Agents you can
read, fork, and ship.
A streaming ReAct runtime with typed tools, progressive skills, and multi-agent teams. Web and desktop, one codebase.
Core Capabilities
Four entry points, one runtime
On top of a streaming, resumable ReAct runtime, Zapvol exposes a broad surface of typed, documented primitives. Four worth starting with: a typed tool system with pluggable sandboxes, progressive skills following the agentskills.io spec, persistent memory with 3-tier compaction, and multi-agent orchestration. Pick one to dive in.
// Agent invokes when task matches a skill
await load_skill({
skill_name: 'market-research',
})
// Full SKILL.md returned — only activated
// skills occupy context window space // L3 Tool Instructions — auto-injected at startup
### Skills: `load_skill`
Available Skills:
- market-research: Systematic market analysis...
- code-review: Structured code review...
- data-analysis: Statistical analysis...
// ~24 tokens each · 50 skills < 1,500 tokens # skills/market-research/SKILL.md
---
name: market-research
description: Systematic market analysis...
compatibility: ">=1.0"
allowed-tools: tavily_search exa_company_search
min_tier: lite
---
# instructions loaded on demand // HITL tool — halts the agent, awaits structured answer
const answer = await ask_user_question({
title: 'Clarify report requirements',
fields: [
{ id: 'format', type: 'radio', options: [...] },
{ id: 'sections', type: 'checkbox', options: [...] },
],
})
// answer.format / answer.sections — typed & Zod-validated const result = await bash({
cmd: 'pnpm typecheck',
timeout: 30_000,
})
// runs inside Daytona / E2B / Node — same call // tools/init-tools.ts — mount at startup
initToolRegistry({
builtin: defaultTools,
mcpServers: [
mcpServer('linear', { apiKey }),
mcpServer('figma', { accessToken }),
mcpServer('postgres', { url }),
],
})
// Capability-filtered per sandbox await memory.save({
type: 'project',
content: 'Compaction fires at 80% token budget.',
pinned: true,
})
// Types: user · feedback · project · reference const memories = await memory.recall({
types: ['user', 'project'],
query: 'compaction settings',
limit: 5,
})
// Semantic + type-filtered // Automatic — fires at ~80% token budget
// Tier 0: round degradation O(1)
// Tier 1: tool-call truncation O(n)
// Tier 2: LLM summarization O(llm)
// No config needed · pinned memories preserved // Lead agent invokes spawn_team tool:
spawn_team({
name: 'build_api',
members: [
{ name: 'schema-sync', agentType: 'code' },
{ name: 'test-runner', agentType: 'test' },
{ name: 'doc-writer', agentType: 'docs' },
],
}) // Lead creates tasks with deps:
create_team_task({
id: 'write-tests',
assignee: 'test-runner',
prompt: 'Write integration tests for /api/auth',
dependencies: ['fetch-schema', 'generate-client'],
})
// DAG-scheduled — runs when deps complete // Agents message each other via a tool:
send_team_message({
to: 'test-runner',
body: 'schema.json ready at /tmp/schema.json',
})
// Delivered as system-reminder in next step Why Zapvol
Built to be opened, not hidden
Readable loops, composable agents, swappable sandboxes, one codebase across platforms — all on typed, documented internals you can read, fork, or replace.
See the whole loop
Every stage in the ReAct cycle is yours to read, pause, or replace.
- State machine + SSE streaming
- Pause, steer, or fork mid-run
- 3-tier compaction for 100K+ sessions
Solo agent or full squad
Lead agents spawn members with a typed task graph and isolated contexts.
- Dependency resolution between sub-agents
- Inter-member messaging with schemas
- Per-member sandbox isolation
Same agent, swappable runtime
One dependency-inverted interface backs three sandbox providers.
- Node, Daytona, and E2B out of the box
- Capability-gated tool exposure
- Drop in a new provider without touching agents
Web and desktop, one codebase
Shared UI, hooks, and contracts across browsers, Electron, and Hono.
- PostgreSQL on server, SQLite on desktop
- React 19 + strict TypeScript everywhere
- MCP for third-party tools at runtime
How it works
Autonomous by default, shaped by protocol
The same protocol — from a one-line answer to a multi-file refactor. Clarify and Plan activate only when Assess flags them as needed.
Assess
Triage against P0-P3 policies — direct answer, confirmation required, clarification needed, or plan first.
Clarify
optionalWhen context, goal, or constraints materially affect the outcome, ask the user before acting.
Plan
optionalEmit an explicit todo list — execution stages only, each with verifiable output and a delivery spec.
Execute
Run stages linearly, parallelize independent tool calls when safe, recover from errors openly.
Deliver
Synthesize outputs, verify against the delivery spec, return a direct response or persisted files.
Ready to build?
Get started with Zapvol in minutes. Free and open source.