[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-convex-convex-verify":3,"mdc--y6u5fk-key":35,"related-repo-convex-convex-verify":333,"related-org-convex-convex-verify":436},{"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-verify","verify Convex features with automated tests","Prove a Convex feature works — seed, drive as multiple mocked users via convex-test, assert behavior including the negative authz cases (wrong user refused, data-scope enforced).",{"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,18,21],{"name":14,"slug":15,"type":16},"Auth","auth","tag",{"name":9,"slug":8,"type":16},{"name":19,"slug":20,"type":16},"E2E Testing","e2e-testing",{"name":22,"slug":23,"type":16},"Testing","testing",34,"https:\u002F\u002Fgithub.com\u002Fget-convex\u002Fagent-skills","2026-08-04T05:58:40.609814",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-verify","---\nname: convex-verify\ndescription: \"Prove a Convex feature works — seed, drive as multiple mocked users via convex-test, assert behavior including the negative authz cases (wrong user refused, data-scope enforced).\"\n---\n\n\u003C!-- GENERATED from convex-agents content\u002Fcapabilities\u002Fconvex-verify.json — do not edit by hand. -->\n\n# Prove a feature works — seed, drive, assert\n\nA green typecheck proves the code parses; it does not prove a non-owner is actually denied, that a query returns the right rows, or that a mutation has the effect it claims. This capability closes that gap with the loop the whole field is missing: seed → drive → assert, run in-process with `convex-test` so it needs no deployment. Its highest-value assertions are the NEGATIVE ones — the caller who should be refused — because those are exactly the authz defects the 30-app corpus shows are the #1 real bug and the ones a happy-path demo never catches.\n\n## Workflow\n\n1. IDENTIFY the feature to prove: the specific exported query\u002Fmutation\u002Faction (or a small set) the user just built\u002Fchanged, and its intended behavior — who should be allowed, what data should come back, what a mutation should change. If the intent is unstated, ask one focused question rather than guessing the contract.\n2. SET UP `convex-test`: ensure `convex-test` + `vitest` are dev deps AND a `vitest.config.ts` sets `test.environment: \"edge-runtime\"` with `server.deps.inline: [\"convex-test\"]` — WITHOUT that config, `convexTest(schema)` fails at runtime with `import.meta.glob is not a function` (verified). Also install `@edge-runtime\u002Fvm`. Then `convexTest(schema)` gives a `t` handle. Reuse the project's existing test setup if present (compose with the `test` capability, don't fork it).\n3. SEED realistic data through the app's OWN functions where possible (so the seed exercises the same validators\u002Fmutations a real user would), falling back to `t.run(async (ctx) => ctx.db.insert(...))` for fixtures the public API can't create. Seed at least: the caller's own rows AND a second user's rows, so cross-user access is testable.\n4. DRIVE the feature as DIFFERENT identities with `t.withIdentity({ subject, tokenIdentifier, ... })`: call the function as (a) the legitimate owner, (b) a different authenticated user, and (c) unauthenticated (`t` with no identity). Use the real identity shape the app's auth uses (subject\u002FtokenIdentifier), matching how ownership is resolved.\n5. ASSERT behavior — POSITIVE and NEGATIVE:\n   - positive: the owner gets the expected rows \u002F the mutation made the expected change (`expect(await t.withIdentity(owner).query(api.x.y, args)).toEqual(...)`).\n   - NEGATIVE (the load-bearing half): a different user calling the same function is REFUSED — `await expect(t.withIdentity(other).mutation(api.x.cancel, {id})).rejects.toThrow(\u002Fforbidden|not authorized|403\u002F)` — and an unauthenticated caller is refused where auth is required. A feature is not proven until the wrong caller is shown to be blocked.\n   - data-scope: a list\u002Fquery returns ONLY the caller's rows, never the second user's (assert the second user's row is absent).\n6. RUN the tests (`npx vitest run`) and report: what was proven (each positive + negative assertion that passed), and — critically — any assertion that FAILED, because a failed negative assertion is a real authz hole found before ship. Emit findings on the bus (specs\u002Ffinding.schema.json, class authz\u002Fcorrectness, evidence kind probe-result with the exact failing call) for anything that didn't behave.\n7. Do NOT weaken a test to make it pass: if the owner-only query returns another user's row, the FIX is in the function (hand to convex-authz), not in the assertion. A test changed until it's green proves nothing.\n\n## Rules\n\n- Prove behavior, not compilation: every verification includes at least one NEGATIVE assertion (a caller who should be refused is refused) — the happy path alone is not proof.\n- Drive the feature as multiple identities with t.withIdentity (owner, other user, unauthenticated) using the app's real subject\u002FtokenIdentifier shape.\n- Seed both the caller's rows AND a second user's rows so cross-user access and data-scope are actually testable.\n- A vitest.config.ts with environment 'edge-runtime' + convex-test inlined is REQUIRED for convex-test to run (import.meta.glob needs it); author it, don't just author the test file.\n- Run in-process with convex-test — no deployment needed; compose with the `test` capability's setup rather than forking it.\n- Never weaken an assertion to make it pass: a failing negative test is a real defect → hand the fix to convex-authz\u002Fconvex-expert, don't edit the test until it's green.\n- Emit a bus finding for any assertion that failed (authz\u002Fcorrectness, evidence: the failing probe call) so a composite pass or self-heal can pick it up.\n- This drives a SPECIFIC built feature; a request to set up a test framework generally is the `test` capability.\n",{"data":36,"body":37},{"name":4,"description":6},{"type":38,"children":39},"root",[40,49,64,71,270,276],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"prove-a-feature-works-seed-drive-assert",[46],{"type":47,"value":48},"text","Prove a feature works — seed, drive, assert",{"type":41,"tag":50,"props":51,"children":52},"p",{},[53,55,62],{"type":47,"value":54},"A green typecheck proves the code parses; it does not prove a non-owner is actually denied, that a query returns the right rows, or that a mutation has the effect it claims. This capability closes that gap with the loop the whole field is missing: seed → drive → assert, run in-process with ",{"type":41,"tag":56,"props":57,"children":59},"code",{"className":58},[],[60],{"type":47,"value":61},"convex-test",{"type":47,"value":63}," so it needs no deployment. Its highest-value assertions are the NEGATIVE ones — the caller who should be refused — because those are exactly the authz defects the 30-app corpus shows are the #1 real bug and the ones a happy-path demo never catches.",{"type":41,"tag":65,"props":66,"children":68},"h2",{"id":67},"workflow",[69],{"type":47,"value":70},"Workflow",{"type":41,"tag":72,"props":73,"children":74},"ol",{},[75,81,179,192,212,252,265],{"type":41,"tag":76,"props":77,"children":78},"li",{},[79],{"type":47,"value":80},"IDENTIFY the feature to prove: the specific exported query\u002Fmutation\u002Faction (or a small set) the user just built\u002Fchanged, and its intended behavior — who should be allowed, what data should come back, what a mutation should change. If the intent is unstated, ask one focused question rather than guessing the contract.",{"type":41,"tag":76,"props":82,"children":83},{},[84,86,91,93,98,100,106,108,114,116,122,124,130,132,138,140,146,148,154,156,161,163,169,171,177],{"type":47,"value":85},"SET UP ",{"type":41,"tag":56,"props":87,"children":89},{"className":88},[],[90],{"type":47,"value":61},{"type":47,"value":92},": ensure ",{"type":41,"tag":56,"props":94,"children":96},{"className":95},[],[97],{"type":47,"value":61},{"type":47,"value":99}," + ",{"type":41,"tag":56,"props":101,"children":103},{"className":102},[],[104],{"type":47,"value":105},"vitest",{"type":47,"value":107}," are dev deps AND a ",{"type":41,"tag":56,"props":109,"children":111},{"className":110},[],[112],{"type":47,"value":113},"vitest.config.ts",{"type":47,"value":115}," sets ",{"type":41,"tag":56,"props":117,"children":119},{"className":118},[],[120],{"type":47,"value":121},"test.environment: \"edge-runtime\"",{"type":47,"value":123}," with ",{"type":41,"tag":56,"props":125,"children":127},{"className":126},[],[128],{"type":47,"value":129},"server.deps.inline: [\"convex-test\"]",{"type":47,"value":131}," — WITHOUT that config, ",{"type":41,"tag":56,"props":133,"children":135},{"className":134},[],[136],{"type":47,"value":137},"convexTest(schema)",{"type":47,"value":139}," fails at runtime with ",{"type":41,"tag":56,"props":141,"children":143},{"className":142},[],[144],{"type":47,"value":145},"import.meta.glob is not a function",{"type":47,"value":147}," (verified). Also install ",{"type":41,"tag":56,"props":149,"children":151},{"className":150},[],[152],{"type":47,"value":153},"@edge-runtime\u002Fvm",{"type":47,"value":155},". Then ",{"type":41,"tag":56,"props":157,"children":159},{"className":158},[],[160],{"type":47,"value":137},{"type":47,"value":162}," gives a ",{"type":41,"tag":56,"props":164,"children":166},{"className":165},[],[167],{"type":47,"value":168},"t",{"type":47,"value":170}," handle. Reuse the project's existing test setup if present (compose with the ",{"type":41,"tag":56,"props":172,"children":174},{"className":173},[],[175],{"type":47,"value":176},"test",{"type":47,"value":178}," capability, don't fork it).",{"type":41,"tag":76,"props":180,"children":181},{},[182,184,190],{"type":47,"value":183},"SEED realistic data through the app's OWN functions where possible (so the seed exercises the same validators\u002Fmutations a real user would), falling back to ",{"type":41,"tag":56,"props":185,"children":187},{"className":186},[],[188],{"type":47,"value":189},"t.run(async (ctx) => ctx.db.insert(...))",{"type":47,"value":191}," for fixtures the public API can't create. Seed at least: the caller's own rows AND a second user's rows, so cross-user access is testable.",{"type":41,"tag":76,"props":193,"children":194},{},[195,197,203,205,210],{"type":47,"value":196},"DRIVE the feature as DIFFERENT identities with ",{"type":41,"tag":56,"props":198,"children":200},{"className":199},[],[201],{"type":47,"value":202},"t.withIdentity({ subject, tokenIdentifier, ... })",{"type":47,"value":204},": call the function as (a) the legitimate owner, (b) a different authenticated user, and (c) unauthenticated (",{"type":41,"tag":56,"props":206,"children":208},{"className":207},[],[209],{"type":47,"value":168},{"type":47,"value":211}," with no identity). Use the real identity shape the app's auth uses (subject\u002FtokenIdentifier), matching how ownership is resolved.",{"type":41,"tag":76,"props":213,"children":214},{},[215,217],{"type":47,"value":216},"ASSERT behavior — POSITIVE and NEGATIVE:\n",{"type":41,"tag":218,"props":219,"children":220},"ul",{},[221,234,247],{"type":41,"tag":76,"props":222,"children":223},{},[224,226,232],{"type":47,"value":225},"positive: the owner gets the expected rows \u002F the mutation made the expected change (",{"type":41,"tag":56,"props":227,"children":229},{"className":228},[],[230],{"type":47,"value":231},"expect(await t.withIdentity(owner).query(api.x.y, args)).toEqual(...)",{"type":47,"value":233},").",{"type":41,"tag":76,"props":235,"children":236},{},[237,239,245],{"type":47,"value":238},"NEGATIVE (the load-bearing half): a different user calling the same function is REFUSED — ",{"type":41,"tag":56,"props":240,"children":242},{"className":241},[],[243],{"type":47,"value":244},"await expect(t.withIdentity(other).mutation(api.x.cancel, {id})).rejects.toThrow(\u002Fforbidden|not authorized|403\u002F)",{"type":47,"value":246}," — and an unauthenticated caller is refused where auth is required. A feature is not proven until the wrong caller is shown to be blocked.",{"type":41,"tag":76,"props":248,"children":249},{},[250],{"type":47,"value":251},"data-scope: a list\u002Fquery returns ONLY the caller's rows, never the second user's (assert the second user's row is absent).",{"type":41,"tag":76,"props":253,"children":254},{},[255,257,263],{"type":47,"value":256},"RUN the tests (",{"type":41,"tag":56,"props":258,"children":260},{"className":259},[],[261],{"type":47,"value":262},"npx vitest run",{"type":47,"value":264},") and report: what was proven (each positive + negative assertion that passed), and — critically — any assertion that FAILED, because a failed negative assertion is a real authz hole found before ship. Emit findings on the bus (specs\u002Ffinding.schema.json, class authz\u002Fcorrectness, evidence kind probe-result with the exact failing call) for anything that didn't behave.",{"type":41,"tag":76,"props":266,"children":267},{},[268],{"type":47,"value":269},"Do NOT weaken a test to make it pass: if the owner-only query returns another user's row, the FIX is in the function (hand to convex-authz), not in the assertion. A test changed until it's green proves nothing.",{"type":41,"tag":65,"props":271,"children":273},{"id":272},"rules",[274],{"type":47,"value":275},"Rules",{"type":41,"tag":218,"props":277,"children":278},{},[279,284,289,294,299,311,316,321],{"type":41,"tag":76,"props":280,"children":281},{},[282],{"type":47,"value":283},"Prove behavior, not compilation: every verification includes at least one NEGATIVE assertion (a caller who should be refused is refused) — the happy path alone is not proof.",{"type":41,"tag":76,"props":285,"children":286},{},[287],{"type":47,"value":288},"Drive the feature as multiple identities with t.withIdentity (owner, other user, unauthenticated) using the app's real subject\u002FtokenIdentifier shape.",{"type":41,"tag":76,"props":290,"children":291},{},[292],{"type":47,"value":293},"Seed both the caller's rows AND a second user's rows so cross-user access and data-scope are actually testable.",{"type":41,"tag":76,"props":295,"children":296},{},[297],{"type":47,"value":298},"A vitest.config.ts with environment 'edge-runtime' + convex-test inlined is REQUIRED for convex-test to run (import.meta.glob needs it); author it, don't just author the test file.",{"type":41,"tag":76,"props":300,"children":301},{},[302,304,309],{"type":47,"value":303},"Run in-process with convex-test — no deployment needed; compose with the ",{"type":41,"tag":56,"props":305,"children":307},{"className":306},[],[308],{"type":47,"value":176},{"type":47,"value":310}," capability's setup rather than forking it.",{"type":41,"tag":76,"props":312,"children":313},{},[314],{"type":47,"value":315},"Never weaken an assertion to make it pass: a failing negative test is a real defect → hand the fix to convex-authz\u002Fconvex-expert, don't edit the test until it's green.",{"type":41,"tag":76,"props":317,"children":318},{},[319],{"type":47,"value":320},"Emit a bus finding for any assertion that failed (authz\u002Fcorrectness, evidence: the failing probe call) so a composite pass or self-heal can pick it up.",{"type":41,"tag":76,"props":322,"children":323},{},[324,326,331],{"type":47,"value":325},"This drives a SPECIFIC built feature; a request to set up a test framework generally is the ",{"type":41,"tag":56,"props":327,"children":329},{"className":328},[],[330],{"type":47,"value":176},{"type":47,"value":332}," capability.",{"items":334,"total":435},[335,348,360,377,394,406,421],{"slug":8,"name":8,"fn":336,"description":337,"org":338,"tags":339,"stars":24,"repoUrl":25,"updatedAt":347},"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},[340,343,344],{"name":341,"slug":342,"type":16},"Backend","backend",{"name":9,"slug":8,"type":16},{"name":345,"slug":346,"type":16},"Database","database","2026-08-04T05:33:40.321614",{"slug":349,"name":349,"fn":350,"description":351,"org":352,"tags":353,"stars":24,"repoUrl":25,"updatedAt":359},"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},[354,355,356],{"name":341,"slug":342,"type":16},{"name":9,"slug":8,"type":16},{"name":357,"slug":358,"type":16},"Engineering","engineering","2026-08-04T05:58:58.661741",{"slug":361,"name":361,"fn":362,"description":363,"org":364,"tags":365,"stars":24,"repoUrl":25,"updatedAt":376},"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},[366,367,370,373],{"name":9,"slug":8,"type":16},{"name":368,"slug":369,"type":16},"Cost Optimization","cost-optimization",{"name":371,"slug":372,"type":16},"Observability","observability",{"name":374,"slug":375,"type":16},"Performance","performance","2026-08-04T05:58:45.241135",{"slug":378,"name":378,"fn":379,"description":380,"org":381,"tags":382,"stars":24,"repoUrl":25,"updatedAt":393},"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},[383,386,387,390],{"name":384,"slug":385,"type":16},"Agents","agents",{"name":9,"slug":8,"type":16},{"name":388,"slug":389,"type":16},"LLM","llm",{"name":391,"slug":392,"type":16},"RAG","rag","2026-08-04T05:59:00.756304",{"slug":395,"name":395,"fn":396,"description":397,"org":398,"tags":399,"stars":24,"repoUrl":25,"updatedAt":405},"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},[400,401,404],{"name":14,"slug":15,"type":16},{"name":402,"slug":403,"type":16},"Authentication","authentication",{"name":9,"slug":8,"type":16},"2026-08-04T05:58:59.175962",{"slug":407,"name":407,"fn":408,"description":409,"org":410,"tags":411,"stars":24,"repoUrl":25,"updatedAt":420},"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},[412,415,416,417],{"name":413,"slug":414,"type":16},"Backup","backup",{"name":9,"slug":8,"type":16},{"name":345,"slug":346,"type":16},{"name":418,"slug":419,"type":16},"Reliability","reliability","2026-08-04T05:58:42.702643",{"slug":422,"name":422,"fn":423,"description":424,"org":425,"tags":426,"stars":24,"repoUrl":25,"updatedAt":434},"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},[427,428,431],{"name":9,"slug":8,"type":16},{"name":429,"slug":430,"type":16},"Payments","payments",{"name":432,"slug":433,"type":16},"Stripe","stripe","2026-08-04T05:58:46.810981",30,{"items":437,"total":555},[438,444,450,457,464,470,477,483,495,510,524,541],{"slug":8,"name":8,"fn":336,"description":337,"org":439,"tags":440,"stars":24,"repoUrl":25,"updatedAt":347},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[441,442,443],{"name":341,"slug":342,"type":16},{"name":9,"slug":8,"type":16},{"name":345,"slug":346,"type":16},{"slug":349,"name":349,"fn":350,"description":351,"org":445,"tags":446,"stars":24,"repoUrl":25,"updatedAt":359},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[447,448,449],{"name":341,"slug":342,"type":16},{"name":9,"slug":8,"type":16},{"name":357,"slug":358,"type":16},{"slug":361,"name":361,"fn":362,"description":363,"org":451,"tags":452,"stars":24,"repoUrl":25,"updatedAt":376},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[453,454,455,456],{"name":9,"slug":8,"type":16},{"name":368,"slug":369,"type":16},{"name":371,"slug":372,"type":16},{"name":374,"slug":375,"type":16},{"slug":378,"name":378,"fn":379,"description":380,"org":458,"tags":459,"stars":24,"repoUrl":25,"updatedAt":393},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[460,461,462,463],{"name":384,"slug":385,"type":16},{"name":9,"slug":8,"type":16},{"name":388,"slug":389,"type":16},{"name":391,"slug":392,"type":16},{"slug":395,"name":395,"fn":396,"description":397,"org":465,"tags":466,"stars":24,"repoUrl":25,"updatedAt":405},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[467,468,469],{"name":14,"slug":15,"type":16},{"name":402,"slug":403,"type":16},{"name":9,"slug":8,"type":16},{"slug":407,"name":407,"fn":408,"description":409,"org":471,"tags":472,"stars":24,"repoUrl":25,"updatedAt":420},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[473,474,475,476],{"name":413,"slug":414,"type":16},{"name":9,"slug":8,"type":16},{"name":345,"slug":346,"type":16},{"name":418,"slug":419,"type":16},{"slug":422,"name":422,"fn":423,"description":424,"org":478,"tags":479,"stars":24,"repoUrl":25,"updatedAt":434},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[480,481,482],{"name":9,"slug":8,"type":16},{"name":429,"slug":430,"type":16},{"name":432,"slug":433,"type":16},{"slug":484,"name":484,"fn":485,"description":486,"org":487,"tags":488,"stars":24,"repoUrl":25,"updatedAt":494},"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},[489,492,493],{"name":490,"slug":491,"type":16},"Analytics","analytics",{"name":368,"slug":369,"type":16},{"name":374,"slug":375,"type":16},"2026-08-04T05:58:51.890215",{"slug":496,"name":496,"fn":497,"description":498,"org":499,"tags":500,"stars":24,"repoUrl":25,"updatedAt":509},"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},[501,504,507,508],{"name":502,"slug":503,"type":16},"API Development","api-development",{"name":505,"slug":506,"type":16},"Architecture","architecture",{"name":341,"slug":342,"type":16},{"name":9,"slug":8,"type":16},"2026-07-12T08:00:39.428577",{"slug":511,"name":511,"fn":512,"description":513,"org":514,"tags":515,"stars":24,"repoUrl":25,"updatedAt":523},"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},[516,519,520],{"name":517,"slug":518,"type":16},"Automation","automation",{"name":9,"slug":8,"type":16},{"name":521,"slug":522,"type":16},"Scheduling","scheduling","2026-08-04T05:59:03.147387",{"slug":525,"name":525,"fn":526,"description":527,"org":528,"tags":529,"stars":24,"repoUrl":25,"updatedAt":540},"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},[530,531,534,537],{"name":9,"slug":8,"type":16},{"name":532,"slug":533,"type":16},"Deployment","deployment",{"name":535,"slug":536,"type":16},"Operations","operations",{"name":538,"slug":539,"type":16},"Security","security","2026-08-04T05:58:55.830592",{"slug":542,"name":542,"fn":543,"description":544,"org":545,"tags":546,"stars":24,"repoUrl":25,"updatedAt":554},"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},[547,548,549,550,551],{"name":14,"slug":15,"type":16},{"name":341,"slug":342,"type":16},{"name":9,"slug":8,"type":16},{"name":345,"slug":346,"type":16},{"name":552,"slug":553,"type":16},"Realtime","realtime","2026-08-04T05:58:54.310662",50]