Deploy

One container on a laptop. A cluster for the team.

ZAANIX is a single Node.js server with DuckDB inside it — nothing else to install. The image is multi-arch (amd64 and arm64) and ships with DuckDB's extensions, so it needs no network at runtime. It is available on request: talk to us for access and the deployment files.

Try it

One container on your machine. The first person to open it creates the admin account.

docker run

Run it for a team

Docker Compose with PostgreSQL metadata, the agent, a local model and Prometheus as you need them.

Docker Compose

Scale it

Kubernetes manifests, and cluster mode: several nodes behind one load balancer.

Kubernetes

Docker

The fastest first look. Set JWT_SECRET and ENCRYPTION_KEY for anything longer, or sign-ins and stored credentials will not survive a restart.

Available on request. The image is private. Talk to us and we will give you access and the exact command for your setup.
Your own filesMount a folder at /data to query files you already have.
An admin up frontSet ZAANIX_ADMIN_EMAIL and ZAANIX_ADMIN_PASSWORD to create it at the first start.
Data appsApps get their own origin on :4201; publish that port too when you use them.

Docker Compose

A docker-compose.yml, shared with access, runs ZAANIX and, by profile, what you want next to it.

ProfilesPostgreSQL metadata, Ollama for a local model, and Prometheus on :9090 — each switched on when you want it.
SecretsAn .env file holds the secrets and the first admin's credentials.
Data./data is mounted at /data; DuckDB spills to a tmpfs.
MemoryZAANIX_MEMORY caps the container (default 8g); DUCKDB_MEMORY_LIMIT caps the engines.

The AI and ZAANIX Agent

Built into the server since 3.0: no second container, port or sign-in. Give it a model and Home becomes the agent; leave it out and ZAANIX works without AI.

The agent guide
# .env — a model for everyone (or set it in Settings › AI › Model; people may keep their own key)
# provider: anthropic | openai | gemini | deepseek | openrouter | kimi | groq | mistral | xai | ollama | custom | bedrock …
AI_PROVIDER=anthropic
AI_MODEL=claude-sonnet-5
AI_API_KEY=sk-ant-…
Governed in SettingsSettings › AI › Agent policy: who may use it, from where, what it may do without asking, budgets and retention.
How far a request goesagent.max_steps, agent.max_retries and agent.max_output_tokens (ZAANIX__agent__max_steps …).
Chat and the command lineagent.slack.* and agent.teams.* turn on the bots; the image ships the zaanix-agent CLI at /cli/install.sh.
Upgrading from the separate appzaanix import-agent-data --from agent.db brings missions, briefs and memories over.

Kubernetes and clusters

Kustomize manifests, shared with access, and a cluster mode for more than one node.

Deployment guide
Hardened by defaultLiveness, readiness and startup probes; non-root with a read-only root filesystem; a spill volume and a PVC for /data.
Cluster modeNodes share PostgreSQL metadata and a ReadWriteMany data volume. Each workspace's engine lives on one node; the others forward to it.
Scheduled work, onceSyncs, alerts, snapshots, checks and streams are claimed by exactly one node, and move when a node stops.
Sticky where it mattersData apps and MCP SSE sessions stay on their node (ClientIP affinity); everything else can go to any node.

MCP clients

Point Claude, Claude Code or Cursor at a running ZAANIX with a token that has the mcp scope.

MCP and agents
claude mcp add --transport http zaanix http://localhost:4200/mcp \
  --header "Authorization: Bearer zx_…"

# or over stdio
zaanix mcp --token zx_… [--workspace <id>]

Configuration

Everything is in zaanix.config.yaml, and any key can be overridden with ZAANIX__SECTION__KEY. These cover most deployments.

All settings
VariableWhat it doesDefault
JWT_SECRETSigns sign-in sessions (16 characters or more). Required in production.generated per start
ENCRYPTION_KEY32-byte hex key for the credential vault (AES-256-GCM). Required in production.generated per start
ZAANIX_ADMIN_EMAIL, _PASSWORDThe first admin, created only when there are no users.none
ZAANIX_DATA_DIRThe folder every DuckDB read and write is confined to./data in the image
ZAANIX_FILESYSTEM_MODEfull for a personal machine; sandboxed for shared deployments.full
DATABASE_URLThe metadata store, sqlite://… or postgres://…. Migrations run at start.SQLite
ZAANIX_ENABLE_EXTERNAL_ACCESSLets a sandboxed deployment read s3://, gcs:// and https:// sources.false
DUCKDB_MEMORY_LIMIT, DUCKDB_THREADSThe engine's memory ceiling and threads.80%, auto
AUTH_STRATEGY and OIDC_*Single sign-on; OIDC_GROUPS_CLAIM maps identity-provider groups to teams.local
AI_PROVIDER, AI_MODEL, AI_API_KEYThe server's AI model (anthropic, openai, gemini, openrouter, ollama, bedrock …); a model set in Settings wins. The 2.x names COPILOT_* still work.none
Upgrading. Metadata migrations run at start (3.0 moves schedules, runs and connections into one table each). Back up /app/meta (or your PostgreSQL database) before a major upgrade; the data directory is not touched.

Talk to us about ZAANIX.

ZAANIX is available on request. Tell us about your data and your team, and we will set you up with access, the deployment files and a walkthrough.