<DM />

Back to blog

create-fullstack-app: a CLI that scaffolds stacks I actually use

Node + TypeScript CLI using Inquirer. Picks your frontend, backend, DB, auth, Docker, then writes the tree. I keep iterating on it. Tagged releases on npm via GitHub Actions.

What it does

create-fullstack-app is a small CLI I wrote in TypeScript. You run it in a directory where you want a new folder; it prompts for structure (single repo vs monorepo vs microservices), package manager (npm, pnpm, yarn, bun), web or mobile stack, backend if you want one, REST vs tRPC vs GraphQL where it applies, database, ORM, auth, logging, tests, Docker. Then it generates files under that project name. No magic runtime: it is scaffolding only, so you still own deps, env vars, and deployment.

Why I bothered

I kept copying the same decisions into new repos: Next or Vite, Nest or Express, Prisma or Drizzle, compose files, eslint. A YAML template or a static starter repo never matched the next project. A prompt-driven generator at least encodes the matrix of options in one codebase and outputs something I can delete or extend per client.

Implementation notes

  • Runtime: Node, ESM, compiled with tsc. Prompts: Inquirer. Subprocess / shell glue: zx. Output is plain filesystem writes (fs-extra), no embedded framework at runtime.
  • The wizard is a big switch on answers: frontend setup (Next, Remix, Astro, SvelteKit, Vue, Expo, Flutter, etc.), optional backend (Nest, Express, Fastify, FastAPI, Django, Spring, Hono, Koa, …), then monorepo tooling (Turborepo, Nx, or a basic workspace) when you pick that layout.
  • Optional Docker artifacts and an OpenAI-related package stub only if you tick those boxes in the flow. Nothing is forced.

Release process

Published under @dartix-software-solutions/create-fullstack-app. CI is GitHub Actions on tag pushes matching v*. The workflow fails if the tag does not match version in package.json, then npm ci, npm run build, and npm publish --access public with an automation token in repo secrets.

Push changes and publish to npm

Committing to main only updates GitHub. The registry gets a new version when you push a tag that matches version in package.json and the workflow runs.

One-time: in the repo on GitHub, add secret NPM_TOKEN with an npm Automation token (Classic) or a granular token that can publish without OTP. A Classic Publish token tends to break in CI with 2FA (EOTP).

Typical release:

git add .
git commit -m "your message"
git push origin main

npm version patch   # or minor | major
git push origin main --follow-tags

Then check GitHub Actions for Publish to npm. If the workflow failed before you fixed the token, re-run the job or delete and re-push the tag after updating the secret.

Optional: publish from your machine after npm run build with npm publish --access public and npm login on an account that can publish the scope.

Run it

From the parent folder where the new project directory should appear:

npx @dartix-software-solutions/create-fullstack-app@latest

npm: @dartix-software-solutions/create-fullstack-app

Developer: devesh-maurya-portfolio.vercel.app · Dartix: dartix.live

Still improving

This is not a one-off release. I use the CLI on real work, and when I hit friction (a broken template, a missing option, a bad default), I patch the generator and cut a new version. Prompts, generated files, and docs move together. Expect semver bumps as I refine things. This page might lag the latest npm release; the package is the source of truth.

Next up: more edge-case fixes, new stacks only when I trust the template, and defaults that match what I actually run in production. If your setup breaks, open an issue on the repo or use the contact section on this site.