The Quint edge daemon is a Go binary that runs as a LaunchDaemon on macOS. It operates the HTTPS forward proxy, MCP stdio relay, MCP multi-server gateway, and unified session tracker. It receives OS-level events from the EndpointSecurity system extension over a Unix socket and merges them with proxy content data into a unified session model.
Distributed as a signed .pkg installer that sets up both the Go daemon and the QuintAgent.app (ES extension):
# Download and install the .pkgsudo installer -pkg quint-latest.pkg -target /# Or use the install script with a deploy tokencurl -fsSL https://install.quintai.dev | sh -s -- --token <deploy-token>
The installer registers:
LaunchDaemon at /Library/LaunchDaemons/dev.quintai.agent.plist
QuintAgent.app in /Applications/ (hosts the ES system extension)
Configuration at /etc/quint/config.yaml
The same config.yaml format is used in both development and production. The daemon reads it on startup — no separate dev/prod config mechanism.
The ES extension (Swift) detects AI agent processes via code signing and monitors 9 event types. Events arrive over a Unix socket with auth handshake. See ES Extension for full details.
MITM TLS interception via HTTP_PROXY / HTTPS_PROXY environment variables. Parses 7 LLM API formats to extract tool calls with arguments. See Forward Proxy for full details.
Runs every 5 seconds, scanning the process table for AI agents using 21 platform signatures. Uses ps etime to recover real start times. This fills the gap for agents that were already running when the daemon started (the ES extension only sees new process launches).
Full production mode: LaunchDaemon with ES extension, forward proxy, process scanner, cloud forwarder, and session lifecycle management.
# Started automatically by launchdsudo launchctl bootstrap system /Library/LaunchDaemons/dev.quintai.agent.plist# Or run manually for developmentsudo ./quint-proxy daemon
This is the default mode when installed via .pkg.
Lightweight mode: forward proxy only, with embedded local dashboard at http://localhost:8080. No ES extension, no cloud forwarder. Good for single-developer use.
quint watch
Set proxy environment variables in another terminal:
Each session has a stable ID: {rootPID}-{startUnixMs}. This survives PID reuse — if a PID is recycled, the millisecond timestamp differentiates the sessions.
Every 10 seconds, the tracker checks if each active session’s root PID is still alive (via kill(pid, 0)). Dead sessions transition to ended and a session_end event is sent to the cloud.
Every intercepted request, response, and tool call is persisted to a local SQLite audit database (~/.quint/quint.db, table audit_log). Each row is signed with Ed25519 and chained to the previous row via prev_hash — the audit log is tamper-evident even before it reaches the cloud.
At every MITM log site (request, response, tool call), the daemon calls SessionLookup(pid) — a callback wired to unisession.Tracker.SessionByPID. If the PID is tracked (i.e. belongs to a detected AI agent process or one of its children), we stamp the row with that session’s ID and PID. If not tracked, the fields are left null.This makes the audit log natively join-able by session without reconstructing attribution after the fact:
SELECT tool_name, arguments_json, response_json, timestampFROM audit_logWHERE session_id = '59247-1777085379101'ORDER BY id ASC;
Two simultaneous Claude Code terminals produce two distinct session_id values — no bleed between invocations.
The raw response_json for streaming LLM calls is a thick stack of wrappers: AWS eventstream binary framing → JSON with base64-encoded "bytes" → Anthropic SSE events → content block deltas. To let downstream consumers avoid re-implementing the decode stack, the daemon exposes:
GET /api/sessions/timeline?pid=N # or ?session_id=X
Returns a flat array of TimelineEvent objects — request, assistant_text, tool_call (with reconstructed JSON input), and response_raw fallback. This is what the local viewer uses to render a readable session drill-down.
audit_log outlives the in-memory unisession.Tracker (reaped ~10s after the root PID exits). The /api/es/sessions endpoint merges live tracker state with audit.DB.HistoricalSessions(limit) — distinct (session_id, process_pid) groupings seen in audit, ordered by MAX(timestamp) — so reaped sessions remain discoverable.
The daemon pushes events and sessions to api.quintai.dev via HTTPS:
Setting
Value
Buffer capacity
5,000 events
Batch size
500 events per push
Flush interval
1 second
Max retries
5 (exponential backoff, 1s → 5min)
Overflow
JSONL file on disk, recovered on next flush
Source: proxy/internal/cloud/forwarder.go.Session lifecycle events (session_start, session_resume, session_end) go through a separate ingest endpoint (/v1/sessions/ingest).Each QuintEvent enqueued for the cloud forwarder also carries session_id, so the cloud actions table can be joined to the cloud sessions table by the same key the local audit log uses.
Source code, credentials, and secrets never leave the machine. The cloud receives only structured metadata sufficient for fleet-wide visibility and compliance reporting.