Manual contentsCLI ReferenceBrowse 126 chapters
Manual 11 min read

CLI Overview

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.

cargo install --git https://github.com/eas4ai/suprnova.git --tag v4.0.3 suprnova-cli
suprnova --version

To upgrade later, pass --force:

cargo install --force --git https://github.com/eas4ai/suprnova.git --tag v4.0.3 suprnova-cli

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 suprnova binary
  • Runtime work that needs your compiled types lives on the per-project console binary
  • 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
cargo install --git https://github.com/eas4ai/suprnova.git --tag v4.0.3 suprnova-cli

# 2. Scaffold a project (interactive - picks Svelte by default)
suprnova new my-app

# 3. Boot it
cd my-app
suprnova migrate
npm install
suprnova serve

Non-interactive scaffold (CI, scripted setup):

suprnova new my-app \
  --frontend svelte \
  --no-interaction \
  --no-git

API-only scaffold (no Inertia, no SPA):

suprnova new my-api --api

Generate code in an existing project:

suprnova make:controller Posts
suprnova make:migration create_posts_table
suprnova make:command reports:daily   # registers under the per-project console binary
suprnova migrate

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:

suprnova --help
suprnova new --help
suprnova serve --help
suprnova make:inertia --help

For the per-project console binary:

cargo run --bin console -- --help
cargo run --bin console -- db:seed --help
cargo run --bin console -- <your-command> --help

--version prints the version on its own line, which is what you want when reporting a bug or checking whether an install took:

suprnova --version
# 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 produces
  • suprnova 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 console binary, #[command], #[derive(Command)], and the three-binary asymmetry
  • Installing Live Components - live:add, its plan, and the record in suprnova.toml
  • Live Component Libraries - live:registry new, check, sign and rotate-key