Starter Features
Start a new app with Tailwind, forms, login, a database, Docker and CI already wired up, or add them to an existing app with one command.
When you create an app
create-giojs asks which features to add (space toggles, enter confirms). Flags skip the question:
npm create giojs@latest my-app -- --tailwind --auth --db
npm create giojs@latest my-app -- --features tailwind,api,auth,db,docker,cipnpm create giojs my-app --tailwind --auth --db
pnpm create giojs my-app --features tailwind,api,auth,db,docker,ciyarn create giojs my-app --tailwind --auth --db
yarn create giojs my-app --features tailwind,api,auth,db,docker,cibun create giojs my-app --tailwind --auth --db
bun create giojs my-app --features tailwind,api,auth,db,docker,ciFeatures work with both the TypeScript and the JavaScript template. A static site (--static) can take tailwind and ci - the prompt offers only those; the others need the GioJS server, so asking for them is an error before anything is written. The generated commands (the Dockerfile, the CI workflow, the printed next steps) use the package manager the app is installed with: --pm, or the one that ran create. Without a terminal and without feature flags, no features are added.
In an existing app
gio add tailwind # runs create-giojs add
npx create-giojs add tailwind # the same, without the gio CLI
npx create-giojs add auth db --dry-run # show what would change
npx create-giojs add docker --cwd ./my-app
npx create-giojs add --ci --features db # create's flag spellings work too- Your changes win. If a file a new feature adds already exists with different content (or a
package.jsonscript is already set to something else), nothing at all is written: the command lists each conflict with a diff of what it would change. Merge it by hand, or rerun with--forceto overwrite. - Pages join the site. A feature's pages go into the starter's
app/(site)/group, so its layout wraps them with the site's navigation; the folder adds nothing to the URL. A page your app already serves at the same URL from another folder (app/login/page.tsxnext to the newapp/(site)/login/page.tsx) is a conflict--forcedoes not override: move or delete one of them. - Safe to run again. A feature whose files all exist is already set up: your edits to them (the login page, say) are kept and listed, and nothing else changes - so
add auth dbafter customizing auth just adds the database. Additions merge into what is there:gio.tomlkeys go into the existing table,[[guards]]entries are added once per path, and.env.example/.gitignorelines are added only when missing. - The language, the build target and the package manager are read from the project (
tsconfig.json, agio exportbuild script, the lockfile). Install the new dependencies afterwards - the command prints the exact command.
The features
| Feature | What it adds |
|---|---|
tailwind | Tailwind CSS v4 through its CLI: app/tailwind.css builds into app/tailwind.out.css, which the root layout imports. npm run dev runs the watcher next to the server (gio dev starts only the server, so the git-ignored output is missing in a fresh clone); build and start build the stylesheet first. See the Tailwind guide. |
api | app/api/guestbook/route.ts (GET/POST JSON with req.json() validation: 201, 400, 415, 422) and app/(site)/guestbook/page.tsx, a page action rendered with <GioForm>: it works without JavaScript, answers invalid input with 422 and actionData, and redirects after success. See Forms and Route Handlers. |
auth | Cookie sessions (lib/session.server.ts), a login page whose action checks demo credentials in constant time, a logout route, and /dashboard protected by a require_session guard and /login rate-limited in gio.toml. See the authentication example. |
db | SQLite with Drizzle ORM on Node's built-in node:sqlite (Node 22.16+): a schema, SQL migrations with a seed, lib/db.server.ts, and a /notes page that lists and adds rows. See the database example. |
docker | A multi-stage Dockerfile built with gio build standalone (a slim, non-root runtime image with a health check), .dockerignore and docker-compose.yml. See Deploying with Docker. |
ci | .github/workflows/ci.yml: installs with your package manager, typechecks (TypeScript), runs the tests when there is a test script, and builds the standalone folder (or the static export), kept as an artifact. |
Each feature also adds a short note to the project's AGENTS.md, so coding agents know where it lives.