[{"data":1,"prerenderedAt":738},["ShallowReactive",2],{"docs-page-\u002Fdocs\u002Fcli":3,"docs-surround-\u002Fdocs\u002Fcli":731},{"id":4,"title":5,"body":6,"description":723,"extension":724,"meta":725,"navigation":726,"path":727,"seo":728,"stem":729,"__hash__":730},"docs\u002Fdocs\u002F4.cli.md","Command Line",{"type":7,"value":8,"toc":712},"minimark",[9,13,28,31,36,49,53,82,92,96,108,145,152,160,170,174,273,276,280,362,471,474,482,497,501,520,533,544,547,591,659,665,669,674,678,708],[10,11,5],"h1",{"id":12},"command-line",[14,15,16,17,21,22,27],"p",{},"The ",[18,19,20],"code",{},"lumber"," command reads your logs in the terminal: the newest ones, a search, or a live tail. Like the Lumber app, it decrypts them on your own machine, so Lumber's servers still hold only ciphertext. It can also hand your logs to an AI agent: see ",[23,24,26],"a",{"href":25},"\u002Fdocs\u002Fmcp","AI Agents",".",[14,29,30],{},"It only reads. Apps, API keys and notes are made in the Lumber app.",[32,33,35],"h2",{"id":34},"requirements","Requirements",[37,38,39,43,46],"ul",{},[40,41,42],"li",{},"macOS. Your account key is kept in the Keychain; Linux and Windows are planned.",[40,44,45],{},"Node.js 20 or later",[40,47,48],{},"A Lumber account, and a phone or Mac where Lumber already has your account key, to show the code that links your Mac",[32,50,52],{"id":51},"install","Install",[54,55,60],"pre",{"className":56,"code":57,"language":58,"meta":59,"style":59},"language-bash shiki shiki-themes github-dark","npm install -g @infinitetoken\u002Flumber-cli\n","bash","",[18,61,62],{"__ignoreMap":59},[63,64,67,71,75,79],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"svObZ","npm",[63,72,74],{"class":73},"sU2Wk"," install",[63,76,78],{"class":77},"sDLfK"," -g",[63,80,81],{"class":73}," @infinitetoken\u002Flumber-cli\n",[14,83,84,85,87,88,91],{},"The package is scoped: the unscoped ",[18,86,20],{}," and ",[18,89,90],{},"lumber-cli"," packages on npm aren't Lumber's.",[32,93,95],{"id":94},"sign-in-and-link-your-mac","Sign in and link your Mac",[54,97,99],{"className":56,"code":98,"language":58,"meta":59,"style":59},"lumber login\n",[18,100,101],{"__ignoreMap":59},[63,102,103,105],{"class":65,"line":66},[63,104,20],{"class":69},[63,106,107],{"class":73}," login\n",[109,110,111,114,125,139],"ol",{},[40,112,113],{},"Enter your Lumber email and password.",[40,115,116,117,121,122,27],{},"Open Lumber on a phone or Mac that has your account key. Your phone gets a notification, and the Mac app asks when you switch to it (or open ",[118,119,120],"strong",{},"Account > Link another device","). Tap ",[118,123,124],{},"Show Code",[40,126,127,128,131,132,134,135,138],{},"Type the 7-digit code it shows, like ",[18,129,130],{},"482 9138",", at ",[18,133,20],{},"'s ",[118,136,137],{},"Code"," prompt. A typo is caught before it's sent.",[40,140,141,142,144],{},"Your other device checks the code and sends your account key. ",[18,143,20],{}," can then read every app you can.",[14,146,147,148,151],{},"The request lasts 10 minutes. A wrong code ends it, so run ",[18,149,150],{},"lumber login"," again for a new one.",[14,153,154,155,159],{},"Linking works the way a new phone links (see ",[23,156,158],{"href":157},"\u002Fdocs\u002Fencryption#linking-a-device","Linking a device","): your Mac makes a one-time key pair, and your other device encrypts your account key to its public half only once the code proves which device is asking. The code never goes through Lumber's servers, so they can't choose where your account key goes. Never give the code to anyone, even someone who says they're from Lumber.",[14,161,162,163,165,166,169],{},"Your session and account key are kept in your login Keychain, in an item named \"Lumber CLI\". The session renews itself each day you use ",[18,164,20],{},", so it only ends after 30 days unused, and signing in again then, as the same person, needs no new link. ",[18,167,168],{},"lumber logout"," removes both.",[32,171,173],{"id":172},"commands","Commands",[175,176,177,190],"table",{},[178,179,180],"thead",{},[181,182,183,187],"tr",{},[184,185,186],"th",{},"Command",[184,188,189],{},"What it does",[191,192,193,204,214,224,234,247,259],"tbody",{},[181,194,195,201],{},[196,197,198],"td",{},[18,199,200],{},"lumber status",[196,202,203],{},"Who's signed in, and which apps your Mac can read",[181,205,206,211],{},[196,207,208],{},[18,209,210],{},"lumber apps",[196,212,213],{},"Your apps, and how many days of logs each one's plan keeps",[181,215,216,221],{},[196,217,218],{},[18,219,220],{},"lumber logs [app...]",[196,222,223],{},"The newest logs, oldest at the bottom",[181,225,226,231],{},[196,227,228],{},[18,229,230],{},"lumber tail [app...]",[196,232,233],{},"Follow new logs as they arrive",[181,235,236,241],{},[196,237,238],{},[18,239,240],{},"lumber mcp",[196,242,243,244,246],{},"Serve your logs to an AI agent (see ",[23,245,26],{"href":25},")",[181,248,249,256],{},[196,250,251,253,254],{},[18,252,150],{},", ",[18,255,168],{},[196,257,258],{},"Sign in and link your Mac, or sign out and remove its account key",[181,260,261,266],{},[196,262,263],{},[18,264,265],{},"lumber help",[196,267,268,269,272],{},"Every command, or ",[18,270,271],{},"lumber logs help"," for one",[14,274,275],{},"Apps are names, in any case, or ids. Naming none means every app.",[32,277,279],{"id":278},"finding-logs","Finding logs",[54,281,283],{"className":56,"code":282,"language":58,"meta":59,"style":59},"lumber logs                          # the newest 100 logs from every app\nlumber logs Billing -l error -s 2h   # one app's errors and fatals from the last two hours\nlumber logs -g \"card declined\" -n 20 # the newest 20 logs mentioning \"card declined\"\nlumber logs Billing -s yesterday -v  # since yesterday, with each log's fields under it\n",[18,284,285,296,321,342],{"__ignoreMap":59},[63,286,287,289,292],{"class":65,"line":66},[63,288,20],{"class":69},[63,290,291],{"class":73}," logs",[63,293,295],{"class":294},"sAwPA","                          # the newest 100 logs from every app\n",[63,297,299,301,303,306,309,312,315,318],{"class":65,"line":298},2,[63,300,20],{"class":69},[63,302,291],{"class":73},[63,304,305],{"class":73}," Billing",[63,307,308],{"class":77}," -l",[63,310,311],{"class":73}," error",[63,313,314],{"class":77}," -s",[63,316,317],{"class":73}," 2h",[63,319,320],{"class":294},"   # one app's errors and fatals from the last two hours\n",[63,322,324,326,328,330,333,336,339],{"class":65,"line":323},3,[63,325,20],{"class":69},[63,327,291],{"class":73},[63,329,78],{"class":77},[63,331,332],{"class":73}," \"card declined\"",[63,334,335],{"class":77}," -n",[63,337,338],{"class":77}," 20",[63,340,341],{"class":294}," # the newest 20 logs mentioning \"card declined\"\n",[63,343,345,347,349,351,353,356,359],{"class":65,"line":344},4,[63,346,20],{"class":69},[63,348,291],{"class":73},[63,350,305],{"class":73},[63,352,314],{"class":77},[63,354,355],{"class":73}," yesterday",[63,357,358],{"class":77}," -v",[63,360,361],{"class":294},"  # since yesterday, with each log's fields under it\n",[175,363,364,374],{},[178,365,366],{},[181,367,368,371],{},[184,369,370],{},"Option",[184,372,373],{},"Meaning",[191,375,376,394,427,437,447,457],{},[181,377,378,383],{},[196,379,380],{},[18,381,382],{},"-l, --level",[196,384,385,386,389,390,393],{},"One level for that level and above (",[18,387,388],{},"warn"," is warn, error and fatal), or a list for exactly those (",[18,391,392],{},"info,warn","). The levels are debug, info, warn, error and fatal.",[181,395,396,404],{},[196,397,398,253,401],{},[18,399,400],{},"-s, --since",[18,402,403],{},"-u, --until",[196,405,406,407,253,410,253,413,416,417,253,420,253,423,426],{},"An age (",[18,408,409],{},"15m",[18,411,412],{},"2h",[18,414,415],{},"3d","), a day (",[18,418,419],{},"2026-10-29",[18,421,422],{},"today",[18,424,425],{},"yesterday","), or an ISO time",[181,428,429,434],{},[196,430,431],{},[18,432,433],{},"-g, --grep",[196,435,436],{},"Text to look for, ignoring case, in the message, request and trace IDs, context and metadata",[181,438,439,444],{},[196,440,441],{},[18,442,443],{},"-n, --lines",[196,445,446],{},"How many logs, 100 unless you say",[181,448,449,454],{},[196,450,451],{},[18,452,453],{},"-v, --verbose",[196,455,456],{},"Each log's id, request and trace IDs, context and metadata under it",[181,458,459,464],{},[196,460,461],{},[18,462,463],{},"--json",[196,465,466,467,246],{},"One JSON object per log (see ",[23,468,470],{"href":469},"#scripts","Scripts",[14,472,473],{},"Each log is one line, in your local time:",[54,475,480],{"className":476,"code":478,"language":479},[477],"language-text","2026-10-29 14:02:11 WARN  Payment retry scheduled\n2026-10-29 14:02:13 ERROR Payment failed: card declined\n","text",[18,481,478],{"__ignoreMap":59},[14,483,484,485,489,490,492,493,496],{},"Lumber's servers can filter by level and time, since those stay readable to them (see ",[23,486,488],{"href":487},"\u002Fdocs\u002Fencryption#what-the-server-sees","What the server sees","). Text is another matter: the server only has ciphertext, so ",[18,491,20],{}," searches on your Mac, decrypting as it reads back through your logs, up to 20,000 of them. Narrow with ",[18,494,495],{},"--since"," to search further back.",[32,498,500],{"id":499},"following-logs","Following logs",[54,502,504],{"className":56,"code":503,"language":58,"meta":59,"style":59},"lumber tail Billing -l warn\n",[18,505,506],{"__ignoreMap":59},[63,507,508,510,513,515,517],{"class":65,"line":66},[63,509,20],{"class":69},[63,511,512],{"class":73}," tail",[63,514,305],{"class":73},[63,516,308],{"class":77},[63,518,519],{"class":73}," warn\n",[14,521,522,525,526,529,530,532],{},[18,523,524],{},"tail"," shows the last 10 logs (",[18,527,528],{},"-n"," changes that), then each new one as it arrives. Apps on Dev and Pro plans stream over Lumber's live connection; for apps on Hobby, ",[18,531,524],{}," checks every 5 seconds. If the connection drops, or your Mac sleeps, it catches up on what it missed when it's back.",[14,534,535,536,539,540,543],{},"In a terminal, the connection's state stays on a line under the logs, such as ",[18,537,538],{},"Following Billing · live",". ",[18,541,542],{},"-q"," hides it.",[32,545,470],{"id":546},"scripts",[14,548,549,551,552,253,555,253,558,253,561,253,564,253,567,570,571,253,574,253,577,87,580,583,584,587,588,27],{},[18,550,463],{}," prints one JSON object per line, with ",[18,553,554],{},"id",[18,556,557],{},"app",[18,559,560],{},"appId",[18,562,563],{},"level",[18,565,566],{},"time",[18,568,569],{},"message",", and ",[18,572,573],{},"requestId",[18,575,576],{},"traceId",[18,578,579],{},"context",[18,581,582],{},"metadata"," when a log has them. A log your Mac has no key for has a ",[18,585,586],{},"null"," message and ",[18,589,590],{},"locked: true",[54,592,594],{"className":56,"code":593,"language":58,"meta":59,"style":59},"# Billing's most common errors today\nlumber logs Billing -l error -s today -n 1000 --json | jq -r .message | sort | uniq -c | sort -rn\n",[18,595,596,601],{"__ignoreMap":59},[63,597,598],{"class":65,"line":66},[63,599,600],{"class":294},"# Billing's most common errors today\n",[63,602,603,605,607,609,611,613,615,618,620,623,626,630,633,636,639,641,644,646,649,652,654,656],{"class":65,"line":298},[63,604,20],{"class":69},[63,606,291],{"class":73},[63,608,305],{"class":73},[63,610,308],{"class":77},[63,612,311],{"class":73},[63,614,314],{"class":77},[63,616,617],{"class":73}," today",[63,619,335],{"class":77},[63,621,622],{"class":77}," 1000",[63,624,625],{"class":77}," --json",[63,627,629],{"class":628},"snl16"," |",[63,631,632],{"class":69}," jq",[63,634,635],{"class":77}," -r",[63,637,638],{"class":73}," .message",[63,640,629],{"class":628},[63,642,643],{"class":69}," sort",[63,645,629],{"class":628},[63,647,648],{"class":69}," uniq",[63,650,651],{"class":77}," -c",[63,653,629],{"class":628},[63,655,643],{"class":69},[63,657,658],{"class":77}," -rn\n",[14,660,661,662,664],{},"Piped, or with ",[18,663,463],{},", the output is plain text, with no colors or spinners.",[32,666,668],{"id":667},"colors","Colors",[14,670,671,673],{},[18,672,20],{}," takes the Lumber app's colors: spinners, help and prompts in the accent you picked on the app's Account screen, levels in their colors, and a square in each app's color before its name.",[32,675,677],{"id":676},"limits","Limits",[37,679,680,683,686,694],{},[40,681,682],{},"macOS only, for now.",[40,684,685],{},"It only reads: apps, API keys, notes and flags are made in the Lumber app.",[40,687,688,689,693],{},"An app you've just been given access to shows as locked until someone who has its key shares it with you, as in the app (see ",[23,690,692],{"href":691},"\u002Fdocs\u002Fapi-keys#sharing-with-your-team","Sharing with your team",").",[40,695,696,699,700,703,704,707],{},[18,697,698],{},"help"," anywhere on the command line shows help, so ",[18,701,702],{},"lumber logs -g help"," prints help rather than searching. Search for ",[18,705,706],{},"-g Help"," instead: the match ignores case.",[709,710,711],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}",{"title":59,"searchDepth":298,"depth":298,"links":713},[714,715,716,717,718,719,720,721,722],{"id":34,"depth":298,"text":35},{"id":51,"depth":298,"text":52},{"id":94,"depth":298,"text":95},{"id":172,"depth":298,"text":173},{"id":278,"depth":298,"text":279},{"id":499,"depth":298,"text":500},{"id":546,"depth":298,"text":470},{"id":667,"depth":298,"text":668},{"id":676,"depth":298,"text":677},"Read, search and follow your logs in the terminal with the lumber command, decrypted on your Mac.","md",{},true,"\u002Fdocs\u002Fcli",{"title":5,"description":723},"docs\u002F4.cli","skToa6blTmXTrmliAWO80qjuRfSQl-Iouk3b3yH2FMM",[732,736],{"title":733,"path":734,"stem":735,"children":-1},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002F3.configuration",{"title":26,"path":25,"stem":737,"children":-1},"docs\u002F5.mcp",1794245210718]