CLI
Open documentation actions
Create Command
Scaffold a new Better Fullstack project with prompts, defaults, templates, shapes, or explicit flags.
create writes a new project from a typed stack configuration. Use it interactively to explore, or pass flags when you need the same project shape every time.
npm create better-fullstack@latest [project-name] -- [flags]For npm, Better Fullstack flags go after --.
Design-system lint
Select shadcn-lint together with oxlint, or with both eslint and prettier, through --addons. For graph input, use --part codeQuality:universal:oxlint --part codeQuality:universal:shadcn-lint, or replace the Oxlint part with both codeQuality:universal:eslint and codeQuality:universal:prettier. The interactive Code Quality prompt accepts one base profile and this optional second check.
This requires Tailwind CSS v4 and one of next, vinext, tanstack-router, tanstack-start, react-router, or react-vite. Generated DESIGN.md explains the initial Button contract and lint:design command. The configuration and dependencies are also present with --no-install and in builder downloads.
Operational contract
| Concern | Contract |
|---|---|
| Preview | Add --dry-run to render and list files without writing them. |
| Writes | Creates a project directory; dependency installation and Git initialization follow --install and --git. |
| Safe inspection | Combine --dry-run, --no-install, and --no-git. |
| Recovery | Generate into a new directory and remove it if you reject the scaffold. Existing-directory behavior is controlled by --directory-conflict. |
| Source of truth | The live CLI schema and the generated flag tables below, shared with the Stack Builder and MCP server. |
Command modes
| Mode | Shape | Use it when |
|---|---|---|
| Wizard | [launcher] my-app | You want prompts and defaults. |
| Defaults | [launcher] my-app [flags] --yes | You want the default stack without prompts. |
| Scripted | [launcher] my-app [flags] | You want repeatable output. |
| Dry run | [launcher] my-app [flags] --dry-run | You want to inspect files before writing. |
Project shapes
--shape names what you are building, and the CLI then runs only the prompts that shape needs:
| Shape | Asks | Result |
|---|---|---|
--shape fullstack | Nothing extra; the standard composition prompt runs. | The full guided flow. |
--shape frontend | TypeScript, Rust, or .NET. | A client app with the server half switched off. |
--shape backend | TypeScript, Go, Rust, Python, Java/Kotlin, .NET, or Elixir. | An API with no web frontend. |
--shape mobile | React Native, Kotlin, Swift, or Flutter. | A mobile app on the platform you pick. |
# Prompts for the mobile platform
bun create better-fullstack@latest my-app --shape mobile
# Platform answered up front; Kotlin libraries and Git are still asked
bun create better-fullstack@latest my-app --shape mobile --kotlin-mobile compose-multiplatform
# Fully prompt-free
bun create better-fullstack@latest my-app --shape backend --ecosystem go --yesWith --yes, nothing is left to prompt, so a shape falls back to its default ecosystem: TypeScript for frontend and backend, React Native for mobile.
A shape decides the stack, so the CLI rejects rather than silently overrules a command that already decides it too: --config, --from-history, --part, and --template each carry a complete stack; a flag the shape switches off contradicts it; and --shape mobile accepts selectors for exactly one platform. Kotlin, Swift, and Flutter apps build through Gradle, XcodeGen, and Flutter, which the CLI does not run, so --install is skipped with a notice on those platforms instead of reporting an install that never happened.
Presets
The preset command lists the curated stacks and creates a project from one:
# List every preset with its options
bun create better-fullstack@latest preset
# Create from a preset
bun create better-fullstack@latest preset future-stack my-app
bun create better-fullstack@latest preset future-stack my-app --framework tanstack-start --effect servercreate --template <id> accepts the same preset ids, for example t3, nextjs-saas, mern, pern, or uniwind. Flags you pass alongside override individual fields, and --yes accepts the rest as-is. Retired ids keep working: saas resolves to nextjs-saas, and solidstart-fullstack resolves to future-stack.
npm create better-fullstack@latest my-app -- --template t3Future Stack
Future Stack is Solid, Effect, and the TanStack libraries in one project: Query, DB, Form, Table, Virtual, Pacer, and Store, with oRPC, Drizzle, SQLite, and Better Auth. The generated app has a /showcase route that uses each library. Its task list writes through TanStack DB, validates with Effect Schema, and persists through an Effect service on the server.
| Option | Choices | Default |
|---|---|---|
--framework | solid-start (SolidStart 2) or tanstack-start (TanStack Start on Solid) | solid-start |
--effect | app (Effect runs inside the framework server) or server (a separate Effect server) | app |
TanStack Start on Solid is also available as --frontend tanstack-start-solid. For now it supports oRPC, Better Auth, Tailwind CSS, and the TanStack showcase; the CLI and the builder reject other integrations for it.
Prompt behavior
- Explicit flags skip only the categories they cover.
--yesaccepts defaults and conflicts with core stack flags such as--frontend,--backend,--database,--orm,--auth, and--api.- Use
noneto disable optional categories, including--ai-docs none. --verifyruns every generated target check after scaffolding without starting dev servers. Those toolchains may fetch dependencies and write normal lockfiles, caches, or build artifacts.--version-channel latestfollows npmlatesttags except for temporary compatibility holds that keep generated projects installable.
Flag tables
The tables below are generated from the same shared schemas the CLI, Stack Builder, and MCP server use.
Common
TypeScript stack
Use these with --ecosystem typescript.
Services
UI and app behavior
shadcn/ui
React Native
Use these with --ecosystem react-native.
Language ecosystems
Go auth splits in two: GoBetterAuth uses the global --auth go-better-auth value, while Go-native helpers use --go-auth.
Examples
Flat single-app output
--workspace-shape single-app flattens a thin Next.js or TanStack Start self-backend scaffold into the project root. It is a create-time layout choice. If the stack needs separate database, ORM, auth, API, service, native, container, or deployment packages, compatibility safely restores the default monorepo layout.
npm create better-fullstack@latest thin-next-app -- \ --frontend next \ --backend self \ --runtime none \ --workspace-shape single-app \ --database none \ --orm none \ --api none \ --auth none \ --payments none \ --email none \ --observability none \ --logging none \ --web-deploy none \ --server-deploy none \ --examples none \ --ai-docs none \ --no-install \ --no-gitMulti-ecosystem project
npm create better-fullstack@latest my-mixed-app -- \ --part frontend:typescript:next \ --part backend:go:gin \ --part backend.orm:go:gorm \ --part database:universal:postgres \ --part mobile:react-native:native-bareSee Multi-Ecosystem for the full part model.
Scaffold history
history lists recent scaffolds with the reproducible command that created each one:
npx create-better-fullstack@latest historyFlags: --limit <n> (default 10), --clear, and --json. To reuse a stack, copy its reproducible command and re-run it with a new name or adjusted flags. History stays local under your user directory.