The agent harness for work that cannot leave the building.
Abhed is a deep agent harness: the loop, the tool contracts, the permission engine and the sandbox. It runs on your own hardware, against a model you host. Policy, audit and deny rules hold when you embed it in something else.
Why Abhed
Five things "under your control" actually means.
Each one is a property this repository tests, not a line of copy.
Runs where the data is
One static binary, from a laptop to an air-gapped rack, with a signed offline bundle for the rack.
Runs any model
Twenty providers over three wire formats, including the one on your own GPUs. Changing vendors is a line of config.
Sandboxed by default
Inside a boundary the operator sets and the agent cannot lift, with an approval policy the operator owns.
Every action on the record
An append-only event log, replayable step by step, with every approval and refusal and who made it. Exportable as traces.
Embeds without weakening
The SDK gives a program the same loop with the same guarantees. The console is a reference app built on it.
A real session
Ninety seconds, captured — not a mock-up.
A 26B model running locally, asked to add a function, write a table-driven test for it, and run the suite. Step through it; the explanation on the right follows the terminal.
Install
One static binary. No runtime to install.
# Go 1.26 or newer. Abhed is a single binary with no runtime dependencies.
git clone https://github.com/yuvrajsingh/abhed
cd abhed
go build -o ~/.local/bin/abhed ./cmd/abhed
abhed -version
go install path and no piped-shell installer,
because neither would work today and both are easy to check. Access is
by request — the form is at the bottom of this page.
# Build a signed bundle on a connected machine: ./scripts/build-bundle.sh # -> abhed-bundle.tar.gz + .sha256 + .sig # Carry it in. On the target, with no internet route: ./scripts/verify-bundle.sh abhed-bundle.tar.gz tar xzf abhed-bundle.tar.gz && ./install.sh
# Abhed does not ship a model. Point it at one you host: ollama serve ollama pull qwen3-coder:30b # Then, in the directory you want the agent to work in: abhed init # writes .abhed/config.json, detects a local endpoint abhed doctor # check the endpoint before you rely on it Ready.
abhed doctor is worth the ten seconds. It checks the
endpoint answers and that the model can emit a
structured tool call — a model that describes one in prose cannot drive
an agent, and finding that out mid-task wastes the run.
Full instructions, configuration and every tool contract are in the documentation.
The harness
Five ways to run it. One set of rules.
The same agent loop, the same policy engine, the same audit trail, whether you drive it from a terminal, a pipeline, another language, or your own Go service. A guarantee that held in the CLI and not in the server would not be a guarantee.
| Surface | What it is for |
|---|---|
abhed |
Interactive. Line editor, slash commands, steer a run mid-flight. |
abhed -p "…" |
Headless. One prompt, typed exit code, for CI and scripts. |
-output-format json |
One JSON event per line on stdout, streamed as it happens. |
abhed rpc |
JSONL over stdio. Drive it as a subprocess from any language. |
abhed serve |
REST, SSE and a web console. Multi-user, tenant-scoped. |
Embed it
Policy, audit and deny rules hold when embedded.
Your application supplies the approver and consumes the event stream — because a host usually has better ideas than a terminal prompt about how to ask a user for permission. Policy still decides what runs, every action is still recorded, and an extension still cannot permit what a deny rule forbids. No approver means refuse, never assume yes.
One guarantee that does not come with it: the SDK builds no sandbox. An embedded agent runs commands with the privileges of the process that embedded it, so the host is responsible for isolation — a container, a jail, a separate user — exactly as it would be for any other library that shells out.
a, err := abhed.New(ctx, abhed.Options{
Workspace: "/srv/work",
Provider: &abhed.Provider{Type: "anthropic", Model: "claude-opus-4-5"},
Mode: "auto",
Deny: []string{"bash(rm -rf *)"},
// Your app decides. No approver means refuse — never assume yes.
Approve: func(ctx context.Context, tool string,
args json.RawMessage, d abhed.Decision) (bool, error) {
return askYourUser(tool, args, d.Reason)
},
// Every action, as it happens.
OnEvent: func(ev abhed.Event) { log.Println(ev.Type) },
})
defer a.Close()
answer, err := a.Run(ctx, "fix the failing tests")
RunRunJSONContinueSteerForkEventsUsageExportHTMLSetModel
Steer works from another goroutine, mid-run. For anything
not written in Go, abhed rpc is the same agent over JSONL.
Primitives
Extend it without forking it.
Extensions
Separate processes speaking JSONL, in any language, on seven live events — tool calls, results, context, compaction, agent start, tool listing and invocation. They may veto, never permit: an extension that could grant permission could also remove the proof of what was permitted.
Skills
A directory with a procedure in it. Only the name and description reach the prompt — about fifteen tokens each — and the body is fetched when the agent decides it applies. A skill may also declare a pipeline the harness executes rather than asks the model to follow.
MCP
Registered servers only, disabled until explicitly enabled, with an optional tool allowlist, and credentials read from the environment rather than a config file. Discovery does not imply trust.
Providers
Twenty of them over three wire formats, added from config without a rebuild. A sampling parameter the provider cannot honour fails at startup rather than being silently ignored.
Governance
What the agent did, provable afterwards.
Most of what an agent harness offers can be added later as an extension. Two things cannot: a log you can replay, and an isolation boundary the database enforces. Both have to be in the core, which is where these are.
They are not on by default. Abhed ships with an in-memory store, which keeps a single-machine trial simple and gives you none of what follows. The triggers and the row-level security are properties of the Postgres store — one config line — and a deployment that needs to prove anything to an auditor has to be running it.
The log is the session
Every action is an event in the store, and the conversation is derived from those events rather than described by them. That is what makes replay exact and forking from any earlier step cheap — nothing extra had to be stored to make either work.
Immutable by trigger Postgres
Recorded events cannot be updated or deleted. Not by convention and not in application code — by database triggers that reject the statement, so an audit trail cannot be quietly rewritten by whatever is holding the connection.
Tenants isolated in the database Postgres
Row-level security scopes every query, with FORCE
because a table's owner bypasses ordinary RLS — and the application
role usually owns the tables it created, which leaves the policy
silently inert. A test read another tenant's rows until
FORCE was added.
Deny is absolute
A deny rule holds in every permission mode, including bypass. An extension may veto a call and can never permit one, so no plugin, profile or mode can widen what an operator forbade.
What this is not. None of it is a compliance certification, and none of it substitutes for one. It is the mechanism an auditor would ask to see — who did what, under whose authority, and can it be shown afterwards — built where it cannot be turned off rather than asserted in a policy document.
Context engineering
Compaction is a capacity decision, not a quality knob.
Headroom for the turn that is coming
The threshold is applied to used tokens plus headroom for the turn that is coming, not to what has already happened. Without that margin the check passes at 24,809 of a 32,768 window, the next tool result adds 8,000, and the call fails — having been told, correctly, that there was no need to compact.
Chosen, not truncated
The system prompt and memory file are re-injected whole, recent turns are kept verbatim and split at a tool-call boundary so the model never sees a result answering a call it cannot see. Exchanges are dropped from the front until what remains actually fits, and compaction returns to half the window rather than to the threshold, because stopping at the threshold leaves the session one turn away from compacting again.
Subagents are a compression ratio
Subagents get a fresh context and a narrower tool set, and return a bounded summary — so the orchestrator grows by the summary rather than the transcript. Isolation is not free: each spawn re-prefills its own prefix, and that spend counts against the parent's budget rather than multiplying invisibly.
Reference application
Abhed Chat is one thing built on it.
A multi-user console — documents in and out, diagrams, live Kubernetes debugging, SSH to declared hosts, every write behind a human approval gate. It is a demonstration of the harness, not the product, and it is built on the same SDK anyone else would use.
It is running now at abhed.zybuu.com — the sign-in page is public, and access is by invitation while it runs on our own infrastructure. Request one and we will get back to you.
Evidence
Numbers that survive a technical diligence call.
Benchmark
Same model, same prompt, three harnesses.
Twenty-four Exercism Python exercises, one local 26B model (gemma4:26b through Ollama), the identical prompt for every system, scored against the original test file after each run. What varies is the harness, so the harness is what the numbers measure.
Abhed was the slowest of the three and used the most tokens: it verifies and iterates where the others stop. That is the trade, stated plainly. The suite is small and single-file, and says nothing about multi-file work. Method, per-task table, and the mid-run correction to the aider invocation are all in the benchmark results; the raw run records are in the repository, and the figures above are recomputed from them by the site tests, never typed in.
What is not true yet. Zybuu holds no SOC 2, ISO 27001 or HIPAA certification. There is no support SLA. A human red-team engagement remains outstanding and is not substitutable by the adversarial suite. Those are stated here rather than discovered later, because the buyers this is built for will ask — and an honest answer is worth more than a careful one.
Limitations
What Abhed does not do.
Every row below is a constraint we would rather you knew before a trial than after one. Where there is a path forward it is stated; where the honest answer is "not yet", it says that.
| Constraint | What it means in practice |
|---|---|
| Vision needs a vision model | Abhed reads images, but only on a model that can see. A local text-only model refuses the attachment by name rather than guessing at it. |
| Single node | Sessions live in one process. There is no horizontal scaling and no failover; a restart ends running turns. Accounts survive it. Transcripts survive it on the Postgres store — on the default in-memory store they do not. A finished session can then be continued from its record by any node; a turn that was in flight cannot. |
| Postgres only | The durable store is Postgres. Other databases are reachable through SSH and their own CLI, not a native driver. |
| Auth mode is restart-only | Switching between local accounts and an identity provider rebuilds the routing table, so it needs a restart. Everything else in settings applies live. |
| Prompt injection is contained, not solved | There is no complete defence, and we do not claim one. The architecture assumes injection sometimes succeeds and limits what it can reach: absolute deny rules, no egress by default, and every observation tagged untrusted at ingest. |
| No certifications | No SOC 2, ISO 27001, HIPAA or FedRAMP. Air-gap deployment, a full audit trail and row-level security are what we have instead — and they are not the same thing as an audit. |
Pricing
Open core. Pay for the governed deployment.
The harness, the CLI, the SDK and the audit log are free and will stay free. What an organisation pays for is running it for many people under policy, and someone to call. Launch pricing, per deployment and per seat — never per token, because you run your own models.
Community
Open source. CLI, SDK, harness, single-tenant server, local accounts, the append-only audit log. Community support.
Install itTeam
Multi-user server with OIDC, the admin and access dashboard, access policy, scheduled runs, email support. Self-hosted. Ten-seat minimum, billed yearly.
Talk to usEnterprise
Everything in Team plus multi-tenant isolation, audit retention and export, the signed air-gap bundle with verification, managed policy, telemetry export, a named support contact and questionnaire support. Air-gapped sites add $25k.
Request a conversationDesign partner · ninety days
Deployment done with you on your infrastructure, a direct line to the founder, roadmap influence, and conversion to Enterprise at a locked price. Three to five partners, in the segments Abhed is built for. $25k.
Prices are launch pricing as of September 2026 and may change before general availability; a signed agreement fixes yours. What Abhed does not yet have — certifications, an SLA, high availability — is stated in the limitations above, not hidden in a contract.
Request access.
Abhed is not publicly downloadable yet. Tell us what you would point it at and we will get back to you — with an invite to the hosted console, or a conversation about running it on your own infrastructure.