Hard isolation by default
Each agent runs in its own systemd-nspawn container with its own Btrfs subvolume, a firewalled veth, and a single MUS pipe to keeperd. No ambient access to the host.
The Hypervisor for Agentic Workflows
VIVARY is the open-source runtime that wraps tool-using LLMs in a hard-isolation boundary. Move from "prompts and prayers" to governed, auditable, and production-ready agent execution.
What you get
Each agent runs in its own systemd-nspawn container with its own Btrfs subvolume, a firewalled veth, and a single MUS pipe to keeperd. No ambient access to the host.
Agents reference a credential_id. keeperd holds the vault and resolves secrets at dispatch time. No token, key, or password ever enters the container.
Each capability is a self-documenting Unix CLI tool: run it with --help and it returns its full JSON schema. Scope, rate limits, and approval requirements are declared in agent.kdl, not buried in prompts.
MUS-framed traffic and structured events are recorded to SQLite. vivlog gives operators a plain CLI to decode frames, trace denials, and reconstruct what the runtime actually did.
Why not just use X?
Your agents run in their infrastructure. Credentials, tool results, and audit data never leave their cloud. Vendor lock-in is structural, not incidental. You cannot inspect what the runtime actually did.
Agents get process-level access to the host environment. Tool calls are untyped function calls. Policy is prompt text. There is no audit trail, no approval flow, and no credential separation — by design.
No isolation. No credential separation. Tool definitions live in prompts. Any server an agent can reach can be called. No structured audit. MCP is a tool-discovery protocol, not a governance layer.
You get OS-level isolation but nothing above it. No capability schema. No policy enforcement. No audit protocol. No orchestration. Every project ends up rebuilding the same ad-hoc governance layer from scratch.
Forensic Visibility
VIVARY provides a forensically-sound SQLite trail of every byte that passed between your LLM and your infrastructure. MUS-framed, timestamped, and immutable.
Every capability request and response is captured in its raw binary form. Decouple your audit trail from the model's own (often unreliable) internal logs.
Denials are not just errors; they are security events. Every blocked URL, path traversal attempt, or rate-limit trigger is recorded with agent-level identity stamping.
How it works
keeperd, ward, viv, and vivlog are statically-linked Go binaries. The full runtime ships in a minimal NixOS LXD image. No Python. No npm. No runtime interpreter.
All agent-to-keeper traffic uses compact MUS frames with typed headers. Every frame is logged. vivlog decodes them without bespoke tooling — grep-friendly, CLI-first.
Capabilities are declared in agent.kdl with named scopes, rate limits, and optional approval gates. The schema is machine-generated from Go types; there is no drift between policy and implementation.
Capabilities
Every action an agent can take is a named, scoped, typed capability — declared in capabilities.kdl and enforced by keeperd. Capabilities are self-documenting Unix CLI tools: run any with --help to get its full JSON schema. No capability, no access.
Web_Page_Read
Browser
risk: low
Fetch the readable text content of a web page, stripped of markup, scripts, and boilerplate.
Calendar_Event_Create
Calendar
risk: high
Create a new calendar event. Writes to the CalendarEvent entity; requires explicit grant in agent.kdl.
Fs_File_Write
Filesystem
risk: medium
Write or overwrite a file in the agent's scoped workspace. Path prefix is enforced by keeperd; symlink escapes are rejected.
Commerce_Order_Create
Commerce
risk: critical
Place an order with a configured commerce provider. Requires a confirm: true field and operator approval gate by default.
Home_Device_Invoke
SmartHome
risk: medium
Invoke an action on a smart home device via the configured hub (Home Assistant, Google Home, etc.).
Messaging_Message_Send
Messaging
risk: high
Send a message to a contact via WhatsApp, SMS, or Signal. Recipient must be a pre-approved contact in agent.kdl.
Capabilities are granted per-agent in agent.kdl. Each grant specifies scope, rate limits, and whether operator approval is required before execution. All calls — allowed and denied — are written to the audit log.