by gebruder
The switchboard for the agent era. Per-channel isolation, encrypted credential vault, per-session hash-chained audit log. Single static Rust binary.
# Add to your Claude Code skills
git clone https://github.com/gebruder/wirkenWirken is the switchboard for the agent era. Message it on Telegram, Discord, Slack, Microsoft Teams, Matrix, WhatsApp, Signal, Google Chat, or iMessage, and the agent on the other end reads files, calls APIs, and runs tools on your behalf. Each channel gets its own line. Every call is logged before it connects.
Wirken ships as a single static Rust binary and works with Ollama, Anthropic, OpenAI, Gemini, Bedrock, Tinfoil, Privatemode, or any OpenAI-compatible endpoint. MIT licensed.
Each channel runs in its own adapter process with a distinct Ed25519 IPC identity and its own vault-scoped token set. Credentials sit in an XChaCha20-Poly1305 vault keyed from the OS keychain, with per-credential expiry and manual rotation tracked in the store. Every agent action, tool call, LLM request, and response is written to a per-session SHA-256 hash-chained audit log. The log forwards to Datadog, Splunk, or a webhook when SIEM is configured. Permissions follow a three-tier model scoped per agent. Parent agents that spawn children declare per-child ceilings: tool allowlist, maximum permission tier, max rounds, max runtime.
Download the latest release binary:
curl -fsSL https://raw.githubusercontent.com/gebruder/wirken/main/install.sh | sh
wirken setup
wirken run
Pin the installer before piping. The committed install.sh has this SHA-256:
73e678196ea073608e902c8ab11a01ede07e0d37fddccaa20c43fa5d62bd52f5
No comments yet. Be the first to share your thoughts!
Verify it yourself:
curl -fsSL https://raw.githubusercontent.com/gebruder/wirken/main/install.sh | sha256sum
The installer then fetches checksums.sha256 and checksums.sha256.sig from the release, verifies the signature with ssh-keygen -Y verify against a signing key embedded in the script, and verifies the binary's SHA-256 against the signed checksums. Every failure path is fail-closed: missing signature, missing checksum, mismatched digest, or a machine without sha256sum/shasum aborts install. The only override is WIRKEN_ALLOW_UNVERIFIED=1, which warns on stderr and is documented in docs/release-signing.md.
Prebuilt binaries are available for Linux (x86_64, aarch64) and macOS (x86_64, Apple Silicon). The Linux binaries are statically linked against musl with no glibc dependency.
Or build from source (requires Rust 1.85+ and the capnp compiler):
# Ubuntu/Debian
sudo apt-get install -y capnproto
# macOS
brew install capnp
cargo install --path crates/cli
wirken setup walks you through three steps:
wirken setup
────────────
Step 1: Pick your AI
Provider: Ollama (local) / Anthropic / OpenAI / Google Gemini / AWS Bedrock / Tinfoil / Privatemode / Custom endpoint
API key: ********
Encrypting API key...
API key encrypted and stored.
Model: gpt-4.1-mini ← auto-detected from provider API
Step 2: Pick your channels
Add a channel: Telegram
Telegram bot token: ********
telegram: token encrypted, adapter keypair generated, registered.
Setup complete!
Provider: openai (gpt-4o)
Channels: telegram
wirken run starts the gateway daemon. It spawns adapter processes, accepts authenticated connections, routes messages to the agent, and serves a WebChat UI at http://localhost:18790:
wirken gateway v0.7.1
──────────────
Provider: ollama/llama3.2
Ollama version: 0.19.0
Route: telegram -> agent:default
Socket: ~/.wirken/sockets/gateway.sock
WebChat: http://localhost:18790
Gateway running. Press Ctrl+C to stop.
All local services bind to 127.0.0.1. Wirken never instructs you to bind inference servers, WebChat, or any local endpoint to 0.0.0.0.
Install as a system service so the gateway starts on login:
wirken setup --install-service
graph TD
Channels["Telegram · Discord · Slack · Teams · Matrix · WhatsApp · Signal · Google Chat · iMessage"]
Channels -- "UDS · Ed25519 · Cap'n Proto" --> Registry
subgraph Gateway["Wirken"]
Registry[Adapter Registry] --> Router
Router --> Detect[Injection Detection]
Detect --> Factory[AgentFactory]
Factory --> Agent[Agent Runtime]
Agent --> Context[Context Engine]
Agent --> Permissions
Agent --> Skills
Agent --> Tools
Agent --> Vault --> Keychain
subgraph Execution
Tools --> Sandbox[Docker / gVisor / Wasm]
end
SessionLog["Session Log\n(per-session hash chain, attested)"]
end
Agent -- "UDS" --> McpProxy["MCP Proxy\n(separate process)"]
McpProxy -- "stdio · HTTP · OAuth2" --> McpServers[MCP Servers]
Agent -- HTTPS --> LLM[LLM Providers]
Agent -- "spawn_subagent" --> Factory
Detect -.-> SessionLog
Permissions -.-> SessionLog
Tools -.-> SessionLog
SessionLog -.-> SIEM[SIEM / Webhook]
Each channel adapter runs as a separate OS process. Adapters authenticate to the gateway with a per-adapter Ed25519 challenge-response handshake over a Unix domain socket. Messages are serialized with Cap'n Proto (zero-copy, traversal-limited). An adapter can only deliver inbound messages for its own channel and request outbound sends for its own channel. It cannot invoke tools, read other channels' sessions, or access other channels' credentials.
Channel isolation operates at two levels. The active mechanism is process-level: each channel runs in its own OS process with a distinct ed25519 identity. The IPC crate also defines a sealed Channel trait and SessionHandle<C: Channel> type that makes cross-channel handle conversions a compile error. This type-level API is not yet threaded through the production message path, where the channel discriminator is a string field on the Cap'n Proto inbound frame. If an adapter process is compromised, the blast radius is exactly one channel because the gateway's IPC boundary, running in a separate memory-safe process, prevents lateral movement.
The MCP proxy also runs out-of-process over a Unix domain socket, with the vault handle isolated in the proxy. MCP servers connect via stdio, HTTP, or OAuth2, and the agent process never sees MCP credentials.
Agents are stateless between turns. The AgentFactory wakes an agent for each inbound message by replaying its session log. Conversations are durably logged as typed session events (user messages, assistant messages, tool calls, tool results, LLM request/response metadata) in an append-only, per-session hash-chained table. If the agent crashes mid-turn, the harness detects incomplete tool rounds on wake and surfaces them as failures rather than silently re-executing side effects. A context engine trims conversations under each model's token budget before every LLM call, preferring to drop old tool results before touching user or assistant text.
Agents can delegate bounded subtasks to child agents via spawn_subagent. The operator configures a per-child capability ceiling (tool allowlist, max permission tier, max rounds, max runtime). Children run headless with no interactive approvals, isolated session logs, and a hard depth cap of 4.
wirken session verify replays the log offline and re-checks message hashes, deterministic tool results, and chain integrity. Tampered sessions break the chain.SessionHandle<Telegram> vs SessionHandle<Discord>) exists in the IPC crate and is regression-tested but not yet used in the production message path.secrecy + zeroize make logging a secret a compile error.Full OWASP and NIST AI RMF mappings: docs/security-properties.md
Wirken gives organizations the controls they need to deploy AI agents without bypassing existing security, compliance, and audit requirements.
wirken session verify replays the log offline and re-checks hashes. SIEM forwarding sends events to Datadog, Splunk, or any webhook in real time.