Change the default stack
Nanostack defaults to Next.js + Tailwind + Supabase. You can change everything.
Default stack
When no project config exists and auto-detection finds nothing, skills assume this stack:
- Framework — Next.js 14 (App Router)
- Language — TypeScript 5
- Styling — Tailwind CSS 3
- Database — Supabase (Postgres)
- ORM — none (raw SQL with parameterized queries)
- Auth — Supabase Auth
- Hosting — Vercel
- Package manager — npm
- Test runner — Vitest
- Linter — ESLint + Prettier
- CI — GitHub Actions
- Monorepo — none (single package)
- API style — REST (Next.js route handlers)
These defaults only matter when the agent cannot figure out your stack from the project itself. In practice, auto-detection handles most cases.
Auto-detection
During /nano-run and at the start of each sprint, nanostack reads your project files to infer the stack:
- package.json — framework, dependencies, test runner, package manager (via lockfile)
- go.mod — Go project with module name and version
- requirements.txt / pyproject.toml — Python project, framework from dependencies
- Cargo.toml — Rust project
- tsconfig.json — TypeScript configuration, compiler options
- tailwind.config.* — Tailwind version and plugins
- docker-compose.yml — service topology
- .github/workflows/ — CI provider
Detection is additive. It fills in what it finds and leaves the rest at defaults. If your project has go.mod but no test runner config, the agent knows it is Go but falls back to defaults for testing.
Manual override
For anything auto-detection gets wrong or cannot infer, set it explicitly:
// .nanostack/stack.json
{
"framework": "SvelteKit",
"language": "TypeScript",
"styling": "UnoCSS",
"database": "Turso (libsql)",
"orm": "Drizzle",
"auth": "Lucia",
"hosting": "Cloudflare Pages",
"package_manager": "pnpm",
"test_runner": "Playwright + Vitest",
"linter": "Biome",
"ci": "GitHub Actions",
"monorepo": "Turborepo",
"api_style": "tRPC"
}You do not need to set every field. Only override what differs from auto-detection.
Priority order
When multiple sources provide the same setting, the most specific one wins:
- Project config — .nanostack/stack.json in the project root. Highest priority.
- User config — ~/.nanostack/stack.json in your home directory. Applies to all projects unless overridden.
- Auto-detection — inferred from project files.
- Built-in defaults — the Next.js + Tailwind + Supabase stack listed above.
A common pattern: set your preferred test runner and linter in the user config (since those rarely change between projects), and override framework and database per project.
How skills use the stack
The stack config is not just metadata. Skills read it to make concrete decisions:
- /nano plans file structure based on the framework's conventions
- /review checks for framework-specific anti-patterns (e.g., client components in server-only routes)
- /qa generates tests using the configured test runner
- /security applies framework-specific checks (e.g., CSRF for SvelteKit, RLS for Supabase)
- /ship formats the commit message and PR description using project conventions