spa:create generator pulls the spa source from the upstream skeleton repository, marks the module as a spa in its yml config, links it to a design module, assigns a free dev port, and installs the spa dependencies. When it finishes you have a working frontend you can start with one command.
If you are new to spa modules, read the spa overview first. This page is the walkthrough; for the terse flag reference see spa:create.
CLI command
Examples
Options
The command clones the spa source and installs packages, so it needs
git
and network access. If either is unavailable the create will not complete.The design link
Every spa composes a design module, atype: "design" module that holds the shared UI building blocks. During create you choose which one. If your project already has type: "design" modules, you pick one interactively or pass it with --design. Otherwise, give a name that does not exist yet and the generator scaffolds it for you with design:create.
The choice is recorded as design: in the spa’s yml config, so the link between the spa and its design module is explicit and persistent.
What happens
When you runspa:create, the generator works through these steps in order:
1
Scaffold the base module
A base module is scaffolded under
modules/<kebab-name>/, using the kebab-case form of the name you gave.2
Detach it from the backend
A spa is a frontend, not part of the backend, so it is un-registered from
AppModule and SharedModule, and its root tsconfig path alias is removed.3
Remove the backend module class
The scaffolded
<Pascal>Module.ts and its spec file are deleted; a spa does not ship a backend module class.4
Mark it as a spa
The module yml is marked
type: "spa" and records design: "<kebab>" for the design module you chose.5
Add Vite scripts and assign a port
Vite
dev, build, and preview scripts are added to the module package.json. The dev script gets a free dev port: 3030 by default, or the next free port if 3030 is taken (the generator scans other modules’ --port usage to find a free one).6
Clone the spa source
The upstream
skeleton-spa repo is cloned (shallow) into the module’s src/, and every shared/ sub-layer is ensured to exist via .gitkeep: assets, components, hooks, layouts, services, store, styles, types, and utils.7
Install dependencies
The spa’s
dependencies and devDependencies are installed into the project.8
Scaffold the design module if needed
If the design module you chose does not exist yet, it is scaffolded via
design:create.What you get
You end up with a self-contained spa module undermodules/<kebab-name>/: its own Vite setup, a src/ populated from the skeleton, the full shared/ layer in place, a dedicated dev port, and a recorded link to its design module. See the spa structure for a tour of the generated layout.
Start and stop the spa
Run the spa from the project root withapp:start. Use --modules/--packages (aliases, comma-separated module names) to narrow the run to just the spa:
Next steps
Run the dev server
Start the spa from the project root with
talos app:start --modules=<name>. Vite
serves it on the assigned port.Add features
Build out pages and flows with
spa:feature:create.Use with Claude and Codex
The generator ships a matchingspa:create skill. It runs the scaffold and then guides your AI agent through what comes next: choosing or naming the design module, starting the dev server, and adding the first features. Initialize the skills once for your agent:
- Claude
- Codex
Prompt
spa:create --name=dashboard --design=ui.
For the full command reference, see spa:create.