convex-quickstart — Claude Code skill: what it does, how to install
Turns a one-sentence idea into a running barebones Next.js + Convex app, with an anonymous dev backend and no publish step.
npx skills add convex/agent-skills --skill convex-quickstart -a claude-codeWhat convex-quickstart does
Hand it a one-sentence idea and the skill stands up a barebones Next.js + Convex template. The quickstart-recipe@^2 recipe takes {idea, template}, creates the project, installs dependencies, starts an anonymous backend and the web dev server. The agent opens the dev URL once it appears. Then it outlines a short plan and waits for your go-ahead before building anything past the template.
Inside sits a rule set for the agent. Backend code under convex/ is handed to the convex-expert capability, and Convex primitives replace Postgres, Redis or Express. No hosting step, no pre-baked auth. When the session is non-interactive, the network is down, or you only want code, the recipe is skipped and the agent writes a standard Convex project by hand, keeping every function in convex/ because Convex does not run them from the project root.
Work is not done until npx tsc --noEmit passes and the code pushes to a deployment. One trap: CONVEX_AGENT_MODE=anonymous belongs only where npx convex whoami fails. Forcing it on a signed-in user rebinds .env.local and costs them their persistent cloud deployment.
What it helps with
- scaffold a Next.js + Convex app from a one-line idea
- start an anonymous dev backend without a publish step
- use indexes in Convex functions instead of unbounded
.collect() - catch wrong relative imports and duplicate symbols before deploy
- keep every backend function inside
convex/
Example prompts for the agent
- Scaffold a barebones Next.js + Convex template for a recipe box with tags.
- Build me a Convex backend for notes, code only, no scaffold docs.
- Open the dev URL, then show the plan before adding features.
How to install convex-quickstart
1Skills CLI (Vercel)
npx skills add convex/agent-skills --skill convex-quickstart -a claude-code2Manually: put the files in place
~/.claude/skills/convex-quickstart/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/convex-quickstart/
1Skills CLI (Vercel)
npx skills add convex/agent-skills --skill convex-quickstart -a codex2Manually: put the files in place
.agents/skills/convex-quickstart/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add convex/agent-skills --skill convex-quickstart -a cursor2Manually: put the files in place
.cursor/skills/convex-quickstart/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install convex/agent-skills convex-quickstart2Manually: put the files in place
.github/skills/convex-quickstart/SKILL.md1Skills CLI (Vercel)
npx skills add convex/agent-skills --skill convex-quickstart -a gemini-cli2Platform CLI
gemini skills install https://github.com/convex/agent-skills --path skills/convex-quickstartManually: put the files in place
.devin/skills/convex-quickstart/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add convex/agent-skills --skill convex-quickstart -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about convex-quickstart
How do I install convex-quickstart in Claude Code?
Run npx skills add convex/agent-skills --skill convex-quickstart -a claude-code. The skill file lands at ~/.claude/skills/convex-quickstart/SKILL.md.
What does convex-quickstart do?
It turns a one-sentence idea into a running Next.js + Convex template: project, dependencies, anonymous backend, web dev server, then the dev URL.
Does it work in a non-interactive session?
Yes, through the degradation rule: instead of fetching the recipe, the agent writes a standard Convex project, with all backend code under convex/.
Source text
SKILL.md · Apache-2.0
---
name: convex-quickstart
description: "Get a barebones Convex + web template running from a one-sentence idea."
---
<!-- GENERATED from convex-agents content/capabilities/quickstart.json — do not edit by hand. -->
# Quickstart: a barebones Convex template, running
Stand up a barebones Next.js + Convex template from the idea, locally, with an anonymous dev deployment. Minimal by design: local dev servers, no publish step, no pre-baked auth.
## Workflow
1. Run recipe `quickstart-recipe@^2` with {idea, template} (the pack fetches + caches it; pinned offline fallback). It creates the project, installs deps, starts the backend (anonymous) and the web dev server.
2. When it prints the dev URL, open it for the user.
3. Present a short plan and CONFIRM before building features beyond the template.
## Rules
- Never re-run the recipe if it already reported success.
- Delegate any code under `convex/` to the `convex-expert` capability.
- Don't add Postgres/Redis/Express — use Convex primitives.
- Don't add hosting/publish or pre-baked auth here — keep the template minimal unless the user asks for more.
- DEGRADATION RULE — if the scaffold cannot run (non-interactive session, no network, a sandboxed temp dir, or the user just wants code, not an app): skip the recipe and write a standard Convex project directly. ALL backend code goes under `convex/` (schema.ts, functions) — NEVER at the project root; Convex functions only run from the `convex/` directory. Write ZERO scaffold/documentation files (no START_HERE.md, ARCHITECTURE.md, MANIFEST.txt, README walls) unless explicitly asked. "Build me a backend" means code, not ceremony.
- Data access + imports — before writing any convex/*.ts: never an unbounded `.collect()` on a table that can grow — use `.withIndex(...)` and `.paginate(...)`/`.take(n)`. Use an index, not `.filter()`, for anything that would be a SQL WHERE. `.withIndex(...)` callbacks only have `eq`/`gt`/`gte`/`lt`/`lte` — there is no `.range(...)` method. Imports: `query`/`mutation`/`action`/`internalQuery`/`internalMutation`/`internalAction` come from `./_generated/server`; `api`/`internal` come from `./_generated/api`; NEVER import from `convex/server` in application code. `v.literal("exact value")` for fixed string/enum members, not a bare string. `"use node"` only at the top of action-only modules — never in a file that also exports a `query` or `mutation`. Never import a Node builtin (`crypto`/`fs`/`path`/`http`/`child_process`/`os`, with or without the `node:` prefix) into a file lacking `"use node"` — including `http.ts` route handlers; use Web Crypto (`crypto.subtle`) instead of `import`ing `crypto` where possible.
- Reserved names — never `export const <jsReservedWord> = ...` (e.g. `delete`, `new`, `class`, `function`, `return`) as a query/mutation/action export name; esbuild fails to parse it. Never a table or index name starting with `_` (e.g. `_migrations: defineTable(...)`) — `_` is reserved and errors at push as `TableNameReserved`/`IndexNameReserved`.
- HTTP routes — `httpRouter` has no Express-style `:param` segments (`path: "/users/:id"` only matches that literal string and is dead code); use `pathPrefix` and parse the trailing segment yourself. Every `http.route({...})` `handler:` must be wrapped in `httpAction(...)` from `./_generated/server` — a bare `async (ctx, request) => {...}` type-checks but isn't a valid HTTP action.
- `ctx.runQuery`/`ctx.runMutation`/`ctx.runAction` need a codegen'd function reference (`api.foo.bar`/`internal.foo.bar`), never a raw imported module member (`import * as queries from "./queries"; ctx.runQuery(queries.getX, ...)` compiles but fails at runtime).
- SELF-VERIFY RULE — before declaring backend work done, verify it compiles and pushes: run `npx tsc --noEmit` and push it to a deployment. Prefer the project's existing one; otherwise `npx convex dev --once` when `npx convex whoami` succeeds, and `CONVEX_AGENT_MODE=anonymous npx convex dev --once` ONLY when it does not. Forcing anonymous on a signed-in user rebinds `.env.local` and costs them the persistent, publishable cloud deployment they expect. Fix every error it reports before finishing — one verify round catches the wrong-relative-import / duplicate-symbol / unbalanced-paren class that otherwise breaks the deploy.
© convex · Apache-2.0 · convex/agent-skills