CLI

JAF has one command you actually need: the scaffolder. It writes a new project and installs its dependencies.

Everything after that - dev server, build, preview, typecheck - runs from your project's own scripts.

Create a Project

pnpm create jaf my-app

Leave the name off and it asks for that too.

Answer the prompts - name, template, features, package manager, install, git - then cd my-app and start the dev server:

pnpm dev
Whichever manager you start with is the one you keep. The generated package.json uses bare binary names (vite, tsc --noEmit), so nothing in a scaffolded app is tied to npm, pnpm, yarn or bun.

Templates

Three templates. basic is the default.

Template What you get
blank A wired empty project: shell, entry and one page.
basic A home page, an about page, a layout and two sample components.
full A guided tour: data fetching, persisted state, modals, toasts, a dynamic route and a theme toggle.

Pass --template to skip the question:

pnpm create jaf my-app --template full

Every template also ships JAF's skills library in llm/skills/, plus an AGENTS.md so your coding assistant writes real JAF.

Common Flags

Flag What it does
--template <id> blank, basic or full
--pm <id> Install and print instructions for npm, pnpm, yarn or bun. Defaults to the manager you ran.
--no-git Skip git init, which otherwise runs automatically.
--no-install Write the files but do not install dependencies.
-y Skip every prompt and take the defaults. CI and piped input do this on their own, so nothing ever hangs waiting for an answer.

--flag value and --flag=value both work.

An unknown flag or value stops the run and prints why, rather than guessing.

Run the scaffolder with --help for the full list, including --tailwind / --no-tailwind and --tanstack.

The jaf Command

Optional. The @jaf/cli package installs a jaf binary, and jaf new my-app is the same scaffolder with the same flags.

You do not need it to build a JAF app.

Day to day, use the four scripts in your project:

Script What it does
dev Dev server with hot reloading
build Production build into dist/
preview Serve the production build locally
typecheck tsc --noEmit across the project