Docs
kit.json reference
The full schema is at
https://raw.githubusercontent.com/Marlon-Chaviano/first-commit/main/registry/kit.schema.json; link it with $schema to get autocomplete and validation in your editor.{
"$schema": "https://raw.githubusercontent.com/Marlon-Chaviano/first-commit/main/registry/kit.schema.json",
"name": "my-saas",
"version": "1.0.0",
"title": "My SaaS stack",
"description": "Next.js + Supabase with my go-to skills.",
"category": "saas",
"tags": ["nextjs", "supabase"],
"author": "your-user",
"base": { "command": "npx create-next-app@latest {{name}} --yes --use-{{pm}}" },
"libraries": {
"framework": ["react", "nextjs"],
"components": "shadcn",
"animation": ["motion"],
"observability": ["sentry-nextjs"]
},
"dependencies": ["@supabase/supabase-js"],
"skills": ["supabase/agent-skills@supabase"],
"mcp": { "supabase": { "url": "https://mcp.supabase.com/mcp" } },
"env": { "NEXT_PUBLIC_SUPABASE_URL": "" },
"options": [
{
"id": "payments",
"label": "Payments",
"default": "none",
"choices": [
{ "id": "none", "label": "No payments" },
{
"id": "stripe",
"label": "Stripe",
"dependencies": ["stripe"],
"skills": ["stripe/ai@stripe-best-practices"],
"setupTasks": ["Put STRIPE_SECRET_KEY in .env"],
"instructions": "## Payments\n\nAlways verify webhook signatures."
}
]
}
],
"instructions": "## How to work here\n\n- Every new table gets RLS."
}- name
- Lowercase and hyphens. It's the name used in the command.
- version
- Semver (1.0.0). Bump it on every change and create the matching git tag.
- extends
- The kit this one starts from (
landing-next,user/repo/kit,./path, with an optional@version). - title / description
- What shows in the catalog. The description says what someone gets by using it.
- category
- mobile, web, landing, saas, api, extension, monorepo or other.
- tags / author
- For search and attribution.
- base.command
- Creates the project and must create the
{{name}}folder. Variables:{{name}},{{pm}},{{pmx}},{{opt.<id>}}. - base.install
- Installs dependencies if the scaffolder didn't (for example, with --no-install).
- addCommand
- How to add packages, for example
npx expo install {{packages}}. - packageManagers
- Supported package managers; the first one is the default.
- finalize
- Commands run last, after every option's setup (a monorepo installs once all its apps exist). A failure stops the install.
- verify.command
- What
testruns in each generated project. Defaults to{{pm}} run build. - verify.matrix
- Combinations to test, each on top of the defaults:
[{ "styling": ["nativewind"] }]. Without it, the defaults and one variant per option are tested.
These fields work at the kit's root and inside each option choice, and catalog libraries use them too.
- dependencies / devDependencies
- Packages added after the project is created.
- skills
owner/repo@skillreferences from skills.sh. They're installed for every chosen agent.- mcp
- MCP servers:
{ command, args, env }or{ url }. Written in each agent's format. - env
- Variables added to
.env.example. - files
- A folder of the kit copied over the project.
- writeFiles
- Small files, no downloads:
{ path, content, mode }.mode: create, append, prepend, insert-before (withanchor) or json-merge. - postInstall
- Commands run inside the project at the end. If they fail, you get a warning and the install continues.
- setupTasks
- What can't be automated. Written as a first-steps checklist in
AGENTS.md. - instructions
- Markdown added to
AGENTS.md;CLAUDE.mdandGEMINI.mdimport it.
- options[].id / label
- The id is the CLI flag:
--payments stripe. - options[].type
- select (one) or multi (several).
- options[].default
- The default choice id, or a list for multi.
- choices[].requires
- Can only be picked when another option has certain values:
{ "styling": ["nativewind"] }.
- libraries.framework
- Fixed (
["react", "nextjs"]) or taken from an option ({ "option": "framework" }). It decides which libraries are offered. - libraries.components
- The default component library, or
none. - libraries.addons / animation / observability
- Default lists (
[]to offer them without preselecting). Omit the key to not offer that category.