Your coding agents,
as Discord Rich Presence.
Lattice reads the lifecycle hooks Codex, Claude Code, Antigravity and OpenCode already emit, strips them down on your machine, and hands Discord a status line. Nothing else leaves.
Replaying an OpenCode session. Left: hook events as they hit the local inbox. Right: the presence Discord receives. Strings are the exact output of activity_label() in core.
Three moves. All of them on your machine.
There is no server. Lattice is a hook target and an IPC client, sitting between an agent process and the Discord desktop app that is already running next to it.
- 01
Install one binary
Menu bar app on macOS, desktop app on Windows, GUI, TUI or headless daemon on Linux. Every client links the same core crate.
lattice-cli · 286 KB - 02
Enable a provider
Lattice writes the hook config for Codex, Claude Code, Antigravity or OpenCode. Each agent then posts its lifecycle events to a local inbox.
~/.config/opencode/plugins/lattice.js - 03
Work as usual
Events get sanitized into an ActivityEvent, the newest session wins, and Discord receives one presence update over its local IPC socket.
$XDG_RUNTIME_DIR/discord-ipc-0
Your code never leaves your machine.
Lattice operates as a strict one-way filter. It captures agent lifecycle hooks locally, extracts only the high-level phase and active tool, and sends Discord a minimal presence struct. Prompts, diffs, and file paths are discarded on your CPU before network transmission.
{
"event": "PreToolUse",\n "provider": "opencode",\n "tool": "Edit",\n "file": "/src/auth/token.rs",\n "diff": "+ verify_jwt(...)",\n "prompt": "fix token expiry...",\n "session_id": "sess_9f8a2c1"
}- promptDROPPED"refactor the auth middleware to use…"
- file_pathDROPPED"/home/you/src/auth/token.rs"
- tool_argsDROPPED{ "cmd": "cargo test -- --nocapture" }
- code_diffDROPPED"+ let claims = verify_jwt(&token)?;"
- token_countDROPPED{ "prompt_tokens": 14200, "completion": 850 }
{
"details": "Editing files in OpenCode",\n "state": "OpenCode for Linux",\n "timestamps": { "start": 1726084000 },\n "assets": {
"large_image": "opencode_working",\n "large_text": "OpenCode (active)"
}
}Source code, prompts, tool outputs, file paths, and environment variables are discarded in memory before serialization.
Project name, model name, and elapsed timer can be masked or disabled globally in preferences.toml.
Direct IPC connection to the local Discord client socket. No telemetric relays, no analytics, no external servers.
Five native clients. One shared engine.
Every client runs the same local event pipeline, same sanitization rules, and same Discord IPC protocol. Choose the interface that fits your workflow.

curl -LO https://github.com/spoodyz/Lattice/releases/download/v0.1/Lattice-v0.1-macos-arm64.zipunzip Lattice-v0.1-macos-arm64.zipopen Lattice.app