latticev0.1Download

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.

v0.1MITmacOS · Windows · Linuxno account · no relay · no cloud

~/.local/share/lattice/inboxhooks · opencode

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.

01how it works

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.

  1. 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
  2. 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
  3. 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
02privacy boundary

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.

inboxRaw Agent Event
{
  "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"
}
local sanitizerLattice Filter
5 fields dropped
  • 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 }
discord-ipcDiscord Receives
{
  "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)"
  }
}
Never Transmitted

Source code, prompts, tool outputs, file paths, and environment variables are discarded in memory before serialization.

Optional Toggles

Project name, model name, and elapsed timer can be masked or disabled globally in preferences.toml.

Zero Cloud Relay

Direct IPC connection to the local Discord client socket. No telemetric relays, no analytics, no external servers.

03clients & install

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.

macOS menu bar appSwift, SwiftUI, AppKit · v0.1
Screenshot of macOS menu bar app
Why this exists

Lives in the menu bar. Companion sprite in the popover, hooks toggled per agent.

Requirements

macOS 14+, Apple Silicon

bashInstall macOS
curl -LO https://github.com/spoodyz/Lattice/releases/download/v0.1/Lattice-v0.1-macos-arm64.zip
unzip Lattice-v0.1-macos-arm64.zip
open Lattice.app
After launch:Click the menu bar icon, turn on sharing, pick your agents.