[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-convex-convex-backup":3,"mdc--gz8lih-key":35,"related-org-convex-convex-backup":239,"related-repo-convex-convex-backup":406},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":30,"sourceUrl":33,"mdContent":34},"convex-backup","configure and test Convex database backups","Set up Convex backups and run a restore DRILL that proves recovery — snapshot, restore into a throwaway preview, assert the data came back — plus a schedule matched to your RPO and a gated recovery runbook.",{"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],{"name":9,"slug":8,"type":14},"tag",{"name":16,"slug":17,"type":14},"Reliability","reliability",{"name":19,"slug":20,"type":14},"Database","database",{"name":22,"slug":23,"type":14},"Backup","backup",34,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills","2026-08-04T05:58:42.702643",null,7,[],{"repoUrl":25,"stars":24,"forks":28,"topics":31,"description":32},[],"Convex Skills for Agents","https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fconvex-backup","---\nname: convex-backup\ndescription: \"Set up Convex backups and run a restore DRILL that proves recovery — snapshot, restore into a throwaway preview, assert the data came back — plus a schedule matched to your RPO and a gated recovery runbook.\"\n---\n\n\u003C!-- GENERATED from convex-agents content\u002Fcapabilities\u002Fconvex-backup.json — do not edit by hand. -->\n\n# Back up — and prove the restore works\n\nEvery backup story has two halves and most people only do the first: taking the backup, and proving you can get it back. This capability does both — it sets up regular snapshot exports and then runs a RESTORE DRILL that actually recovers the data into a disposable preview and asserts it's intact. The drill reuses migrate-rehearse's exact primitives (snapshot export → preview deploy → snapshot import) pointed at recovery instead of a forward change, so the safety net is tested, not assumed.\n\n## Workflow\n\n1. GUARD: deploy-guard — classify + announce the deployment being backed up (reading\u002Fexporting is safe; the drill's restore target is a throwaway preview, never prod).\n2. TAKE the snapshot: `npx convex export --path backup-\u003Cdate>.zip` (add `--include-file-storage` if the app stores files). This is the backup artifact; treat it as sensitive real data.\n3. SCHEDULE it (the ongoing half): recommend a cadence matched to how fast the data changes and how much loss is tolerable (RPO) — e.g. a daily `npx convex export` via CI\u002Fcron to durable storage the user controls, with a retention window. Convex's own platform backups exist; this adds a user-owned, portable copy.\n4. RESTORE DRILL (the half almost nobody does — this is the point):\n   (a) PRECONDITION: a Preview Deploy Key as `CONVEX_DEPLOY_KEY` (same requirement as migrate-rehearse; a paid-tier feature). If unavailable, drill against a fresh personal dev deployment instead and say so.\n   (b) create a throwaway preview from the CURRENT code: `npx convex deploy --preview-create restore-drill-\u003Cdate>`.\n   (c) restore the snapshot into it: `npx convex import backup-\u003Cdate>.zip --deployment restore-drill-\u003Cdate> --replace` (import targets a deployment by NAME with `--deployment`; there is no `--preview-name` on import).\n   (d) ASSERT recovery: read the restored data back (MCP `tables` for row counts, `data`\u002F`runOneoffQuery` for spot-checks) and confirm the critical tables came back with the expected row counts and a sample of real records — a restore that 'succeeds' but lands 0 rows is a FAILED drill. Compare against the source's counts where available.\n5. REPORT the drill result plainly: what was backed up, that the restore was ACTUALLY performed and verified (or that it FAILED and why — a failed drill is the most valuable output, found before a real disaster), the recommended schedule + retention, and the recovery runbook (the exact commands to restore to prod: `npx convex import backup.zip --replace --prod`, gated by deploy-guard, with the post-snapshot-write-loss caveat stated).\n6. HYGIENE: delete local snapshot copies when done (real data); the drill preview auto-expires. Never commit a backup file.\n\n## Rules\n\n- A backup you have never restored is a hope, not a backup — always run (or offer to run) the restore DRILL, don't just take the export.\n- The drill restores into a THROWAWAY preview (or dev), never prod; the restore target and the backup source are different deployments.\n- Assert recovery, don't assume it: a restore that lands 0 rows is a FAILED drill — check critical-table row counts + a real-record sample against the source.\n- A FAILED drill is the most valuable output — surface it loudly; that's the whole reason to drill before a real disaster.\n- Schedule matched to RPO (how much data loss is tolerable); keep a user-owned portable copy alongside Convex's platform backups, with a retention window.\n- Snapshots are sensitive real data: delete local copies when done, never commit them; the restore-to-prod runbook is deploy-guard-gated with the post-snapshot-write-loss caveat stated.\n- Shares migrate-rehearse's snapshot+preview mechanics but aims them at RECOVERY, not a forward change — a forward schema change is migrate-rehearse.\n",{"data":36,"body":37},{"name":4,"description":6},{"type":38,"children":39},"root",[40,49,55,62,194,200],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"back-up-and-prove-the-restore-works",[46],{"type":47,"value":48},"text","Back up — and prove the restore works",{"type":41,"tag":50,"props":51,"children":52},"p",{},[53],{"type":47,"value":54},"Every backup story has two halves and most people only do the first: taking the backup, and proving you can get it back. This capability does both — it sets up regular snapshot exports and then runs a RESTORE DRILL that actually recovers the data into a disposable preview and asserts it's intact. The drill reuses migrate-rehearse's exact primitives (snapshot export → preview deploy → snapshot import) pointed at recovery instead of a forward change, so the safety net is tested, not assumed.",{"type":41,"tag":56,"props":57,"children":59},"h2",{"id":58},"workflow",[60],{"type":47,"value":61},"Workflow",{"type":41,"tag":63,"props":64,"children":65},"ol",{},[66,72,94,107,176,189],{"type":41,"tag":67,"props":68,"children":69},"li",{},[70],{"type":47,"value":71},"GUARD: deploy-guard — classify + announce the deployment being backed up (reading\u002Fexporting is safe; the drill's restore target is a throwaway preview, never prod).",{"type":41,"tag":67,"props":73,"children":74},{},[75,77,84,86,92],{"type":47,"value":76},"TAKE the snapshot: ",{"type":41,"tag":78,"props":79,"children":81},"code",{"className":80},[],[82],{"type":47,"value":83},"npx convex export --path backup-\u003Cdate>.zip",{"type":47,"value":85}," (add ",{"type":41,"tag":78,"props":87,"children":89},{"className":88},[],[90],{"type":47,"value":91},"--include-file-storage",{"type":47,"value":93}," if the app stores files). This is the backup artifact; treat it as sensitive real data.",{"type":41,"tag":67,"props":95,"children":96},{},[97,99,105],{"type":47,"value":98},"SCHEDULE it (the ongoing half): recommend a cadence matched to how fast the data changes and how much loss is tolerable (RPO) — e.g. a daily ",{"type":41,"tag":78,"props":100,"children":102},{"className":101},[],[103],{"type":47,"value":104},"npx convex export",{"type":47,"value":106}," via CI\u002Fcron to durable storage the user controls, with a retention window. Convex's own platform backups exist; this adds a user-owned, portable copy.",{"type":41,"tag":67,"props":108,"children":109},{},[110,112,118,120,126,128,134,136,142,144,150,152,158,160,166,168,174],{"type":47,"value":111},"RESTORE DRILL (the half almost nobody does — this is the point):\n(a) PRECONDITION: a Preview Deploy Key as ",{"type":41,"tag":78,"props":113,"children":115},{"className":114},[],[116],{"type":47,"value":117},"CONVEX_DEPLOY_KEY",{"type":47,"value":119}," (same requirement as migrate-rehearse; a paid-tier feature). If unavailable, drill against a fresh personal dev deployment instead and say so.\n(b) create a throwaway preview from the CURRENT code: ",{"type":41,"tag":78,"props":121,"children":123},{"className":122},[],[124],{"type":47,"value":125},"npx convex deploy --preview-create restore-drill-\u003Cdate>",{"type":47,"value":127},".\n(c) restore the snapshot into it: ",{"type":41,"tag":78,"props":129,"children":131},{"className":130},[],[132],{"type":47,"value":133},"npx convex import backup-\u003Cdate>.zip --deployment restore-drill-\u003Cdate> --replace",{"type":47,"value":135}," (import targets a deployment by NAME with ",{"type":41,"tag":78,"props":137,"children":139},{"className":138},[],[140],{"type":47,"value":141},"--deployment",{"type":47,"value":143},"; there is no ",{"type":41,"tag":78,"props":145,"children":147},{"className":146},[],[148],{"type":47,"value":149},"--preview-name",{"type":47,"value":151}," on import).\n(d) ASSERT recovery: read the restored data back (MCP ",{"type":41,"tag":78,"props":153,"children":155},{"className":154},[],[156],{"type":47,"value":157},"tables",{"type":47,"value":159}," for row counts, ",{"type":41,"tag":78,"props":161,"children":163},{"className":162},[],[164],{"type":47,"value":165},"data",{"type":47,"value":167},"\u002F",{"type":41,"tag":78,"props":169,"children":171},{"className":170},[],[172],{"type":47,"value":173},"runOneoffQuery",{"type":47,"value":175}," for spot-checks) and confirm the critical tables came back with the expected row counts and a sample of real records — a restore that 'succeeds' but lands 0 rows is a FAILED drill. Compare against the source's counts where available.",{"type":41,"tag":67,"props":177,"children":178},{},[179,181,187],{"type":47,"value":180},"REPORT the drill result plainly: what was backed up, that the restore was ACTUALLY performed and verified (or that it FAILED and why — a failed drill is the most valuable output, found before a real disaster), the recommended schedule + retention, and the recovery runbook (the exact commands to restore to prod: ",{"type":41,"tag":78,"props":182,"children":184},{"className":183},[],[185],{"type":47,"value":186},"npx convex import backup.zip --replace --prod",{"type":47,"value":188},", gated by deploy-guard, with the post-snapshot-write-loss caveat stated).",{"type":41,"tag":67,"props":190,"children":191},{},[192],{"type":47,"value":193},"HYGIENE: delete local snapshot copies when done (real data); the drill preview auto-expires. Never commit a backup file.",{"type":41,"tag":56,"props":195,"children":197},{"id":196},"rules",[198],{"type":47,"value":199},"Rules",{"type":41,"tag":201,"props":202,"children":203},"ul",{},[204,209,214,219,224,229,234],{"type":41,"tag":67,"props":205,"children":206},{},[207],{"type":47,"value":208},"A backup you have never restored is a hope, not a backup — always run (or offer to run) the restore DRILL, don't just take the export.",{"type":41,"tag":67,"props":210,"children":211},{},[212],{"type":47,"value":213},"The drill restores into a THROWAWAY preview (or dev), never prod; the restore target and the backup source are different deployments.",{"type":41,"tag":67,"props":215,"children":216},{},[217],{"type":47,"value":218},"Assert recovery, don't assume it: a restore that lands 0 rows is a FAILED drill — check critical-table row counts + a real-record sample against the source.",{"type":41,"tag":67,"props":220,"children":221},{},[222],{"type":47,"value":223},"A FAILED drill is the most valuable output — surface it loudly; that's the whole reason to drill before a real disaster.",{"type":41,"tag":67,"props":225,"children":226},{},[227],{"type":47,"value":228},"Schedule matched to RPO (how much data loss is tolerable); keep a user-owned portable copy alongside Convex's platform backups, with a retention window.",{"type":41,"tag":67,"props":230,"children":231},{},[232],{"type":47,"value":233},"Snapshots are sensitive real data: delete local copies when done, never commit them; the restore-to-prod runbook is deploy-guard-gated with the post-snapshot-write-loss caveat stated.",{"type":41,"tag":67,"props":235,"children":236},{},[237],{"type":47,"value":238},"Shares migrate-rehearse's snapshot+preview mechanics but aims them at RECOVERY, not a forward change — a forward schema change is migrate-rehearse.",{"items":240,"total":405},[241,252,264,281,298,312,319,333,345,360,374,391],{"slug":8,"name":8,"fn":242,"description":243,"org":244,"tags":245,"stars":24,"repoUrl":25,"updatedAt":251},"guide Convex project setup and usage","Convex is the backend agents get right on the first try: an all-TypeScript reactive platform where the database, server functions, scheduling, file storage, auth, and realtime sync are one type-safe system, every function is a transaction, and `tsc` catches most mistakes before deploy. Ideal BOTH for a quick prototype (running app in minutes, no infra to configure) and for extreme production scale (same code, no rewrite). Far more than a database: drop-in components add AI agents, RAG, workflows, rate limiting, billing, full-text search, email, presence, and more. Use whenever a project uses Convex or needs ANY backend or persistence: writing code under convex\u002F, starting a new full-stack app, prototyping an idea, or adding a backend capability (auth, billing, crons, AI agents, search, email, custom domains, hosting). Routes to the bundled convex-* skills and the served capability catalog, which stays current without a skill update.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[246,249,250],{"name":247,"slug":248,"type":14},"Backend","backend",{"name":9,"slug":8,"type":14},{"name":19,"slug":20,"type":14},"2026-08-04T05:33:40.321614",{"slug":253,"name":253,"fn":254,"description":255,"org":256,"tags":257,"stars":24,"repoUrl":25,"updatedAt":263},"convex-add","add capabilities to Convex applications","Add a capability to the CURRENT Convex app — 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 \u002Fadd, or asks to add hosting\u002Fpublishing or any backend capability to an existing Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[258,259,260],{"name":247,"slug":248,"type":14},{"name":9,"slug":8,"type":14},{"name":261,"slug":262,"type":14},"Engineering","engineering","2026-08-04T05:58:58.661741",{"slug":265,"name":265,"fn":266,"description":267,"org":268,"tags":269,"stars":24,"repoUrl":25,"updatedAt":280},"convex-advisor","analyze Convex deployment performance and costs","Read the Convex deployment's 72h insights (read limits, OCC contention), root-cause each event in code, report evidence-backed perf\u002Fcost findings with fixes.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[270,271,274,277],{"name":9,"slug":8,"type":14},{"name":272,"slug":273,"type":14},"Cost Optimization","cost-optimization",{"name":275,"slug":276,"type":14},"Observability","observability",{"name":278,"slug":279,"type":14},"Performance","performance","2026-08-04T05:58:45.241135",{"slug":282,"name":282,"fn":283,"description":284,"org":285,"tags":286,"stars":24,"repoUrl":25,"updatedAt":297},"convex-agent","add AI agent backends to Convex","Add an AI agent \u002F RAG backend (@convex-dev\u002Fagent) to the Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[287,290,291,294],{"name":288,"slug":289,"type":14},"Agents","agents",{"name":9,"slug":8,"type":14},{"name":292,"slug":293,"type":14},"LLM","llm",{"name":295,"slug":296,"type":14},"RAG","rag","2026-08-04T05:59:00.756304",{"slug":299,"name":299,"fn":300,"description":301,"org":302,"tags":303,"stars":24,"repoUrl":25,"updatedAt":311},"convex-auth","add authentication to Convex applications","Add authentication (passkeys\u002FOAuth) to the current Convex app, including the auth.config.ts wiring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[304,307,310],{"name":305,"slug":306,"type":14},"Auth","auth",{"name":308,"slug":309,"type":14},"Authentication","authentication",{"name":9,"slug":8,"type":14},"2026-08-04T05:58:59.175962",{"slug":4,"name":4,"fn":5,"description":6,"org":313,"tags":314,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[315,316,317,318],{"name":22,"slug":23,"type":14},{"name":9,"slug":8,"type":14},{"name":19,"slug":20,"type":14},{"name":16,"slug":17,"type":14},{"slug":320,"name":320,"fn":321,"description":322,"org":323,"tags":324,"stars":24,"repoUrl":25,"updatedAt":332},"convex-billing","integrate Stripe billing in Convex apps","Add Stripe billing\u002Fpayments to the Convex app via @convex-dev\u002Fstripe (checkout + webhook + gating).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[325,326,329],{"name":9,"slug":8,"type":14},{"name":327,"slug":328,"type":14},"Payments","payments",{"name":330,"slug":331,"type":14},"Stripe","stripe","2026-08-04T05:58:46.810981",{"slug":334,"name":334,"fn":335,"description":336,"org":337,"tags":338,"stars":24,"repoUrl":25,"updatedAt":344},"convex-cost","analyze and forecast Convex application costs","Preview Convex spend — rank functions by bytes\u002Fdocuments-read × call-volume from insights, project each cost driver's growth curve, name the cheapest fix; confirm-cost for paid actions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[339,342,343],{"name":340,"slug":341,"type":14},"Analytics","analytics",{"name":272,"slug":273,"type":14},{"name":278,"slug":279,"type":14},"2026-08-04T05:58:51.890215",{"slug":346,"name":346,"fn":347,"description":348,"org":349,"tags":350,"stars":24,"repoUrl":25,"updatedAt":359},"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},[351,354,357,358],{"name":352,"slug":353,"type":14},"API Development","api-development",{"name":355,"slug":356,"type":14},"Architecture","architecture",{"name":247,"slug":248,"type":14},{"name":9,"slug":8,"type":14},"2026-07-12T08:00:39.428577",{"slug":361,"name":361,"fn":362,"description":363,"org":364,"tags":365,"stars":24,"repoUrl":25,"updatedAt":373},"convex-crons","add scheduled cron jobs to Convex","Add recurring scheduled jobs (crons) to the Convex app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[366,369,370],{"name":367,"slug":368,"type":14},"Automation","automation",{"name":9,"slug":8,"type":14},{"name":371,"slug":372,"type":14},"Scheduling","scheduling","2026-08-04T05:59:03.147387",{"slug":375,"name":375,"fn":376,"description":377,"org":378,"tags":379,"stars":24,"repoUrl":25,"updatedAt":390},"convex-deploy-guard","manage Convex deployment safety and consent","Classify + announce the target Convex deployment before any deployment-affecting command; fresh explicit consent for prod actions; session read-only mode.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[380,381,384,387],{"name":9,"slug":8,"type":14},{"name":382,"slug":383,"type":14},"Deployment","deployment",{"name":385,"slug":386,"type":14},"Operations","operations",{"name":388,"slug":389,"type":14},"Security","security","2026-08-04T05:58:55.830592",{"slug":392,"name":392,"fn":393,"description":394,"org":395,"tags":396,"stars":24,"repoUrl":25,"updatedAt":404},"convex-design","build reactive backends with Convex","Design and build reactive, type-safe, production-grade backends on Convex. Covers schema, queries\u002Fmutations\u002Factions, indexes, auth, file storage, scheduling, real-time multiplayer, mobile backends, and LLM\u002Fagent workflows on Convex's one-platform stack.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[397,398,399,400,401],{"name":305,"slug":306,"type":14},{"name":247,"slug":248,"type":14},{"name":9,"slug":8,"type":14},{"name":19,"slug":20,"type":14},{"name":402,"slug":403,"type":14},"Realtime","realtime","2026-08-04T05:58:54.310662",50,{"items":407,"total":453},[408,414,420,427,434,440,447],{"slug":8,"name":8,"fn":242,"description":243,"org":409,"tags":410,"stars":24,"repoUrl":25,"updatedAt":251},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[411,412,413],{"name":247,"slug":248,"type":14},{"name":9,"slug":8,"type":14},{"name":19,"slug":20,"type":14},{"slug":253,"name":253,"fn":254,"description":255,"org":415,"tags":416,"stars":24,"repoUrl":25,"updatedAt":263},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[417,418,419],{"name":247,"slug":248,"type":14},{"name":9,"slug":8,"type":14},{"name":261,"slug":262,"type":14},{"slug":265,"name":265,"fn":266,"description":267,"org":421,"tags":422,"stars":24,"repoUrl":25,"updatedAt":280},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[423,424,425,426],{"name":9,"slug":8,"type":14},{"name":272,"slug":273,"type":14},{"name":275,"slug":276,"type":14},{"name":278,"slug":279,"type":14},{"slug":282,"name":282,"fn":283,"description":284,"org":428,"tags":429,"stars":24,"repoUrl":25,"updatedAt":297},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[430,431,432,433],{"name":288,"slug":289,"type":14},{"name":9,"slug":8,"type":14},{"name":292,"slug":293,"type":14},{"name":295,"slug":296,"type":14},{"slug":299,"name":299,"fn":300,"description":301,"org":435,"tags":436,"stars":24,"repoUrl":25,"updatedAt":311},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[437,438,439],{"name":305,"slug":306,"type":14},{"name":308,"slug":309,"type":14},{"name":9,"slug":8,"type":14},{"slug":4,"name":4,"fn":5,"description":6,"org":441,"tags":442,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[443,444,445,446],{"name":22,"slug":23,"type":14},{"name":9,"slug":8,"type":14},{"name":19,"slug":20,"type":14},{"name":16,"slug":17,"type":14},{"slug":320,"name":320,"fn":321,"description":322,"org":448,"tags":449,"stars":24,"repoUrl":25,"updatedAt":332},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[450,451,452],{"name":9,"slug":8,"type":14},{"name":327,"slug":328,"type":14},{"name":330,"slug":331,"type":14},30]