Prerequisites
Choose an install path
- Install script
- pip
The recommended way in. The script creates an isolated environment under
Run
~/.ziro/venv, installs Ziro into it, and puts a ziro command on your PATH.
It needs nothing but Python 3.11.9 or newer: no pipx, no uv, no admin rights.ziro when it finishes. The first launch walks you through setup.Both scripts accept the same options:Configuration is by environment variable, so the options survive being piped
to a shell:
ZIRO_HOME, ZIRO_BIN_DIR, ZIRO_VERSION, ZIRO_PYTHON,
ZIRO_INDEX_URL, ZIRO_EXTRA_INDEX, and on Windows ZIRO_NO_MODIFY_PATH.What the install script does
1
Finds a suitable Python
Checks the
py launcher and the usual interpreter names for one at 3.11.9 or
newer, and stops with a clear message rather than failing deep inside pip.
Set ZIRO_PYTHON to force a specific interpreter.2
Creates an isolated environment
A plain
venv at ~/.ziro/venv. Nothing is installed into your system or
user site-packages, and an existing environment is reused and upgraded in
place.3
Installs from the release index
Ziro from TestPyPI, dependencies from prod PyPI.
4
Puts a command on your PATH
Small wrapper scripts for
ziro, ziro-once, and manage-agents in
~/.local/bin (macOS and Linux) or %LOCALAPPDATA%\Programs\ziro\bin
(Windows). Only those three are exposed; the environment’s own python and
pip stay off your PATH. On Windows the directory is added to your user PATH
and to the current session. On macOS and Linux the script prints the line to
add if the directory is not already there.5
Verifies
Confirms the package reports a version and that the
ziro command exists
before claiming success.uv sync installs the runtime plus the local guardrail backends, Presidio for PII
detection and Llama Guard for content safety, so guardrails work without any cloud
service.
Optional dependency groups
- Local voice
- Dev extras
Push-to-talk speech in and out, running entirely on your machine: faster-whisper
for speech-to-text and Piper for text-to-speech. No cloud key required.Voice is off by default and must also be enabled in the agent’s
voice_policy.yaml. Launch with python -m app.main --user <USER_ID> --voice, or
toggle it in-session with /voice. See Voice.Pre-cache the local models
Embedding warmup is deliberately kept off the startup critical path: the UI appears
before the model is ready, and any consumer that needs it waits for the real model
rather than falling back to a degraded result.
Storage modes
The storage backend is selected by one environment variable. SetDATABASE_URL and
Ziro runs in production mode; leave it unset and it runs entirely on local files.
Dev mode
Nothing to do. Dev mode needs no infrastructure. SQLite files and a FAISS index under./data/ are created on demand.
Production mode
Start PostgreSQL with the pgvector extension:DATABASE_URL, either in ~/.ziro/.env directly,
or through the wizard’s Advanced section (ziro setup) or the in-session
/settings command. On the next build, the store, the checkpointer, and the vector
store all switch over. See Environment variables.
The two modes are not synchronized. Threads and memories written in dev mode live in
SQLite and are not visible after switching to PostgreSQL, and vice versa.
Where state lives
Ziro keeps configuration and per-user state outside the repository, so an installed package behaves the same as a source checkout.
Checkpoints remain the source of truth for conversation content;
threads.json only
carries metadata. The workspace key is <basename>-<sha256 of the real path, first 8 chars>, so two same-named repositories in different directories never collide.
Config layering
Agent configuration resolves most-specific-first across three roots:~/.ziro/agents/<id>/ without ever editing the package. A file missing at every
layer degrades to built-in defaults. See Configuration.
Re-run the wizard
/settings.
Upgrade
ziro distribution from its release index. The index host is
configurable with ZIRO_PYPI_HOST and defaults to test.pypi.org.
Optional extras
There is no automatic fallback between web-search backends. If you configure
searxng and the container is not running, the tool returns a readable error rather
than silently switching to DuckDuckGo.Index your own content
Two indexers extend what the agent can retrieve:Use
python -m ziro.<module> for the indexers. The app.* import alias redirects
normal imports to their ziro.* equivalents, but python -m needs the real module
path.Verify the install
Next steps
Quickstart
Run the wizard and hold your first conversation.
Environment variables
Every variable Ziro reads and what it changes.
Providers
OpenRouter, Anthropic, OpenAI, and custom endpoints.