22 <img src =" assets/logo/void-box.png " alt =" void-box " width =" 200 " >
33 <h1 >void-box</h1 >
44 <p ><strong >Composable agent runtime with hardware isolation</strong ></p >
5- <p ><code >VoidBox = Agent(Skills) + Environment</code ></p >
65
7- <a href =" https://github.com/the-void-ia/void-box/actions/workflows/ci.yml " ><img src =" https://img.shields.io/github/actions/workflow/status/the-void-ia/void-box/ci.yml?branch=main&style=flat-square&label=CI " alt =" CI " ></a >
8- <a href =" https://github.com/the-void-ia/void-box/blob/main/LICENSE " ><img src =" https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square " alt =" License " ></a >
6+ <p >
7+ <em>Design principle:</em> Skills are declared capabilities.<br>
8+ They execute inside isolated micro-VM boundaries — not shared processes.
9+ </p >
10+
11+ <p ><code >VoidBox = Agent(Skills) + Isolation</code ></p >
12+
13+ <!-- CI badge (official GitHub Actions badge) -->
14+ <a href =" https://github.com/the-void-ia/void-box/actions/workflows/ci.yml " >
15+ <img src="https://github.com/the-void-ia/void-box/actions/workflows/ci.yml/badge.svg?branch=master" alt="CI">
16+ </a >
17+
18+ <a href =" https://github.com/the-void-ia/void-box/blob/main/LICENSE " >
19+ <img src="https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square" alt="License">
20+ </a >
921 <img src =" https://img.shields.io/badge/rust-1.83%2B-orange?style=flat-square&logo=rust " alt =" Rust 1.83+ " >
1022</div >
1123
1224<br >
1325
1426<p align =" center " >
1527 <a href =" docs/architecture.md " >Architecture</a > ·
16- <a href =" #quick-start " >Getting Started </a > ·
28+ <a href =" #quick-start " >Quick Start </a > ·
1729 <a href =" #observability " >Observability</a >
1830</p >
1931
20- > [ !NOTE]
21- > ** v0 preview** — Functional, 222+ tests passing, KVM + Ollama E2E verified. API may change.
32+ <p align =" center " >
33+ Local-first. Cloud-ready. Runs on any Linux host with <code >/dev/kvm</code >.
34+ </p >
35+
36+ > ** Status:** v0 (early release). Production-ready architecture; APIs are still stabilizing.
37+
38+ ---
2239
2340## What You Get
2441
25- - ** Hardware isolation** — KVM micro-VMs, not containers. Fresh VM per agent.
26- - ** Skill-native** — Procedural knowledge (SKILL.md), MCP servers, CLI tools. Compatible with [ skills.sh] ( https://skills.sh ) ecosystem.
27- - ** Composable pipelines** — Sequential ` .pipe() ` , parallel ` .fan_out() ` , streaming output.
28- - ** Multi-LLM** — Claude, Ollama, or any OpenAI-compatible endpoint. Per-box model selection.
29- - ** Observability built-in** — OTLP traces/metrics, structured logs, guest telemetry via procfs.
30- - ** No root required** — Usermode SLIRP networking via smoltcp, no TAP devices.
42+ - ** Hardware isolation** — KVM micro-VMs, not containers. Fresh micro-VM per stage.
43+ - ** Policy-enforced execution** — Command allowlists, rlimits, seccomp-BPF, and controlled network egress.
44+ - ** Skill-native** — Procedural knowledge (SKILL.md), MCP servers, and CLI tools provisioned into the sandbox.
45+ - ** Composable pipelines** — Sequential ` .pipe() ` , parallel ` .fan_out() ` , streaming output with stage-level failure domains.
46+ - ** Model backend options** — claude-code runtime using Claude (default) or Ollama.
47+ - ** Observability built-in** — OTLP traces/metrics, structured logs, and guest telemetry via procfs.
48+ - ** No root required** — Usermode SLIRP networking via smoltcp (no TAP devices).
49+
50+ Isolation is the primitive. Pipelines are compositions of bounded execution environments.
51+
52+ ---
3153
3254## Quick Start
3355
@@ -51,11 +73,11 @@ let hn_api = Skill::file("skills/hackernews-api.md")
5173let reasoning = Skill :: agent (" claude-code" )
5274 . description (" Autonomous reasoning and code execution" );
5375
54- // VoidBox = Agent(Skills) + Environment
76+ // VoidBox = Agent(Skills) + Isolation
5577let researcher = VoidBox :: new (" hn_researcher" )
5678 . skill (hn_api )
5779 . skill (reasoning )
58- . llm (LlmProvider :: ollama (" qwen3-coder" ))
80+ . llm (LlmProvider :: ollama (" qwen3-coder" )) // claude-code runtime using Ollama backend
5981 . memory_mb (1024 )
6082 . network (true )
6183 . prompt (" Analyze top HN stories for AI engineering trends" )
@@ -69,61 +91,20 @@ let result = researcher.run(None).await?;
6991println! (" {}" , result . claude_result. result_text);
7092```
7193
72- ## Declarative Spec
73-
74- ``` yaml
75- api_version : v1
76- kind : agent
77- name : hn_researcher
78- sandbox :
79- memory_mb : 1024
80- network : true
81- llm :
82- provider : ollama
83- model : qwen3-coder
84- agent :
85- prompt : " Analyze top HN stories for AI engineering trends"
86- skills :
87- - " file:skills/hackernews-api.md"
88- - " agent:claude-code"
89- ` ` `
90-
91- ` ` ` bash
92- voidbox run --file hackernews_agent.yaml
93- ```
94-
95- ## Pipeline Example
96-
97- ``` rust
98- use void_box :: pipeline :: Pipeline ;
99-
100- // Compose: sequential + parallel stages with streaming output
101- let result = Pipeline :: named (" trading_analysis" , data_box )
102- . pipe (quant_box ) // sequential
103- . fan_out (vec! [sentiment_box , risk_box ]) // parallel: both get quant output
104- . pipe (strategy_box ) // sequential: gets merged results
105- . run_streaming (| box_name , chunk | {
106- eprint! (" [{}] {}" , box_name , String :: from_utf8_lossy (& chunk . data));
107- })
108- . await ? ;
109-
110- println! (" Cost: ${:.4} | Tokens: {}in/{}out" ,
111- result . total_cost_usd (),
112- result . total_input_tokens (),
113- result . total_output_tokens ());
114- ```
115-
94+ ---
11695## Architecture
11796
11897```
11998┌─────────────────────────────────────────────┐
12099│ Host │
121- │ VoidBox / Pipeline / Daemon │
100+ │ VoidBox Engine / Pipeline Orchestrator │
101+ │ │
122102│ ┌─────────────────────────────────────┐ │
123103│ │ VMM (KVM) │ │
124104│ │ vsock ←→ guest-agent (PID 1) │ │
125- │ │ SLIRP ←→ eth0 (10.0.2.15) │ │
105+ │ │ SLIRP ←→ eth0 (10.0.2.15) │ │
126106│ └─────────────────────────────────────┘ │
107+ │ │
127108│ Seccomp-BPF │ OTLP export │
128109└──────────────┼───────────────────────────────┘
129110 Hardware │ Isolation
@@ -132,30 +113,13 @@ println!("Cost: ${:.4} | Tokens: {}in/{}out",
132113┌──────────────▼───────────────────────────────┐
133114│ Guest VM (Linux) │
134115│ guest-agent: auth, allowlist, rlimits │
135- │ claude-code → Ollama / Claude API │
136- │ skills provisioned at ~/.claude/skills/ │
116+ │ claude-code runtime ( Claude API or Ollama backend) │
117+ │ skills provisioned into isolated runtime │
137118└───────────────────────────────────────────────┘
138119```
139120
140121See [ docs/architecture.md] ( docs/architecture.md ) for the full component diagram, wire protocol, and security model.
141122
142- ## Security Model
143-
144- - ** Session secret** — 32-byte random token (getrandom), injected via kernel cmdline, required for all vsock messages
145- - ** Seccomp-BPF** — Restricts VMM thread to minimum syscalls for KVM operation
146- - ** Command allowlist** — Guest-agent only executes approved binaries
147- - ** Resource limits** — setrlimit on guest processes (memory, open files, processes, file size)
148- - ** SLIRP rate limiting** — Max concurrent connections, CIDR deny list
149- - ** No root required** — Usermode networking via smoltcp, no TAP devices
150-
151- ## LLM Providers
152-
153- | Provider | Config | Notes |
154- | ---| ---| ---|
155- | ** Claude** (default) | ` ANTHROPIC_API_KEY ` | Production quality |
156- | ** Ollama** | ` LlmProvider::ollama("model") ` | Local, any model. Guest reaches host via SLIRP gateway (10.0.2.2) |
157- | ** Custom** | ` LlmProvider::custom(url) ` | OpenRouter, vLLM, any OpenAI-compatible endpoint |
158-
159123## Observability
160124
161125- ** OTLP traces** — Per-box spans, tool call events, pipeline-level trace
@@ -165,38 +129,6 @@ See [docs/architecture.md](docs/architecture.md) for the full component diagram,
165129
166130Enable with ` --features opentelemetry ` and set ` VOIDBOX_OTLP_ENDPOINT ` .
167131
168- ## Project Structure
169-
170- ```
171- void-box/ Main crate (VMM, sandbox, pipeline, skills, observability)
172- src/
173- agent_box.rs VoidBox: Agent(Skills) + Environment
174- pipeline.rs Sequential + parallel composition
175- skill.rs Skill types (MCP, CLI, file, remote, agent)
176- llm.rs LLM provider configuration
177- runtime.rs Spec file → execution
178- vmm/ KVM micro-VM monitor
179- sandbox/ Mock + local sandbox abstraction
180- observe/ OpenTelemetry integration
181- network/ SLIRP usermode networking (smoltcp)
182- guest-agent/ PID 1 inside guest VMs (vsock, auth, rlimits)
183- void-box-protocol/ Wire format types (host ↔ guest)
184- claudio/ Mock claude-code for testing
185- ```
186-
187- ## Examples
188-
189- | Example | Description |
190- | ---| ---|
191- | ` quick_demo ` | Two-stage analyst/strategist pipeline |
192- | ` trading_pipeline ` | Four-stage sequential financial pipeline with local skills |
193- | ` parallel_pipeline ` | Diamond topology with ` fan_out ` , per-box models, streaming |
194- | ` ollama_local ` | Single box with local Ollama model |
195- | ` remote_skills ` | Pulls skills from skills.sh repositories |
196- | ` claude_workflow ` | Workflow plan/apply pattern |
197- | ` claude_in_voidbox_example ` | Interactive Claude session in sandbox |
198- | ` boot_diag ` | VM boot diagnostics |
199-
200132## Running & Testing
201133
202134### Mock mode (no KVM required)
@@ -251,14 +183,7 @@ VOID_BOX_INITRAMFS=/tmp/void-box-test-rootfs.cpio.gz \
251183cargo test --test e2e_skill_pipeline -- --ignored --test-threads=1
252184```
253185
254- ## Troubleshooting
255-
256- ** ` /dev/kvm ` permission denied** — Add your user to the ` kvm ` group and re-login.
257-
258- ** ` Not logged in ` ** — Use ` OLLAMA_MODEL=... ` for local inference or set ` ANTHROPIC_API_KEY ` .
259-
260- ** Parallel stages timeout** — Use the same Ollama model for all parallel boxes, or increase ` STAGE_TIMEOUT_SECS=600 ` .
261-
262186## License
263187
264188Apache-2.0 · [ The Void Platform] ( https://github.com/the-void-ia )
189+
0 commit comments