MULTI-DEVICE · ONE RUNNER {{ s.n }}{{ s.l }} STEP {{ mdStepN }} OF {{ mdStepTotal }} {{ mdDeviceL }} ○ Studio Mac offline {{ mdCaption }} ‹ Back Next ›
GRID PHONE · 03 CARD · + OWNER LINE
‹ Home PREPARE ···
vertex · ⌘1 · FABLE · high Add per-key rate limits to the public API {{ mdPhOwnerG }}{{ mdPhOwnerL }}·{{ mdPhConfirm }}
Card Session History
WHAT THIS CARD ISPartner keys have no rate limit today. This adds a per-key limiter on the public router with a quota column, defaulting to 60 requests a minute, and returns 429 with a Retry-After header.
THE PLAN · 8 STEPS
1. Add the limiter middleware to the public router 2. Add a quota column with a safe default 3. Return 429 with Retry-After 4. Cover burst and steady traffic in tests + 4 more
OPEN QUESTION · WAITING ON YOU The 41 keys already in use have no limit today. On the day this ships, should they get the same 60 a minute, or stay unlimited until you say? Answer it ›
QUESTION · ANSWERED HERE 09:03 You answered A · Same limit for everyone, day one {{ mdRelayG }}{{ mdRelayL }}Cancel {{ mdRelayNote }}
View session Approve plan
GRID PHONE · 04 QUESTION · + QUEUED FOOTER
‹ Card QUESTION 1 OF 1
vertex · Add per-key rate limits{{ mdPhOwnerG }}{{ mdPhOwnerL }}·{{ mdPhConfirm }} The 41 keys already in use have no limit today. On the day this ships, should they get the same 60 requests a minute, or stay unlimited until you say?
ASame limit for everyone, day one (recommended)Simplest and fair. Three partners are above 60 a minute today and will see 429s until they back off or ask for more.
BExisting keys stay unlimitedNobody breaks, but the limit only protects you from new partners. Needs a follow-up card to migrate the 41.
CLimit them, but at 300 a minute for 30 daysA grace window. One more config value, and a card to lower it later.
✎Something else…
HELP ME DECIDE
Which partners are above 60? What breaks if I pick A? What would you do?
{{ mdPhHint }}
Answer A and continue {{ mdRelayG }}{{ mdRelayL }}{{ mdRelayNote }}Cancel
TWO ADDITIONS TO GRID PHONE Owner line under the title on 03 Card and 04 Question, the desktop OwnerChip in phone type: ○ Runs on Studio Mac · last confirmed 41m ago. Pending footer after an answer: the same RelayChip — ◔ Queued for Studio Mac with a 44px Cancel, then Applied or Rejected with the reason. Tap an option here to see it. No Start button on the phone — absent, not disabled. The plan footer keeps View session and Approve plan.
{{ discIc }}{{ discT }}{{ discP }} · runs in the background · changes nothing until you approve✕
WHAT GRID WILL DO
{{ discPrompt }}
STEPS○{{ s.t }}
ADD WHAT YOU KNOW optional
Cancel Run in the background
✦Ask Grid ☾ Focus ⤢ ✕
✕
Nothing matches. {{ r.kick }}
{{ r.t }}{{ r.tag }} {{ r.ic }}{{ r.p }}·{{ r.s }}
{{ f.kindIc }}{{ f.kindL }}·{{ f.need }}·{{ f.p }}{{ f.wait }} {{ f.t }} {{ x.l }}
{{ f.fic }}{{ f.fl }}·{{ f.fn }}·{{ f.p }}{{ f.age }} {{ f.t }} Read the answer
{{ f.fic }}{{ f.fl }}·{{ f.fn }}·{{ f.p }}{{ f.age }} {{ f.t }} {{ f.step }}
✓{{ h }}
Nothing waits on you and nothing is running. Ask anything above; it runs in the background.
All threads›
✦Ask Grid+ New
✕
Nothing matches.
{{ th.kick }}
{{ th.ic }}{{ th.kindL }}·{{ th.need }} {{ th.t }}{{ th.tag }} ContinueDiscard {{ th.ic }}{{ th.p }}·{{ th.s }}
New question{{ askModeIc }}{{ askModeL }} ✕
✦What can Grid do for you?It runs in the background, so you can close this and keep working; Grid tells you when it is done. Anything that changes code or settings comes back to you first.
{{ d.ic }}{{ d.l }} ›{{ x.t }}
ABOUT{{ c.g }}{{ c.l }}✕ + card or file
⌕
CARDS {{ o.t }}{{ o.st }}{{ o.ck }} No card matches.
COMMANDS · ↑↓ to pick, ↵ or tab to use {{ c.n }}{{ c.d }}{{ c.src }} No command starts with that.
{{ f.ext }}{{ f.name }}{{ f.size }}✕
{{ askAcctI }} LLM ACCOUNT{{ o.i }}{{ o.l }}{{ o.d }}{{ o.ck }} {{ askMEL }} ▾ {{ o.l }}{{ o.ck }}{{ o.d }} {{ u.l }}{{ u.v }}› ‹ {{ askSubH }}{{ o.l }}{{ o.ck }}{{ o.d }} Send
{{ askCardV.kindIc }}{{ askCardV.kindL }}·{{ askCardV.need }} Open the full card ↗ {{ askModeIc }}{{ askModeL }} ✕
{{ focusKick }}· {{ focusDf }}{{ cardTyI }} {{ focusTitle }} {{ focusSub }} {{ rl.k }}{{ rl.t }} Runs in the cloud{{ rxAcctK }}{{ rxState }} {{ st.n }} ✓ DONE
GOAL {{ gdGoal }} {{ gdWhy }} {{ gdNowK }}{{ gdNowAge }} {{ gdNowT }} {{ gdNowHow }} Grid types it into the open page for you. {{ gdNowCta }} I’m stuck ☉ {{ gdBrT }}{{ gdBrUrl }} Watch {{ gdTakeL }} STEPS{{ gdDoneN }} {{ s.ck }} {{ s.t }}{{ s.who }} {{ s.sub }} {{ s.letL }} DONE WHEN ·{{ w }} ⧉ Body has 2 versions — edited on Studio Mac and here while apart. Both are kept until you resolve. Resolve… ✓ Body resolved here · the other version stays in History for 30 daysUndo {{ planHead }} You answered {{ mdQAnswerT }} · here · 09:03 {{ mdRelayG }}{{ mdRelayL }} {{ mdRelayNote }} Cancel SENT FROM THIS DEVICE {{ r.g }}{{ r.l }} {{ r.what }} — {{ r.note }} {{ planSummary }} {{ s.mk }} {{ s.t }} {{ planAskKick }} {{ q.ask }} {{ o.letter }} RECOMMENDED {{ o.t }} {{ o.exp }} FILES IT WILL TOUCH◆ Code view {{ f.s }} {{ f.n }} {{ f.d }} DETAILED TASKS{{ planTasksCount }} {{ k.mark }} {{ k.t }} HOW IT WILL BE VERIFIED ○ {{ v.t }} WHAT IT WILL NOT DO ⊘ {{ v.t }} QUESTIONS IT ASKED1 answered · 1 open ✓Is a bucket enough, or a sliding window? Partners hit us in bursts.09:31 you: a bucket — capacity handles the burst, refill sets the sustained rate 6 files ~180 lines 1 database change After approval it builds without asking until Review. The schema step still stops for a tap: project rule. SUMMARY {{ chSummary }} CHANGES SO FAR◆ Code view{{ chAdd }}{{ chDel }} {{ f.s }} {{ f.n }} {{ f.add }} {{ f.del }} {{ l.n }}{{ l.t }} EXECUTION PLAN{{ exSum }}
{{ ph.l }}{{ ph.count }}{{ ph.waived }}{{ ph.fail }}{{ ph.totEl }}{{ ph.chev }} {{ ph.emptyT }}
{{ k.mark }} {{ k.t }}{{ k.evL }} {{ k.st }}After: {{ k.after }}Waiting for: {{ k.ext }} ({{ k.extSt }})SkipResume {{ k.procCmd }}{{ k.procEl }}· {{ k.procCpu }} CPU · {{ k.procMem }}Kill process stopped · the agent was told {{ k.ev }} “{{ k.why }}” SkipCancelRecorded as skipped by you, never as passed. {{ k.durEl }}
↕ {{ ph.scrollHint }}{{ ph.jumpL }} {{ ph.method }}{{ ph.methodWhy }}
CARDS IN THIS RUN · 3 picked up on its own {{ s.t }} {{ s.role }} Grid noticed these three touch the same worklist and the same API, so it kept them in one run instead of racing three agents at the same rate limit. Nothing is pushed. Commits happen at Deliver, after your review.
⚠ IT NEEDS A DECISION A read-only Team Board token is needed to inspect crm.thehalalvillage.com. Add it safely, or get help creating one. SECRET REQUESTsupplied by this card · only the value is editable KEY NAMETEAM_BOARD_API_TOKENKIND · FORenv var · RemoteWEBSITEcrm.thehalalvillage.comGRID WILLset it as an env var ●●●never shownSave secretLink from password manager Saving to this project’s local secret store… ✓ TEAM_BOARD_API_TOKEN storedOption A answered automatically. The card, chat and agent transcript receive only this name and status. {{ srProblemTitle }}{{ srProblemText }}Try again STATE CHECK{{ x.l }} A · {{ srALabel }}B · Help me create a read-only token ⚠ That looks like a secret. Don’t send it here; use the protected field above. Help me decide /btw asks about the question · the card stays paused /btw ⌘⏎ ⚠ That looks like a secret. /btw will not send it; save it through the protected request instead. {{ q.l }} YOU ASKED {{ btwQ }} {{ btwA }} side question · not an answer · the card is still waiting on you Paused 22m. The other three steps are done and sitting in the working tree. READY FOR REVIEW {{ rvSummary }} ✕ REJECTEDYour approval from 09:07 was for the review as it stood at 08:58 · 2 files · +52 −0. The agent changed the diff at 09:12, before Studio Mac saw your approval, so it was not applied. Below is the review as it is now: 4 files · +83 −6 · storefront/router.ts and marker.test.ts are new since you approved. You approved · here · 09:07 ◔Queued for Studio Mac Tied to this exact diff. If the diff changes first, this approval is rejected and you see the new one. Cancel THE PLAN · AS APPROVED{{ rvPlanHead }} {{ s.mark }} {{ s.t }} {{ s.d }} FINDINGS · ONE DECISION EACH {{ b.i }} {{ b.t }} FIX LATER DROP {{ rvPickSum }} running locally for this review · localhost:5173 Open ↗ {{ rvFilesHead }}◆ Code view{{ rvDecided }} {{ f.s }} {{ f.n }} {{ f.dm }} {{ f.add }} {{ f.del }} COMMIT · WAITING ON YOUR APPROVE {{ rvCommit }} {{ vfHead }} {{ vfCount }} Not just a unit suite. A card is verified when every check its project defines comes back green: tests, a real browser run, an HTTP probe, and anything only you can judge. {{ v.mark }} {{ v.k }} {{ v.n }} {{ v.s }} {{ v.d }} {{ v.out }} ▣ Screenshot per step, kept with the card. Click to watch the run. Re-run all Tick the manual check All green closes the card and writes the outcome to project memory. A red check brings it back to you with that check on top. {{ idleKick }} {{ idleWhy }} {{ idleSub }} WHAT IS IN THE WORKTREE {{ idleSum }} CHANGES SO FAR◆ Code view {{ idleAdd }} {{ idleDel }} {{ fl.n }} {{ fl.add }} {{ fl.del }} THE PLAN {{ idleStepL }} {{ s.mk }} {{ s.t }} {{ a.l }} {{ idleCta }} ALSO IN THE PLAN {{ s.t }} {{ s.n }} {{ s.mk }} {{ r.mk }} {{ r.id }}{{ r.name }}{{ r.rel }} {{ r.t }} NO SESSION OF ITS OWN ⌘2 Close every MR untouched for a month That run created this card and picked it up by itself: same worklist, same API rate limit, so a second agent would only fight it. Nobody assigned it. Open ⌘2 and watch it there IF YOU WANT IT SEPARATE Give it its own session Hand it to a different session… Two agents on one repo area is the usual way work gets lost, so a run that finds related cards keeps them together. You never assign them by hand; you can always split one off. Move to Inbox Take it off ⌘2 CLOSED · 2H AGO Cards drag between stages on mouse and touch. A manual drag is treated as your decision: the agent re-plans instead of dragging back. WRITTEN TO GRID MEMORY “A manual drag overrides the pipeline: never drag it back.” 3 files +212 −38 $2.10 Reopen card
{{ planBtnL }} Revise
? Change by change ↺ {{ rvSendLabel }} ✓ {{ rvApproveLabel }}
{{ askCardV.kindIc }}{{ askCardV.kindL }}·{{ askCardV.need }}·{{ askCardV.p }}· {{ askCardV.stg }} {{ askCardV.t }} Open the full card ↗ {{ askModeIc }}{{ askModeL }} ✕
WHY IT IS HERE{{ askCardV.kindT }}
WHERE IT STANDS{{ askCardV.what }}{{ askCardV.wait }}
{{ x.l }}The full card has the plan, the session and every file.
{{ askCur.title }} {{ askCur.diff }} · {{ askCur.model }}{{ askCur.meta }} {{ askArchL }} Make it a card {{ askModeIc }}{{ askModeL }} ✕
{{ c }}{{ f.ext }}{{ f.name }}{{ f.size }}✕{{ askCur.q }}
◐Working · {{ askCur.age }}Stop {{ s2.m }}{{ s2.t }} You can close this. Grid tells you when the answer is ready, and it waits here.
✓{{ askCur.ran }}
✦
{{ p }}
RESEARCH{{ askCur.docMeta }}Open full pageExport PDF {{ askCur.docTitle }}
THE ANSWER{{ askCur.lead }}
{{ c.v }}
14 pages · 23 sources · saved to Library › vertex
▤{{ askCur.file }}{{ askCur.docMeta }}{{ askCur.lead }}OpenDownloadShow in Library
WHAT I FOUND✓{{ f }}
{{ askCur.lead }}
⚙{{ askCur.scope }}{{ askCur.stL }}
{{ d.k }}{{ d.where }}{{ d.a }}{{ d.b }}
Apply {{ askCur.nDiff }} changesOpen in ProjectsDiscard
{{ askCur.lead }}
{{ c.ty }}{{ c.t }}{{ c.d }}{{ c.diff }}
Create {{ askCur.nCards }} cardsSend to Backlog instead
✓{{ askCur.note }}
{{ f.q }}📎 {{ f.attL }}
{{ f.ic }}{{ f.a }}
{{ s3.l }}
COMMANDS · ↑↓ to pick, ↵ or tab to use {{ c.n }}{{ c.d }}{{ c.src }} No command starts with that.
{{ f.ext }}{{ f.name }}{{ f.size }}✕
{{ askAcctI }} LLM ACCOUNT{{ o.i }}{{ o.l }}{{ o.d }}{{ o.ck }} {{ askMEL }} ▾ {{ o.l }}{{ o.ck }}{{ o.d }} {{ u.l }}{{ u.v }}› ‹ {{ askSubH }}{{ o.l }}{{ o.ck }}{{ o.d }} Send
{{ n.ic }} {{ n.t }}{{ n.p }}{{ n.s }} {{ n.a }}✕
Grid Console ALPHA {{ m.l }} {{ i.l }} {{ i.k }} ⌕⌘K + New card{{ kmNewCard }} DV SOLO ▾ DV Abdullahi Egal dev@gridconsole.dev SOLO · 1 SEAT renews 14 Sep Plans & licence… Devices & sign-ins Billing ↗ Action history⌘⇧H Report a problem Replay the tour? Keyboard shortcuts⌘/ Appearance and theme{{ themeLabel }} Sign out
TOUR {{ tourN }} {{ tourTitle }} {{ tourCh }} {{ tourWhat }} ‹ Back Explain {{ tourNextL }} › ✕
{{ tourCh }} {{ tourN }} ✕
{{ tourTitle }} {{ pp.t }} ON SCREEN {{ tourWhat }}
Look at the screen ‹ Back {{ tourNextL }} ›
{{ n.i }}{{ n.l }}{{ n.badge }} PROJECT SETUP · VERTEX✕
{{ w.ic }}{{ w.l }}
▾FILTER {{ p.l }} {{ p.n2 }} {{ p.key }} {{ askPillIc }}{{ askPillL }}{{ askUnreadN }}{{ kmAskK }}
{{ t.p }} {{ t.d }} ◫{{ t.n }} ✕
New tab{{ kmTermTabK }} {{ kmTermNewK }} {{ kmSplitK }} {{ kmTermCloseK }} {{ tpMaxSvg }}{{ kmTermMaxK }} {{ kmTermK }}
⌕esc
Workspace~/grid · no project
{{ g.p }}{{ g.dir }} · mainrecent ↳{{ w.tree }}{{ w.card }}
Nothing matches.
⌕↵ next · ⇧↵ previous✕
{{ p.p }}{{ p.d }}✕
↺ restored from your last session · {{ p.cwd }}
{{ l.t }}
{{ p.prompt }}
BY PROJECT{{ tpRailSum }}
{{ r.p }} {{ r.liveN }} {{ r.n }}
{{ t.d }} +{{ w.tree }}
❯_Terminal{{ tpN }}{{ kmTermK }} {{ crumb }} {{ idxL }} {{ m.l }} re-explain {{ agLive }} agents live {{ sbVer }} {{ sbAccIni }}{{ sbAccName }}{{ sbAccProv }} no reading yet {{ g.l }} {{ g.v }} {{ g.reset }} {{ o.g }} −{{ zoomPct }}+
Accounts and usageNew cards bill to the active pool or account. Limits are the provider's own figures, so they include work done outside Grid.✕
ACTIVEnew cards bill here · a pool picks one of its accounts per card {{ t.ini }}{{ t.l }}{{ t.sub }}
{{ ac.ini }} {{ ac.name }} {{ ac.prov }} · {{ ac.who }} {{ ac.inActiveL }} {{ ac.pauseL }}
{{ u.ml }}{{ u.mp }} {{ u.ms }}
No limits reading yet · Grid reads them in the background. SPENT{{ ac.spend }}{{ ac.age }}
Spend comes from Claude Code's own transcripts; Codex spend isn't available yet.Open Insights →
{{ w.ic }}{{ w.l }}
{{ bmBack }}esc
{{ runHead }} {{ runN }} {{ runTotals }}
{{ r.st }} {{ r.restartsL }} {{ r.me }} {{ r.acct }} {{ r.pv }} · {{ r.dur }} {{ r.cost }}
SUBAGENTS {{ agKidN }}
{{ agAl }} the parent {{ gr.g }} {{ gr.n }} {{ k.id }} {{ k.cost }} {{ k.t }}
{{ agKidNote }}
‹ {{ focusEl }} ☁ Cloud worker Open in Development ›
‹ {{ focusEl }} ☁ Cloud worker ▶ Start on Studio Mac ▶ Start here Starting… Terminal
▤ {{ sesBtnL }}▾
{{ runHead }}{{ runTotals }} {{ r.st }} {{ r.restartsL }} {{ r.acct }} {{ r.me }} · {{ r.pv }} · {{ r.dur }}{{ r.cost }}
▶ {{ runCount }}
⋯
DIFFICULTY{{ focusDiff }} ACCOUNT · WHO THIS CARD BILLS TO {{ a.ini }} {{ a.l }} {{ a.mk }} Switching stops the running agent. The card, its worktree and the conversation stay; you start the next agent yourself. SESSION {{ x.l }}{{ x.k }} {{ x.tip }} Edit the card…⌘E
{{ sesTermAg }} {{ sesTermCwd }} the agent's live session Back to the conversation
{{ l.t }} ❯
SESSION {{ sesStart }} · IN THE CLOUD
YOU {{ c.t }} {{ c.youMore }} {{ c.when }}
{{ c.t }}
{{ c.mark }} {{ c.t }} ⟲
{{ c.ok }} {{ c.name }} {{ c.target }} open {{ c.stat }} {{ c.fold }}
{{ c.out }}
{{ c.ok }} {{ c.label }} {{ c.n }} {{ c.fold }}
{{ t.ok }} {{ t.name }} {{ t.target }} open {{ t.stat }} {{ t.fold }}
{{ t.out }}
{{ c.askKick }} {{ c.t }} {{ c.askAct }}
{{ stateText }}
⌘⏎ send
↵↵ auto mode on shift+tab to cycle {{ focusMeter }}
READ ONLY {{ roWhy }} {{ roCta }}
{{ d.l }}
{{ focusKick }}· {{ focusDf }}{{ cardTyI }} {{ focusTitle }} {{ focusSub }} {{ rl.k }}{{ rl.t }} Runs in the cloud{{ rxAcctK }}{{ rxState }} {{ st.n }} ✓ DONE
GOAL {{ gdGoal }} {{ gdWhy }} {{ gdNowK }}{{ gdNowAge }} {{ gdNowT }} {{ gdNowHow }} Grid types it into the open page for you. {{ gdNowCta }} I’m stuck ☉ {{ gdBrT }}{{ gdBrUrl }} Watch {{ gdTakeL }} STEPS{{ gdDoneN }} {{ s.ck }} {{ s.t }}{{ s.who }} {{ s.sub }} {{ s.letL }} DONE WHEN ·{{ w }} ⧉ Body has 2 versions — edited on Studio Mac and here while apart. Both are kept until you resolve. Resolve… ✓ Body resolved here · the other version stays in History for 30 daysUndo {{ planHead }} You answered {{ mdQAnswerT }} · here · 09:03 {{ mdRelayG }}{{ mdRelayL }} {{ mdRelayNote }} Cancel SENT FROM THIS DEVICE {{ r.g }}{{ r.l }} {{ r.what }} — {{ r.note }} {{ planSummary }} {{ s.mk }} {{ s.t }} {{ planAskKick }} {{ q.ask }} {{ o.letter }} RECOMMENDED {{ o.t }} {{ o.exp }} FILES IT WILL TOUCH◆ Code view {{ f.s }} {{ f.n }} {{ f.d }} DETAILED TASKS{{ planTasksCount }} {{ k.mark }} {{ k.t }} HOW IT WILL BE VERIFIED ○ {{ v.t }} WHAT IT WILL NOT DO ⊘ {{ v.t }} QUESTIONS IT ASKED1 answered · 1 open ✓Is a bucket enough, or a sliding window? Partners hit us in bursts.09:31 you: a bucket — capacity handles the burst, refill sets the sustained rate 6 files ~180 lines 1 database change After approval it builds without asking until Review. The schema step still stops for a tap: project rule. SUMMARY {{ chSummary }} CHANGES SO FAR◆ Code view{{ chAdd }}{{ chDel }} {{ f.s }} {{ f.n }} {{ f.add }} {{ f.del }} {{ l.n }}{{ l.t }} EXECUTION PLAN{{ exSum }}
{{ ph.l }}{{ ph.count }}{{ ph.waived }}{{ ph.fail }}{{ ph.totEl }}{{ ph.chev }} {{ ph.emptyT }}
{{ k.mark }} {{ k.t }}{{ k.evL }} {{ k.st }}After: {{ k.after }}Waiting for: {{ k.ext }} ({{ k.extSt }})SkipResume {{ k.procCmd }}{{ k.procEl }}· {{ k.procCpu }} CPU · {{ k.procMem }}Kill process stopped · the agent was told {{ k.ev }} “{{ k.why }}” SkipCancelRecorded as skipped by you, never as passed. {{ k.durEl }}
↕ {{ ph.scrollHint }}{{ ph.jumpL }} {{ ph.method }}{{ ph.methodWhy }}
CARDS IN THIS RUN · 3 picked up on its own {{ s.t }} {{ s.role }} Grid noticed these three touch the same worklist and the same API, so it kept them in one run instead of racing three agents at the same rate limit. Nothing is pushed. Commits happen at Deliver, after your review.
⚠ IT NEEDS A DECISION A read-only Team Board token is needed to inspect crm.thehalalvillage.com. Add it safely, or get help creating one. SECRET REQUESTsupplied by this card · only the value is editable KEY NAMETEAM_BOARD_API_TOKENKIND · FORenv var · RemoteWEBSITEcrm.thehalalvillage.comGRID WILLset it as an env var ●●●never shownSave secretLink from password manager Saving to this project’s local secret store… ✓ TEAM_BOARD_API_TOKEN storedOption A answered automatically. The card, chat and agent transcript receive only this name and status. {{ srProblemTitle }}{{ srProblemText }}Try again STATE CHECK{{ x.l }} A · {{ srALabel }}B · Help me create a read-only token ⚠ That looks like a secret. Don’t send it here; use the protected field above. Help me decide /btw asks about the question · the card stays paused /btw ⌘⏎ ⚠ That looks like a secret. /btw will not send it; save it through the protected request instead. {{ q.l }} YOU ASKED {{ btwQ }} {{ btwA }} side question · not an answer · the card is still waiting on you Paused 22m. The other three steps are done and sitting in the working tree. READY FOR REVIEW {{ rvSummary }} ✕ REJECTEDYour approval from 09:07 was for the review as it stood at 08:58 · 2 files · +52 −0. The agent changed the diff at 09:12, before Studio Mac saw your approval, so it was not applied. Below is the review as it is now: 4 files · +83 −6 · storefront/router.ts and marker.test.ts are new since you approved. You approved · here · 09:07 ◔Queued for Studio Mac Tied to this exact diff. If the diff changes first, this approval is rejected and you see the new one. Cancel THE PLAN · AS APPROVED{{ rvPlanHead }} {{ s.mark }} {{ s.t }} {{ s.d }} FINDINGS · ONE DECISION EACH {{ b.i }} {{ b.t }} FIX LATER DROP {{ rvPickSum }} running locally for this review · localhost:5173 Open ↗ {{ rvFilesHead }}◆ Code view{{ rvDecided }} {{ f.s }} {{ f.n }} {{ f.dm }} {{ f.add }} {{ f.del }} COMMIT · WAITING ON YOUR APPROVE {{ rvCommit }} {{ vfHead }} {{ vfCount }} Not just a unit suite. A card is verified when every check its project defines comes back green: tests, a real browser run, an HTTP probe, and anything only you can judge. {{ v.mark }} {{ v.k }} {{ v.n }} {{ v.s }} {{ v.d }} {{ v.out }} ▣ Screenshot per step, kept with the card. Click to watch the run. Re-run all Tick the manual check All green closes the card and writes the outcome to project memory. A red check brings it back to you with that check on top. {{ idleKick }} {{ idleWhy }} {{ idleSub }} WHAT IS IN THE WORKTREE {{ idleSum }} CHANGES SO FAR◆ Code view {{ idleAdd }} {{ idleDel }} {{ fl.n }} {{ fl.add }} {{ fl.del }} THE PLAN {{ idleStepL }} {{ s.mk }} {{ s.t }} {{ a.l }} {{ idleCta }} ALSO IN THE PLAN {{ s.t }} {{ s.n }} {{ s.mk }} {{ r.mk }} {{ r.id }}{{ r.name }}{{ r.rel }} {{ r.t }} NO SESSION OF ITS OWN ⌘2 Close every MR untouched for a month That run created this card and picked it up by itself: same worklist, same API rate limit, so a second agent would only fight it. Nobody assigned it. Open ⌘2 and watch it there IF YOU WANT IT SEPARATE Give it its own session Hand it to a different session… Two agents on one repo area is the usual way work gets lost, so a run that finds related cards keeps them together. You never assign them by hand; you can always split one off. Move to Inbox Take it off ⌘2 CLOSED · 2H AGO Cards drag between stages on mouse and touch. A manual drag is treated as your decision: the agent re-plans instead of dragging back. WRITTEN TO GRID MEMORY “A manual drag overrides the pipeline: never drag it back.” 3 files +212 −38 $2.10 Reopen card
{{ h.l }}
{{ e.ic }}
{{ e.k }} {{ e.at }} DRIFT FROM PLAN REWIND {{ e.t }} {{ e.d }} {{ e.ans }}
{{ r.r }}
{{ fl.n }} NOT IN THE PLAN {{ fl.s }} {{ fl.add }} {{ fl.del }}
Every command this card ran on your machine, in order, with what it did. Anything that changed state outside the worktree is marked, and can be handed back to an agent to undo.
{{ a.at }} {{ a.cmd }} {{ a.res }} {{ a.where }} {{ a.note }} {{ a.undoLbl }}
Put the card back to an earlier moment. The conversation, the files and the memory written after that point all go with it: nothing is left half-rewound.
{{ r.mk }} {{ r.kind }}{{ r.at }} {{ r.t }} WHAT YOU LOSE {{ d.l }} {{ d.v }} Rewind to {{ rwAt }}
{{ rc.rel }} {{ rc.st }} {{ rc.t }} {{ rc.why }}
{{ b.t }}
Stage runs{{ cmp.clockMeta }}
{{ k.l }}{{ k.wall }}{{ k.sub }}
Commands{{ cmp.runsMeta }}System performance ↗
{{ r.cmd }}{{ r.st }}{{ r.dur }}{{ r.cpu }}{{ r.mem }}{{ r.exit }}
Masterplan waves{{ cmp.wavesMeta }}
{{ w.wave }}{{ w.st }}{{ w.t }}{{ w.m }}
Agents on this card, tokens and how the context grew are under Insights.
{{ k.k }}{{ k.v }}{{ k.s }}
TOKENS BY TYPE{{ ci.tokTot }} {{ s.l }}{{ s.v }}{{ s.cost }}{{ s.p }}
CONTEXT AT STARTUP{{ ci.startTot }}
{{ s.car }} {{ s.l }}{{ s.v }}
{{ s.body }}
{{ r.lU }}{{ r.kind }}{{ r.tok }} · {{ r.cost }} {{ r.span }} {{ r.note }}
{{ g.n }}{{ g.role }}{{ g.m }}{{ g.tok }}
120k context ceilingone turninherited from the previous run
{{ planBtnL }} Revise
? Change by change ↺ {{ rvSendLabel }} ✓ {{ rvApproveLabel }}
{{ it.kicker }}{{ it.foldN }}▾ {{ it.i }} {{ it.l }} {{ it.key }} {{ it.n }}
{{ sb.d }} {{ sb.l }} {{ sb.n }}
{{ it.kicker }}{{ it.foldN }}▾ {{ it.i }} {{ it.l }} {{ it.key }} {{ it.n }} ⇤Collapse⌘B
{{ it.i }}
{{ it.i }} ⇥
{{ w.ic }}{{ w.l }}
{{ agTitle }} {{ tb.l }} {{ o.l }} {{ avFleetL }} {{ agLive }} running {{ avProbL }} {{ avCoverL }} {{ agSpend }} today DEFAULT ACCOUNT{{ avDefK }}{{ avDefL }}▾ {{ o.k }} {{ o.l }}{{ o.sub }} {{ o.mk }} A project pool or a card identity always wins over the default. Changing it moves no running agent. + New card + New idea
CPU{{ m7.cpu }}last 60 s
LOAD AVERAGE {{ m7.la1 }}/ {{ m7.laCores }} cores{{ m7.laX }} {{ m7.laSub }} 5 min {{ m7.la5 }} / {{ m7.laCores }} cores · 15 min {{ m7.la15 }} / {{ m7.laCores }} cores
MEMORY › sort by RAM {{ m7.mem }} {{ m7.memSub }}
● {{ m7.dangN }}
{{ d.n }}{{ d.pid }}{{ d.cmd }} {{ d.cpu }} {{ d.ram }} {{ d.p }} · {{ d.card }}. {{ d.why }} KillOpen card
Studio Mac · 12 cores · 64 GB · polled every 2 s {{ m7.sessN }} · {{ m7.cost }} ▤ Studio Mac · 12 cores · 64 GB
{{ mc.head }}
CPU{{ mc.cpu.cap }}
{{ l.l }}{{ l.v }}
MEM{{ mc.mem.cap }}
{{ l.l }}{{ l.v }}
GRID{{ mc.gTot }}Agent processes count as Grid, even when Grid only guesses the card.
WHATSTATUSCPU{{ mc.aCpu }}RAM{{ mc.aRam }}
{{ r.l }}{{ r.sub }}
{{ r.chev }}{{ r.l }}{{ r.tag }}{{ r.st }}{{ r.cpu }}{{ r.ram }}{{ r.actL }}
{{ r.l }}{{ r.st }}{{ r.cpu }}{{ r.ram }}{{ r.actL }}
OTHER PROCESSES{{ mc.oTot }}Showing those over{{ o.l }}
PROCESSWHAT IT ISCPU{{ mc.aCpu }}RAM{{ mc.aRam }}
{{ r.l }}{{ r.d }}{{ r.cpu }}{{ r.ram }}Quit
{{ mc.oHidden }}
{{ gd.head }}{{ gd.sub }}{{ o.l }}
NEEDS A LOOK · {{ gd.issN }}
{{ b.l }}{{ b.tag }}{{ b.d }}{{ b.actL }}
Nothing is stuck. Every background job finished on time.
WHERE GRID’S CPU TIME GOESclick a part to see what is in it
{{ p.l }}{{ p.v }} · {{ p.pc }}{{ p.d }}
{{ j.l }}{{ j.code }}{{ j.d }}{{ j.last }}{{ j.cpu }}
RECENT ACTIVITY{{ o.l }}
{{ e.t }}{{ e.l }}{{ e.j }}{{ e.dur }}
Nothing here in this window. {{ gd.moreL }}
STATUSCARDSTAGEPROGRESSMACHINE {{ g.g }}{{ g.n }} {{ a.hg }}{{ a.hw }} {{ a.title }} {{ a.stage }} {{ a.step }} {{ a.mach }} {{ a.acct }} {{ x.l }} More… {{ x.l }}{{ x.tip }}
{{ h.l }}
{{ r.chev }} {{ r.ag }} · {{ r.p }}{{ r.t }} {{ r.st }} {{ r.dur }} {{ r.cost }} {{ r.cpu }} {{ r.ram }} {{ r.n }} ● {{ r.status }}
{{ q.pre }}{{ q.n }}{{ q.d }} {{ q.cpu }} {{ q.ram }}
Open cardPauseStop and kill its processes
⌕{{ f.l }}
{{ h.l }}
No process matches.
{{ p.kChev }}{{ p.n }}{{ p.kN }} {{ p.d }}{{ p.cmd }} {{ p.cpu }} {{ p.ram }} {{ p.own }} Kill
{{ k.pre }}{{ k.n }} {{ k.d }} {{ k.cpu }} {{ k.ram }} {{ k.own }}
Stage agents cover the pipeline; Stage rules decides which one works each stage. Helpers run beside them and hand back a packet; guards wake on their own triggers.{{ agDefSum }}
{{ g.k }}
{{ r.i }}{{ r.n }} {{ r.arrow }}{{ r.now }}
{{ ad.kick }}NEW · NOT IN THE APP YET {{ ad.n }} {{ ad.sub }} {{ f.k }} {{ f.v }}
MODEL ROLEwhich column of the model matrix this agent readsreset to {{ ad.roleDef }} {{ ro.l }}
{{ ce.d }}{{ pv.v }}
{{ ad.roleNote }}
DEFINITIONhow Grid starts it; options this provider can't honour strike throughreset to default
{{ f.k }} {{ o.l }} −{{ f.v }}+ {{ f.v }} ↗
{{ p.l }}no effort setting
{{ f.note }}
{{ ad.schemaK }}read by the stage session, never its transcript {{ ad.schema }}
PROVIDERSbadges only where a provider falls back or is unverified
{{ p.n }}{{ p.b }}{{ p.how }}{{ p.warn }}
{{ ad.promptK }}{{ ad.promptNote }}reset to default{{ ad.edL }}{{ o.l }}{{ o.l }}Same as Claude · {{ ad.ownL }}{{ ad.dropL }}
{{ b.t }}•{{ s.t }}{{ s.t }}
{{ ad.src }}
GRID ALSO REQUIRESappended to the prompt, in order · set in Stage rules; click one to change it there {{ q.mk }}{{ q.l }} {{ q.h }}{{ q.d }}
{{ ad.typesK }}{{ ad.typesNote }}
{{ t.g }}{{ t.pill }}{{ fl.l }}{{ t.car }} {{ t.route }} THE TYPE'S OWN NOTE · ALWAYS APPENDED {{ t.note }} {{ t.ownK }}remove Sent after the stage prompt and the type's note, only to {{ t.pill }} cards at this stage. + Add a prompt for {{ t.lbl }} cards
SECTIONS IT LEAVES ON THE CARD ###{{ s }}
{{ ad.gateK }} {{ ad.gateM }}{{ ad.gate }}
‹Development{{ devRailN }}
{{ ri.l }} {{ ri.n }} {{ ri.chip }}{{ ri.src }} {{ ri.t }} {{ ri.sub }} {{ ri.p }}·{{ ri.verb }}
Development ▦ Board ☰ List ⚙ Stage rules ▤ Compact {{ w.ini }}clear {{ boardOpen }} open · {{ boardTotal }} total ● {{ needN }} WAITING ON YOU › ⌕/ + New card
‹Developmentesc
STAGE RULES {{ s.l }}{{ s.ov }}
{{ srCur.l }}{{ srCur.d }}{{ srPvL }}✕
WHAT THE AGENT RECEIVES{{ srPvMeta }}
{{ p.src }}{{ p.l }}{{ p.from }}{{ p.tok }}{{ p.car }}
{{ p.v }}
Built from the rules on this page for {{ srPvFor }}. A real card adds its own request, plan and findings.
CARD TYPE{{ t.l }}{{ t.n }} PROJECT{{ t.l }}{{ t.n }}
{{ srScopeL }}
Already in the promptwhat this stage’s agent is told before any rule below{{ srDefL }}
{{ d.hd }}{{ d.kl }}•{{ l }}
{{ r.icon }}
{{ r.l }}NEW🔒 {{ r.lockL }}{{ r.src }}reset to default{{ r.ovL }} {{ r.ovCar }}
{{ ov.scope }}{{ ov.v }}Go ›
{{ r.what }} ☁ {{ r.v }}
{{ o.g }}{{ o.l }} ✓ {{ pr.l }} {{ o.d }}
☁ ON CLOUD WORKERS{{ r.cloud.l }}{{ r.cloud.v }}{{ cs.l }}{{ r.cloud.txt }}
ADVANCED{{ srAdvSum }}{{ srAdvL }}
{{ r.icon }}
{{ r.l }}NEW🔒 {{ r.lockL }}{{ r.src }}reset to default{{ r.ovL }} {{ r.ovCar }}
{{ ov.scope }}{{ ov.v }}Go ›
{{ r.what }} ☁ {{ r.v }}
{{ o.g }}{{ o.l }} ✓ {{ pr.l }} {{ o.d }}
☁ ON CLOUD WORKERS{{ r.cloud.l }}{{ r.cloud.v }}{{ cs.l }}{{ r.cloud.txt }}
OVERRIDES IN {{ srCurU }} None: every card and project uses the defaults. {{ o.scope }}{{ o.l }}: {{ o.v }}instead of {{ o.was }}
Session guidancepart of every card session’s context file · edits apply to new sessions · a card’s Insights tab shows what one session got
{{ ctxText }}
{{ c.h }}{{ c.src }}{{ c.from }}{{ c.tok }}{{ c.car }}
{{ c.v }}
What {{ srCur.l }} writes into the cardheadings the next stage and you read · GATE: Grid refuses the move without it
{{ q.mk }}{{ q.l }}{{ q.h }}GATE🔒 always{{ q.d }}
{{ srNoteL }}added to this stage’s prompt for these cards · {{ srNoteN }} / 600
Approval{{ srAAScope }}
WHO APPROVES{{ m.l }} {{ aaModeNote }}
WHAT FINDINGS DO The review agent rates every problem it finds as critical, important or minor. Pick what each kind does. This runs before anyone approves, you or Grid.
{{ f.sev }} {{ f.ex }}{{ f.d }}
HOW GRID DECIDESin your words; Grid reads this before every {{ aaNoun }} Add+ {{ p.l }} ALWAYS ASK ME WHEN {{ x.ck }}{{ x.l }} These win over the prompt. Grid checks them from the plan and diff, not from its own judgment.
QUIET HOURSdifferent behaviour while you are away
{{ w.l }}{{ w.from }} – {{ w.to }}{{ w.days }}Remove {{ o.l }}{{ o.d }}
+ Add a window
TRY IT ON YOUR LAST 20{{ aaTry }} {{ r.t }}{{ r.why }}GRID: {{ r.g }}YOU: {{ r.y }}
Every auto-approval writes its reason on the card. You can send any of them back until it is delivered.
{{ r.l }}
{{ col.name }}{{ col.num }} {{ col.sub }}
⚙Stage rules
{{ k.acct }} {{ k.acctTip }} {{ k.tyL }} {{ k.p }} New {{ k.needChip }} {{ k.t }} {{ k.line2 }} {{ k.blocked }} {{ k.sched }} {{ k.tkL }} {{ s.mk }} {{ s.t }} {{ k.codeSaved }} {{ k.mdOwnerG }}{{ k.mdOwner }}{{ k.mdConflict }} {{ k.age }} {{ k.wkN }} {{ k.holder }} {{ k.agSt }} {{ k.ownL2 }}
{{ col.more }} + Add
CARDPROJECTSTATUSAGENTAGE
{{ gr.d }} {{ gr.l }} {{ gr.n }} {{ gr.hint }}
{{ r.t }}{{ r.stg }} {{ r.p }} {{ r.pill }}{{ r.status }} {{ r.ag }} {{ r.age }}
{{ gr.emptyT }}
‹Needs you{{ ndRailN }}
{{ ri.l }} {{ ri.n }} {{ ri.chip }} {{ ri.t }} {{ ri.sub }} {{ ri.p }}·{{ ri.stg }}
{{ blCard.tyL }} {{ blCard.p }} {{ blCard.ph }} {{ blCard.touched }} ⋯
{{ blCard.t }} {{ blCard.who }} · {{ blCard.created }} {{ f.k }}{{ f.v }}{{ f.by }}▾ ✦ {{ f.why }} {{ tt.l }}{{ tt.s }}
{{ blCard.taskG }}THE TASK {{ blCard.task }}
{{ blCard.accG }}ACCEPTANCE{{ blCard.accSub }} ▢{{ a }} Not written yet · Grid drafts it in the refine thread once the questions are answered. + criterion
{{ blCard.scG }}SCOPE Not drawn yet. IN{{ blCard.scInT }} OUT{{ blCard.scOutT }}
✓DESIGN{{ blCard.dsLinkedSub }} {{ db.g }}{{ db.l }}
{{ blCard.mpG }}MASTERPLAN{{ blCard.mpSub }}{{ blCard.mpAcL }}{{ blCard.mpKpL }} {{ blCard.mpNote }} {{ sb.n }}{{ sb.t }}{{ sb.tyl }}{{ sb.dep }}
{{ blCard.dsG }}DESIGN{{ blCard.dsSub }}change {{ blCard.dsLine }} {{ pp.g }}{{ pp.l }}{{ pp.sub }}✓ ✦ Open in Claude Design{{ blCard.cdProj.url }} · {{ blCard.cdV }}attach a file
□{{ cs.title }}remove {{ cs.body }}
+ section
LINKED {{ ln.g }}{{ ln.l }} ▦{{ w.t }}· {{ w.st }} + link
HISTORY {{ hh.when }}{{ hh.t }}
✦Refine· read {{ blCard.readSub }}re-read {{ blCard.readyLine }}
✦{{ m.t }}{{ a.l }} {{ m.t }} ✦{{ m.n }}{{ m.why }}{{ m.t }}{{ o.l }}or type below✓{{ m.ans }}· {{ m.effect }}change
{{ c.l }}
{{ blCard.saveState }} {{ blCard.startHint }} Save ▶ {{ blCard.startL }}
{{ ndGreeting }} {{ ndHeadline }} {{ ndOldest }}
{{ g.l }}{{ g.n }} {{ g.emptyT }}
{{ r.verb }} {{ r.t }}{{ r.p }}·{{ r.stgL }} {{ r.what }} {{ r.wait }}
{{ pz.n }}{{ pz.l }} {{ pz.sub }}
MEANWHILE?
{{ e.l }} {{ e.when }} {{ e.d }} {{ e.t }}{{ e.st }}{{ e.who }}{{ e.p }} {{ e.line }}
Backlog {{ blCount }} items · {{ blTopicN }} topics · {{ blReadyN }} ready ✓ {{ blNote }} ⇄ Sources {{ blSrcN }} + Topic + New idea
Linked toolsIdeas come in from these; Grid refines them here and writes status and summaries back. Crew plan.+ Link a tool✕
{{ s.ic }}{{ s.n }}{{ s.st }} {{ s.where }} {{ r.k }}{{ r.v }} {{ s.last }}Sync now
An idea keeps its origin as a badge. When it becomes a card, the source gets the card link and status; when it closes, the source gets the summary and the PR. Nothing in a source is changed without a rule that says so.
‹Backlog{{ blCount }}
{{ ri.l }} {{ ri.n }} {{ ri.chip }}{{ ri.src }} {{ ri.t }} {{ ri.sub }} {{ ri.p }}·{{ ri.verb }}
{{ blCard.tyL }} {{ blCard.p }} {{ blCard.ph }} {{ blCard.touched }} ⋯
{{ blCard.t }} {{ blCard.who }} · {{ blCard.created }} {{ f.k }}{{ f.v }}{{ f.by }}▾ ✦ {{ f.why }} {{ tt.l }}{{ tt.s }}
{{ blCard.taskG }}THE TASK {{ blCard.task }}
{{ blCard.accG }}ACCEPTANCE{{ blCard.accSub }} ▢{{ a }} Not written yet · Grid drafts it in the refine thread once the questions are answered. + criterion
{{ blCard.scG }}SCOPE Not drawn yet. IN{{ blCard.scInT }} OUT{{ blCard.scOutT }}
✓DESIGN{{ blCard.dsLinkedSub }} {{ db.g }}{{ db.l }}
{{ blCard.mpG }}MASTERPLAN{{ blCard.mpSub }}{{ blCard.mpAcL }}{{ blCard.mpKpL }} {{ blCard.mpNote }} {{ sb.n }}{{ sb.t }}{{ sb.tyl }}{{ sb.dep }}
{{ blCard.dsG }}DESIGN{{ blCard.dsSub }}change {{ blCard.dsLine }} {{ pp.g }}{{ pp.l }}{{ pp.sub }}✓ ✦ Open in Claude Design{{ blCard.cdProj.url }} · {{ blCard.cdV }}attach a file
□{{ cs.title }}remove {{ cs.body }}
+ section
LINKED {{ ln.g }}{{ ln.l }} ▦{{ w.t }}· {{ w.st }} + link
HISTORY {{ hh.when }}{{ hh.t }}
✦Refine· read {{ blCard.readSub }}re-read {{ blCard.readyLine }}
✦{{ m.t }}{{ a.l }} {{ m.t }} ✦{{ m.n }}{{ m.why }}{{ m.t }}{{ o.l }}or type below✓{{ m.ans }}· {{ m.effect }}change
{{ c.l }}
{{ blCard.saveState }} {{ blCard.startHint }} Save ▶ {{ blCard.startL }}
TOPICS+ Addall ✕
{{ tp.name }}{{ tp.p }} {{ tp.intent }} {{ tp.n }}{{ tp.ready }}{{ tp.need }}
{{ col.l }}{{ col.n }}+ Add{{ col.hint }}
{{ k.tyL }} {{ k.p }} {{ k.age }} {{ k.t }} ◫ {{ k.topic }}◫ {{ k.sugg }}GRID SUGGESTS · KEEP {{ k.rdN }}{{ k.rdMiss }} DECIDE{{ k.ask }}
{{ col.emptyT }}
⋮⋮{{ tp.rank }} {{ tp.chev }} {{ tp.name }} {{ tp.p }} {{ tp.intent }} {{ tp.sum }}
TYPEITEMPROJECTDIFFICULTYPRIORITYREADINESS
⋮⋮{{ r.tyL }} {{ r.t }}{{ r.src }}{{ r.kick }}{{ r.line }} {{ r.p }} {{ r.df }} {{ r.priG }}{{ r.pri }} {{ r.rdN }} {{ r.bl }}
Code ?
PROJECTS · {{ codeProjN }} {{ pr.p }}{{ pr.sub }}
{{ codeSel.p }}{{ codeSel.repo }}
MAIN TREE ⌂main{{ codeSel.mainDirty }}open ›
ACTIVE CARDS{{ codeSel.activeN }} · each on its own worktree No open cards on this project.
{{ c.t }} {{ c.stage }} ⌂ {{ c.tree }} {{ c.ag }}
ON MAIN? Nothing closed yet. ✓{{ c.t }}{{ c.age }}
{{ envTabTitle }} {{ envSummary }} {{ envChecked }} ↻ Check now
PROJECTS · {{ envProjN }} {{ pr.d }}{{ pr.p }}{{ pr.sub }}
{{ envSel.p }} {{ envSel.repo }} {{ envSel.discL }}
{{ envSel.discNote }}
{{ pi.title }}✕ Connect once for all of Grid. Grid talks to the manager’s own app or CLI on this computer; you unlock it there. Grid never sees or stores your master password. {{ m.l }}{{ m.how }}{{ m.det }} Cancel{{ pi.connL }} {{ pi.unL }}{{ pi.unD }} Change manager {{ it.k }}{{ it.l }}{{ it.sub }} Use from “{{ pi.pL }}”{{ f.l }} {{ f.l }}{{ pi.modeNote }} CancelContinue
{{ scM.title }}✕ {{ o.l }} {{ scM.nL }}{{ scM.vL }}{{ scM.ref }}{{ scM.refL }} Website optional Environments {{ scM.envReq }}{{ o.l }}+ Environment Add environmentDiscover fills in how it deploys and its health check afterwards. Grid may{{ o.l }} {{ scM.store }} CancelSave
RUNNING NOW{{ envSel.runsHint }}
▸ {{ x.d }} {{ x.n }} {{ x.tree }} {{ x.state }} {{ x.up }} {{ x.act }}
{{ p.d }}{{ p.n }}{{ p.port }} Logs{{ a.l }} {{ p.url }} ↗{{ p.cmd }}{{ p.state }}
{{ x.err }}
Nothing is running for this project. Start a run config below.
RUN CONFIGSwhat a run is made of+ Create one
New run configsay what it should do; Grid writes it from the services it knows and what you add {{ x.l }} ✦ Let Grid write itruns as a task; you approve the config before it is savedCancel
{{ c.n }}● {{ c.liveN }} {{ c.what }} {{ ch }} on{{ c.wt }}▾ {{ w.tree }}{{ w.card }}{{ w.note }} {{ c.bl }}
ACCOUNTS & SECRETS{{ scL.sub }}{{ scImpL }}+ Add
{{ r.k }}{{ r.n }}{{ r.meta }}{{ r.may }}Remove
Nothing yet. Add a login or an environment variable.
ENVIRONMENTS · {{ envSel.remN }}across {{ envSel.repoN }} repos{{ envSel.host }}
⎇{{ rg.repo }}{{ rg.n }} Nothing deployed from this repo.
{{ r.d }}{{ r.n }}{{ r.app }} {{ r.url }} ↗ {{ r.sha }}{{ r.br }} Deployed {{ r.age }}{{ r.res }}{{ r.via }} › {{ r.health }}Add a check {{ r.note }}
▸{{ rg.oldL }}
{{ r.d }}{{ r.n }}{{ r.app }} {{ r.url }} ↗ {{ r.sha }}{{ r.br }} Deployed {{ r.age }}{{ r.res }}{{ r.via }} › {{ r.health }}Add a check {{ r.note }}
{{ envSel.remoteFoot }}
DEPLOYMENT ACCOUNTScredentials for deploying this environment
{{ ac.d }}{{ ac.n }}{{ ac.how }}Add credentials{{ ac.state }}
ACCOUNTS & SECRETS{{ scR.sub }}{{ scImpL }}+ Add
{{ r.k }}{{ r.n }}{{ r.meta }}{{ r.may }}Remove
Nothing yet. Add a login or an environment variable.
PIPELINES · {{ envSel.pipeN }}across {{ envSel.repoN }} repos{{ envSel.ciHost }}Open {{ envSel.ciHost }} ↗
⎇{{ rg.repo }}{{ rg.n }}{{ rg.st }} No pipelines found in this repo.
{{ pl.d }}{{ pl.n }}{{ pl.trigger }}{{ pl.state }}{{ pl.age }}{{ a.l }} {{ sp.d }}{{ sp.n }}{{ sp.t }} {{ pl.err }}
RECENT RUNSlast 10 across pipelines
{{ rn.d }}{{ rn.pipe }}{{ rn.repoS }}{{ rn.ref }}{{ rn.by }} · {{ rn.dur }} · {{ rn.age }}
CLOUD WORKERS{{ cwSum }}{{ cwAcct }}
{{ cwHead5L }}{{ cwSplit }}{{ cwHeadWL }}
Sessions draw on the primary account's plan; there is no VM charge. CPU and memory of this machine are under System performance; each card's own sessions are on its Compute tab.
{{ cwEmptyT }}
{{ g.p }}{{ g.nL }} · {{ g.modeL }}Configure ›
{{ hh.k }}{{ hh.v }}
{{ r.t }}{{ r.stage }} · {{ r.ctx }} · {{ r.acct }}{{ r.sL }} {{ r.meta }}
{{ r.ask.ask }}{{ r.ask.type }} {{ r.ask.rec }} {{ r.ask.check }} · {{ r.ask.eff }} Answer on the cardWake with a message
PREVIEWSGrid tunnels into running VMs, opened in the built-in browser; they live as long as the session {{ pv.t }}{{ pv.url }}{{ pv.st }}Open
{{ s.k }} {{ s.l }} {{ s.st }} {{ ac.l }}
{{ s.note }}
{{ r.t }} {{ r.sub }} {{ r.tag }} {{ pk.k }} {{ pk.v }} ▾
{{ s.pmCur.ic }}Secrets come from {{ s.pmCur.n }}{{ s.pmCur.st }}Change No password manager connectedGrid can still use the macOS Keychain on this Mac.Connect a password manager
Which one do you use?{{ p.ic }}{{ p.n }} {{ s.pmWiz.ic }}Connect {{ s.pmWiz.n }} {{ s.pmWiz.how }} 🔒{{ s.pmWiz.safe }} {{ s.pmWiz.btn }}‹ Another one Cancel
{{ h.n }}{{ h.t }}
SECRETCOMES FROMFORAGENT MAYASKS YOU
{{ x.l }}{{ x.n }} {{ x.src }}{{ x.ref }} {{ x.env }}▾ {{ x.use }}▾ {{ x.ask }}▾
{{ m.l }}{{ m.d }}
CAN IT RUN IN THE CLOUD{{ s.rxEligSum }}{{ s.rxLive }}{{ s.rxDiscL }} Grid clones the project into a Linux VM, runs the setup script and the test command, and reports which stages can run there and why. Nothing runs in the cloud until this has passed. ●cloning · setup script · test command · writing the result…
{{ x.s }}{{ x.w }}↺{{ x.why }}
ENVIRONMENThow the VM is set up; filled in by the check, yours to change{{ s.rxEnvNote }} SETUP SCRIPTruns once per environment; cached as a snapshot when under 5 minutes↺ Grid’s guess SESSION STARTone disposable database per session, seeded with a named scenario; never real personal data↺ Grid’s guess NETWORKwhat the VM may reach {{ m.l }}{{ m.d }} TUNNEL THE APPopen the running app’s ports from the VM in the built-in browser, as if it ran here{{ s.rxTunnelL }} {{ pt.l }} INJECTED VARIABLESset in the VM at start; values come from Accounts & secrets and never reach the model+ Add from Accounts & secrets
{{ x.mk }}{{ x.n }}{{ x.from }}{{ x.stL }}
{{ s.emptyT }} {{ s.foot }}
{{ pjEdE.kind }} {{ pjEdE.title }} ✕
{{ f.l }}{{ f.hint }} {{ o.l }} {{ f.note }}
Remove Done
{{ w.ic }}{{ w.l }}
Code
{{ mi.sec }} {{ mi.l }} {{ mi.k }} plugins add items here · editor.contextMenu
WHO CALLS {{ ccTitle }} {{ ccCount }} ✕
{{ c.n }}{{ c.ln }} {{ c.d }} ›
bright rows are indexed: click to jump to the calling line · grey callers are not indexed yet
FILES ± changed only
⊼ {{ r.l }} {{ r.wt }} {{ r.wtChev }} {{ wo.l }} {{ wo.sub }} {{ r.folder }} ⬒ {{ r.l }} {{ r.ig }} {{ r.l }} {{ r.meta2 }}
{{ cvDir }} {{ cvFileName }} {{ cvLang }} ⃺{{ cvWtCur }}·{{ cvWtCard }} ✓ {{ cvSavedL }} {{ cvDirtyL }} Save · update card ⌘S Discard {{ cvImportsL }}
{{ cvFootL }} ⌘S saves to the card · ⌘F finds · ⌃Space completes · Tab accepts the ghost text
GOAL OF THIS FILE {{ cvModelName }} {{ cvTldr }} {{ cvAbout }}
{{ c.label }} {{ c.hint }}
{{ c.mark }} {{ c.stage }} {{ c.t }} {{ c.key }} {{ c.age }} {{ c.chev }}
WHAT THIS CARD IS {{ cvSelModel }} {{ cvSelCx }} {{ cvSelMicro }}
{{ cvAgId }} AGENT {{ cvAgState }} {{ cvAgStep }} {{ s.mk }} {{ s.t }} {{ cvAgWhy }} {{ cvAgCta }} ›
WHAT IT CHANGED HERE {{ h.what }} {{ h.addTxt }} {{ h.delTxt }}
FILES THIS CARD CHANGED {{ cvSelFilesN }} click to open {{ fl.n }} {{ fl.addTxt }} {{ fl.delTxt }} {{ fl.planned }} {{ fl.chev }}
closed: the conversation lives in the receipt view receipt › show full card ›
Select a card. Its changes light up in the code, the why opens here, and open cards take messages.
Terminal ? LAYOUT {{ g.l }}
{{ t.l }} {{ t.sub }} ✕ drop here {{ termMoveNote }}
Not enough room for its terminals {{ termAskText }} Keep the tab Close the tab and its terminals
OPEN CARDS {{ c.t }} {{ c.st }} cancel
WHICH FOLDER? ›_ {{ d.cwd }} cancel
›_ Open a new terminal Open a card's session… ?
{{ s.key }} {{ s.st }} ›_ {{ s.cwd }} {{ s.title }} ⇄ ✕
{{ ln.t }}
{{ tfKey }} {{ tfSt }} {{ tfP }} {{ tfTitle }}
{{ tfKick }} {{ tfLine }} THIS CARD {{ tfSum }} TASKS {{ tk.mk }} {{ tk.t }}
Open the card ›
OPEN CARDS Click a card terminal to see its details here. Click a card below to open its session in a free slot.
{{ c.key }} {{ c.st }} {{ c.inTab }} {{ c.t }} {{ c.word }}
◫All projects{{ pjRailN }} PROJECTS {{ pr.n }}{{ pr.sub }}
Projects {{ pjCount }} {{ pjHiddenL }} + Add project
WORKSPACE DEFAULTS {{ d.k }} {{ d.v }} ▾ every project starts here and can override itStages & cards: Workspace settings ›
{{ p.n }} {{ p.path }} {{ p.health }} {{ p.eyeL }}
{{ c.g }} {{ c.l }} {{ p.cards }} {{ p.shared }}
{{ pjEd.kind }} {{ pjEd.title }} ✕
{{ f.l }}{{ f.hint }} {{ o.l }} {{ f.note }}
Remove Done
{{ pjD.n }} {{ pjD.path }} {{ pjD.saved }}
PROJECT {{ pjD.visL }}
FOLDER Choose… {{ pjD.pathNote }}
COLOUR LLM ACCOUNT {{ pjD.acct }} ▾
⚙ Stage rules for {{ pjSrName }}{{ pjSrSum }} Open stage rules ›
{{ s.k }} {{ s.l }} {{ s.st }} {{ ac.l }}
{{ s.note }}
{{ r.t }} {{ r.sub }} {{ r.tag }} {{ pk.k }} {{ pk.v }} ▾
{{ s.pmCur.ic }}Secrets come from {{ s.pmCur.n }}{{ s.pmCur.st }}Change No password manager connectedGrid can still use the macOS Keychain on this Mac.Connect a password manager
Which one do you use?{{ p.ic }}{{ p.n }} {{ s.pmWiz.ic }}Connect {{ s.pmWiz.n }} {{ s.pmWiz.how }} 🔒{{ s.pmWiz.safe }} {{ s.pmWiz.btn }}‹ Another one Cancel
{{ h.n }}{{ h.t }}
SECRETCOMES FROMFORAGENT MAYASKS YOU
{{ x.l }}{{ x.n }} {{ x.src }}{{ x.ref }} {{ x.env }}▾ {{ x.use }}▾ {{ x.ask }}▾
{{ m.l }}{{ m.d }}
CAN IT RUN IN THE CLOUD{{ s.rxEligSum }}{{ s.rxLive }}{{ s.rxDiscL }} Grid clones the project into a Linux VM, runs the setup script and the test command, and reports which stages can run there and why. Nothing runs in the cloud until this has passed. ●cloning · setup script · test command · writing the result…
{{ x.s }}{{ x.w }}↺{{ x.why }}
ENVIRONMENThow the VM is set up; filled in by the check, yours to change{{ s.rxEnvNote }} SETUP SCRIPTruns once per environment; cached as a snapshot when under 5 minutes↺ Grid’s guess SESSION STARTone disposable database per session, seeded with a named scenario; never real personal data↺ Grid’s guess NETWORKwhat the VM may reach {{ m.l }}{{ m.d }} TUNNEL THE APPopen the running app’s ports from the VM in the built-in browser, as if it ran here{{ s.rxTunnelL }} {{ pt.l }} INJECTED VARIABLESset in the VM at start; values come from Accounts & secrets and never reach the model+ Add from Accounts & secrets
{{ x.mk }}{{ x.n }}{{ x.from }}{{ x.stL }}
{{ s.emptyT }} {{ s.foot }}
04 Memory {{ pjMem.sum }} Compact now + Add by hand
{{ tb.l }} {{ tb.n }}
{{ pjMem.note }}
STORED IN {{ pjMem.file }} Open the folder
SUMMARY TYPE SUBJECT USED CREATED
{{ m.chev }} {{ m.sum }} {{ m.ty }} {{ m.subject }} {{ m.uses }} {{ m.when }}
{{ m.body }} {{ m.src }} Edit Delete
{{ pjMem.emptyT }}
THIS WORKSPACE {{ wsName }} {{ wsKind }} SETTINGS {{ w.i }} {{ w.l }} {{ w.n }} + Add project
Workspace settings that belong to the whole workspace, not one project Browse registry + Install from file Import from VS Code Export settings
General where this workspace keeps its files, what it may spend, and what it always asks about
{{ g.kicker }} {{ g.badge }} {{ r.l }} {{ r.hint }} {{ o.l }} {{ r.val }} {{ r.unit }}
Ask GridHow Ask Grid behaves when you ask it something. These rules go in front of every question, so it knows what it may do itself and what it hands to a card.
RULES{{ ahSum }}
{{ r.ic }} {{ r.n }} {{ r.t }} {{ r.edL }}Remove
+ Add a rule
WHERE A REQUEST GOES {{ x.a }}→{{ x.b }}
WHAT ASK GRID RECEIVES
{{ ahPrompt }}
Workspace settingswhat every stage does in every project; projects and card types override single values
{{ t.g }}{{ t.l }}{{ t.n }}
{{ wrS.lead }}
{{ s.l }}{{ s.overL }}{{ s.desc }} {{ s.walkL }} {{ s.editL }}
{{ r.l }} {{ r.val }}
Note{{ s.note }}
‹ ›
{{ wrS.mTitle }}✕ {{ wrS.mSub }} {{ wrS.mWalkL }}
{{ r.ic }} {{ r.l }}NEW{{ r.d }}
{{ o.g }}{{ o.l }}
{{ o.g }}{{ o.l }}
{{ r.cur }}
Still asks you when the change involves
{{ o.g }}{{ o.l }}
● {{ r.wsL }}↺ {{ r.resetT }}
Note for the agentAnything else it should do at this stage, appended as written.
APPENDED TO THE AGENT’S PROMPT
{{ wrS.mPrompt }}
Changes apply straight away.Done
CARD RULESWhat goes in a cardA card is free Markdown. The agent writes the headings the work needs; only a few are fixed.
🔒Headings Grid reads Grid looks for these to know a stage is done, so every card writes them when it reaches that stage.
{{ f.st }}{{ f.h }}{{ f.sub }}
☑Tasks Prepare writesEdit Prepare plans the whole card as checkboxes for each later stage. Grid adds these to every plan; the agent adds the rest.
{{ t.st }}{{ t.n }}[ ]{{ i }}Only what the agent plans
✦Sections it may add Suggested, never required. The agent writes one only when the card needs it.
{{ o.g }}{{ o.l }}
✦ {{ crW.idea }}Suggest itNot now
Add
Tasks Prepare writes✕One task per line. Prepare puts these in every plan, under the stage they belong to, next to the tasks it plans itself.
{{ t.st }}{{ t.d }}
Changes apply straight away.Done
Agents and models which agent runs the cards, and what each of the three model roles resolves to
AGENT PROVIDER {{ p.n }} {{ p.st }} {{ p.d }} {{ p.link }}
COMPUTE BUDGET{{ gsBudNote }} {{ b.l }} {{ b.d }}
THE FOUR ROLESmodel and effort per difficulty. Click any cell to change it. DIFFICULTY PLANNING IMPLEMENTATION REVIEW DELIVERY & VALIDATION {{ m.l }} {{ c.m }}▾ {{ c.e }}▾ {{ gsMatrixFoot }}
GRID INTELLIGENCEthe small jobs Grid does for you in the background ✓{{ j.t }} {{ g.n }} {{ g.d }} {{ g.link }} MODEL {{ mm.l }}{{ mm.h }}
DYNAMIC WORKFLOWwhat ultracode is allowed to spin up At ultracode effort an agent stops working alone: it opens a dynamic workflow and starts several agents on the same card, then reconciles their diffs into one. A Masterplan card does the same to run its subcards. This cap is how many of those may exist at once. AGENTS PER CARD, AT MOST {{ l.n }} {{ l.l }} Cards at low or medium effort run one agent and ignore this. Only ultracode reaches the cap. {{ capSmallMk }} Let an agent drop to a smaller model when a step is simple {{ capSmallNote }}
Accounts which Claude or Codex login a card bills to — add, switch the workspace default, and remove
REGISTERED {{ a.ini }} {{ a.l }} {{ a.pv }} PRIMARY {{ a.stL }} ACTIVE Set active Check Remove {{ a.line }} {{ acctFoot }}
WORKSPACE DEFAULT what a new card bills to unless its project or the card says otherwise {{ o.ini }}{{ o.l }}{{ o.sub }} POOLS {{ poolNote }} ∷{{ p.l }}{{ p.bill }}RenameRemove pool {{ m.ini }}{{ m.l }}{{ m.head }}✕ + {{ c.l }} no accounts: cards pointed here wait HOW IT PICKS {{ s.l }}{{ s.d }} {{ p.stratNote }} {{ p.used }} CREATE A POOL add accounts from any provider once it exists {{ newPool.err }} Create
ADD AN ACCOUNT {{ p.l }} {{ acctAddNote }} LABEL Work THEN RUN THIS IN YOUR OWN TERMINAL {{ acctLoginCmd }} {{ acctCopilot }}
CARD IDENTITIES {{ acctIdentNote }} {{ r.l }} {{ r.chip }} {{ r.why }}
SDLC the workflow the board runs. Click a stage for its contract, or the dashed arrow between two stages to edit what runs on it
WORKFLOW PROVIDERthe plugin that owns the stages, their contracts and what runs between them {{ p.l }} {{ p.st }} {{ p.d }} {{ p.link }}
{{ r.l }} {{ r.role }} {{ r.cmdHint }} › {{ r.checkHint }}
{{ sdTitle }} stage {{ sdIdx }} of 7 {{ sdScope }}
MODEL ROLE{{ sdRoleNote }} {{ x.l }} {{ x.sub }} A stage names a role, not a model. Change what the role resolves to in Agents and models, and every stage using it follows. A new stage inherits a model the moment you name its role.
{{ sdFrom }} › {{ sdTo }} {{ sdTrig }}
What the agent is told at this arrow now lives with the stage: its rules, what it writes and what is already in the prompt are in Stage rules; its role prompt and stage text are on its agent.Stage rules ›Agent ›
MUST BE TRUE TO PASS{{ sdChecksNote }} {{ c.mk }} {{ c.t }} {{ c.by }} + add a check
COMMANDS · 3the prompt each stage sends
{{ c.n }}{{ c.used }} {{ c.f }} {{ c.ln }} · {{ c.mod }} · ◆ {{ c.by }}
Commands are files on disk, so they diff and commit like code. Another provider contributes its own set. DEFAULT PROFILE◆ claude-provider Workspace defaults for every new card. A card can be raised or lowered when you create it; a project can pin its own. {{ q.l }}{{ q.k }} {{ o.l }} {{ q.d }}
{{ c.n }}{{ c.f }}Reset to default COMMAND LINE {{ c.cmd }} PROMPT · EDITABLE {{ l }} … {{ c.ln }} total Used by {{ c.used }} in the active SDLC. Change which command a stage calls in Settings › SDLC.
UNVERIFIED PLUGINS ALLOWED this workspace loads plugins nobody signed, with the permissions their manifests claim Turn it off
BUNDLED · {{ plugBundledN }}Shipped with 0.1.0 and on by default. Core keeps cards, worktrees, rewind and the licence; everything with an opinion in it is one of these.
{{ p.n }} v{{ p.v }} · {{ p.by }} {{ p.src }} {{ p.trustW }} {{ p.tl }} {{ p.sigNote }} {{ p.blockedNote }} {{ p.d }} {{ p.hooks }} ⚙{{ p.cfgL }}{{ p.cfgOpen }} Read from the manifest, so Grid can show these without loading the plugin. {{ c.k }}{{ c.t }} {{ c.v }}
INSTALLED · {{ plugInstalledN }} Added to this workspace after the fact: installed from the registry, or a .gridplugin handed to you. Writing and sideloading your own is free on every tier.
{{ p.n }} v{{ p.v }} · {{ p.by }} {{ p.src }} {{ p.trustW }} {{ p.tl }} {{ p.sigNote }} {{ p.blockedNote }} {{ p.d }} {{ p.hooks }}
Allow unverified plugins {{ plugAllowNote }} {{ plugAllowL }} PUBLISHER KEYS {{ k.w }} {{ k.fp }} {{ k.who }} {{ k.act }} ?
NOT INSTALLED · {{ plugMarketN }} · MARKETPLACE {{ c.l }} Browsable now, installable when the marketplace opens with the public beta. Writing and sideloading your own is free on every tier.
{{ p.n }} {{ p.tr }} v{{ p.v }} · {{ p.by }} {{ p.d }} {{ p.hooks }} {{ p.ins }}
AGENT & MODEL PROVIDERSEvery model picker in Grid lists these. One provider plugin is required; the rest are optional.
{{ pr.n }} {{ pr.d }} {{ pr.s }}
WHAT A PLUGIN MAY DODeclared in the manifest and shown before you install. Grid refuses anything the manifest did not ask for.
{{ x.mk }} {{ x.k }} {{ x.d }}
{{ ideTitle }} {{ ideSub }}
{{ g.k }} {{ r.l }}{{ r.d }} {{ o.l }}
LANGUAGE INTELLIGENCE{{ liSummary }} {{ t.k }} {{ t.d }} {{ t.m }} A language with no server still folds, outlines and highlights: structure never depends on an install. Adding one is a config row, not a release.
KEYMAP{{ kmCount }}⌕
{{ p.l }}One set of shortcuts: ⌘ on macOS is Ctrl on Windows and Linux, ⌥ is Alt. Click a key to change it.↺ Reset all
{{ g.l }}
{{ r.c }}NEW{{ r.w }}{{ r.movedT }} ↺ {{ r.k }}
No shortcut matches.
SYNC Settings follow your Grid account: this machine and 2 others. Import from VS Code reads keybindings.json and settings.json; nothing is sent until you confirm.
Sync✕ Sync keeps this board on your other devices, encrypted with a key only you hold. Nobody at Grid can read it. ▯ PhoneAnswer questions and approve reviews from anywhere. ▤ Other computersThe same board on every machine you own. One with the repos can run. ▦ TeamShare chosen projects with people, with a link. Needs Teams. WHAT SYNCS Cards, questions, reviews, sessions and provenance. WHAT NEVER LEAVES THIS MACHINE Repositories, worktrees, diffs and terminals. Turn on syncThis isn’t my first deviceSolo licence ✓ · sync plugin ✓ Sync{{ mdSyncStateL }}{{ mdSyncModalSub }}✕ ○ Offline. Keep working; everything is kept here and sent when the connection is back. Retrying every 30s. +Add a phoneAnswer and approve from anywhere. It never runs cards. +Connect another computerGrid on a second Mac or PC shares this board and can run cards. +Connect a serverA Linux machine of yours runs cards while this computer is off. Join another deviceThis computer is new: join the board you already run in Grid on another device.Join › Your devices{{ mdDevCountL }} WANTS TO JOINTravel MacBook shows wren 47 cobalt. Same words there?Yes, approveNo
{{ r.name }}This computer{{ r.kindL }} {{ r.can }} {{ r.stL }} {{ r.cfgL }}Remove
!{{ x.h }} {{ x.msg }}{{ x.actL }}
Only this computer so far. Add your phone or another computer above.
TeamNEEDS TEAMSShare projects…Join a team…Upgrade to Teams Share chosen projects with other people and decide what each of them may do. Your own devices above never need Teams. {{ t.l }}{{ t.role }}{{ t.sub }} {{ t.meta }} {{ t.act }} Nothing shared yet. Share projects from this board, or join a team with the link its owner sent you. Advanced…{{ mdQueueSummary }}{{ mdSyncEscNote }}
‹ Back{{ mdScrTitle }}✕ Install Grid on the phone, then do one of these. The phone gets the board; it can answer and approve, never run. SCANOpen Grid on the phone › Join › point the camera here. Expires in 9:41. OR SEND A LINKhttps://sync.gridconsole.dev/d/grid-9kq2vtCopy linkMessage it…Open it on the phone. Works once, for 10 minutes. ▌ Waiting for the phone… ‹ Back{{ mdScrTitle }}✕ A worker is a Linux machine of yours that runs these projects’ cards as you, Mac on or off. WORKER NAMELetters, digits, spaces, dots and dashes; up to 60. PROJECTS IT WORKS ON {{ wkAllCk.ck }}All projects{{ o.l }} {{ r.ck }}{{ r.l }}{{ r.sub }}{{ r.lock }}{{ o.l }} {{ g.l }} · {{ g.d }} Active projects, most used first.{{ wkInactiveL }} COMMITS ASAbdullahi Egal <dev@gridconsole.dev> HOME DIRECTORY ON THE SERVERUse an absolute path, like /var/lib/grid-worker or /srv/grid.Where it keeps checkouts, worktrees and its state. Leave the default unless that disk is small. Your plan allows 2 workers; 2 in use.See plans Add a worker{{ wkAllow }} Approve a Claude login for {{ wkName }} in your browser: sign in with the Claude account this worker should use, then Authorize. The worker receives it sealed during the join; nothing is typed on the box. ▌ {{ wkApproveL }} Open the page againCancel ▸ The browser shows a code instead · ▸ Paste a token from claude setup-token if the login fails RUN THIS ON THE WORKER · EXPIRES IN {{ wkExp }} {{ wkInstallCmd }} grid-worker join gw_9kq2vt.7f3e1c2a9b {{ wkCopyL }} Nothing to type on the box: it joins your board and fetches {{ wkProjNames }}. Next you give it git access and an agent account. ▌ {{ wkWaitL }} {{ g.t }} Finish setting up {{ wkName }}{{ wkGuideSum }} {{ g.n }} {{ g.l }}optional{{ g.st }} {{ g.d }} {{ a.l }} {{ wkDoneL }}Finish later; its cards wait until then ‹ Back{{ mdScrTitle }}● online✕ Projects{{ wxS.proj.sum }}{{ wxS.proj.warn }}{{ wxS.proj.cta }} {{ wkcAllCk.ck }}All active projects{{ wkInactiveL }} {{ P.ck }}{{ P.l }}{{ P.sub }}{{ P.expL }} {{ it.g }}{{ it.l }}{{ it.d }}{{ it.st }}{{ o.l }}{{ it.actL }} {{ wkcAskL }}Keep itUntick it Repositories are cloned on the server. Grid’s own project files come over Sync. Other files in the project folder stay on your computer unless you choose to copy them; secrets never travel as files. Agents and accounts{{ wxS.agent.sum }}{{ wxS.agent.warn }}{{ wxS.agent.cta }} ACTIVE ON THIS SERVER{{ X.ini }}{{ X.l }}{{ X.k }} ACCOUNTS{{ X.ini }}{{ X.l }}{{ X.sub }}RemoveAdd an account{{ o.l }} POOLS{{ X.l }}{{ m.ini }}{{ X.strat }}Remove {{ m.ini }}{{ m.l }}{{ o.l }}Create poolCancel + Create a pool PROVIDERS INSTALLED{{ X.l }}{{ X.ver }}{{ X.state }}{{ X.actL }} Git access{{ wxS.git.sum }}{{ wxS.git.warn }}{{ wxS.git.cta }} {{ o.l }}{{ wxGitNote }}{{ wxGitTokL }}COMMITS AS Capacity{{ wxS.cap.sum }}{{ wxS.cap.warn }}{{ wxS.cap.cta }} CARDS AT ONCE{{ o.l }}−{{ wkcSlots }}+{{ wkcCapNote }} COMPUTE BUDGET{{ o.l }}{{ wxBudNote }} Server{{ wxS.srv.sum }}{{ wxS.srv.warn }}{{ wxS.srv.cta }} NAME HOME DIRECTORYUse an absolute path.{{ wkcHomeNote }} {{ wkcDetails }} Save{{ wkcSaved }} ‹ Back{{ mdScrTitle }}✕ {{ wrName }} loses access from now. Grid rotates the worker’s workspace key so nothing it kept can read new work, removes its deploy keys from your repositories and frees its place on your plan. What it already fetched stays on the box; nothing is erased remotely. CARDS ON IT{{ c.t }} · {{ c.s }}They stay where they are on the board. Their work up to the last push is safe; start them again once another worker holds the project. STILL YOURS TO REVOKEThe Claude login it holds: revoke it at claude.ai. Remove {{ wrName }}Keep it ✓ {{ s }}Done ‹ Back{{ mdScrTitle }}✕ PROJECTS IT GETS · AND WHAT IT MAY DO {{ cfAllCk.ck }}All projects{{ o.l }} {{ r.ck }}{{ r.l }}{{ r.sub }}{{ r.lock }}{{ o.l }} {{ g.l }} · {{ g.d }} Active projects, most used first. {{ cfSummary }}{{ wkInactiveL }} Save{{ cfSaved }} ‹ Back{{ mdScrTitle }}✕ Install Grid on the other computer, open Sync there and pick This isn’t my first device. Then do one of these. PROJECTS IT GETS · AND WHAT IT MAY DO {{ cpAllCk.ck }}All projects{{ o.l }} {{ r.ck }}{{ r.l }}{{ r.sub }}{{ r.lock }}{{ o.l }} {{ g.l }} · {{ g.d }} Active projects, most used first. {{ cpSummary }}{{ wkInactiveL }} CONNECT IT TYPE THIS CODE THEREwren 47 cobaltThree words, nothing else. You approve it here when it appears. Expires in 9:41. OR SEND A LINKhttps://sync.gridconsole.dev/d/grid-9kq2vtCopy linkMessage it…Open it on the other computer. Works once, for 10 minutes. It gets those projects straight away; you can change each one later from its row under Your devices. To run agents there too, give it a checkout of the repositories — Grid tells you which are missing under the project’s Runs on. ▌ Waiting for the other computer… (simulate request) ‹ Back{{ mdScrTitle }}✕ On the computer that already has your board, open Sync › + Computer. Type the three words it shows, or open the link it gives you. Join After you press Join, approve it on the other computer. The board arrives here; repositories do not. Lost every device?Use the recovery phrase ‹ Back{{ mdScrTitle }}✕ Pick projects, decide what the person may do, send them one link. Cards, sessions and pinned plugins travel; repositories never do. 1 · PROJECTS {{ p.mk }} {{ p.l }}{{ p.sub }} 2 · WHAT THEY MAY DO {{ r.title }} {{ r.tip }} 3 · SEND THIS {{ mdShareLink }}Copy linkRevoke {{ mdShareSummary }} One link, one person, 7 days. Revoke stops new joins; whoever joined stays until you remove them. Create link{{ mdShareSummary }} ‹ Back{{ mdScrTitle }}✕ Paste the link the team’s owner sent you. Before you join, it tells you exactly what you get. {{ mdJoinLink }}Paste Teamacme · owner sara@acme.dev Projectshelios · northwind You maycreate and edit cards, answer, approve · Board only Run agentsNo — not with Board only, even though helios is checked out here. Join acmeNot now ‹ Back{{ mdScrTitle }}✕ {{ mb.who }}{{ mb.role }}{{ mb.meta }}Change access…Remove {{ mb.sub }} SHARED WITH EVERY MEMBERgrid-sdlc-default 0.1.0 · github-deliver 0.1.0 — version-pinned; members get the same stages and commands you have. ‹ Back{{ mdScrTitle }}✕ RECOVERY PHRASESHOWN ONCEThe only way back in if every device is lost. Grid keeps no copy. Write it down; it was shown when you turned sync on.I have it written downRecover a workspace… QUEUE · {{ mdQueueL }} {{ q.g }}{{ q.l }}{{ q.what }}{{ q.t }}{{ q.act }} Everything sent. Nothing waiting. RELAYhttps://sync.gridconsole.dev{{ mdRelayStatusL }}The relay only ever sees encrypted blobs. You can point it at your own server. AUDIT LOG · 90 DAYS {{ e.t }}{{ e.who }}{{ e.what }} TURN OFF SYNC ON THIS COMPUTERThis computer stops sending and receiving. What is already here stays. Other devices keep going.Turn off sync ‹ Back{{ mdScrTitle }}✕ Only when no other device can approve you. Type the eight groups from the phrase you wrote down. J8H4KQ2M7YV3RTBN9WXK5PGC2HDF6QSZ group 5group 6group 7group 8 Recover (4 groups missing) ‹ Back{{ mdScrTitle }}✕ {{ mdRemoveBody }} CARDS THAT RUN THERE {{ c.t }} · {{ c.sub }} They keep saying Runs on Studio Mac (removed) until you start each one on a prepared computer from its card. Its agent is not stopped by this; it just stops reporting. {{ mdRemoveBtn }}Keep it
✕ Closeesc
New design✕
Design nameOne design per frontend. Ideas and cards for it all point here.
Project{{ p2.l }}◈
Linked to repository ⌢{{ ndRepoFull }}found in {{ ndPSel }} {{ r.full }}{{ r.sub }}
{{ ndDupName }} already covers this frontend. Add new screens there, so the ideas and cards stay on one design.Open {{ ndDupName }}
Start from
{{ o.g }}{{ o.l }}{{ o.d }}
{{ ndPathL }}Choose…{{ ndPathHint }}
Viewports{{ ndVpN }} · every screen is designed for each
{{ vg.gl }}{{ vg.l }}{{ vg.n }}
{{ vc.g }}{{ vc.sz }}{{ vc.nm }} {{ vg.moreL }}show less Add
Cancel Create design Create design
▦ {{ t.l }} ✕ +
Designs{{ dsHomeN }} · one per frontend↥ Import+ New design
NameStatusVersionLast changed ▾Owner
{{ d.name }}{{ d.p }}● open▣ {{ d.idea }} {{ d.stL }} {{ d.ver }} {{ d.when }} {{ d.init }}{{ d.owner }} ···{{ d.starG }}
{{ dsName }}{{ dsP }}{{ dsIdea }}
Describe what should change. The design on the right updates as you go. {{ m.t }} ✦{{ m.t }}
◉{{ dsPinsL }}clear ✦Updating the design…
{{ dsAcctI }} LLM ACCOUNT{{ o.i }}{{ o.l }}{{ o.d }}{{ o.ck }} {{ dsMEL }} ▾ {{ o.l }}{{ o.ck }}{{ o.d }} Effort{{ dsEffL }}{{ dsEffSubG }} EFFORT{{ o.l }}{{ o.ck }} Send
↻ {{ dsFileG }} {{ dsFileDir }}{{ dsFileName }} ▾ PAGES {{ f.g }}{{ f.n }} ↥Import files…zip, html, pdf, video ⌕All files⌘P {{ v.g }}{{ v.l }}{{ dsKindL }} − {{ dsZoomL }} + ➤ ◉Comment ✎Edit {{ dsSyncL }} ··· ⇣Import from liveCompare with the running app; take only what you pick ◷Versions & changes…{{ dsBuiltNote }} ⇡Import files…Copied into this design's folder · zip, html, pdf, video ✕{{ dsDelL }} {{ dsPresentL }} ✦ Create cards
{{ dsModeHintG }}{{ dsModeHint }}
{{ dsUrl }}
9:41●●● ▮
You · {{ p.when }}
{{ p.t }}
{{ p.n }}
CancelComment
API keys4 keys · limit 60/min eachNew key
KEYPARTNERUSAGE, LAST MINUTE
{{ r.k }}{{ r.pn }} {{ r.note }} Raise limit
{{ dsFileDir }}{{ dsFileName }}
{{ dsVpNote }}
VERTEX · PARTNER PRICINGUsage-based pricing for API keys {{ pg.n }}
{{ dsPdfNote }}
{{ dsVSceneI }} · {{ dsVScene }} Keys that warn before they stop
⏮ {{ dsVPlayG }} {{ dsVTime }} / {{ dsVTotal }}
{{ tk.l }} {{ sg.n }} · {{ sg.d }}
{{ dsDNum }}{{ dsDTitle }}{{ dsDSub }}
‹ {{ th.n }} ›
{{ dsFileDir }}{{ dsFileName }}
{{ dsRealMedia }} {{ dsRealNote }}
↑ {{ dsFlPath }}{{ dsFlCount }}
{{ g.l }}
› {{ r.n }}{{ r.sub }} {{ r.when }}
{{ cl.n }}{{ cl.t }}
Import from live into {{ dsName }}✕ Nothing is overwritten. What you take lands as a new version next to your current one, and you can go back in one click.
✦Scanning {{ dsLvUrl }} and comparing it page by page…
{{ dsLvSum }}
{{ r.tg }} {{ r.f }}{{ r.k }}{{ r.d }} {{ c.l }} {{ r.note }}
{{ dsLvFoot }} Cancel {{ dsLvBtnL }}
Versions & changes · {{ dsName }}{{ dsBuiltNote }} {{ tb.l }} ✕
{{ v.l }}LIVELATEST{{ v.when }} {{ v.t }}
{{ dsVcPick.l }} · {{ dsVcPick.t }} Mark as built Open on the canvas
{{ dsVcFile }} · {{ dsVcPick.l }}
API keys4 keys · limit 60/min eachNew key
KEYPARTNERUSAGE, LAST MINUTE
{{ r.k }}{{ r.pn }} {{ r.note }} Raise limit
{{ dsFileDir }}{{ dsFileName }}
{{ dsDiffSum }}✦ Create cards from these changes
Nothing changed since the version the app is built from.
{{ d.t }}
{{ d.t }}
{{ d.m }}{{ d.t }}
Where the running app no longer matches the design. Import a difference into the design, or turn it into a card. The running app matches the design.
WHATRUNNING APPDESIGN {{ d.what }}{{ d.src }}{{ d.live }}{{ d.design }}
Import into {{ dsName }}✕
or try it with sample files
{{ f.g }}{{ f.n }}{{ f.k }}{{ f.to }}
Cancel{{ dsImpGoL }}
⌕{{ dsBrCount }}
← /{{ c.l }}
No file matches. {{ r.g }}{{ r.n }}{{ r.sub }}
✦Create cards from {{ dsName }}✕
HOW
{{ w.g }}{{ w.l }} {{ w.d }}
{{ dsCCWhat }}
RUNS ON {{ dsActAcc }} ↻ {{ dsModelsNote }} Copilot sets its own effort
DIFFICULTY {{ dsActAcc }}
{{ x.g }}{{ x.l }} {{ dsCCSum }}
{{ c.g }} {{ c.ty }}{{ c.df }}{{ c.rd }} {{ c.t }} {{ c.why }} DECIDE{{ c.q }}
This takes a few minutes. Send it to the background and keep working; Grid tells you when the cards are drafted. Cancel Run in the background {{ dsCCPrimaryL }} {{ dsCCGoL }}
Library {{ libN }} ⌕
← / {{ c.l }}
NAMEKINDFROM CARDSIZEMODIFIED
Nothing here. Research cards file their outcome in the Library, and designs made on a card land here too.
{{ d.n }}● drafting{{ d.where }}{{ d.sumTxt }} · {{ d.peek }} {{ d.kind }} {{ d.card }} {{ d.meta }} {{ d.when }}
Insights {{ tb.l }} {{ g.l }} ‹ {{ inLabel }} › This {{ inGrainName }} Week · 28 Sep – 4 Oct ledger as of {{ tkAsOf }} Export CSV
{{ p.l }}{{ tkProvNote }}
{{ k.k }} {{ k.v }}{{ k.v2 }} {{ k.d }}vs last week
{{ tk.chartK }}{{ m.n }} {{ m.v }}{{ tk.total }}
{{ y.l }}
{{ d.mk }} {{ d.v }}
{{ d.l }}
{{ tk.p1K }}{{ tk.total }} {{ s.l }}{{ s.v }}{{ s.p }} {{ tk.p1N }}
{{ tk.p2K }}{{ tk.total }} {{ tk.p2A }}{{ tk.p2B }} {{ b.l }}{{ b.v }} {{ f.k }}{{ f.v }}{{ f.d }}
{{ tk.p3K }}{{ tk.total }}
{{ m.n }}TOTAL {{ c.v }}
{{ tk.p4K }}{{ tk.p4T }}
{{ h.l }} {{ c.t }} {{ c.p }} {{ c.ty }}{{ c.df }} {{ c.v }}{{ c.v2 }}{{ c.v3 }}{{ c.m }} {{ c.why }}
{{ x.n }}{{ x.l }}{{ x.s }}›
BREAKDOWN Group by {{ b.l }}{{ b.sep }} {{ tk.btTot }}
{{ h.l }} {{ r.l }}› {{ c.v }}
SPEND{{ inTotal }}{{ inLabel }}
AGENT TIME{{ inTotTime }}across {{ inRowsN }} {{ inTitleLow }}
TOKENS{{ inTotTok }}in and out
CARDS CLOSED236 today
SPEND OVER {{ inGrainUp }}
BY PROJECT {{ p.n }} {{ p.v }}
BY MODEL {{ m.n }} {{ m.v }} BY WHAT IT PAID FOR {{ w.n }} {{ w.v }}
GROUP BY {{ g.l }} FILTER {{ x.k }}{{ x.v }}{{ x.x }} {{ inRowsN }} rows
COST BY {{ inTitle }} SESSIONS TOKENS TIME COST SHARE {{ r.n }} {{ r.sub }} {{ r.ses }} {{ r.tok }} {{ r.time }} {{ r.cost }} {{ r.chev }} TOTAL {{ inTotSes }} {{ inTotTok }} {{ inTotTime }} {{ inTotal }}
Account & licence {{ t.l }} dev@gridconsole.dev · SOLO · 1 seat ✕
Free is free forever. Solo is free while Grid is in the alpha, Crew is planned for the public beta, and Fleet is sold by conversation. There is no waitlist and no checkout yet.
{{ t.n }} YOURS {{ t.sub }} {{ t.price }} {{ t.per }} ✓ {{ x.t }} {{ t.cta }} {{ t.why }}
HAVE A LICENCE KEY? ORB-XXXX-XXXX-XXXX-XXXX Activate for air-gapped machines
SIGNED IN ON 3 DEVICES · SOLO ALLOWS 3 a seat is a person, not a machine {{ d.n }} {{ d.s }} {{ d.act }} Signing out remotely takes effect within a minute, or immediately the next time that machine checks in. A device that has been offline past the grace window drops to read-only: you keep every card, board and transcript, agents just will not start.
{{ r.l }} {{ r.v }} {{ r.hint }} WHY THIS IS NOT A NAG SCREEN Grid runs agents against your source, so the licence check is deliberately dumb: a signed token, a device id, and a daily heartbeat. No telemetry on what you build, no reading your repos, and a fortnight of grace if you are on a plane or behind a firewall.
RUN vertex {{ runTree }} ✕
{{ cf.d }} {{ cf.n }} {{ cf.state }} {{ cf.actL }}
{{ sv.d }} {{ sv.n }} {{ sv.port }}
{{ runSelName }} {{ runSelState }} ↻ Restart ■ Stop
{{ runSelCmd }} {{ runSelUrl }}
{{ l.at }} {{ l.t }}
{{ runFoot }} Copy log
REJECT {{ rjCard }} ✕
WHY The agent reads this. Be as blunt as you would be in review. {{ rjWhy }} WHERE THE CARD GOES {{ d.t }}{{ d.stage }} {{ d.d }} UNDO THE CODE WORK {{ rjUndoHint }} {{ u.l }}
{{ rjSummary }} Cancel {{ rjBtn }}
⟲ Rewind this session put the conversation and the files back to a point you choose ✕
CHECKPOINTS · NEWEST FIRST {{ r.mk }} {{ r.at }} {{ r.kind }} TOUCHED THE WORLD {{ r.t }} since here {{ r.since }} {{ r.cost }}
WHAT REWINDING TO {{ rwAt }} DOES The session picks up right after “{{ rwText }}” with the working tree exactly as it was then. You can steer differently from there. {{ d.l }} {{ d.v }} REWIND CANNOT UNDO THIS 67 merge requests are already closed on the server. Rewinding forgets that it happened; it does not reopen them. Reopen them from Recent actions first Rewind files & chat Chat only, keep the files A rewind is itself undoable for an hour, and it never deletes the transcript: the dropped rows stay readable under History.
{{ docKick }} {{ d.l }} {{ cardTyI }} {{ cardTyL }} {{ docPath }} Copy markdown ✕
{{ cardTyI }} {{ cardTyL }} card {{ cardTyD }} {{ s.l }}
{{ b.t }}
{{ b.t }}
{{ b.t }}
{{ b.t }} NEEDS A TAP
{{ l.n }} {{ l.t }}
▲ {{ b.t }}
{{ h.l }}
{{ e.ic }}
{{ e.k }} {{ e.at }} DRIFT FROM PLAN REWIND {{ e.t }} {{ e.d }} {{ e.ans }}
{{ r.r }}
{{ fl.n }} NOT IN THE PLAN {{ fl.s }} {{ fl.add }} {{ fl.del }}
Every command this card ran on your machine, in order, with what it did. Anything that changed state outside the worktree is marked, and can be handed back to an agent to undo.
{{ a.at }} {{ a.cmd }} {{ a.res }} {{ a.where }} {{ a.note }} {{ a.undoLbl }}
Put the card back to an earlier moment. The conversation, the files and the memory written after that point all go with it: nothing is left half-rewound.
{{ r.mk }} {{ r.kind }}{{ r.at }} {{ r.t }} WHAT YOU LOSE {{ d.l }} {{ d.v }} Rewind to {{ rwAt }}
{{ rc.rel }} {{ rc.st }} {{ rc.t }} {{ rc.why }}
HOW MUCH IT ASKS · THIS CARD inherited from {{ focusProj }}
{{ d.t }}
{{ dialNote }}
Want to try it yourself? This preview is interactive. Take over and click anywhere: the board, a card, the code view. Yes, let me drive Keep watching
↻ replay the walkthrough
‹ › {{ dmStep }} {{ dmCap }}
Getting started I already have a workspace ›
WORKING DIRECTORY {{ gsDir }} Choose… CHOOSE A FOLDER~/ ◢ {{ d.n }} {{ d.sub }} Somewhere else… scanning {{ gsDir }} for repositories… DISCOVERED {{ gsCount }} {{ p.n }}{{ p.b }} new folders here become projects automatically · a context file is offered, never required
Grid runs many agents, across many projects, in parallel. Two things to set first: which agent runs them, and how much compute they may spend.
everything here lands in Settings → Agents and models, and stays changeable Skip setup Next: agents and models →
Agents and models step 2 of 2 · you can change all of it later
AGENT PROVIDERSGrid needs at least one. It runs the sessions; Grid runs the pipeline. {{ p.n }} {{ p.st }} {{ p.d }} {{ p.link }}
COMPUTE BUDGET{{ gsBudNote }} {{ b.l }} {{ b.d }}
WHAT THAT PROPOSESmodel and effort per difficulty, per stage. Click any cell to change it. DIFFICULTY PLANNING IMPLEMENTATION REVIEW DELIVERY & VALIDATION {{ m.l }} {{ c.m }}▾ {{ c.e }}▾ {{ gsMatrixFoot }}
GRID INTELLIGENCEthe small jobs Grid does for you in the background ✓{{ j.t }} {{ g.n }} {{ g.d }} {{ g.link }} MODEL {{ mm.l }}{{ mm.h }}
{{ gsSummary }} Back Save and start the tour →
Open a workspace Grid asks this every launch
Each workspace is a separate Grid: its own config folder, projects, memory, plugins, settings and licence. Nothing crosses between them, and two can run side by side.
{{ w.n }} {{ w.kind }} {{ w.plan }} {{ w.path }} {{ s.v }}{{ s.l }} {{ w.key }}
+ New workspace Point it at a folder. Grid discovers the projects inside and gives it a config folder of its own.
the last workspace opens on launch · hold ⌥ while starting to land here instead Skip
{{ ceStage }} {{ ceStageSub }} gridconsole-core {{ ceAgentKey }} {{ ceAgentWhat }} {{ ceCardId }} esc
CARD TITLE ? {{ ceOrigKick }} {{ ceOrigIc }} {{ ceOrigWho }} {{ ceOrigVia }} {{ ceOrigWhen }}
THE TASK {{ ceTaskNote }} WRITE READ
● {{ s.t }} {{ s.n }}
! {{ ceLiveWarn }}
{{ r.t }}
{{ b.t }} AGENT WRITES THIS {{ b.t }} · {{ b.t }} {{ b.ck }} {{ b.t }}
CARD TYPE {{ ceTyNote }}
{{ t.i }} {{ t.n }} {{ t.sub2 }} {{ t.res }}
{{ ceTyName }}. {{ ceTyWhat }} {{ ceTySkip }}
THE CADENCE?
{{ rc.n }}
AT {{ h2.t }} {{ ceRcCron }} {{ ceRcSays }}
WHAT SETS IT OFF?
{{ gv.n }}
{{ ceGvSubKick }}
{{ gs.n }}
{{ ceGvSays }} WHAT IT IS HANDED
{{ cx.k }} {{ cx.v }}
The task above says what to do with it. Keep it small: file a normal card for anything that needs a plan.
DIFFICULTY {{ ceDfNote }}
{{ d.n }} {{ d.sp }} {{ d.d }}
New card describe it once · Grid fills the rest in, and you correct it esc
THE TASK{{ capTaCount }}{{ capTaL }} + Attach or drop a screenshot
PROJECT{{ capProjSt }} ✦ {{ p2.n }} {{ p2.pct }} {{ capProjWhy }}
CARD TYPE{{ capTypeSt }} {{ t.ic }} ✦{{ t.l }} {{ t.flow }} {{ capTypeWhy }} {{ capTyExL }}. {{ capTyExD }} {{ st2.l }}
DIFFICULTY{{ capDiffSt }} {{ df.l }}✦ {{ df.sub }} {{ capDiffWhy }}
OVERRIDESreset to project defaults {{ or.k }} {{ or.v }} DEFAULT {{ or.chev }} {{ or.warn }} {{ oo.l }} {{ oo.tag }} GATES {{ gt.mk }} {{ gt.l }} OUTPUT {{ ou.l }} {{ capOutNote }} {{ capOvHint }}
WHAT THIS CARD WILL DO{{ capPhaseNote }} {{ p.st }} {{ p.you }} {{ p.model }} {{ p.eff }} {{ capPhaseFoot }}
{{ capSummary }} Create card⌘⏎
New idea lands in the backlog · nothing runs until it is shaped esc
THE IDEA{{ ideaCount }} + Attach or drop a screenshot
PROJECT{{ ideaProjSt }} ✦ {{ p3.n }} {{ ideaProjWhy }}
TOPIC {{ ideaTopicSt }} ✦ {{ ideaTopicTag }} or put it under ✦ {{ tp2.l }} {{ tp2.n }} {{ ideaTopicWhy }}
WHAT HAPPENS NEXT {{ s3.t }} {{ s3.d }}
{{ ideaSummary }} Add to backlog⌘⏎
SCREEN / STATE INVENTORY Settings › Sync — Off · Create · Join (code, waiting) · Approve on existing device · Expired/failed · Recovery (phrase) · Locked key · Relay unreachable · Removed · Devices (name, role, last contact, this device) · Queue (summary, full list, per-row action) · Remove device · Remove runner (affected work + recovery). Project › Runs on — Can run · Board only with reasons (repo, runtime, account) · Link a checkout · partially cleared · Local setup details (paths). Board — owner row on tiles (▸ here / ▸ Studio Mac / ○ offline) · ⧉ conflict flag · stale (synced 41m ago). Card — owner chip + last confirmed · Start here / Start on Studio Mac / Starting… / View session / Move execution · question answered → relay chip ◔ ✓ ✕ ⌛ — ? · review current vs rejected old approval · persistent conflict entry. Conflict — entry · compare (side by side / stacked) · base on/off · incoming edit · edit vs delete · combined editor · resolved with undo · survives stage move. Move execution — clean · confirm · done · dirty work · local-only repo · missing runtime/account · old host offline. Race — both pressed · one owner. Phone — two additions to Grid Phone.
COMPONENT CHANGES OwnerChip (new) — glyph + words: “▸ Runs here”, “▸ Runs on Studio Mac”, “○ Runs on Studio Mac · offline 41m”, “Runs on Studio Mac (removed)”. Tile (muted row), card header (bordered), phone. Never color-only. RelayChip (new) — six states with fixed glyphs; note is a prop. Relay acceptance is “◔ Queued”, never ✓. Tile — one optional owner row above the footer, sharing the row with the ⧉ flag. Session header — OwnerChip, then Start here / Start on Studio Mac (exclusive), View session (always), Move execution…. Question / Review blocks — footer with RelayChip and Cancel; review gains the rejected-old-approval insert above the current diff. ConflictEntry + ConflictResolver (new dialog) — two version groups with author/time, base toggle, incoming banner, combined textarea. Under 640px it stacks; each group keeps its own pick button. MoveExecution dialog (new) — from/to, checks (repo, work, runtime, account, host), blocked insert or what-happens + stop confirmation. Device row gains a role chip; Queue joins the Devices card in Settings › Sync; Runs on group joins project settings.
INTERACTION NOTES · BACKEND FACTS NEEDED Owner chip needs: owning device, last confirmation time from that device, reachability now. “Last confirmed” is the runner’s own heartbeat, not relay receipt. Start needs one authoritative claim per card. Both devices show Starting… until it returns; the loser gets the toast and View session. No timer, no takeover. Relay states need: queued (here), delivered, applied (runner ack + result), rejected (reason: review changed, already answered, card moved), expired (runner TTL), cancelled (here), uncertain (delivered, no ack within N min → “check the session”, never ✓). Review approval carries the diff identity it approved; the runner rejects on mismatch and returns the current diff summary. Conflict needs per-field versions with device, author, time and optional base; both kept until a resolution write. Stage moves are separate writes. An incoming version during resolution never replaces the one on screen. Move execution needs target readiness (repo remote match, runtime, account), source work state (dirty files, unpushed commits), whether the provider can resume the conversation, and a runner ack that the agent stopped. Old host offline ⇒ no stop ack ⇒ no move; only ownership recovery from Devices. Keyboard — Tab follows reading order; dialogs trap focus and return it to the opener; Esc = cancel / keep both; ⌘1 / ⌘2 pick a conflict side; Enter on a focused option answers. Every status chip has words; glyphs are decorative. Pairing — three-word code on both devices; approval is a tap on the existing device. Scan-to-approve from the iPhone camera is proposed and needs backend work.
UNRESOLVED PRODUCT CHOICES 1 · How long a queued answer waits on the runner before it expires (24h shown; not decided). 2 · Whether a card whose runner was removed can be claimed by any prepared device, or only after an explicit release. 3 · Whether uncertain relay results retry on their own or wait for the user. 4 · Whether Move execution is offered while the target is online but locked. 5 · Whether the losing conflict version stays in History for a window (30 days shown) or forever. 6 · A second runner per workspace — out of scope; the UI never assumes it. 7 · A pairing gesture beyond the three-word code — needs backend work before it is promised.