Skip to main content

Prerequisites

Choose an install path

The recommended way in. The script creates an isolated environment under ~/.ziro/versions/<version>, 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.
Run ziro when it finishes. The first launch walks you through setup.
Piping a script from the internet into a shell is worth being careful about. Read it first: both are served as plain text over HTTPS at ziro-agent.com/install.sh and ziro-agent.com/install.ps1.
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/versions/<version>, built in a staging directory and renamed into place once the version is known. Nothing is installed into your system or user site-packages, and an existing install is never written to: the new version is built beside it.
3

Points the launcher at it

A one-line ~/.ziro/current file names the live version. The shims read it on every launch, so switching versions is a single atomic file replace.
4

Installs from the release index

Ziro from TestPyPI, dependencies from prod PyPI.
5

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.
6

Verifies

Confirms the package reports a version and that the ziro command exists before claiming success.
Re-running the script installs the newest release beside the one you have and switches to it. ziro upgrade does the same thing from inside the app.
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

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 section of settings.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

This downloads only what is missing:
Run this before your first launch. Once the embeddings model is cached on disk, Ziro sets Hugging Face to offline mode at import, which removes roughly nine seconds of Hub metadata checks from every startup. A machine with nothing cached stays online and downloads once.
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. Set DATABASE_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:
Then point Ziro at it by setting 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

Each agent is configured by one settings.yaml (with an optional section per concern), resolving most-specific-first across three roots and deep-merging per section:
That means you configure an installed Ziro by dropping a settings.yaml under ~/.ziro/agents/<id>/ without ever editing the package. A section missing at every layer degrades to built-in defaults. Legacy split *_policy.yaml files still resolve as an alternative to the matching section. See Configuration.
Sections that can execute or widen access (permissions, mcp, hooks, plugins, and any matching split file) are skipped when they come from an untrusted project .ziro directory. Folder trust is content-hashed, so editing one of these revokes trust until you confirm it again.

Re-run the wizard

This re-opens the first-run wizard with every field prefilled, even when a key is already configured. Use it to re-key, switch the default model or provider, change theme, or add a custom provider. The same sections are reachable in-session with /settings.

Upgrade

The new version is built in its own environment under ~/.ziro/versions/ and the current pointer is replaced only after it verifies. Nothing that is running is ever written to, which is what makes this safe on Windows: the old approach asked pip to replace the ziro.exe it was running from, and Windows locks a running image against writes. A failed download or a broken release leaves your working install exactly as it was. The two most recent versions are kept, so --rollback needs no download. The index host is configurable with ZIRO_PYPI_HOST and defaults to test.pypi.org.
Upgrades use uv when it is available, and fetch it into ~/.ziro/tools when it is not. An environment is roughly 1.2 GB across 55k files; uv hard-links them out of its cache, so a second version costs only the packages that actually changed. Without uv it falls back to pip, which copies every file and takes minutes rather than seconds.
Installs made by pipx, uv tool, or a source checkout are left to whatever made them: ziro upgrade runs the plain in-place pip upgrade there.

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

This lists every agent with its on/off state and does not need a model call. It is a quick confirmation that the package, the agent folders, and the config layers all resolve.

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.