GioJSdocs
On this page

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,ci

Features 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

bash
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.json script 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 --force to 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.tsx next to the new app/(site)/login/page.tsx) is a conflict --force does 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 db after customizing auth just adds the database. Additions merge into what is there: gio.toml keys go into the existing table, [[guards]] entries are added once per path, and .env.example / .gitignore lines are added only when missing.
  • The language, the build target and the package manager are read from the project (tsconfig.json, a gio export build script, the lockfile). Install the new dependencies afterwards - the command prints the exact command.

The features

FeatureWhat it adds
tailwindTailwind 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.
apiapp/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.
authCookie 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.
dbSQLite 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.
dockerA 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.