[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-convex-convex-migrate-rehearse":3,"mdc--8o0594-key":34,"related-org-convex-convex-migrate-rehearse":286,"related-repo-convex-convex-migrate-rehearse":459},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"convex-migrate-rehearse","rehearse and deploy Convex schema migrations","Rehearse a live-app schema change + backfill on a snapshot-seeded preview deployment, verify, then promote the proven change to prod with the snapshot as rollback.",{"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,17,20],{"name":14,"slug":15,"type":16},"Database","database","tag",{"name":18,"slug":19,"type":16},"Migration","migration",{"name":21,"slug":22,"type":16},"Deployment","deployment",34,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills","2026-08-04T05:58:50.351413",null,7,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],"Convex Skills for Agents","https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fconvex-migrate-rehearse","---\nname: convex-migrate-rehearse\ndescription: \"Rehearse a live-app schema change + backfill on a snapshot-seeded preview deployment, verify, then promote the proven change to prod with the snapshot as rollback.\"\n---\n\n\u003C!-- GENERATED from convex-agents content\u002Fcapabilities\u002Fmigrate-rehearse.json — do not edit by hand. -->\n\n# Rehearse a schema change on a preview before prod\n\nA schema push on Convex validates every existing document against the new schema and FAILS the push if any row doesn't conform — a real data-conformance gate. The safe way to use that gate is to let it fail on a rehearsal copy, not on prod. This capability turns a preview deployment into that copy: seed it with a prod snapshot, push the new schema + run the backfill there, watch the gate, and only promote once it's green. It composes deploy-guard (target classification), migrate (the optional-then-tighten pattern), and @convex-dev\u002Fmigrations (the batched, resumable backfill).\n\n## Workflow\n\n0. PRECONDITION: preview deployments need a Preview Deploy Key (dashboard → Project Settings → Deploy Keys → Preview) exported as `CONVEX_DEPLOY_KEY` before any `--preview-create`\u002F`--preview-name` deploy — a plain `npx convex login` session cannot create previews, and this is a paid-tier feature. If no preview key is available, fall back to rehearsing on the personal dev deployment seeded with the snapshot, and say so.\n1. GUARD: deploy-guard — classify + announce the SOURCE (prod, being read) and the eventual TARGET (prod, being changed); get the fresh explicit yes for the prod promote up front and confirm the plan.\n2. SNAPSHOT the source data read-only: `npx convex export --path snapshot.zip` (from the deployment holding the real data; add `--include-file-storage` only if the migration touches files). This is a read; it changes nothing.\n3. CREATE the preview FROM THE PRE-CHANGE CODE — do this BEFORE editing schema.ts, so the preview starts on the schema the snapshot data already conforms to: `npx convex deploy --preview-create migrate-\u003Cslug>` (needs the preview key; auto-expires ~5 days). Seed it: `npx convex import snapshot.zip --deployment migrate-\u003Cslug>` (import targets a deployment by NAME with `--deployment`; there is no `--preview-name` flag on import). The import succeeds because the data still matches the old schema.\n4. REHEARSE on the preview, in the migrate order — each push is `npx convex deploy --preview-name migrate-\u003Cslug>` (re-deploys to the SAME preview, keeping its data; NOT `convex dev`, which targets personal dev): (a) make the new\u002Fchanged field OPTIONAL and deploy — if existing rows violate it the push FAILS HERE on the copy with the offending shape; fix and re-push until green. (b) write a @convex-dev\u002Fmigrations backfill and run it against the preview; verify every row is now valid. (c) tighten the validator (required \u002F narrowed union) and deploy again — the gate now passes because the backfill ran.\n5. VERIFY on the preview: run the app's functions against the migrated data (MCP `run`\u002F`runOneoffQuery` pointed at the preview, or a smoke query) to confirm behavior and shape.\n6. PROMOTE only on the fresh explicit yes from step 1: apply the SAME sequence to prod (optional schema → backfill → tighten). Because it already succeeded on prod-shaped data, the prod push repeats a proven run. Keep the snapshot as the rollback artifact (`npx convex import snapshot.zip --replace --prod`); state plainly that data written after the snapshot is lost, so keep the promote window short.\n7. CLEAN UP: the preview auto-expires; delete the local snapshot when done (it holds real data — treat it as sensitive, never commit it).\n\n## Rules\n\n- Create the preview from the PRE-CHANGE code and seed the snapshot BEFORE editing schema.ts — so the import conforms and the conformance gate then fails on the copy (not prod) when you push the change; each preview push is `deploy --preview-name`, import targets it with `--deployment`.\n- Follow the migrate order every time: optional field → push → backfill → verify → tighten → push; skipping 'optional first' makes the very first push reject existing rows.\n- The prod promote needs a fresh explicit yes (deploy-guard) and is a REPEAT of the proven preview run, not a new attempt.\n- Keep the prod snapshot as the rollback artifact; state plainly that a snapshot-restore loses data written after the snapshot, so keep the promote window short.\n- Treat the exported snapshot as sensitive real data: delete it locally when finished; never commit it.\n- Backfills go through @convex-dev\u002Fmigrations (batched, resumable, dry-runnable), not ad-hoc one-shot mutations over a whole table.\n- This is the rehearsal-and-promote flow; for the plain 'explain optional-then-tighten' guidance with no live data, that's migrate.\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,48,54,61,226,232],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"rehearse-a-schema-change-on-a-preview-before-prod",[45],{"type":46,"value":47},"text","Rehearse a schema change on a preview before prod",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52],{"type":46,"value":53},"A schema push on Convex validates every existing document against the new schema and FAILS the push if any row doesn't conform — a real data-conformance gate. The safe way to use that gate is to let it fail on a rehearsal copy, not on prod. This capability turns a preview deployment into that copy: seed it with a prod snapshot, push the new schema + run the backfill there, watch the gate, and only promote once it's green. It composes deploy-guard (target classification), migrate (the optional-then-tighten pattern), and @convex-dev\u002Fmigrations (the batched, resumable backfill).",{"type":40,"tag":55,"props":56,"children":58},"h2",{"id":57},"workflow",[59],{"type":46,"value":60},"Workflow",{"type":40,"tag":62,"props":63,"children":65},"ol",{"start":64},0,[66,105,110,131,167,188,208,221],{"type":40,"tag":67,"props":68,"children":69},"li",{},[70,72,79,81,87,89,95,97,103],{"type":46,"value":71},"PRECONDITION: preview deployments need a Preview Deploy Key (dashboard → Project Settings → Deploy Keys → Preview) exported as ",{"type":40,"tag":73,"props":74,"children":76},"code",{"className":75},[],[77],{"type":46,"value":78},"CONVEX_DEPLOY_KEY",{"type":46,"value":80}," before any ",{"type":40,"tag":73,"props":82,"children":84},{"className":83},[],[85],{"type":46,"value":86},"--preview-create",{"type":46,"value":88},"\u002F",{"type":40,"tag":73,"props":90,"children":92},{"className":91},[],[93],{"type":46,"value":94},"--preview-name",{"type":46,"value":96}," deploy — a plain ",{"type":40,"tag":73,"props":98,"children":100},{"className":99},[],[101],{"type":46,"value":102},"npx convex login",{"type":46,"value":104}," session cannot create previews, and this is a paid-tier feature. If no preview key is available, fall back to rehearsing on the personal dev deployment seeded with the snapshot, and say so.",{"type":40,"tag":67,"props":106,"children":107},{},[108],{"type":46,"value":109},"GUARD: deploy-guard — classify + announce the SOURCE (prod, being read) and the eventual TARGET (prod, being changed); get the fresh explicit yes for the prod promote up front and confirm the plan.",{"type":40,"tag":67,"props":111,"children":112},{},[113,115,121,123,129],{"type":46,"value":114},"SNAPSHOT the source data read-only: ",{"type":40,"tag":73,"props":116,"children":118},{"className":117},[],[119],{"type":46,"value":120},"npx convex export --path snapshot.zip",{"type":46,"value":122}," (from the deployment holding the real data; add ",{"type":40,"tag":73,"props":124,"children":126},{"className":125},[],[127],{"type":46,"value":128},"--include-file-storage",{"type":46,"value":130}," only if the migration touches files). This is a read; it changes nothing.",{"type":40,"tag":67,"props":132,"children":133},{},[134,136,142,144,150,152,158,160,165],{"type":46,"value":135},"CREATE the preview FROM THE PRE-CHANGE CODE — do this BEFORE editing schema.ts, so the preview starts on the schema the snapshot data already conforms to: ",{"type":40,"tag":73,"props":137,"children":139},{"className":138},[],[140],{"type":46,"value":141},"npx convex deploy --preview-create migrate-\u003Cslug>",{"type":46,"value":143}," (needs the preview key; auto-expires ~5 days). Seed it: ",{"type":40,"tag":73,"props":145,"children":147},{"className":146},[],[148],{"type":46,"value":149},"npx convex import snapshot.zip --deployment migrate-\u003Cslug>",{"type":46,"value":151}," (import targets a deployment by NAME with ",{"type":40,"tag":73,"props":153,"children":155},{"className":154},[],[156],{"type":46,"value":157},"--deployment",{"type":46,"value":159},"; there is no ",{"type":40,"tag":73,"props":161,"children":163},{"className":162},[],[164],{"type":46,"value":94},{"type":46,"value":166}," flag on import). The import succeeds because the data still matches the old schema.",{"type":40,"tag":67,"props":168,"children":169},{},[170,172,178,180,186],{"type":46,"value":171},"REHEARSE on the preview, in the migrate order — each push is ",{"type":40,"tag":73,"props":173,"children":175},{"className":174},[],[176],{"type":46,"value":177},"npx convex deploy --preview-name migrate-\u003Cslug>",{"type":46,"value":179}," (re-deploys to the SAME preview, keeping its data; NOT ",{"type":40,"tag":73,"props":181,"children":183},{"className":182},[],[184],{"type":46,"value":185},"convex dev",{"type":46,"value":187},", which targets personal dev): (a) make the new\u002Fchanged field OPTIONAL and deploy — if existing rows violate it the push FAILS HERE on the copy with the offending shape; fix and re-push until green. (b) write a @convex-dev\u002Fmigrations backfill and run it against the preview; verify every row is now valid. (c) tighten the validator (required \u002F narrowed union) and deploy again — the gate now passes because the backfill ran.",{"type":40,"tag":67,"props":189,"children":190},{},[191,193,199,200,206],{"type":46,"value":192},"VERIFY on the preview: run the app's functions against the migrated data (MCP ",{"type":40,"tag":73,"props":194,"children":196},{"className":195},[],[197],{"type":46,"value":198},"run",{"type":46,"value":88},{"type":40,"tag":73,"props":201,"children":203},{"className":202},[],[204],{"type":46,"value":205},"runOneoffQuery",{"type":46,"value":207}," pointed at the preview, or a smoke query) to confirm behavior and shape.",{"type":40,"tag":67,"props":209,"children":210},{},[211,213,219],{"type":46,"value":212},"PROMOTE only on the fresh explicit yes from step 1: apply the SAME sequence to prod (optional schema → backfill → tighten). Because it already succeeded on prod-shaped data, the prod push repeats a proven run. Keep the snapshot as the rollback artifact (",{"type":40,"tag":73,"props":214,"children":216},{"className":215},[],[217],{"type":46,"value":218},"npx convex import snapshot.zip --replace --prod",{"type":46,"value":220},"); state plainly that data written after the snapshot is lost, so keep the promote window short.",{"type":40,"tag":67,"props":222,"children":223},{},[224],{"type":46,"value":225},"CLEAN UP: the preview auto-expires; delete the local snapshot when done (it holds real data — treat it as sensitive, never commit it).",{"type":40,"tag":55,"props":227,"children":229},{"id":228},"rules",[230],{"type":46,"value":231},"Rules",{"type":40,"tag":233,"props":234,"children":235},"ul",{},[236,256,261,266,271,276,281],{"type":40,"tag":67,"props":237,"children":238},{},[239,241,247,249,254],{"type":46,"value":240},"Create the preview from the PRE-CHANGE code and seed the snapshot BEFORE editing schema.ts — so the import conforms and the conformance gate then fails on the copy (not prod) when you push the change; each preview push is ",{"type":40,"tag":73,"props":242,"children":244},{"className":243},[],[245],{"type":46,"value":246},"deploy --preview-name",{"type":46,"value":248},", import targets it with ",{"type":40,"tag":73,"props":250,"children":252},{"className":251},[],[253],{"type":46,"value":157},{"type":46,"value":255},".",{"type":40,"tag":67,"props":257,"children":258},{},[259],{"type":46,"value":260},"Follow the migrate order every time: optional field → push → backfill → verify → tighten → push; skipping 'optional first' makes the very first push reject existing rows.",{"type":40,"tag":67,"props":262,"children":263},{},[264],{"type":46,"value":265},"The prod promote needs a fresh explicit yes (deploy-guard) and is a REPEAT of the proven preview run, not a new attempt.",{"type":40,"tag":67,"props":267,"children":268},{},[269],{"type":46,"value":270},"Keep the prod snapshot as the rollback artifact; state plainly that a snapshot-restore loses data written after the snapshot, so keep the promote window short.",{"type":40,"tag":67,"props":272,"children":273},{},[274],{"type":46,"value":275},"Treat the exported snapshot as sensitive real data: delete it locally when finished; never commit it.",{"type":40,"tag":67,"props":277,"children":278},{},[279],{"type":46,"value":280},"Backfills go through @convex-dev\u002Fmigrations (batched, resumable, dry-runnable), not ad-hoc one-shot mutations over a whole table.",{"type":40,"tag":67,"props":282,"children":283},{},[284],{"type":46,"value":285},"This is the rehearsal-and-promote flow; for the plain 'explain optional-then-tighten' guidance with no live data, that's migrate.",{"items":287,"total":458},[288,299,311,328,345,359,374,388,400,415,429,444],{"slug":8,"name":8,"fn":289,"description":290,"org":291,"tags":292,"stars":23,"repoUrl":24,"updatedAt":298},"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},[293,296,297],{"name":294,"slug":295,"type":16},"Backend","backend",{"name":9,"slug":8,"type":16},{"name":14,"slug":15,"type":16},"2026-08-04T05:33:40.321614",{"slug":300,"name":300,"fn":301,"description":302,"org":303,"tags":304,"stars":23,"repoUrl":24,"updatedAt":310},"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},[305,306,307],{"name":294,"slug":295,"type":16},{"name":9,"slug":8,"type":16},{"name":308,"slug":309,"type":16},"Engineering","engineering","2026-08-04T05:58:58.661741",{"slug":312,"name":312,"fn":313,"description":314,"org":315,"tags":316,"stars":23,"repoUrl":24,"updatedAt":327},"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},[317,318,321,324],{"name":9,"slug":8,"type":16},{"name":319,"slug":320,"type":16},"Cost Optimization","cost-optimization",{"name":322,"slug":323,"type":16},"Observability","observability",{"name":325,"slug":326,"type":16},"Performance","performance","2026-08-04T05:58:45.241135",{"slug":329,"name":329,"fn":330,"description":331,"org":332,"tags":333,"stars":23,"repoUrl":24,"updatedAt":344},"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},[334,337,338,341],{"name":335,"slug":336,"type":16},"Agents","agents",{"name":9,"slug":8,"type":16},{"name":339,"slug":340,"type":16},"LLM","llm",{"name":342,"slug":343,"type":16},"RAG","rag","2026-08-04T05:59:00.756304",{"slug":346,"name":346,"fn":347,"description":348,"org":349,"tags":350,"stars":23,"repoUrl":24,"updatedAt":358},"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},[351,354,357],{"name":352,"slug":353,"type":16},"Auth","auth",{"name":355,"slug":356,"type":16},"Authentication","authentication",{"name":9,"slug":8,"type":16},"2026-08-04T05:58:59.175962",{"slug":360,"name":360,"fn":361,"description":362,"org":363,"tags":364,"stars":23,"repoUrl":24,"updatedAt":373},"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},[365,368,369,370],{"name":366,"slug":367,"type":16},"Backup","backup",{"name":9,"slug":8,"type":16},{"name":14,"slug":15,"type":16},{"name":371,"slug":372,"type":16},"Reliability","reliability","2026-08-04T05:58:42.702643",{"slug":375,"name":375,"fn":376,"description":377,"org":378,"tags":379,"stars":23,"repoUrl":24,"updatedAt":387},"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},[380,381,384],{"name":9,"slug":8,"type":16},{"name":382,"slug":383,"type":16},"Payments","payments",{"name":385,"slug":386,"type":16},"Stripe","stripe","2026-08-04T05:58:46.810981",{"slug":389,"name":389,"fn":390,"description":391,"org":392,"tags":393,"stars":23,"repoUrl":24,"updatedAt":399},"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},[394,397,398],{"name":395,"slug":396,"type":16},"Analytics","analytics",{"name":319,"slug":320,"type":16},{"name":325,"slug":326,"type":16},"2026-08-04T05:58:51.890215",{"slug":401,"name":401,"fn":402,"description":403,"org":404,"tags":405,"stars":23,"repoUrl":24,"updatedAt":414},"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},[406,409,412,413],{"name":407,"slug":408,"type":16},"API Development","api-development",{"name":410,"slug":411,"type":16},"Architecture","architecture",{"name":294,"slug":295,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T08:00:39.428577",{"slug":416,"name":416,"fn":417,"description":418,"org":419,"tags":420,"stars":23,"repoUrl":24,"updatedAt":428},"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},[421,424,425],{"name":422,"slug":423,"type":16},"Automation","automation",{"name":9,"slug":8,"type":16},{"name":426,"slug":427,"type":16},"Scheduling","scheduling","2026-08-04T05:59:03.147387",{"slug":430,"name":430,"fn":431,"description":432,"org":433,"tags":434,"stars":23,"repoUrl":24,"updatedAt":443},"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},[435,436,437,440],{"name":9,"slug":8,"type":16},{"name":21,"slug":22,"type":16},{"name":438,"slug":439,"type":16},"Operations","operations",{"name":441,"slug":442,"type":16},"Security","security","2026-08-04T05:58:55.830592",{"slug":445,"name":445,"fn":446,"description":447,"org":448,"tags":449,"stars":23,"repoUrl":24,"updatedAt":457},"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},[450,451,452,453,454],{"name":352,"slug":353,"type":16},{"name":294,"slug":295,"type":16},{"name":9,"slug":8,"type":16},{"name":14,"slug":15,"type":16},{"name":455,"slug":456,"type":16},"Realtime","realtime","2026-08-04T05:58:54.310662",50,{"items":460,"total":506},[461,467,473,480,487,493,500],{"slug":8,"name":8,"fn":289,"description":290,"org":462,"tags":463,"stars":23,"repoUrl":24,"updatedAt":298},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[464,465,466],{"name":294,"slug":295,"type":16},{"name":9,"slug":8,"type":16},{"name":14,"slug":15,"type":16},{"slug":300,"name":300,"fn":301,"description":302,"org":468,"tags":469,"stars":23,"repoUrl":24,"updatedAt":310},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[470,471,472],{"name":294,"slug":295,"type":16},{"name":9,"slug":8,"type":16},{"name":308,"slug":309,"type":16},{"slug":312,"name":312,"fn":313,"description":314,"org":474,"tags":475,"stars":23,"repoUrl":24,"updatedAt":327},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[476,477,478,479],{"name":9,"slug":8,"type":16},{"name":319,"slug":320,"type":16},{"name":322,"slug":323,"type":16},{"name":325,"slug":326,"type":16},{"slug":329,"name":329,"fn":330,"description":331,"org":481,"tags":482,"stars":23,"repoUrl":24,"updatedAt":344},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[483,484,485,486],{"name":335,"slug":336,"type":16},{"name":9,"slug":8,"type":16},{"name":339,"slug":340,"type":16},{"name":342,"slug":343,"type":16},{"slug":346,"name":346,"fn":347,"description":348,"org":488,"tags":489,"stars":23,"repoUrl":24,"updatedAt":358},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[490,491,492],{"name":352,"slug":353,"type":16},{"name":355,"slug":356,"type":16},{"name":9,"slug":8,"type":16},{"slug":360,"name":360,"fn":361,"description":362,"org":494,"tags":495,"stars":23,"repoUrl":24,"updatedAt":373},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[496,497,498,499],{"name":366,"slug":367,"type":16},{"name":9,"slug":8,"type":16},{"name":14,"slug":15,"type":16},{"name":371,"slug":372,"type":16},{"slug":375,"name":375,"fn":376,"description":377,"org":501,"tags":502,"stars":23,"repoUrl":24,"updatedAt":387},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[503,504,505],{"name":9,"slug":8,"type":16},{"name":382,"slug":383,"type":16},{"name":385,"slug":386,"type":16},30]