Skip to main content

Prerequisites

Choose an install path

The recommended way in. The script creates an isolated environment under ~/.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.
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/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.
Re-running the script upgrades an existing install in place. ziro upgrade does the same thing from inside the app, and works here because pip lives in the environment the script creates.
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_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

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

Agent configuration resolves most-specific-first across three roots:
That means you configure an installed Ziro by dropping files under ~/.ziro/agents/<id>/ without ever editing the package. A file missing at every layer degrades to built-in defaults. See Configuration.
Files that can execute or widen access (permissions.yaml, mcp_servers.yaml, hooks.yaml, plugin_config.yaml) are skipped when they come from an untrusted project .ziro directory. Folder trust is content-hashed, so editing one of these files 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

Upgrades the installed 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

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.