Suprnova ships two binaries with different jobs. The global suprnova -
installed once into ~/.cargo/bin - scaffolds new projects, generates code,
boots dev servers, and runs migrations. The per-project console, built
from each app's src/bin/console.rs, runs runtime commands that need the
app's compiled types (seeders, pruners, your own #[command] handlers).
This chapter is the map; each subcommand has its own deep-dive in the
sibling chapters listed under Next.
Install
The CLI is distributed via cargo install --git. Suprnova is
distributed through git tags, not crates.io - see Distribution
model.
To upgrade later, pass --force:
The two binaries
| Binary | Built from | Used for |
|---|---|---|
suprnova |
suprnova-cli/ (this crate) |
Scaffolding (new), generators (make:*), dev runner (serve), migrations (migrate*, db:sync), Docker config (docker:*), SSR worker (ssr:*), key minting (key:generate), type generation (generate-types), and forwards to the console binary for db:seed and model:prune |
console |
src/bin/console.rs in your project |
Runtime commands that link your app's types - built-in db:seed and model:prune plus every #[command] / #[derive(Command)] you define |
Worker daemons (schedule:run, schedule:work, schedule:list,
workflow:work, queue:work) sit on a third surface: your app binary's
own clap parser, the same binary that serves HTTP. The global suprnova
shells into cargo run --quiet -- <name> for those so you can launch them
from the CLI you already have open. See Console for the full
three-way split.
Why Suprnova diverges
Laravel solves this with a single per-project script - php artisan -
because PHP loads framework and user code together at runtime. Rust links
binaries at compile time, so a global suprnova binary can't statically
see your seeders, factories, or #[command] handlers. The pragmatic split:
- File-only work (scaffolding, generators, ops) lives on the global
suprnovabinary - Runtime work that needs your compiled types lives on the per-project
consolebinary - Daemons live on your app/server binary so they share the same boot path
as
serve
You get the ergonomics of php artisan (cargo run --bin console -- db:seed
or console <name> directly) without the static-linking lie.
Commands at a glance
The same list suprnova --help prints, grouped the same way.
Create
| Command | Description |
|---|---|
suprnova new [name] |
Scaffold a new project. See suprnova new. |
suprnova serve |
Boot backend + Vite together with hot reload. See suprnova serve. |
suprnova dev:tls |
Trust portless's CA and register a https://<name>.localhost dev URL. See HTTPS Dev URLs. |
suprnova web:run |
Run the app binary directly (no Vite, no rebuild loop). Production-shaped local run. |
Generate
| Command | Description |
|---|---|
suprnova make:controller <name> |
Scaffold a controller in src/controllers/. |
suprnova make:action <name> |
Scaffold an invokable action in src/actions/. |
suprnova make:middleware <name> |
Scaffold a middleware in src/middleware/. |
suprnova make:migration <name> |
Scaffold a SeaORM migration in src/migrations/. |
suprnova make:inertia <name> |
Scaffold an Inertia page in frontend/src/pages/. Pass --data for a #[derive(Data, Validate)] props struct in src/props/ instead. |
suprnova make:error <name> |
Scaffold a domain error in src/errors/. |
suprnova make:task <name> |
Scaffold a scheduled task in src/tasks/. |
suprnova make:command <name> |
Scaffold a #[derive(Command)] console command in src/commands/. |
suprnova make:factory <name> |
Scaffold a model factory in src/factories/. --model names the model. |
suprnova make:seeder <name> |
Scaffold a database seeder in src/seeders/. |
suprnova make:cast <name> |
Scaffold a custom attribute cast in src/casts/. |
suprnova make:channel <name> |
Scaffold a private broadcast channel in src/broadcasting/. |
suprnova make:class <name> |
Scaffold a plain struct in src/. |
suprnova make:enum <name> |
Scaffold an enum in src/enums/. |
suprnova make:event <name> |
Scaffold an event in src/events/. |
suprnova make:listener <name> |
Scaffold an event listener in src/listeners/. --event names the event. |
suprnova make:job <name> |
Scaffold a queued job in src/jobs/. |
suprnova make:job-middleware <name> |
Scaffold job middleware in src/jobs/middleware/. |
suprnova make:mail <name> |
Scaffold a mailable in src/mail/. |
suprnova make:notification <name> |
Scaffold a notification in src/notifications/. |
suprnova make:observer <name> |
Scaffold a model observer in src/observers/. --model names the model. |
suprnova make:policy <name> |
Scaffold a #[policy] in src/policies/. --model names the model. |
suprnova make:provider <name> |
Scaffold a service registration the bootstrap calls in src/providers/. |
suprnova make:resource <name> |
Scaffold a JSON:API resource in src/resources/. |
suprnova make:rule <name> |
Scaffold a validation rule in src/rules/. |
suprnova make:scope <name> |
Scaffold a global query scope in src/scopes/. --model names the model. |
suprnova make:test <name> |
Scaffold an integration test in tests/. |
suprnova make:trait <name> |
Scaffold a trait with a default method in src/concerns/. |
suprnova make:interface <name> |
Scaffold a trait with required methods in src/contracts/. |
suprnova generate-types |
Emit TypeScript types from every #[derive(InertiaProps)] struct. -o <path> to override output, -w to watch and regenerate. |
See Generators for the full scaffold details and what each generated file looks like.
Live
| Command | Description |
|---|---|
suprnova live:make <name> |
Scaffold a Live component in src/live/, its view in templates/live/, and its registration in src/live/mod.rs. Never overwrites; --dry-run reports the plan. |
suprnova live:add <component> |
Install a Live component: a shipped name (field), a library address ([<host>/]<owner>/<library>/<component>[@<version>]), an https:// URL of a component directory, or a ./path to one (--manifest <path> too). Verifies a third-party component's signature against the key suprnova.toml pins, scans every file without running it, shows the plan, and asks before it writes; records the install in suprnova.toml. --allow <capability> approves a capability, --yes confirms the plan without a terminal (never a capability or a key), --force replaces edited files and accepts a downgrade or a changed release, --dry-run reports the plan and writes nothing. See Installing Live Components. |
suprnova live:registry new <namespace> --source <library address> |
Scaffold a component library in ./<namespace>: library.json, an example component, a preview/ application, and a signing key written to your configuration directory. --source is required: the address the library will be published at, which every signature covers. See Live Component Libraries. |
suprnova live:registry check |
From a library's root, check every component as live:add would and list each component's capabilities. |
suprnova live:registry sign |
From a library's root, check every component, then sign each one, all or nothing. Reads the key from SUPRNOVA_LIBRARY_KEY when set, else from your configuration directory. |
suprnova live:registry rotate-key |
From a library's root, move the library to a new signing key: make the key pair, write the new private key to your configuration directory, set library.json's publicKey, rewrite previousKeys as one handover per former key, each signed by that key and naming the new one, raise the patch version (a rotation changes every component's signed content, and live:add refuses changed content at a recorded version), and sign every component again with the new key, all or nothing. Refuses when a former key's file is missing; --drop-key <fingerprint> leaves that key's handover out. Prints both fingerprints and the new key's path. Reads the current key as sign does. |
suprnova live:wait [-- <cargo args>] |
Wait until no live:add holds the project lock, restoring an interrupted install first. Given cargo arguments after --, run that cargo command, holding a shared lock until its build finishes so no install starts mid-build. suprnova serve builds this way. |
suprnova live:check |
Verify every third-party component suprnova.toml records against its pinned key, offline, then check every registered Live view with the integrated checker. Reads askama.toml dirs or templates/; --templates <dir> overrides, --allow-unproved accepts unproved dynamic structures. |
suprnova live:inspect |
Report safe Live runtime, registry, provider, and artifact state (--json for one JSON document). |
suprnova live:assets --out <dir> |
Publish the reviewed Live runtime artifacts to <dir>/<identity>/, atomically; --replace replaces a publication whose bytes differ. |
live:add and live:registry start no process: nothing a component
carries runs while they fetch, check, sign or install it.
live:check, live:inspect, and live:assets run inside your application:
the CLI starts cargo run --bin console and reads a bounded, versioned
JSON-lines report from the framework's hidden tooling helper, so it never
needs a framework dependency of its own. Build output stays on stderr;
anything unexpected on stdout fails the command closed.
Database
| Command | Description |
|---|---|
suprnova migrate |
Run all pending migrations. |
suprnova migrate:status |
Show which migrations are applied vs pending. |
suprnova migrate:rollback [--step N] |
Roll back the last N migrations (default 1). |
suprnova migrate:fresh [--force] |
Drop every table and re-run all migrations. Destructive. In production it needs --force plus a typed confirmation on an interactive terminal. |
suprnova db:sync [--skip-migrations] [--regenerate-models] |
Run migrations and regenerate SeaORM entities from the live schema. --regenerate-models overwrites custom model files in src/models/. |
suprnova db:seed [<seeder>] |
Run every registered seeder, or the one named. --class=<seeder> names it as an option; you cannot pass both. |
suprnova model:prune [--model <Name>] [--pretend] |
Delete the rows that Prunable and MassPrunable models select for removal. --model prunes one model, named by its type name; a name that no registered pruner has prints model:prune: no pruner registered for the name on the error stream and exits 0. --pretend reports the row count and deletes nothing. |
db:seed and model:prune run your project's console binary
(cargo run --quiet --bin console -- <name>), because the seeder and model
registries are compiled into your crate. The CLI checks no name: the console
binary knows which seeders and models exist, and it reports an unknown one.
You can also run them directly, for example
cargo run --bin console -- db:seed or ./target/debug/console db:seed.
See Console for the registration pattern.
See Migrations chapter for the full migration workflow.
Schedule
| Command | Description |
|---|---|
suprnova schedule:run |
Run every due task once. The cron-friendly form. |
suprnova schedule:work |
Foreground daemon that checks every minute and runs due tasks. |
suprnova schedule:list [--timezone <zone>] |
Print every registered task with its cron expression. --timezone names the IANA zone the listing is read in (default UTC). |
Each of these shells into cargo run --quiet -- <name> against your
app/server binary - the same binary that serves HTTP - so registered tasks
and bootstrapped services are visible. See Scheduling
CLI and the Scheduling chapter.
Workflow
| Command | Description |
|---|---|
suprnova workflow:work |
Start the workflow worker daemon. Pulls workflow steps off the registry and runs them with the same panic boundary as HTTP handlers. |
suprnova workflow:install |
Drop the workflow + workflow_steps migrations into src/migrations/. Already present in fresh scaffolds. |
See Workflows.
SSR
| Command | Description |
|---|---|
suprnova ssr:start [--runtime node|bun|deno|<path>] |
Run the application binary's ssr:start, which checks the installed Inertia configuration and runs the SSR worker in the foreground. --runtime replaces the configured runtime. Ctrl-C, Ctrl-\, Ctrl-Z, fg, SIGTERM, and SIGHUP reach the application, which runs in a process group of its own, through the CLI. |
suprnova ssr:stop [--graceful] |
Run the application binary's ssr:stop, which sends GET /shutdown to the worker at the configured URL. With --graceful, a worker that isn't running counts as stopped. |
suprnova ssr:check |
Run the application binary's ssr:check, which asks the installed SSR gateway's health check. |
Each of these runs cargo run --bin <app> -- <name> from the project
directory, the way serve runs the backend, and exits with the
application's status. The CLI reads no SSR settings of its own: the
configuration your application passes to Inertia::install decides what
each command checks and does, as Console
describes.
See Inertia SSR for the production setup.
Deploy
| Command | Description |
|---|---|
suprnova docker:init |
Emit a multi-stage production Dockerfile + .dockerignore. |
suprnova docker:compose [--with-mailpit] [--with-minio] |
Emit a docker-compose.yml for local development. Postgres + Redis always included; Mailpit and MinIO opt in. |
See Docker and the Deployment chapter.
Security
| Command | Description |
|---|---|
suprnova key:generate [--show] |
Mint a 32-byte AES-256 key, base64 URL-safe no padding (same wire format EncryptionKey::to_base64 produces). --show prints just the key for APP_KEY=$(suprnova key:generate --show). |
See Encryption for what APP_KEY protects and how
rotation via APP_KEY_PREVIOUS works.
Quick start
The most common path from "nothing installed" to "running app":
# 1. Install the CLI
# 2. Scaffold a project (interactive - picks Svelte by default)
# 3. Boot it
Non-interactive scaffold (CI, scripted setup):
API-only scaffold (no Inertia, no SPA):
Generate code in an existing project:
Getting help
--help (or -h) works on any subcommand. The top-level help is
hand-formatted (ui::print_help) and groups commands by section; the
per-subcommand help comes from clap and shows every flag with its default:
For the per-project console binary:
--version prints the version on its own line, which is what you want
when reporting a bug or checking whether an install took:
# suprnova 4.0.3
Both -v and -V are accepted. Clap's generated flag offers only -V;
this one is hand-declared so the lowercase spelling - the one most people
try first - works too. The version also appears in the --help banner,
which is where it lived before the flag existed.
Next
suprnova new- every flag the scaffolder accepts and the directory layout it producessuprnova serve- the dev runner: backend + Vite + type generation- Generators - the full
make:*family with output templates - Migrations CLI -
migrate,migrate:fresh,db:sync, and the SeaORM workflow - Console - the per-project
consolebinary,#[command],#[derive(Command)], and the three-binary asymmetry - Installing Live Components -
live:add, its plan, and the record insuprnova.toml - Live Component Libraries -
live:registry new,check,signandrotate-key
