[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-convex-quickstart":3,"mdc--pp9iih-key":38,"related-org-convex-quickstart":2094,"related-repo-convex-quickstart":2278},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":27,"repoUrl":28,"updatedAt":29,"license":30,"forks":31,"topics":32,"repo":33,"sourceUrl":36,"mdContent":37},"quickstart","scaffold new Convex applications","Scaffold a running Next.js + shadcn Convex app from one sentence — convex dev + next dev already running — then build the idea live (runs locally). TRIGGER when the user wants to START a new Convex app from scratch — e.g. they ran $quickstart, said 'scaffold a new app', 'build me an app where users can ___', or 'new app'. SKIP when there's already a Convex project in the cwd.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"convex","Convex","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fconvex.png","get-convex",[13,15,18,21,24],{"name":9,"slug":8,"type":14},"tag",{"name":16,"slug":17,"type":14},"Next.js","next-js",{"name":19,"slug":20,"type":14},"Full-stack","full-stack",{"name":22,"slug":23,"type":14},"shadcn\u002Fui","shadcn-ui",{"name":25,"slug":26,"type":14},"Frontend","frontend",2,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fconvex-codex-plugin","2026-07-18T05:12:53.387652","Apache-2.0",0,[],{"repoUrl":28,"stars":27,"forks":31,"topics":34,"description":35},[],"Codex plugin for the hosted Convex MCP server","https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fconvex-codex-plugin\u002Ftree\u002FHEAD\u002Fplugins\u002Fconvex\u002Fskills\u002Fquickstart","---\nname: \"quickstart\"\ndescription: \"Scaffold a running Next.js + shadcn Convex app from one sentence — convex dev + next dev already running — then build the idea live (runs locally). TRIGGER when the user wants to START a new Convex app from scratch — e.g. they ran $quickstart, said 'scaffold a new app', 'build me an app where users can ___', or 'new app'. SKIP when there's already a Convex project in the cwd.\"\nlicense: \"Apache-2.0\"\n---\n\n# Convex Quickstart (Codex beta)\n\nStand up a running Next.js + shadcn \"wow-shell\" Convex app from one sentence, then\nbuild the user's idea live (locally). The heavy scaffold runs as a served shell script\nfrom the Convex quickstart backend (\"anteater\"); your job is to launch it, then build.\n\n> **Auth (passkeys), the feedback panel, custom domains, and public `*.convex.app`\n> publishing are de-scoped for this release** — they ship later. The scaffold runs\n> **locally only**, with no login and no panel. (The error-watch monitor in STEP 5\n> still applies and is valuable — keep it.)\n\nThe user's request after `$quickstart` is the **app idea** (e.g.\n`$quickstart a movie-night voting app` → idea = \"a movie-night voting app\"). If no\nidea was given, ask for a one-sentence idea, then continue.\n\n## Degradation rule — when the scaffold can't run, write code, not ceremony\n\nIf the bootstrap can't run — a non-interactive\u002Fone-shot session, no network access, a\nsandboxed temp dir, or the user just wants code rather than a running app — **don't\nwait on the scaffold**. Write a standard Convex project directly:\n\n- **ALL backend code goes under `convex\u002F`** (`schema.ts`, queries, mutations, actions)\n  — **NEVER at the project root.** Convex functions only run from the `convex\u002F`\n  directory.\n- **Write ZERO scaffold\u002Fdocumentation files** unless explicitly asked — no\n  `START_HERE.md`, `ARCHITECTURE.md`, `MANIFEST.txt`, or README walls. \"Build me a\n  backend\" is a request for code, not a design-doc package.\n\n## Data access + imports — read before writing any convex\u002F*.ts\n\n- Never an unbounded `.collect()` on a table that can grow — use `.withIndex(...)` +\n  `.paginate(paginationOpts)`\u002F`.take(n)`.\n- Index, don't filter — `.index(...)` in `schema.ts` for every read path, queried via\n  `.withIndex(...)`; `.filter()` is a full table scan.\n- Imports: `query`\u002F`mutation`\u002F`action`\u002F`internalQuery`\u002F`internalMutation`\u002F`internalAction`\n  from `\".\u002F_generated\u002Fserver\"`; `api`\u002F`internal` from `\".\u002F_generated\u002Fapi\"`; never from\n  `\"convex\u002Fserver\"` in application code.\n- `v.literal(\"exact value\")` for fixed string\u002Fenum members, not a bare `v.string()`.\n- `\"use node\";` is action-only — never in a file that also exports a `query` or\n  `mutation`.\n\n## Self-verify — before declaring backend work done\n\nBefore you call any backend work finished: run `npx tsc --noEmit` and, when a\ndeployment is available (or via a local anonymous one:\n`CONVEX_AGENT_MODE=anonymous npx convex dev --once`), push it. Fix every error\neither one reports before finishing — one verify round catches the\nwrong-relative-import \u002F duplicate-symbol \u002F unbalanced-paren class that otherwise\nbreaks the deploy.\n\n## STEP 0 — launch the scaffold NOW (before anything else)\n\nRun this **first**, before any reasoning or other tool calls — it kicks off the\n~45–120s scaffold (npm install, convex dev, next dev) in the background so it's\ninstalling while you read the rest. Substitute the user's idea for `\u003CIDEA>`:\n\n```bash\nBASE=\"https:\u002F\u002Fbasic-anteater-667.convex.site\"\nIDEA=\"\u003CIDEA>\"\nSLUG=$(curl -fsS --max-time 15 -X POST \"$BASE\u002Fgenerate\" -H 'content-type: application\u002Fjson' \\\n  --data \"$(node -e 'process.stdout.write(JSON.stringify({idea:process.argv[1],template:\"nextjs-shadcn\"}))' \"$IDEA\")\" \\\n  | node -e 'let s=\"\";process.stdin.on(\"data\",d=>s+=d).on(\"end\",()=>{try{process.stdout.write(JSON.parse(s).id||\"\")}catch{}})') || true\necho \"SLUG=$SLUG\"\nQB=$(mktemp -t convex-qb-XXXX.sh)\ncurl -fsS --max-time 20 \"$BASE\u002Fquickstart-bootstrap\" -o \"$QB\" || { echo \"BOOTSTRAP_FETCH_FAILED\"; exit 3; }\n# The bootstrap is feature-flagged via a profile. We ship the MINIMAL profile: scaffold\n# only — no auth\u002Fpasskeys, no feedback panel, no custom domain, and public *.convex.app\n# publishing disabled (they ship later). To restore the goodness pass QB_PROFILE=full\n# (or individual flags, e.g. QB_PASSKEYS=1 QB_PANEL=1 QB_DOMAIN=1).\necho \"AUTH_MODE=none\"   # minimal profile = no pre-baked auth; the build has no login\n# QB_HARNESS=codex tags telemetry. QB_ARGS_BASE=$BASE is CRITICAL: the slug was\n# generated on THIS deployment, so the bootstrap must fetch the personalized args +\n# bespoke runbook from the SAME host (its default is prod, which 404s a staging slug\n# → generic \"My Convex App\" defaults).\nnohup env QB_PROFILE=minimal QB_HARNESS=codex QB_ARGS_BASE=\"$BASE\" QB_FEEDBACK_URL=\"$BASE\u002Ffeedback\" \\\n  bash \"$QB\" $SLUG > .quickstart-bootstrap.log 2>&1 &\necho \"SCAFFOLD_LAUNCHED log=.quickstart-bootstrap.log SLUG=$SLUG\"\n```\n\n- If it prints `SCAFFOLD_LAUNCHED`, the scaffold is running in the background.\n  **Do NOT run it again.** Note the `SLUG=`.\n- If `curl` is blocked or you see `BOOTSTRAP_FETCH_FAILED`, the network\u002Fsandbox\n  blocked it — tell the user they likely need to run Codex with network access \u002F\n  auto-approve (`codex --sandbox danger-full-access`), then retry.\n\n## STEP 1 — wait for the scaffold, open the browser\n\nPoll `.quickstart-bootstrap.log` until it contains `BOOTSTRAP_COMPLETE`.\n\n**Codex's sandbox often reaps backgrounded (`nohup … &`) processes when the launch\ncall returns** — so the bootstrap may write its first line, then die before scaffolding.\nIf within ~20s the log has stalled (no new lines), **no app subdirectory has appeared**,\nand there's no `BOOTSTRAP_COMPLETE`, the background launch was reaped. Recover by running\nthe bootstrap in the **FOREGROUND** — re-run the STEP 0 block but replace the\n`nohup env … &` line with a plain foreground run, same env:\n\n```bash\nQB_PROFILE=minimal QB_HARNESS=codex QB_ARGS_BASE=\"$BASE\" QB_FEEDBACK_URL=\"$BASE\u002Ffeedback\" bash \"$QB\" $SLUG\n```\n\nIt backgrounds `convex dev` \u002F `next dev` itself and returns at `BOOTSTRAP_COMPLETE` in\n~1–2 min (set a generous command timeout, 300s+). `BOOTSTRAP_FETCH_FAILED` → server\nunreachable; tell the user. When it completes the log prints:\n- `OPEN_BROWSER_URL: http:\u002F\u002Flocalhost:\u003Cport>` — open this for the user immediately.\n- The app is scaffolded in a new subdirectory with `convex dev` + `next dev` running\n  and error watchers armed (`convex-errors.log` \u002F `next-errors.log` paths are in the log).\n\n## STEP 2 — read the runbook + build the idea live\n\nRead the personalized runbook for the full build flow (it's served — fetch it):\n\n```bash\ncurl -fsS \"https:\u002F\u002Fbasic-anteater-667.convex.site\u002Fq\u002F$SLUG.md\"\n```\n\nThen build the user's idea following it. What's already done by the scaffold:\n- **No auth this release** — the scaffold ships with **no login**. Only add auth if the\n  user explicitly asks (then wire their requested provider via the `convex-expert` skill).\n  *(Passkeys are de-scoped — `QB_PROFILE=minimal` sets `QB_PASSKEYS=0`.)*\n- **No feedback panel this release** — narrate your build **in chat**; do NOT call\n  `progress:post` \u002F `todos:*` \u002F `refinementQuestions:*`. *(Panel is off — `QB_PANEL=0`.)*\n- **Publishing is disabled this release** — the app runs **locally** at the printed URL;\n  do not publish or run `$add hosting`.\n\nRules while building:\n- Delegate all code inside `convex\u002F` to the **`convex-expert`** skill's rules\n  (object-form syntax, validators, indexes, internal vs public).\n- Watch for `convex\u002F` + `next` errors and fix them as they appear — the easiest way\n  is the `fix_errors_automatically` tool (see STEP 5), which surfaces them as events.\n\n## STEP 3 — wrap up (runs locally; no publish this release)\n\nWhen the app builds clean and the core feature works (your \"v1\"), tell the user it's\nrunning **locally** at the printed URL and summarize what you built. Publishing to a\npublic `*.convex.app` URL and custom domains are **disabled this release** — don't\ndeploy, don't run `$add hosting`, and don't look for `.quickstart-domains.json`.\n\n## STEP 5 — stay on watch with `fix_errors_automatically` (start EARLY, don't yield)\n\nThis harness has no push: a runtime error (or a slow async result) sits **unseen**\nuntil you actively look. This plugin bundles a `convex-plugin` MCP server with one\n**blocking** tool that surfaces it as an event — keep using it even though the\nfeedback panel is off this release (the `convex_error` \u002F `next_error` watch is the\nvaluable part).\n\n**Start watching as soon as the app is open (right after STEP 1) — not just after\nv1.** The user is most engaged at the very start and will often submit a request or\nquestion while you're still building. Call `fix_errors_automatically` between build\nmilestones and whenever you'd otherwise pause; on the FIRST call it returns\n**immediately** if anything is already pending (it surfaces existing unhandled\nrequests\u002Fquestions as `existing: true`), so feedback submitted before you started\nwatching is never lost. Then make it your standing idle action for the rest of the\nsession.\n\n> **Avoid the repeated approval prompt:** each call is a separate tool invocation,\n> so a one-time \"Allow\" re-asks every loop. Choose **\"Always allow\"** when prompted,\n> or add to `~\u002F.codex\u002Fconfig.toml`: `[mcp_servers.convex-plugin]` then\n> `trust_level = \"trusted\"`. Also pass a long `timeoutMs` (e.g. 280000) so each\n> block is long and you re-call less often.\n\nCall the **`fix_errors_automatically`** tool with `projectDir` set to your app's\n**absolute path** (the `convex-app\u002F` subdir, where `.env.local` lives). It BLOCKS\nuntil the next event, then returns one of:\n- `feature_request` \u002F `refinement_answer` → the user wants something — handle it\n  (loop back through STEP 2\u002F3), then call the tool again.\n- `convex_error` \u002F `next_error` → stop, read the line, fix the file, wait for\n  `convex dev` \u002F Next to recover, then call again.\n- `quiet` → heartbeat timeout, nothing happened — just call it again.\n\n**Loop on this tool instead of ending your turn.** Each call blocks, so you stay on\nwatch and react within seconds — no polling, no walking away. Keep looping until the\nuser clearly says they're done.\n\n## After the run\n\nOffer `$improve-convex-plugin` so the user can send this session for an AI review that\nimproves the quickstart.\n\n## On failure \u002F friction — offer to self-report (WITH the user's permission)\n\nIf the run doesn't go smoothly — you give up, hit a blocker, it takes way too long, or\nthe user is frustrated — don't yield silently. **Ask first, send only on a yes**:\n\n> \"That didn't go as smoothly as it should have. May I send this session — the transcript,\n>  with secrets redacted — to the Convex team so they can fix what went wrong? [yes \u002F no]\"\n\n- **On yes** → run the `improve-convex-plugin` flow (ships the redacted transcript):\n  `curl -fsSL \"https:\u002F\u002Fbasic-anteater-667.convex.site\u002Fsend-transcript\" | QB_HARNESS=codex bash -s -- --idea \"\u003Cwhat broke>\"`\n- **On no** → respect it; send nothing.\n- Either way, give the user an honest summary of where it got stuck.\n\nNever send the transcript without an explicit yes.\n",{"data":39,"body":40},{"name":4,"description":6,"license":30},{"type":41,"children":42},"root",[43,52,58,89,117,124,136,212,218,421,427,448,454,474,1140,1196,1202,1222,1269,1375,1410,1458,1464,1469,1509,1514,1639,1644,1696,1702,1741,1754,1796,1828,1880,1926,1981,1991,1997,2010,2016,2027,2041,2083,2088],{"type":44,"tag":45,"props":46,"children":48},"element","h1",{"id":47},"convex-quickstart-codex-beta",[49],{"type":50,"value":51},"text","Convex Quickstart (Codex beta)",{"type":44,"tag":53,"props":54,"children":55},"p",{},[56],{"type":50,"value":57},"Stand up a running Next.js + shadcn \"wow-shell\" Convex app from one sentence, then\nbuild the user's idea live (locally). The heavy scaffold runs as a served shell script\nfrom the Convex quickstart backend (\"anteater\"); your job is to launch it, then build.",{"type":44,"tag":59,"props":60,"children":61},"blockquote",{},[62],{"type":44,"tag":53,"props":63,"children":64},{},[65,80,82,87],{"type":44,"tag":66,"props":67,"children":68},"strong",{},[69,71,78],{"type":50,"value":70},"Auth (passkeys), the feedback panel, custom domains, and public ",{"type":44,"tag":72,"props":73,"children":75},"code",{"className":74},[],[76],{"type":50,"value":77},"*.convex.app",{"type":50,"value":79},"\npublishing are de-scoped for this release",{"type":50,"value":81}," — they ship later. The scaffold runs\n",{"type":44,"tag":66,"props":83,"children":84},{},[85],{"type":50,"value":86},"locally only",{"type":50,"value":88},", with no login and no panel. (The error-watch monitor in STEP 5\nstill applies and is valuable — keep it.)",{"type":44,"tag":53,"props":90,"children":91},{},[92,94,100,102,107,109,115],{"type":50,"value":93},"The user's request after ",{"type":44,"tag":72,"props":95,"children":97},{"className":96},[],[98],{"type":50,"value":99},"$quickstart",{"type":50,"value":101}," is the ",{"type":44,"tag":66,"props":103,"children":104},{},[105],{"type":50,"value":106},"app idea",{"type":50,"value":108}," (e.g.\n",{"type":44,"tag":72,"props":110,"children":112},{"className":111},[],[113],{"type":50,"value":114},"$quickstart a movie-night voting app",{"type":50,"value":116}," → idea = \"a movie-night voting app\"). If no\nidea was given, ask for a one-sentence idea, then continue.",{"type":44,"tag":118,"props":119,"children":121},"h2",{"id":120},"degradation-rule-when-the-scaffold-cant-run-write-code-not-ceremony",[122],{"type":50,"value":123},"Degradation rule — when the scaffold can't run, write code, not ceremony",{"type":44,"tag":53,"props":125,"children":126},{},[127,129,134],{"type":50,"value":128},"If the bootstrap can't run — a non-interactive\u002Fone-shot session, no network access, a\nsandboxed temp dir, or the user just wants code rather than a running app — ",{"type":44,"tag":66,"props":130,"children":131},{},[132],{"type":50,"value":133},"don't\nwait on the scaffold",{"type":50,"value":135},". Write a standard Convex project directly:",{"type":44,"tag":137,"props":138,"children":139},"ul",{},[140,179],{"type":44,"tag":141,"props":142,"children":143},"li",{},[144,155,157,163,165,170,172,177],{"type":44,"tag":66,"props":145,"children":146},{},[147,149],{"type":50,"value":148},"ALL backend code goes under ",{"type":44,"tag":72,"props":150,"children":152},{"className":151},[],[153],{"type":50,"value":154},"convex\u002F",{"type":50,"value":156}," (",{"type":44,"tag":72,"props":158,"children":160},{"className":159},[],[161],{"type":50,"value":162},"schema.ts",{"type":50,"value":164},", queries, mutations, actions)\n— ",{"type":44,"tag":66,"props":166,"children":167},{},[168],{"type":50,"value":169},"NEVER at the project root.",{"type":50,"value":171}," Convex functions only run from the ",{"type":44,"tag":72,"props":173,"children":175},{"className":174},[],[176],{"type":50,"value":154},{"type":50,"value":178},"\ndirectory.",{"type":44,"tag":141,"props":180,"children":181},{},[182,187,189,195,197,203,204,210],{"type":44,"tag":66,"props":183,"children":184},{},[185],{"type":50,"value":186},"Write ZERO scaffold\u002Fdocumentation files",{"type":50,"value":188}," unless explicitly asked — no\n",{"type":44,"tag":72,"props":190,"children":192},{"className":191},[],[193],{"type":50,"value":194},"START_HERE.md",{"type":50,"value":196},", ",{"type":44,"tag":72,"props":198,"children":200},{"className":199},[],[201],{"type":50,"value":202},"ARCHITECTURE.md",{"type":50,"value":196},{"type":44,"tag":72,"props":205,"children":207},{"className":206},[],[208],{"type":50,"value":209},"MANIFEST.txt",{"type":50,"value":211},", or README walls. \"Build me a\nbackend\" is a request for code, not a design-doc package.",{"type":44,"tag":118,"props":213,"children":215},{"id":214},"data-access-imports-read-before-writing-any-convexts",[216],{"type":50,"value":217},"Data access + imports — read before writing any convex\u002F*.ts",{"type":44,"tag":137,"props":219,"children":220},{},[221,258,293,379,397],{"type":44,"tag":141,"props":222,"children":223},{},[224,226,232,234,240,242,248,250,256],{"type":50,"value":225},"Never an unbounded ",{"type":44,"tag":72,"props":227,"children":229},{"className":228},[],[230],{"type":50,"value":231},".collect()",{"type":50,"value":233}," on a table that can grow — use ",{"type":44,"tag":72,"props":235,"children":237},{"className":236},[],[238],{"type":50,"value":239},".withIndex(...)",{"type":50,"value":241}," +\n",{"type":44,"tag":72,"props":243,"children":245},{"className":244},[],[246],{"type":50,"value":247},".paginate(paginationOpts)",{"type":50,"value":249},"\u002F",{"type":44,"tag":72,"props":251,"children":253},{"className":252},[],[254],{"type":50,"value":255},".take(n)",{"type":50,"value":257},".",{"type":44,"tag":141,"props":259,"children":260},{},[261,263,269,271,276,278,283,285,291],{"type":50,"value":262},"Index, don't filter — ",{"type":44,"tag":72,"props":264,"children":266},{"className":265},[],[267],{"type":50,"value":268},".index(...)",{"type":50,"value":270}," in ",{"type":44,"tag":72,"props":272,"children":274},{"className":273},[],[275],{"type":50,"value":162},{"type":50,"value":277}," for every read path, queried via\n",{"type":44,"tag":72,"props":279,"children":281},{"className":280},[],[282],{"type":50,"value":239},{"type":50,"value":284},"; ",{"type":44,"tag":72,"props":286,"children":288},{"className":287},[],[289],{"type":50,"value":290},".filter()",{"type":50,"value":292}," is a full table scan.",{"type":44,"tag":141,"props":294,"children":295},{},[296,298,304,305,311,312,318,319,325,326,332,333,339,341,347,348,354,355,361,363,369,371,377],{"type":50,"value":297},"Imports: ",{"type":44,"tag":72,"props":299,"children":301},{"className":300},[],[302],{"type":50,"value":303},"query",{"type":50,"value":249},{"type":44,"tag":72,"props":306,"children":308},{"className":307},[],[309],{"type":50,"value":310},"mutation",{"type":50,"value":249},{"type":44,"tag":72,"props":313,"children":315},{"className":314},[],[316],{"type":50,"value":317},"action",{"type":50,"value":249},{"type":44,"tag":72,"props":320,"children":322},{"className":321},[],[323],{"type":50,"value":324},"internalQuery",{"type":50,"value":249},{"type":44,"tag":72,"props":327,"children":329},{"className":328},[],[330],{"type":50,"value":331},"internalMutation",{"type":50,"value":249},{"type":44,"tag":72,"props":334,"children":336},{"className":335},[],[337],{"type":50,"value":338},"internalAction",{"type":50,"value":340},"\nfrom ",{"type":44,"tag":72,"props":342,"children":344},{"className":343},[],[345],{"type":50,"value":346},"\".\u002F_generated\u002Fserver\"",{"type":50,"value":284},{"type":44,"tag":72,"props":349,"children":351},{"className":350},[],[352],{"type":50,"value":353},"api",{"type":50,"value":249},{"type":44,"tag":72,"props":356,"children":358},{"className":357},[],[359],{"type":50,"value":360},"internal",{"type":50,"value":362}," from ",{"type":44,"tag":72,"props":364,"children":366},{"className":365},[],[367],{"type":50,"value":368},"\".\u002F_generated\u002Fapi\"",{"type":50,"value":370},"; never from\n",{"type":44,"tag":72,"props":372,"children":374},{"className":373},[],[375],{"type":50,"value":376},"\"convex\u002Fserver\"",{"type":50,"value":378}," in application code.",{"type":44,"tag":141,"props":380,"children":381},{},[382,388,390,396],{"type":44,"tag":72,"props":383,"children":385},{"className":384},[],[386],{"type":50,"value":387},"v.literal(\"exact value\")",{"type":50,"value":389}," for fixed string\u002Fenum members, not a bare ",{"type":44,"tag":72,"props":391,"children":393},{"className":392},[],[394],{"type":50,"value":395},"v.string()",{"type":50,"value":257},{"type":44,"tag":141,"props":398,"children":399},{},[400,406,408,413,415,420],{"type":44,"tag":72,"props":401,"children":403},{"className":402},[],[404],{"type":50,"value":405},"\"use node\";",{"type":50,"value":407}," is action-only — never in a file that also exports a ",{"type":44,"tag":72,"props":409,"children":411},{"className":410},[],[412],{"type":50,"value":303},{"type":50,"value":414}," or\n",{"type":44,"tag":72,"props":416,"children":418},{"className":417},[],[419],{"type":50,"value":310},{"type":50,"value":257},{"type":44,"tag":118,"props":422,"children":424},{"id":423},"self-verify-before-declaring-backend-work-done",[425],{"type":50,"value":426},"Self-verify — before declaring backend work done",{"type":44,"tag":53,"props":428,"children":429},{},[430,432,438,440,446],{"type":50,"value":431},"Before you call any backend work finished: run ",{"type":44,"tag":72,"props":433,"children":435},{"className":434},[],[436],{"type":50,"value":437},"npx tsc --noEmit",{"type":50,"value":439}," and, when a\ndeployment is available (or via a local anonymous one:\n",{"type":44,"tag":72,"props":441,"children":443},{"className":442},[],[444],{"type":50,"value":445},"CONVEX_AGENT_MODE=anonymous npx convex dev --once",{"type":50,"value":447},"), push it. Fix every error\neither one reports before finishing — one verify round catches the\nwrong-relative-import \u002F duplicate-symbol \u002F unbalanced-paren class that otherwise\nbreaks the deploy.",{"type":44,"tag":118,"props":449,"children":451},{"id":450},"step-0-launch-the-scaffold-now-before-anything-else",[452],{"type":50,"value":453},"STEP 0 — launch the scaffold NOW (before anything else)",{"type":44,"tag":53,"props":455,"children":456},{},[457,459,464,466,472],{"type":50,"value":458},"Run this ",{"type":44,"tag":66,"props":460,"children":461},{},[462],{"type":50,"value":463},"first",{"type":50,"value":465},", before any reasoning or other tool calls — it kicks off the\n~45–120s scaffold (npm install, convex dev, next dev) in the background so it's\ninstalling while you read the rest. Substitute the user's idea for ",{"type":44,"tag":72,"props":467,"children":469},{"className":468},[],[470],{"type":50,"value":471},"\u003CIDEA>",{"type":50,"value":473},":",{"type":44,"tag":475,"props":476,"children":481},"pre",{"className":477,"code":478,"language":479,"meta":480,"style":480},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","BASE=\"https:\u002F\u002Fbasic-anteater-667.convex.site\"\nIDEA=\"\u003CIDEA>\"\nSLUG=$(curl -fsS --max-time 15 -X POST \"$BASE\u002Fgenerate\" -H 'content-type: application\u002Fjson' \\\n  --data \"$(node -e 'process.stdout.write(JSON.stringify({idea:process.argv[1],template:\"nextjs-shadcn\"}))' \"$IDEA\")\" \\\n  | node -e 'let s=\"\";process.stdin.on(\"data\",d=>s+=d).on(\"end\",()=>{try{process.stdout.write(JSON.parse(s).id||\"\")}catch{}})') || true\necho \"SLUG=$SLUG\"\nQB=$(mktemp -t convex-qb-XXXX.sh)\ncurl -fsS --max-time 20 \"$BASE\u002Fquickstart-bootstrap\" -o \"$QB\" || { echo \"BOOTSTRAP_FETCH_FAILED\"; exit 3; }\n# The bootstrap is feature-flagged via a profile. We ship the MINIMAL profile: scaffold\n# only — no auth\u002Fpasskeys, no feedback panel, no custom domain, and public *.convex.app\n# publishing disabled (they ship later). To restore the goodness pass QB_PROFILE=full\n# (or individual flags, e.g. QB_PASSKEYS=1 QB_PANEL=1 QB_DOMAIN=1).\necho \"AUTH_MODE=none\"   # minimal profile = no pre-baked auth; the build has no login\n# QB_HARNESS=codex tags telemetry. QB_ARGS_BASE=$BASE is CRITICAL: the slug was\n# generated on THIS deployment, so the bootstrap must fetch the personalized args +\n# bespoke runbook from the SAME host (its default is prod, which 404s a staging slug\n# → generic \"My Convex App\" defaults).\nnohup env QB_PROFILE=minimal QB_HARNESS=codex QB_ARGS_BASE=\"$BASE\" QB_FEEDBACK_URL=\"$BASE\u002Ffeedback\" \\\n  bash \"$QB\" $SLUG > .quickstart-bootstrap.log 2>&1 &\necho \"SCAFFOLD_LAUNCHED log=.quickstart-bootstrap.log SLUG=$SLUG\"\n","bash","",[482],{"type":44,"tag":72,"props":483,"children":484},{"__ignoreMap":480},[485,519,543,633,688,736,763,796,903,913,922,931,940,966,975,984,993,1002,1069,1115],{"type":44,"tag":486,"props":487,"children":490},"span",{"class":488,"line":489},"line",1,[491,497,503,508,514],{"type":44,"tag":486,"props":492,"children":494},{"style":493},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[495],{"type":50,"value":496},"BASE",{"type":44,"tag":486,"props":498,"children":500},{"style":499},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[501],{"type":50,"value":502},"=",{"type":44,"tag":486,"props":504,"children":505},{"style":499},[506],{"type":50,"value":507},"\"",{"type":44,"tag":486,"props":509,"children":511},{"style":510},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[512],{"type":50,"value":513},"https:\u002F\u002Fbasic-anteater-667.convex.site",{"type":44,"tag":486,"props":515,"children":516},{"style":499},[517],{"type":50,"value":518},"\"\n",{"type":44,"tag":486,"props":520,"children":521},{"class":488,"line":27},[522,527,531,535,539],{"type":44,"tag":486,"props":523,"children":524},{"style":493},[525],{"type":50,"value":526},"IDEA",{"type":44,"tag":486,"props":528,"children":529},{"style":499},[530],{"type":50,"value":502},{"type":44,"tag":486,"props":532,"children":533},{"style":499},[534],{"type":50,"value":507},{"type":44,"tag":486,"props":536,"children":537},{"style":510},[538],{"type":50,"value":471},{"type":44,"tag":486,"props":540,"children":541},{"style":499},[542],{"type":50,"value":518},{"type":44,"tag":486,"props":544,"children":546},{"class":488,"line":545},3,[547,552,557,563,568,573,579,584,589,594,599,604,608,613,618,623,628],{"type":44,"tag":486,"props":548,"children":549},{"style":493},[550],{"type":50,"value":551},"SLUG",{"type":44,"tag":486,"props":553,"children":554},{"style":499},[555],{"type":50,"value":556},"=$(",{"type":44,"tag":486,"props":558,"children":560},{"style":559},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[561],{"type":50,"value":562},"curl",{"type":44,"tag":486,"props":564,"children":565},{"style":510},[566],{"type":50,"value":567}," -fsS",{"type":44,"tag":486,"props":569,"children":570},{"style":510},[571],{"type":50,"value":572}," --max-time",{"type":44,"tag":486,"props":574,"children":576},{"style":575},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[577],{"type":50,"value":578}," 15",{"type":44,"tag":486,"props":580,"children":581},{"style":510},[582],{"type":50,"value":583}," -X",{"type":44,"tag":486,"props":585,"children":586},{"style":510},[587],{"type":50,"value":588}," POST",{"type":44,"tag":486,"props":590,"children":591},{"style":499},[592],{"type":50,"value":593}," \"",{"type":44,"tag":486,"props":595,"children":596},{"style":493},[597],{"type":50,"value":598},"$BASE",{"type":44,"tag":486,"props":600,"children":601},{"style":510},[602],{"type":50,"value":603},"\u002Fgenerate",{"type":44,"tag":486,"props":605,"children":606},{"style":499},[607],{"type":50,"value":507},{"type":44,"tag":486,"props":609,"children":610},{"style":510},[611],{"type":50,"value":612}," -H",{"type":44,"tag":486,"props":614,"children":615},{"style":499},[616],{"type":50,"value":617}," '",{"type":44,"tag":486,"props":619,"children":620},{"style":510},[621],{"type":50,"value":622},"content-type: application\u002Fjson",{"type":44,"tag":486,"props":624,"children":625},{"style":499},[626],{"type":50,"value":627},"'",{"type":44,"tag":486,"props":629,"children":630},{"style":493},[631],{"type":50,"value":632}," \\\n",{"type":44,"tag":486,"props":634,"children":636},{"class":488,"line":635},4,[637,642,647,652,657,661,666,670,674,679,684],{"type":44,"tag":486,"props":638,"children":639},{"style":510},[640],{"type":50,"value":641},"  --data",{"type":44,"tag":486,"props":643,"children":644},{"style":499},[645],{"type":50,"value":646}," \"$(",{"type":44,"tag":486,"props":648,"children":649},{"style":559},[650],{"type":50,"value":651},"node",{"type":44,"tag":486,"props":653,"children":654},{"style":510},[655],{"type":50,"value":656}," -e ",{"type":44,"tag":486,"props":658,"children":659},{"style":499},[660],{"type":50,"value":627},{"type":44,"tag":486,"props":662,"children":663},{"style":510},[664],{"type":50,"value":665},"process.stdout.write(JSON.stringify({idea:process.argv[1],template:\"nextjs-shadcn\"}))",{"type":44,"tag":486,"props":667,"children":668},{"style":499},[669],{"type":50,"value":627},{"type":44,"tag":486,"props":671,"children":672},{"style":499},[673],{"type":50,"value":593},{"type":44,"tag":486,"props":675,"children":676},{"style":493},[677],{"type":50,"value":678},"$IDEA",{"type":44,"tag":486,"props":680,"children":681},{"style":499},[682],{"type":50,"value":683},"\")\"",{"type":44,"tag":486,"props":685,"children":686},{"style":493},[687],{"type":50,"value":632},{"type":44,"tag":486,"props":689,"children":691},{"class":488,"line":690},5,[692,697,702,707,711,716,720,725,730],{"type":44,"tag":486,"props":693,"children":694},{"style":499},[695],{"type":50,"value":696},"  |",{"type":44,"tag":486,"props":698,"children":699},{"style":559},[700],{"type":50,"value":701}," node",{"type":44,"tag":486,"props":703,"children":704},{"style":510},[705],{"type":50,"value":706}," -e",{"type":44,"tag":486,"props":708,"children":709},{"style":499},[710],{"type":50,"value":617},{"type":44,"tag":486,"props":712,"children":713},{"style":510},[714],{"type":50,"value":715},"let s=\"\";process.stdin.on(\"data\",d=>s+=d).on(\"end\",()=>{try{process.stdout.write(JSON.parse(s).id||\"\")}catch{}})",{"type":44,"tag":486,"props":717,"children":718},{"style":499},[719],{"type":50,"value":627},{"type":44,"tag":486,"props":721,"children":722},{"style":499},[723],{"type":50,"value":724},")",{"type":44,"tag":486,"props":726,"children":727},{"style":499},[728],{"type":50,"value":729}," ||",{"type":44,"tag":486,"props":731,"children":733},{"style":732},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[734],{"type":50,"value":735}," true\n",{"type":44,"tag":486,"props":737,"children":739},{"class":488,"line":738},6,[740,745,749,754,759],{"type":44,"tag":486,"props":741,"children":742},{"style":732},[743],{"type":50,"value":744},"echo",{"type":44,"tag":486,"props":746,"children":747},{"style":499},[748],{"type":50,"value":593},{"type":44,"tag":486,"props":750,"children":751},{"style":510},[752],{"type":50,"value":753},"SLUG=",{"type":44,"tag":486,"props":755,"children":756},{"style":493},[757],{"type":50,"value":758},"$SLUG",{"type":44,"tag":486,"props":760,"children":761},{"style":499},[762],{"type":50,"value":518},{"type":44,"tag":486,"props":764,"children":766},{"class":488,"line":765},7,[767,772,776,781,786,791],{"type":44,"tag":486,"props":768,"children":769},{"style":493},[770],{"type":50,"value":771},"QB",{"type":44,"tag":486,"props":773,"children":774},{"style":499},[775],{"type":50,"value":556},{"type":44,"tag":486,"props":777,"children":778},{"style":559},[779],{"type":50,"value":780},"mktemp",{"type":44,"tag":486,"props":782,"children":783},{"style":510},[784],{"type":50,"value":785}," -t",{"type":44,"tag":486,"props":787,"children":788},{"style":510},[789],{"type":50,"value":790}," convex-qb-XXXX.sh",{"type":44,"tag":486,"props":792,"children":793},{"style":499},[794],{"type":50,"value":795},")\n",{"type":44,"tag":486,"props":797,"children":799},{"class":488,"line":798},8,[800,804,808,812,817,821,825,830,834,839,843,848,852,856,861,866,870,875,879,884,889,894,898],{"type":44,"tag":486,"props":801,"children":802},{"style":559},[803],{"type":50,"value":562},{"type":44,"tag":486,"props":805,"children":806},{"style":510},[807],{"type":50,"value":567},{"type":44,"tag":486,"props":809,"children":810},{"style":510},[811],{"type":50,"value":572},{"type":44,"tag":486,"props":813,"children":814},{"style":575},[815],{"type":50,"value":816}," 20",{"type":44,"tag":486,"props":818,"children":819},{"style":499},[820],{"type":50,"value":593},{"type":44,"tag":486,"props":822,"children":823},{"style":493},[824],{"type":50,"value":598},{"type":44,"tag":486,"props":826,"children":827},{"style":510},[828],{"type":50,"value":829},"\u002Fquickstart-bootstrap",{"type":44,"tag":486,"props":831,"children":832},{"style":499},[833],{"type":50,"value":507},{"type":44,"tag":486,"props":835,"children":836},{"style":510},[837],{"type":50,"value":838}," -o",{"type":44,"tag":486,"props":840,"children":841},{"style":499},[842],{"type":50,"value":593},{"type":44,"tag":486,"props":844,"children":845},{"style":493},[846],{"type":50,"value":847},"$QB",{"type":44,"tag":486,"props":849,"children":850},{"style":499},[851],{"type":50,"value":507},{"type":44,"tag":486,"props":853,"children":854},{"style":499},[855],{"type":50,"value":729},{"type":44,"tag":486,"props":857,"children":858},{"style":499},[859],{"type":50,"value":860}," {",{"type":44,"tag":486,"props":862,"children":863},{"style":732},[864],{"type":50,"value":865}," echo",{"type":44,"tag":486,"props":867,"children":868},{"style":499},[869],{"type":50,"value":593},{"type":44,"tag":486,"props":871,"children":872},{"style":510},[873],{"type":50,"value":874},"BOOTSTRAP_FETCH_FAILED",{"type":44,"tag":486,"props":876,"children":877},{"style":499},[878],{"type":50,"value":507},{"type":44,"tag":486,"props":880,"children":881},{"style":499},[882],{"type":50,"value":883},";",{"type":44,"tag":486,"props":885,"children":886},{"style":732},[887],{"type":50,"value":888}," exit",{"type":44,"tag":486,"props":890,"children":891},{"style":575},[892],{"type":50,"value":893}," 3",{"type":44,"tag":486,"props":895,"children":896},{"style":499},[897],{"type":50,"value":883},{"type":44,"tag":486,"props":899,"children":900},{"style":499},[901],{"type":50,"value":902}," }\n",{"type":44,"tag":486,"props":904,"children":906},{"class":488,"line":905},9,[907],{"type":44,"tag":486,"props":908,"children":910},{"style":909},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[911],{"type":50,"value":912},"# The bootstrap is feature-flagged via a profile. We ship the MINIMAL profile: scaffold\n",{"type":44,"tag":486,"props":914,"children":916},{"class":488,"line":915},10,[917],{"type":44,"tag":486,"props":918,"children":919},{"style":909},[920],{"type":50,"value":921},"# only — no auth\u002Fpasskeys, no feedback panel, no custom domain, and public *.convex.app\n",{"type":44,"tag":486,"props":923,"children":925},{"class":488,"line":924},11,[926],{"type":44,"tag":486,"props":927,"children":928},{"style":909},[929],{"type":50,"value":930},"# publishing disabled (they ship later). To restore the goodness pass QB_PROFILE=full\n",{"type":44,"tag":486,"props":932,"children":934},{"class":488,"line":933},12,[935],{"type":44,"tag":486,"props":936,"children":937},{"style":909},[938],{"type":50,"value":939},"# (or individual flags, e.g. QB_PASSKEYS=1 QB_PANEL=1 QB_DOMAIN=1).\n",{"type":44,"tag":486,"props":941,"children":943},{"class":488,"line":942},13,[944,948,952,957,961],{"type":44,"tag":486,"props":945,"children":946},{"style":732},[947],{"type":50,"value":744},{"type":44,"tag":486,"props":949,"children":950},{"style":499},[951],{"type":50,"value":593},{"type":44,"tag":486,"props":953,"children":954},{"style":510},[955],{"type":50,"value":956},"AUTH_MODE=none",{"type":44,"tag":486,"props":958,"children":959},{"style":499},[960],{"type":50,"value":507},{"type":44,"tag":486,"props":962,"children":963},{"style":909},[964],{"type":50,"value":965},"   # minimal profile = no pre-baked auth; the build has no login\n",{"type":44,"tag":486,"props":967,"children":969},{"class":488,"line":968},14,[970],{"type":44,"tag":486,"props":971,"children":972},{"style":909},[973],{"type":50,"value":974},"# QB_HARNESS=codex tags telemetry. QB_ARGS_BASE=$BASE is CRITICAL: the slug was\n",{"type":44,"tag":486,"props":976,"children":978},{"class":488,"line":977},15,[979],{"type":44,"tag":486,"props":980,"children":981},{"style":909},[982],{"type":50,"value":983},"# generated on THIS deployment, so the bootstrap must fetch the personalized args +\n",{"type":44,"tag":486,"props":985,"children":987},{"class":488,"line":986},16,[988],{"type":44,"tag":486,"props":989,"children":990},{"style":909},[991],{"type":50,"value":992},"# bespoke runbook from the SAME host (its default is prod, which 404s a staging slug\n",{"type":44,"tag":486,"props":994,"children":996},{"class":488,"line":995},17,[997],{"type":44,"tag":486,"props":998,"children":999},{"style":909},[1000],{"type":50,"value":1001},"# → generic \"My Convex App\" defaults).\n",{"type":44,"tag":486,"props":1003,"children":1005},{"class":488,"line":1004},18,[1006,1011,1016,1021,1026,1031,1035,1039,1043,1048,1052,1056,1061,1065],{"type":44,"tag":486,"props":1007,"children":1008},{"style":559},[1009],{"type":50,"value":1010},"nohup",{"type":44,"tag":486,"props":1012,"children":1013},{"style":510},[1014],{"type":50,"value":1015}," env",{"type":44,"tag":486,"props":1017,"children":1018},{"style":510},[1019],{"type":50,"value":1020}," QB_PROFILE=minimal",{"type":44,"tag":486,"props":1022,"children":1023},{"style":510},[1024],{"type":50,"value":1025}," QB_HARNESS=codex",{"type":44,"tag":486,"props":1027,"children":1028},{"style":510},[1029],{"type":50,"value":1030}," QB_ARGS_BASE=",{"type":44,"tag":486,"props":1032,"children":1033},{"style":499},[1034],{"type":50,"value":507},{"type":44,"tag":486,"props":1036,"children":1037},{"style":493},[1038],{"type":50,"value":598},{"type":44,"tag":486,"props":1040,"children":1041},{"style":499},[1042],{"type":50,"value":507},{"type":44,"tag":486,"props":1044,"children":1045},{"style":510},[1046],{"type":50,"value":1047}," QB_FEEDBACK_URL=",{"type":44,"tag":486,"props":1049,"children":1050},{"style":499},[1051],{"type":50,"value":507},{"type":44,"tag":486,"props":1053,"children":1054},{"style":493},[1055],{"type":50,"value":598},{"type":44,"tag":486,"props":1057,"children":1058},{"style":510},[1059],{"type":50,"value":1060},"\u002Ffeedback",{"type":44,"tag":486,"props":1062,"children":1063},{"style":499},[1064],{"type":50,"value":507},{"type":44,"tag":486,"props":1066,"children":1067},{"style":493},[1068],{"type":50,"value":632},{"type":44,"tag":486,"props":1070,"children":1072},{"class":488,"line":1071},19,[1073,1078,1082,1086,1090,1095,1100,1105,1110],{"type":44,"tag":486,"props":1074,"children":1075},{"style":510},[1076],{"type":50,"value":1077},"  bash",{"type":44,"tag":486,"props":1079,"children":1080},{"style":499},[1081],{"type":50,"value":593},{"type":44,"tag":486,"props":1083,"children":1084},{"style":493},[1085],{"type":50,"value":847},{"type":44,"tag":486,"props":1087,"children":1088},{"style":499},[1089],{"type":50,"value":507},{"type":44,"tag":486,"props":1091,"children":1092},{"style":493},[1093],{"type":50,"value":1094}," $SLUG ",{"type":44,"tag":486,"props":1096,"children":1097},{"style":499},[1098],{"type":50,"value":1099},">",{"type":44,"tag":486,"props":1101,"children":1102},{"style":510},[1103],{"type":50,"value":1104}," .quickstart-bootstrap.log",{"type":44,"tag":486,"props":1106,"children":1107},{"style":499},[1108],{"type":50,"value":1109}," 2>&1",{"type":44,"tag":486,"props":1111,"children":1112},{"style":499},[1113],{"type":50,"value":1114}," &\n",{"type":44,"tag":486,"props":1116,"children":1118},{"class":488,"line":1117},20,[1119,1123,1127,1132,1136],{"type":44,"tag":486,"props":1120,"children":1121},{"style":732},[1122],{"type":50,"value":744},{"type":44,"tag":486,"props":1124,"children":1125},{"style":499},[1126],{"type":50,"value":593},{"type":44,"tag":486,"props":1128,"children":1129},{"style":510},[1130],{"type":50,"value":1131},"SCAFFOLD_LAUNCHED log=.quickstart-bootstrap.log SLUG=",{"type":44,"tag":486,"props":1133,"children":1134},{"style":493},[1135],{"type":50,"value":758},{"type":44,"tag":486,"props":1137,"children":1138},{"style":499},[1139],{"type":50,"value":518},{"type":44,"tag":137,"props":1141,"children":1142},{},[1143,1169],{"type":44,"tag":141,"props":1144,"children":1145},{},[1146,1148,1154,1156,1161,1163,1168],{"type":50,"value":1147},"If it prints ",{"type":44,"tag":72,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":50,"value":1153},"SCAFFOLD_LAUNCHED",{"type":50,"value":1155},", the scaffold is running in the background.\n",{"type":44,"tag":66,"props":1157,"children":1158},{},[1159],{"type":50,"value":1160},"Do NOT run it again.",{"type":50,"value":1162}," Note the ",{"type":44,"tag":72,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":50,"value":753},{"type":50,"value":257},{"type":44,"tag":141,"props":1170,"children":1171},{},[1172,1174,1179,1181,1186,1188,1194],{"type":50,"value":1173},"If ",{"type":44,"tag":72,"props":1175,"children":1177},{"className":1176},[],[1178],{"type":50,"value":562},{"type":50,"value":1180}," is blocked or you see ",{"type":44,"tag":72,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":50,"value":874},{"type":50,"value":1187},", the network\u002Fsandbox\nblocked it — tell the user they likely need to run Codex with network access \u002F\nauto-approve (",{"type":44,"tag":72,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":50,"value":1193},"codex --sandbox danger-full-access",{"type":50,"value":1195},"), then retry.",{"type":44,"tag":118,"props":1197,"children":1199},{"id":1198},"step-1-wait-for-the-scaffold-open-the-browser",[1200],{"type":50,"value":1201},"STEP 1 — wait for the scaffold, open the browser",{"type":44,"tag":53,"props":1203,"children":1204},{},[1205,1207,1213,1215,1221],{"type":50,"value":1206},"Poll ",{"type":44,"tag":72,"props":1208,"children":1210},{"className":1209},[],[1211],{"type":50,"value":1212},".quickstart-bootstrap.log",{"type":50,"value":1214}," until it contains ",{"type":44,"tag":72,"props":1216,"children":1218},{"className":1217},[],[1219],{"type":50,"value":1220},"BOOTSTRAP_COMPLETE",{"type":50,"value":257},{"type":44,"tag":53,"props":1223,"children":1224},{},[1225,1238,1240,1245,1247,1252,1254,1259,1261,1267],{"type":44,"tag":66,"props":1226,"children":1227},{},[1228,1230,1236],{"type":50,"value":1229},"Codex's sandbox often reaps backgrounded (",{"type":44,"tag":72,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":50,"value":1235},"nohup … &",{"type":50,"value":1237},") processes when the launch\ncall returns",{"type":50,"value":1239}," — so the bootstrap may write its first line, then die before scaffolding.\nIf within ~20s the log has stalled (no new lines), ",{"type":44,"tag":66,"props":1241,"children":1242},{},[1243],{"type":50,"value":1244},"no app subdirectory has appeared",{"type":50,"value":1246},",\nand there's no ",{"type":44,"tag":72,"props":1248,"children":1250},{"className":1249},[],[1251],{"type":50,"value":1220},{"type":50,"value":1253},", the background launch was reaped. Recover by running\nthe bootstrap in the ",{"type":44,"tag":66,"props":1255,"children":1256},{},[1257],{"type":50,"value":1258},"FOREGROUND",{"type":50,"value":1260}," — re-run the STEP 0 block but replace the\n",{"type":44,"tag":72,"props":1262,"children":1264},{"className":1263},[],[1265],{"type":50,"value":1266},"nohup env … &",{"type":50,"value":1268}," line with a plain foreground run, same env:",{"type":44,"tag":475,"props":1270,"children":1272},{"className":477,"code":1271,"language":479,"meta":480,"style":480},"QB_PROFILE=minimal QB_HARNESS=codex QB_ARGS_BASE=\"$BASE\" QB_FEEDBACK_URL=\"$BASE\u002Ffeedback\" bash \"$QB\" $SLUG\n",[1273],{"type":44,"tag":72,"props":1274,"children":1275},{"__ignoreMap":480},[1276],{"type":44,"tag":486,"props":1277,"children":1278},{"class":488,"line":489},[1279,1284,1288,1293,1298,1302,1307,1312,1316,1320,1324,1328,1333,1337,1341,1345,1349,1353,1358,1362,1366,1370],{"type":44,"tag":486,"props":1280,"children":1281},{"style":493},[1282],{"type":50,"value":1283},"QB_PROFILE",{"type":44,"tag":486,"props":1285,"children":1286},{"style":499},[1287],{"type":50,"value":502},{"type":44,"tag":486,"props":1289,"children":1290},{"style":510},[1291],{"type":50,"value":1292},"minimal",{"type":44,"tag":486,"props":1294,"children":1295},{"style":493},[1296],{"type":50,"value":1297}," QB_HARNESS",{"type":44,"tag":486,"props":1299,"children":1300},{"style":499},[1301],{"type":50,"value":502},{"type":44,"tag":486,"props":1303,"children":1304},{"style":510},[1305],{"type":50,"value":1306},"codex",{"type":44,"tag":486,"props":1308,"children":1309},{"style":493},[1310],{"type":50,"value":1311}," QB_ARGS_BASE",{"type":44,"tag":486,"props":1313,"children":1314},{"style":499},[1315],{"type":50,"value":502},{"type":44,"tag":486,"props":1317,"children":1318},{"style":499},[1319],{"type":50,"value":507},{"type":44,"tag":486,"props":1321,"children":1322},{"style":493},[1323],{"type":50,"value":598},{"type":44,"tag":486,"props":1325,"children":1326},{"style":499},[1327],{"type":50,"value":507},{"type":44,"tag":486,"props":1329,"children":1330},{"style":493},[1331],{"type":50,"value":1332}," QB_FEEDBACK_URL",{"type":44,"tag":486,"props":1334,"children":1335},{"style":499},[1336],{"type":50,"value":502},{"type":44,"tag":486,"props":1338,"children":1339},{"style":499},[1340],{"type":50,"value":507},{"type":44,"tag":486,"props":1342,"children":1343},{"style":493},[1344],{"type":50,"value":598},{"type":44,"tag":486,"props":1346,"children":1347},{"style":510},[1348],{"type":50,"value":1060},{"type":44,"tag":486,"props":1350,"children":1351},{"style":499},[1352],{"type":50,"value":507},{"type":44,"tag":486,"props":1354,"children":1355},{"style":559},[1356],{"type":50,"value":1357}," bash",{"type":44,"tag":486,"props":1359,"children":1360},{"style":499},[1361],{"type":50,"value":593},{"type":44,"tag":486,"props":1363,"children":1364},{"style":493},[1365],{"type":50,"value":847},{"type":44,"tag":486,"props":1367,"children":1368},{"style":499},[1369],{"type":50,"value":507},{"type":44,"tag":486,"props":1371,"children":1372},{"style":493},[1373],{"type":50,"value":1374}," $SLUG\n",{"type":44,"tag":53,"props":1376,"children":1377},{},[1378,1380,1386,1388,1394,1396,1401,1403,1408],{"type":50,"value":1379},"It backgrounds ",{"type":44,"tag":72,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":50,"value":1385},"convex dev",{"type":50,"value":1387}," \u002F ",{"type":44,"tag":72,"props":1389,"children":1391},{"className":1390},[],[1392],{"type":50,"value":1393},"next dev",{"type":50,"value":1395}," itself and returns at ",{"type":44,"tag":72,"props":1397,"children":1399},{"className":1398},[],[1400],{"type":50,"value":1220},{"type":50,"value":1402}," in\n~1–2 min (set a generous command timeout, 300s+). ",{"type":44,"tag":72,"props":1404,"children":1406},{"className":1405},[],[1407],{"type":50,"value":874},{"type":50,"value":1409}," → server\nunreachable; tell the user. When it completes the log prints:",{"type":44,"tag":137,"props":1411,"children":1412},{},[1413,1424],{"type":44,"tag":141,"props":1414,"children":1415},{},[1416,1422],{"type":44,"tag":72,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":50,"value":1421},"OPEN_BROWSER_URL: http:\u002F\u002Flocalhost:\u003Cport>",{"type":50,"value":1423}," — open this for the user immediately.",{"type":44,"tag":141,"props":1425,"children":1426},{},[1427,1429,1434,1436,1441,1443,1449,1450,1456],{"type":50,"value":1428},"The app is scaffolded in a new subdirectory with ",{"type":44,"tag":72,"props":1430,"children":1432},{"className":1431},[],[1433],{"type":50,"value":1385},{"type":50,"value":1435}," + ",{"type":44,"tag":72,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":50,"value":1393},{"type":50,"value":1442}," running\nand error watchers armed (",{"type":44,"tag":72,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":50,"value":1448},"convex-errors.log",{"type":50,"value":1387},{"type":44,"tag":72,"props":1451,"children":1453},{"className":1452},[],[1454],{"type":50,"value":1455},"next-errors.log",{"type":50,"value":1457}," paths are in the log).",{"type":44,"tag":118,"props":1459,"children":1461},{"id":1460},"step-2-read-the-runbook-build-the-idea-live",[1462],{"type":50,"value":1463},"STEP 2 — read the runbook + build the idea live",{"type":44,"tag":53,"props":1465,"children":1466},{},[1467],{"type":50,"value":1468},"Read the personalized runbook for the full build flow (it's served — fetch it):",{"type":44,"tag":475,"props":1470,"children":1472},{"className":477,"code":1471,"language":479,"meta":480,"style":480},"curl -fsS \"https:\u002F\u002Fbasic-anteater-667.convex.site\u002Fq\u002F$SLUG.md\"\n",[1473],{"type":44,"tag":72,"props":1474,"children":1475},{"__ignoreMap":480},[1476],{"type":44,"tag":486,"props":1477,"children":1478},{"class":488,"line":489},[1479,1483,1487,1491,1496,1500,1505],{"type":44,"tag":486,"props":1480,"children":1481},{"style":559},[1482],{"type":50,"value":562},{"type":44,"tag":486,"props":1484,"children":1485},{"style":510},[1486],{"type":50,"value":567},{"type":44,"tag":486,"props":1488,"children":1489},{"style":499},[1490],{"type":50,"value":593},{"type":44,"tag":486,"props":1492,"children":1493},{"style":510},[1494],{"type":50,"value":1495},"https:\u002F\u002Fbasic-anteater-667.convex.site\u002Fq\u002F",{"type":44,"tag":486,"props":1497,"children":1498},{"style":493},[1499],{"type":50,"value":758},{"type":44,"tag":486,"props":1501,"children":1502},{"style":510},[1503],{"type":50,"value":1504},".md",{"type":44,"tag":486,"props":1506,"children":1507},{"style":499},[1508],{"type":50,"value":518},{"type":44,"tag":53,"props":1510,"children":1511},{},[1512],{"type":50,"value":1513},"Then build the user's idea following it. What's already done by the scaffold:",{"type":44,"tag":137,"props":1515,"children":1516},{},[1517,1564,1615],{"type":44,"tag":141,"props":1518,"children":1519},{},[1520,1525,1527,1532,1534,1540,1542],{"type":44,"tag":66,"props":1521,"children":1522},{},[1523],{"type":50,"value":1524},"No auth this release",{"type":50,"value":1526}," — the scaffold ships with ",{"type":44,"tag":66,"props":1528,"children":1529},{},[1530],{"type":50,"value":1531},"no login",{"type":50,"value":1533},". Only add auth if the\nuser explicitly asks (then wire their requested provider via the ",{"type":44,"tag":72,"props":1535,"children":1537},{"className":1536},[],[1538],{"type":50,"value":1539},"convex-expert",{"type":50,"value":1541}," skill).\n",{"type":44,"tag":1543,"props":1544,"children":1545},"em",{},[1546,1548,1554,1556,1562],{"type":50,"value":1547},"(Passkeys are de-scoped — ",{"type":44,"tag":72,"props":1549,"children":1551},{"className":1550},[],[1552],{"type":50,"value":1553},"QB_PROFILE=minimal",{"type":50,"value":1555}," sets ",{"type":44,"tag":72,"props":1557,"children":1559},{"className":1558},[],[1560],{"type":50,"value":1561},"QB_PASSKEYS=0",{"type":50,"value":1563},".)",{"type":44,"tag":141,"props":1565,"children":1566},{},[1567,1572,1574,1579,1581,1587,1588,1594,1595,1601,1603],{"type":44,"tag":66,"props":1568,"children":1569},{},[1570],{"type":50,"value":1571},"No feedback panel this release",{"type":50,"value":1573}," — narrate your build ",{"type":44,"tag":66,"props":1575,"children":1576},{},[1577],{"type":50,"value":1578},"in chat",{"type":50,"value":1580},"; do NOT call\n",{"type":44,"tag":72,"props":1582,"children":1584},{"className":1583},[],[1585],{"type":50,"value":1586},"progress:post",{"type":50,"value":1387},{"type":44,"tag":72,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":50,"value":1593},"todos:*",{"type":50,"value":1387},{"type":44,"tag":72,"props":1596,"children":1598},{"className":1597},[],[1599],{"type":50,"value":1600},"refinementQuestions:*",{"type":50,"value":1602},". ",{"type":44,"tag":1543,"props":1604,"children":1605},{},[1606,1608,1614],{"type":50,"value":1607},"(Panel is off — ",{"type":44,"tag":72,"props":1609,"children":1611},{"className":1610},[],[1612],{"type":50,"value":1613},"QB_PANEL=0",{"type":50,"value":1563},{"type":44,"tag":141,"props":1616,"children":1617},{},[1618,1623,1625,1630,1632,1638],{"type":44,"tag":66,"props":1619,"children":1620},{},[1621],{"type":50,"value":1622},"Publishing is disabled this release",{"type":50,"value":1624}," — the app runs ",{"type":44,"tag":66,"props":1626,"children":1627},{},[1628],{"type":50,"value":1629},"locally",{"type":50,"value":1631}," at the printed URL;\ndo not publish or run ",{"type":44,"tag":72,"props":1633,"children":1635},{"className":1634},[],[1636],{"type":50,"value":1637},"$add hosting",{"type":50,"value":257},{"type":44,"tag":53,"props":1640,"children":1641},{},[1642],{"type":50,"value":1643},"Rules while building:",{"type":44,"tag":137,"props":1645,"children":1646},{},[1647,1669],{"type":44,"tag":141,"props":1648,"children":1649},{},[1650,1652,1657,1659,1667],{"type":50,"value":1651},"Delegate all code inside ",{"type":44,"tag":72,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":50,"value":154},{"type":50,"value":1658}," to the ",{"type":44,"tag":66,"props":1660,"children":1661},{},[1662],{"type":44,"tag":72,"props":1663,"children":1665},{"className":1664},[],[1666],{"type":50,"value":1539},{"type":50,"value":1668}," skill's rules\n(object-form syntax, validators, indexes, internal vs public).",{"type":44,"tag":141,"props":1670,"children":1671},{},[1672,1674,1679,1680,1686,1688,1694],{"type":50,"value":1673},"Watch for ",{"type":44,"tag":72,"props":1675,"children":1677},{"className":1676},[],[1678],{"type":50,"value":154},{"type":50,"value":1435},{"type":44,"tag":72,"props":1681,"children":1683},{"className":1682},[],[1684],{"type":50,"value":1685},"next",{"type":50,"value":1687}," errors and fix them as they appear — the easiest way\nis the ",{"type":44,"tag":72,"props":1689,"children":1691},{"className":1690},[],[1692],{"type":50,"value":1693},"fix_errors_automatically",{"type":50,"value":1695}," tool (see STEP 5), which surfaces them as events.",{"type":44,"tag":118,"props":1697,"children":1699},{"id":1698},"step-3-wrap-up-runs-locally-no-publish-this-release",[1700],{"type":50,"value":1701},"STEP 3 — wrap up (runs locally; no publish this release)",{"type":44,"tag":53,"props":1703,"children":1704},{},[1705,1707,1711,1713,1718,1720,1725,1727,1732,1734,1740],{"type":50,"value":1706},"When the app builds clean and the core feature works (your \"v1\"), tell the user it's\nrunning ",{"type":44,"tag":66,"props":1708,"children":1709},{},[1710],{"type":50,"value":1629},{"type":50,"value":1712}," at the printed URL and summarize what you built. Publishing to a\npublic ",{"type":44,"tag":72,"props":1714,"children":1716},{"className":1715},[],[1717],{"type":50,"value":77},{"type":50,"value":1719}," URL and custom domains are ",{"type":44,"tag":66,"props":1721,"children":1722},{},[1723],{"type":50,"value":1724},"disabled this release",{"type":50,"value":1726}," — don't\ndeploy, don't run ",{"type":44,"tag":72,"props":1728,"children":1730},{"className":1729},[],[1731],{"type":50,"value":1637},{"type":50,"value":1733},", and don't look for ",{"type":44,"tag":72,"props":1735,"children":1737},{"className":1736},[],[1738],{"type":50,"value":1739},".quickstart-domains.json",{"type":50,"value":257},{"type":44,"tag":118,"props":1742,"children":1744},{"id":1743},"step-5-stay-on-watch-with-fix_errors_automatically-start-early-dont-yield",[1745,1747,1752],{"type":50,"value":1746},"STEP 5 — stay on watch with ",{"type":44,"tag":72,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":50,"value":1693},{"type":50,"value":1753}," (start EARLY, don't yield)",{"type":44,"tag":53,"props":1755,"children":1756},{},[1757,1759,1764,1766,1772,1774,1779,1781,1787,1788,1794],{"type":50,"value":1758},"This harness has no push: a runtime error (or a slow async result) sits ",{"type":44,"tag":66,"props":1760,"children":1761},{},[1762],{"type":50,"value":1763},"unseen",{"type":50,"value":1765},"\nuntil you actively look. This plugin bundles a ",{"type":44,"tag":72,"props":1767,"children":1769},{"className":1768},[],[1770],{"type":50,"value":1771},"convex-plugin",{"type":50,"value":1773}," MCP server with one\n",{"type":44,"tag":66,"props":1775,"children":1776},{},[1777],{"type":50,"value":1778},"blocking",{"type":50,"value":1780}," tool that surfaces it as an event — keep using it even though the\nfeedback panel is off this release (the ",{"type":44,"tag":72,"props":1782,"children":1784},{"className":1783},[],[1785],{"type":50,"value":1786},"convex_error",{"type":50,"value":1387},{"type":44,"tag":72,"props":1789,"children":1791},{"className":1790},[],[1792],{"type":50,"value":1793},"next_error",{"type":50,"value":1795}," watch is the\nvaluable part).",{"type":44,"tag":53,"props":1797,"children":1798},{},[1799,1804,1806,1811,1813,1818,1820,1826],{"type":44,"tag":66,"props":1800,"children":1801},{},[1802],{"type":50,"value":1803},"Start watching as soon as the app is open (right after STEP 1) — not just after\nv1.",{"type":50,"value":1805}," The user is most engaged at the very start and will often submit a request or\nquestion while you're still building. Call ",{"type":44,"tag":72,"props":1807,"children":1809},{"className":1808},[],[1810],{"type":50,"value":1693},{"type":50,"value":1812}," between build\nmilestones and whenever you'd otherwise pause; on the FIRST call it returns\n",{"type":44,"tag":66,"props":1814,"children":1815},{},[1816],{"type":50,"value":1817},"immediately",{"type":50,"value":1819}," if anything is already pending (it surfaces existing unhandled\nrequests\u002Fquestions as ",{"type":44,"tag":72,"props":1821,"children":1823},{"className":1822},[],[1824],{"type":50,"value":1825},"existing: true",{"type":50,"value":1827},"), so feedback submitted before you started\nwatching is never lost. Then make it your standing idle action for the rest of the\nsession.",{"type":44,"tag":59,"props":1829,"children":1830},{},[1831],{"type":44,"tag":53,"props":1832,"children":1833},{},[1834,1839,1841,1846,1848,1854,1856,1862,1864,1870,1872,1878],{"type":44,"tag":66,"props":1835,"children":1836},{},[1837],{"type":50,"value":1838},"Avoid the repeated approval prompt:",{"type":50,"value":1840}," each call is a separate tool invocation,\nso a one-time \"Allow\" re-asks every loop. Choose ",{"type":44,"tag":66,"props":1842,"children":1843},{},[1844],{"type":50,"value":1845},"\"Always allow\"",{"type":50,"value":1847}," when prompted,\nor add to ",{"type":44,"tag":72,"props":1849,"children":1851},{"className":1850},[],[1852],{"type":50,"value":1853},"~\u002F.codex\u002Fconfig.toml",{"type":50,"value":1855},": ",{"type":44,"tag":72,"props":1857,"children":1859},{"className":1858},[],[1860],{"type":50,"value":1861},"[mcp_servers.convex-plugin]",{"type":50,"value":1863}," then\n",{"type":44,"tag":72,"props":1865,"children":1867},{"className":1866},[],[1868],{"type":50,"value":1869},"trust_level = \"trusted\"",{"type":50,"value":1871},". Also pass a long ",{"type":44,"tag":72,"props":1873,"children":1875},{"className":1874},[],[1876],{"type":50,"value":1877},"timeoutMs",{"type":50,"value":1879}," (e.g. 280000) so each\nblock is long and you re-call less often.",{"type":44,"tag":53,"props":1881,"children":1882},{},[1883,1885,1893,1895,1901,1903,1908,1910,1916,1918,1924],{"type":50,"value":1884},"Call the ",{"type":44,"tag":66,"props":1886,"children":1887},{},[1888],{"type":44,"tag":72,"props":1889,"children":1891},{"className":1890},[],[1892],{"type":50,"value":1693},{"type":50,"value":1894}," tool with ",{"type":44,"tag":72,"props":1896,"children":1898},{"className":1897},[],[1899],{"type":50,"value":1900},"projectDir",{"type":50,"value":1902}," set to your app's\n",{"type":44,"tag":66,"props":1904,"children":1905},{},[1906],{"type":50,"value":1907},"absolute path",{"type":50,"value":1909}," (the ",{"type":44,"tag":72,"props":1911,"children":1913},{"className":1912},[],[1914],{"type":50,"value":1915},"convex-app\u002F",{"type":50,"value":1917}," subdir, where ",{"type":44,"tag":72,"props":1919,"children":1921},{"className":1920},[],[1922],{"type":50,"value":1923},".env.local",{"type":50,"value":1925}," lives). It BLOCKS\nuntil the next event, then returns one of:",{"type":44,"tag":137,"props":1927,"children":1928},{},[1929,1947,1970],{"type":44,"tag":141,"props":1930,"children":1931},{},[1932,1938,1939,1945],{"type":44,"tag":72,"props":1933,"children":1935},{"className":1934},[],[1936],{"type":50,"value":1937},"feature_request",{"type":50,"value":1387},{"type":44,"tag":72,"props":1940,"children":1942},{"className":1941},[],[1943],{"type":50,"value":1944},"refinement_answer",{"type":50,"value":1946}," → the user wants something — handle it\n(loop back through STEP 2\u002F3), then call the tool again.",{"type":44,"tag":141,"props":1948,"children":1949},{},[1950,1955,1956,1961,1963,1968],{"type":44,"tag":72,"props":1951,"children":1953},{"className":1952},[],[1954],{"type":50,"value":1786},{"type":50,"value":1387},{"type":44,"tag":72,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":50,"value":1793},{"type":50,"value":1962}," → stop, read the line, fix the file, wait for\n",{"type":44,"tag":72,"props":1964,"children":1966},{"className":1965},[],[1967],{"type":50,"value":1385},{"type":50,"value":1969}," \u002F Next to recover, then call again.",{"type":44,"tag":141,"props":1971,"children":1972},{},[1973,1979],{"type":44,"tag":72,"props":1974,"children":1976},{"className":1975},[],[1977],{"type":50,"value":1978},"quiet",{"type":50,"value":1980}," → heartbeat timeout, nothing happened — just call it again.",{"type":44,"tag":53,"props":1982,"children":1983},{},[1984,1989],{"type":44,"tag":66,"props":1985,"children":1986},{},[1987],{"type":50,"value":1988},"Loop on this tool instead of ending your turn.",{"type":50,"value":1990}," Each call blocks, so you stay on\nwatch and react within seconds — no polling, no walking away. Keep looping until the\nuser clearly says they're done.",{"type":44,"tag":118,"props":1992,"children":1994},{"id":1993},"after-the-run",[1995],{"type":50,"value":1996},"After the run",{"type":44,"tag":53,"props":1998,"children":1999},{},[2000,2002,2008],{"type":50,"value":2001},"Offer ",{"type":44,"tag":72,"props":2003,"children":2005},{"className":2004},[],[2006],{"type":50,"value":2007},"$improve-convex-plugin",{"type":50,"value":2009}," so the user can send this session for an AI review that\nimproves the quickstart.",{"type":44,"tag":118,"props":2011,"children":2013},{"id":2012},"on-failure-friction-offer-to-self-report-with-the-users-permission",[2014],{"type":50,"value":2015},"On failure \u002F friction — offer to self-report (WITH the user's permission)",{"type":44,"tag":53,"props":2017,"children":2018},{},[2019,2021,2026],{"type":50,"value":2020},"If the run doesn't go smoothly — you give up, hit a blocker, it takes way too long, or\nthe user is frustrated — don't yield silently. ",{"type":44,"tag":66,"props":2022,"children":2023},{},[2024],{"type":50,"value":2025},"Ask first, send only on a yes",{"type":50,"value":473},{"type":44,"tag":59,"props":2028,"children":2029},{},[2030],{"type":44,"tag":53,"props":2031,"children":2032},{},[2033,2035,2040],{"type":50,"value":2034},"\"That didn't go as smoothly as it should have. May I send this session — the transcript,\nwith secrets redacted — to the Convex team so they can fix what went wrong? ",{"type":44,"tag":486,"props":2036,"children":2037},{},[2038],{"type":50,"value":2039},"yes \u002F no",{"type":50,"value":507},{"type":44,"tag":137,"props":2042,"children":2043},{},[2044,2068,2078],{"type":44,"tag":141,"props":2045,"children":2046},{},[2047,2052,2054,2060,2062],{"type":44,"tag":66,"props":2048,"children":2049},{},[2050],{"type":50,"value":2051},"On yes",{"type":50,"value":2053}," → run the ",{"type":44,"tag":72,"props":2055,"children":2057},{"className":2056},[],[2058],{"type":50,"value":2059},"improve-convex-plugin",{"type":50,"value":2061}," flow (ships the redacted transcript):\n",{"type":44,"tag":72,"props":2063,"children":2065},{"className":2064},[],[2066],{"type":50,"value":2067},"curl -fsSL \"https:\u002F\u002Fbasic-anteater-667.convex.site\u002Fsend-transcript\" | QB_HARNESS=codex bash -s -- --idea \"\u003Cwhat broke>\"",{"type":44,"tag":141,"props":2069,"children":2070},{},[2071,2076],{"type":44,"tag":66,"props":2072,"children":2073},{},[2074],{"type":50,"value":2075},"On no",{"type":50,"value":2077}," → respect it; send nothing.",{"type":44,"tag":141,"props":2079,"children":2080},{},[2081],{"type":50,"value":2082},"Either way, give the user an honest summary of where it got stuck.",{"type":44,"tag":53,"props":2084,"children":2085},{},[2086],{"type":50,"value":2087},"Never send the transcript without an explicit yes.",{"type":44,"tag":2089,"props":2090,"children":2091},"style",{},[2092],{"type":50,"value":2093},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":2095,"total":2277},[2096,2111,2126,2141,2158,2173,2188,2198,2217,2231,2248,2262],{"slug":8,"name":8,"fn":2097,"description":2098,"org":2099,"tags":2100,"stars":2108,"repoUrl":2109,"updatedAt":2110},"guide Convex project setup and usage","Routes general Convex requests to the right project skill. Use when the user asks which Convex skill to use or gives an underspecified Convex app task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2101,2104,2105],{"name":2102,"slug":2103,"type":14},"Backend","backend",{"name":9,"slug":8,"type":14},{"name":2106,"slug":2107,"type":14},"Database","database",34,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills","2026-07-12T08:00:45.091281",{"slug":2112,"name":2112,"fn":2113,"description":2114,"org":2115,"tags":2116,"stars":2108,"repoUrl":2109,"updatedAt":2125},"convex-create-component","build reusable Convex components","Builds reusable Convex components with isolated tables and app-facing APIs. Use for new components, reusable backend modules, integrations, or component boundary work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2117,2120,2123,2124],{"name":2118,"slug":2119,"type":14},"API Development","api-development",{"name":2121,"slug":2122,"type":14},"Architecture","architecture",{"name":2102,"slug":2103,"type":14},{"name":9,"slug":8,"type":14},"2026-07-12T08:00:39.428577",{"slug":2127,"name":2127,"fn":2128,"description":2129,"org":2130,"tags":2131,"stars":2108,"repoUrl":2109,"updatedAt":2140},"convex-migration-helper","plan Convex schema and data migrations","Plans Convex schema and data migrations with widen-migrate-narrow and @convex-dev\u002Fmigrations. Use for breaking schema changes, backfills, table reshaping, or zero-downtime rollouts.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2132,2133,2134,2137],{"name":2102,"slug":2103,"type":14},{"name":9,"slug":8,"type":14},{"name":2135,"slug":2136,"type":14},"Data Engineering","data-engineering",{"name":2138,"slug":2139,"type":14},"Migration","migration","2026-07-12T08:00:51.27967",{"slug":2142,"name":2142,"fn":2143,"description":2144,"org":2145,"tags":2146,"stars":2108,"repoUrl":2109,"updatedAt":2157},"convex-performance-audit","audit Convex application performance","Audits Convex performance for reads, subscriptions, write contention, and function limits. Use for slow features, insights findings, OCC conflicts, or read amplification.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2147,2148,2151,2154],{"name":9,"slug":8,"type":14},{"name":2149,"slug":2150,"type":14},"Debugging","debugging",{"name":2152,"slug":2153,"type":14},"Monitoring","monitoring",{"name":2155,"slug":2156,"type":14},"Performance","performance","2026-07-12T08:00:50.02928",{"slug":2159,"name":2159,"fn":2160,"description":2161,"org":2162,"tags":2163,"stars":2108,"repoUrl":2109,"updatedAt":2172},"convex-quickstart","initialize Convex in applications","Creates or adds Convex to an app. Use for new Convex projects, npm create convex@latest, frontend setup, env vars, or the first npx convex dev run.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2164,2167,2168,2169],{"name":2165,"slug":2166,"type":14},"CLI","cli",{"name":9,"slug":8,"type":14},{"name":25,"slug":26,"type":14},{"name":2170,"slug":2171,"type":14},"Onboarding","onboarding","2026-07-12T08:00:43.436152",{"slug":2174,"name":2174,"fn":2175,"description":2176,"org":2177,"tags":2178,"stars":2108,"repoUrl":2109,"updatedAt":2187},"convex-setup-auth","set up authentication and access control","Sets up Convex auth, identity mapping, and access control. Use for login, auth providers, users tables, protected functions, or roles in a Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2179,2182,2185,2186],{"name":2180,"slug":2181,"type":14},"Access Control","access-control",{"name":2183,"slug":2184,"type":14},"Auth","auth",{"name":2102,"slug":2103,"type":14},{"name":9,"slug":8,"type":14},"2026-07-12T08:00:48.652641",{"slug":2189,"name":2189,"fn":2190,"description":2191,"org":2192,"tags":2193,"stars":27,"repoUrl":28,"updatedAt":2197},"add","add capabilities to Convex applications","Add a capability to the CURRENT Convex + Next.js project — consults the served Convex capability catalog for always-current procedures (billing, crons, auth, agent, search, …); falls back to built-in hosting or @convex-dev component search. TRIGGER when the user runs $add, or asks to add hosting\u002Fpublishing or any backend capability to an existing Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2194,2195,2196],{"name":2102,"slug":2103,"type":14},{"name":9,"slug":8,"type":14},{"name":16,"slug":17,"type":14},"2026-07-12T07:59:59.358004",{"slug":2199,"name":2199,"fn":2200,"description":2201,"org":2202,"tags":2203,"stars":27,"repoUrl":28,"updatedAt":2216},"agent","build AI agents with Convex","Build an AI agent \u002F RAG feature on Convex (@convex-dev\u002Fagent: threads, tools, vector search). TRIGGER on an AI-agent\u002Fchatbot\u002FRAG request.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2204,2207,2210,2213],{"name":2205,"slug":2206,"type":14},"Agents","agents",{"name":2208,"slug":2209,"type":14},"Engineering","engineering",{"name":2211,"slug":2212,"type":14},"RAG","rag",{"name":2214,"slug":2215,"type":14},"Search","search","2026-07-12T08:00:01.921824",{"slug":2184,"name":2184,"fn":2218,"description":2219,"org":2220,"tags":2221,"stars":27,"repoUrl":28,"updatedAt":2230},"add authentication to Convex applications","Add sign-in (passkeys by default, OAuth\u002Fpassword optional) to the current Convex app, wired correctly incl. auth.config.ts. TRIGGER on a login\u002Fauth request for an existing app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2222,2223,2226,2227],{"name":2183,"slug":2184,"type":14},{"name":2224,"slug":2225,"type":14},"Authentication","authentication",{"name":9,"slug":8,"type":14},{"name":2228,"slug":2229,"type":14},"OAuth","oauth","2026-07-18T05:12:54.443056",{"slug":2232,"name":2232,"fn":2233,"description":2234,"org":2235,"tags":2236,"stars":27,"repoUrl":28,"updatedAt":2247},"billing","integrate Stripe billing in Convex apps","Add Stripe billing to a Convex app via @convex-dev\u002Fstripe (checkout + auto-verified webhook + subscription gating). TRIGGER on a payments\u002Fbilling\u002Fsubscription request.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2237,2238,2241,2244],{"name":9,"slug":8,"type":14},{"name":2239,"slug":2240,"type":14},"Payments","payments",{"name":2242,"slug":2243,"type":14},"Stripe","stripe",{"name":2245,"slug":2246,"type":14},"Webhooks","webhooks","2026-07-12T08:00:08.123246",{"slug":2249,"name":2249,"fn":2250,"description":2251,"org":2252,"tags":2253,"stars":27,"repoUrl":28,"updatedAt":2261},"check-updates","upgrade Convex component versions","Check the CURRENT Convex app's pinned components against the latest recommended versions and offer to upgrade them — e.g. the passkey auth component's new email-first sign-in. TRIGGER when the user runs \u002Fcheck-updates or $check-updates, asks 'are my components up to date', 'any updates', 'upgrade auth', 'upgrade my components', or wants the newest features after a quickstart. Applies each upgrade behind a build gate (verify-or-revert) with the user's consent.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2254,2257,2258],{"name":2255,"slug":2256,"type":14},"Configuration","configuration",{"name":9,"slug":8,"type":14},{"name":2259,"slug":2260,"type":14},"Maintenance","maintenance","2026-07-12T08:00:03.236862",{"slug":2263,"name":2263,"fn":2264,"description":2265,"org":2266,"tags":2267,"stars":27,"repoUrl":28,"updatedAt":2276},"convex-authz","audit and harden Convex authorization","Audit and harden a Convex app's authorization: identity-from-arg impersonation, missing per-document ownership checks, and public queries leaking PII\u002Ffinancial data by a client-supplied id — the single largest real-defect cluster measured against generated Convex backends (44 of 214). Runs a deterministic scan for the 3 shapes, then applies the canonical requireIdentity\u002FrequireOwner pattern, then verifies with tsc. TRIGGER on 'secure my app', 'audit auth', 'add login', 'who can access this data', or an explicit 'audit my authz'. NOT always-on. SKIP when there is no convex\u002F directory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2268,2269,2272,2273],{"name":2183,"slug":2184,"type":14},{"name":2270,"slug":2271,"type":14},"Code Analysis","code-analysis",{"name":9,"slug":8,"type":14},{"name":2274,"slug":2275,"type":14},"Security","security","2026-07-12T08:00:04.516752",26,{"items":2279,"total":1071},[2280,2286,2293,2300,2307,2313,2320],{"slug":2189,"name":2189,"fn":2190,"description":2191,"org":2281,"tags":2282,"stars":27,"repoUrl":28,"updatedAt":2197},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2283,2284,2285],{"name":2102,"slug":2103,"type":14},{"name":9,"slug":8,"type":14},{"name":16,"slug":17,"type":14},{"slug":2199,"name":2199,"fn":2200,"description":2201,"org":2287,"tags":2288,"stars":27,"repoUrl":28,"updatedAt":2216},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2289,2290,2291,2292],{"name":2205,"slug":2206,"type":14},{"name":2208,"slug":2209,"type":14},{"name":2211,"slug":2212,"type":14},{"name":2214,"slug":2215,"type":14},{"slug":2184,"name":2184,"fn":2218,"description":2219,"org":2294,"tags":2295,"stars":27,"repoUrl":28,"updatedAt":2230},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2296,2297,2298,2299],{"name":2183,"slug":2184,"type":14},{"name":2224,"slug":2225,"type":14},{"name":9,"slug":8,"type":14},{"name":2228,"slug":2229,"type":14},{"slug":2232,"name":2232,"fn":2233,"description":2234,"org":2301,"tags":2302,"stars":27,"repoUrl":28,"updatedAt":2247},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2303,2304,2305,2306],{"name":9,"slug":8,"type":14},{"name":2239,"slug":2240,"type":14},{"name":2242,"slug":2243,"type":14},{"name":2245,"slug":2246,"type":14},{"slug":2249,"name":2249,"fn":2250,"description":2251,"org":2308,"tags":2309,"stars":27,"repoUrl":28,"updatedAt":2261},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2310,2311,2312],{"name":2255,"slug":2256,"type":14},{"name":9,"slug":8,"type":14},{"name":2259,"slug":2260,"type":14},{"slug":2263,"name":2263,"fn":2264,"description":2265,"org":2314,"tags":2315,"stars":27,"repoUrl":28,"updatedAt":2276},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2316,2317,2318,2319],{"name":2183,"slug":2184,"type":14},{"name":2270,"slug":2271,"type":14},{"name":9,"slug":8,"type":14},{"name":2274,"slug":2275,"type":14},{"slug":1539,"name":1539,"fn":2321,"description":2322,"org":2323,"tags":2324,"stars":27,"repoUrl":28,"updatedAt":2331},"develop Convex backend applications","Convex backend rules — consult this whenever writing or editing any code inside a convex\u002F directory (schemas, queries, mutations, actions, HTTP endpoints, crons, file storage, auth, component installation). TRIGGER before touching convex\u002F functions, so the code uses the object-form syntax, validators, indexes, and component patterns that generic models get wrong.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2325,2326,2327,2328],{"name":2102,"slug":2103,"type":14},{"name":9,"slug":8,"type":14},{"name":2106,"slug":2107,"type":14},{"name":2329,"slug":2330,"type":14},"TypeScript","typescript","2026-07-18T05:12:50.448833"]