Run it inside your own boundary.
The control plane is meant to sit where your trust boundary already is. Three deployment shapes, the same binary, the same decisions.
Choose a shape
| Model | Best for | Packaging & Runtime |
|---|---|---|
| Single-Binary Daemon | Production host systems, CI/CD runners, and developer machines. | Compiled Go/Rust binary (cirvixd) with zero runtime dependencies. brew or curl install. |
| Kubernetes Sidecar | Microservice agent fleets (LangGraph, CrewAI, AutoGen pods). | Containerized proxy (cirvix/proxy:1.0) sharing a local UDS volume. Fails closed. |
| Docker Compose | Staging environments and isolated host clusters. | Control plane container + PostgreSQL audit store + policy volume. |
| Bare Node / NPM | Quick evaluation or JavaScript runtime integration. | @cirvix_ai/agent-control CLI over Unix Domain Socket. |
Single-Binary Daemon (Go / Rust)
Enterprise security engineers require zero dependency friction. Cirvix distributes statically compiled single-binary daemons (cirvixd) for Linux (x86_64, ARM64), macOS (Apple Silicon, Intel), and Windows (x64) with policy evaluation designed against a sub-millisecond budget per decision (design target; measured runs with hardware context on benchmarks).
| Platform | One-Line Installation | Binary Target |
|---|---|---|
| macOS / Linux (Homebrew) | brew tap cirvix/tap && brew install cirvix | Statically compiled daemon + CLI wrapper |
| Linux / macOS (Shell) | curl -fsSL https://cirvix.com/install.sh | sh | Auto-detects architecture, installs to ~/.local/bin/cirvix |
| Windows (PowerShell) | irm https://cirvix.com/install.ps1 | iex | Installs standalone cirvix.exe, sets User PATH |
[Unit] Description=Cirvix Enterprise Agent Security Daemon After=network.target Documentation=https://cirvix.com/docs.html [Service] Type=simple User=cirvix Group=cirvix ExecStart=/usr/local/bin/cirvixd --config=/etc/cirvix/config.env Restart=always RestartSec=5s LimitNOFILE=65536 ProtectSystem=strict ProtectHome=read-only ReadWritePaths=/var/run/cirvix /var/log/cirvix [Install] WantedBy=multi-user.target
Kubernetes Sidecar Proxy Pattern
For distributed agent fleets running in Kubernetes (e.g. LangChain, CrewAI, AutoGen, Claude Code instances), Cirvix operates as a drop-in sidecar proxy inside the workload Pod. The agent and the Cirvix proxy communicate over an ultra-low-latency shared Unix Domain Socket (UDS) mounted via an in-memory emptyDir volume.
apiVersion: v1
kind: Pod
metadata:
name: fleet-agent-worker
namespace: agents-prod
labels:
app.kubernetes.io/name: fleet-agent
security.cirvix.com/governed: "true"
spec:
volumes:
- name: cirvix-socket
emptyDir:
medium: Memory
- name: cirvix-policies
configMap:
name: production-agent-policies
containers:
# --- 1. Your AI Agent Workload Container ---
- name: agent-app
image: registry.internal/fleet-agent:latest
env:
- name: CIRVIX_SOCKET
value: "unix:///var/run/cirvix/ipc.sock"
- name: CIRVIX_FAIL_CLOSED
value: "true"
volumeMounts:
- name: cirvix-socket
mountPath: /var/run/cirvix
# --- 2. Cirvix Drop-in Sidecar Proxy Container ---
- name: cirvix-proxy
image: cirvix/proxy:1.0
imagePullPolicy: IfNotPresent
securityContext:
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
runAsNonRoot: true
runAsUser: 10001
capabilities:
drop:
- ALL
env:
- name: CIRVIX_LISTEN_SOCKET
value: "/var/run/cirvix/ipc.sock"
- name: CIRVIX_POLICY_DIR
value: "/etc/cirvix/policies"
- name: CIRVIX_MASTER_KEY
valueFrom:
secretKeyRef:
name: cirvix-secrets
key: master-key
volumeMounts:
- name: cirvix-socket
mountPath: /var/run/cirvix
- name: cirvix-policies
mountPath: /etc/cirvix/policies
readOnly: true
resources:
limits:
cpu: "500m"
memory: "256Mi"
requests:
cpu: "50m"
memory: "64Mi"
livenessProbe:
exec:
command: ["/bin/cirvix-proxy", "ping", "--socket=/var/run/cirvix/ipc.sock"]
initialDelaySeconds: 3
periodSeconds: 10Docker Compose Fleet
services: control-plane: image: cirvix/control-plane:1.0 restart: unless-stopped environment: # Customer managed envelope key. Never held by Cirvix. CIRVIX_MASTER_KEY: ${CIRVIX_MASTER_KEY} CIRVIX_POLICY_DIR: /etc/cirvix/policies CIRVIX_AUDIT_STORE: postgres://cirvix:secret@postgres:5432/audit_chain CIRVIX_FAIL_CLOSED: "true" volumes: - ./policies:/etc/cirvix/policies:ro - cirvix_ipc:/var/run/cirvix depends_on: postgres: condition: service_healthy agent-service: image: company/agent-fleet:latest environment: CIRVIX_SOCKET: unix:///var/run/cirvix/ipc.sock volumes: - cirvix_ipc:/var/run/cirvix volumes: cirvix_ipc: driver: local
Configuration
| Variable | Required | Purpose |
|---|---|---|
CIRVIX_MASTER_KEY | Yes | AES-256-GCM envelope key. Customer managed, no escrow path. |
CIRVIX_POLICY_DIR | Yes | Directory of JSON rule files, mounted read-only. |
CIRVIX_AUDIT_STORE | Yes | Where the hash-linked chain is written (Postgres, SQLite, or S3). |
CIRVIX_SOCKET | No | Unix domain socket path (e.g. unix:///var/run/cirvix/ipc.sock). |
CIRVIX_FAIL_CLOSED | No | Defaults to true. Denies all agent operations if policy engine fails. |
CIRVIX_OIDC_ISSUER | No | Enables OIDC. Identity resolves to (issuer, subject). |
There is no cirvix.toml and no cirvix init. Configuration is environment plus a policy directory — if you have seen either of those referenced elsewhere, that documentation is describing something the software does not have.
Before you put traffic through it
- Confirm
CIRVIX_MASTER_KEYis supplied from your own secret store, not baked into an image. - Mount the policy directory read-only so a compromised process cannot rewrite the rules it is bound by.
- Verify the chain once with
/v1/audit/verifyso you know what a healthy result looks like. - Test the failure path deliberately: stop the audit store and confirm actions are denied rather than passed through.
Bring every agent
under control.
Set durable policy, preserve a verifiable record, and give teams a safer way to put intelligent systems to work.