A stack doesn't contain any project files of its own — it's a thin manifest, anesis.stack.json, that names one template and an ordered list of already-published addons. Creating one is mostly a planning exercise: get the composition and order right, then let the CLI drive the same template and addon pipelines it always uses.
Everything a stack references — the template and every addon — must already exist in the registry before you write the manifest. A stack cannot introduce new template or addon behavior, only sequence existing ones.
anesis new <name> <template>. It must already exist in the registry.id must already be published — a stack never bundles addon or template source, only references to them.requires, include those addons in the list too (earlier in the order) — the CLI refuses to run a stack that skips a hard dependency.inputs, so users aren't re-prompted for choices the stack already made, and which ones should stay open.The stack builder walks through the same decisions as the manifest, then generates both the terminal command sequence and a downloadable anesis.stack.json.
bun add tailwindcss or a one-off codegen call. These land in the copyable command list so you (and anyone following your stack by hand) don't lose track of them, but they are not written into anesis.stack.json since the manifest format only understands template + addon references.anesis.stack.json as your starting manifest.Extra terminal commands are a builder convenience
The anesis.stack.jsonschema only understands a template plus addon references — there's no field for raw shell commands. The builder's Extra commands step appends free-form lines like bun add tailwindcssto the copyable command block so you don't lose them while assembling a stack, but they stay out of the downloaded manifest and out of anything you publish. If a command needs to travel with the stack, wrap it in a real addon instead.
Whether you download it from the builder or write it by hand, every stack manifest has the same shape.
{
"schema_version": "1",
"id": "nest-drizzle-stack",
"name": "NestJS + Drizzle",
"description": "NestJS starter with Drizzle ORM already wired up.",
"template": "nestjs",
"addons": [
{ "id": "dotenv", "command": "install" },
{
"id": "nest-drizzle",
"command": "install",
"inputs": { "driver": "postgres", "use_ssl": "false" }
}
]
}id is the identifier used everywhere in the CLI — anesis new my-app --stack <id>, anesis stack install <id>, etc. Keep it URL-safe: lowercase letters, numbers, and hyphens.name is the human-readable title shown in the registry UI — spaces and casing are fine here.description is a one-line summary shown on stack cards and the detail page.addons must be in the exact order you want them applied — the CLI does not reorder or sort the array for you.Order matters because each addon in the list runs sequentially, the same way anesis use would run it by hand.
If addon B declares "requires": ["A"], A must appear earlier in the addons array — the CLI checks anesis.lock as it works through the list and stops with a clear error if a dependency is missing. The builder handles this for you automatically: selecting an addon that requires another one prompts you to add the dependency, and the generated command list is always ordered so requirements run first.
Stacks don't have a local link/test command the way templates and addons do (anesis template link, anesis addon link) — validation means actually running the sequence once.
addons[].id exists in the registry under that exact id — a typo fails at scaffold time for anyone using the stack, not at publish time.anesis.stack.json (plus an optional README) to a GitHub repo before publishing — the registry stores a reference to that repo and commit, not the file itself.Once the manifest lives in a GitHub repo and you've confirmed the sequence works end to end, publish it the same way as any other registry entry.
anesis stack publish https://github.com/owner/repo
anesis stack update https://github.com/owner/repoSee Publishing a stack for the full flag list and what happens on the backend, and the command reference for every stack subcommand.
If the template or an addon you need doesn't exist yet, build that first.