Skip to content

Introduction

stacks turns five production-tested templates into new projects with one command. Each generated project is a normal repository: no runtime dependency on stacks, no generator to keep around, nothing hidden. It runs on day one because the template it came from is itself a complete, running app.

Terminal window
npx @aurostack/stacks new nest-api ./api --name shop-api
Template What you get
nest-api NestJS 12 API: Prisma on PostgreSQL, Redis, BullMQ queues, better-auth, Vitest, Docker Compose, a Scalar API reference at /docs, OpenTelemetry, optional Temporal
react-app One Vite + React 19 app: RTK Query, better-auth sessions, a shadcn-style UI kit with light/dark themes, auth screens as routes, optional marketing site and admin console
react-monorepo The same stack as separate apps (landing, auth, client, admin) over shared packages, with Yarn workspaces and Turborepo, sharing one session across subdomains
node-worker A TypeScript worker: BullMQ consumers, Prisma against the API’s database, pino, PM2, Docker, optional Temporal and Puppeteer
py-worker A Python worker on the same queues, SQLAlchemy on the same database, optional Temporal

They are designed to be combined: an API, a web front end and one or more workers make up a typical project, and the defaults already agree on ports, queue names, cookie settings and telemetry.

How stacks, the templates, generated projects and services relate · Open full screen ↗

Every template ships with the parts a real project needs on day one and usually bolts on in week six:

  • Configuration validated at startup, so a missing variable fails the boot, not a request.
  • Auth (better-auth) with sessions, cookies and an admin superuser.
  • Background work on BullMQ, and Temporal when work must survive crashes and deploys.
  • Observability through OpenTelemetry and OpenObserve, on by default and silent until connected.
  • Secrets pulled from Infisical, Docker images and Forgejo CI.
  • Tests that run: unit and end-to-end for the API, typecheck, lint and format checks everywhere.

Every feature can be dropped (--without) or added (--with) at generation time. See how stacks works.