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 test runs 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@skill references 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 (with anchor) 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.md and GEMINI.md import 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.