Skip to main content
Ziro installs a single console script, ziro, which is the same entry point as python -m app.main. Everything else is a module you run with python -m.

The main entry point

Subcommands

ziro setup and ziro flavour strip their subcommand and keep parsing the normal flags, so ziro setup --theme nord works.

Flags

All of these apply to ziro and python -m app.main equally.
--user
string
User ID. Scopes long-term memory. Omit it to reuse the last-used user, or to get the first-run picker.
--agent
string
Agent ID to run. Omit it to pick interactively. An agent that is disabled, or that falls outside the active flavour, is rejected or corrected to the flavour’s default agent.
--flavour
string
Flavour to launch. Scopes which agents are visible, which threads exist, and which shared memory is used. Omit it to pick interactively when several are configured, or to resume the last one. Bundled flavours are chat, engineering, research, and safe.
--thread
string
Thread ID to resume a previous session. Alias: --resume.
--no-tui
boolean
default:"false"
Force the plain rich REPL instead of the Textual TUI.
--voice
boolean
default:"false"
Enable push-to-talk voice I/O. Requires the agent’s voice_policy.yaml to have enabled: true. Implies the rich REPL.
-p, --print
string
Headless: run one turn and print the reply, then exit. -p "message" sends that message; a bare -p reads the message from stdin.
--json
boolean
default:"false"
With -p, emit the chat_once JSON line instead of plain text.
--attach
path
Path to an image to attach to the first message. Repeatable. A text-only model receives a graceful notice instead of the image.
--theme
string
UI theme name for this launch, overriding the saved preference. Bundled themes are ziro (the default), carbon, nord, and gruvbox.
--think
string
Seed the reasoning effort for this session: high, medium, low, or off. Change it live with /think.

Which front end you get

The entry point picks one of three front ends. The rule is short:
1

-p is present

Run exactly one turn headless, print the reply (or the JSON line with --json), and exit. Textual is never imported. The wizard and pickers never run: the user is resolved from --user or the last-used user, and a missing user or missing API key fails fast to stderr.
2

A TTY with Textual available

Launch the Textual TUI. The shell paints in roughly 1.6 seconds and is usable immediately; anything you type before the engine finishes building is queued and runs in order once it is ready.
3

Anything else

Fall back to the rich REPL. This is also what --no-tui and --voice force, and what you get when Textual is not installed or stdout is not a terminal.
The TUI is import-guarded. No Textual, or no TTY, degrades to the REPL rather than failing.

Examples

Other entry points

The app.* to ziro.* module alias does not cover python -m, because running a module needs the real module path. That is why the indexers are spelled python -m ziro.rag.indexer and python -m ziro.tools.indexer, not app.rag / app.tools.

Supporting commands

Dev and prod modes

The runtime mode is selected by one environment variable, not a flag. See environment variables for the full list.

Next steps

Slash commands

Everything you can do once a session is running.

Headless runs

The -p and --json contracts in detail.

Environment

Keys, providers, model tiers, and the runtime switches.