diff --git a/README.md b/README.md
index 2280a91..e364fd0 100644
--- a/README.md
+++ b/README.md
@@ -96,53 +96,93 @@ A browser PWA, an HTTP API service, LiveKit agent workers, and a
memory/action layer. The screen signal flows through LiveKit, never a manual
screenshot upload.
+### Infrastructure: LiveKit · Hermes · MongoDB · DigitalOcean
+
+How the real-time, action, memory, and hosting layers wire together. Everything
+under the droplet boundary is one systemd-supervised DigitalOcean box; LiveKit
+and Mongo Atlas are managed clouds it talks to.
+
```mermaid
flowchart LR
- subgraph Laptop["Engineer laptop"]
- PWA["React PWA"]
- Screen["Screen share track"]
- Git["Git watcher
scripts/podman-agent.mjs"]
- end
+ Dev["Engineer browser
React PWA + screen share"]
- subgraph Realtime["LiveKit room"]
- Room["Pod room"]
- Data["Data topic
podman.intervention"]
- Audio["Audio tracks
Gemini TTS + Lyria"]
- end
-
- subgraph Backend["PodMan backend"]
- API["API service
/api/token /api/pods /api/outcome"]
+ subgraph DO["DigitalOcean droplet — systemd-supervised"]
+ Caddy["Caddy
serves static frontend · proxies /api"]
+ API["API service
/api/token · /api/pods · /api/outcome"]
Agent["Vision agent worker
@livekit/rtc-node"]
- Convo["Live conversation agent
Gemini Live API (Python)"]
- Vision["Gemini Vision
structured JSON"]
- Detector["Coordination detector
collisions, blockers"]
+ Detector["Coordination detector
collisions + blockers"]
+ Hermes["Hermes action layer
cards · messages · urgent voice"]
+ PyAgent["Live conversation agent
LiveKit Agents (Python)"]
end
- subgraph Memory["Memory and actions"]
- Mongo["MongoDB Atlas
observations, outcomes, vectors"]
- GitHub["GitHub
repo state + sync PR artifact"]
- Hermes["Hermes action layer
cards, messages, urgent voice"]
+ subgraph LK["LiveKit room — managed cloud"]
+ Tracks["Screen-share video tracks"]
+ DataCh["Data topic
podman.intervention"]
+ AudioCh["Audio tracks
TTS + Lyria music"]
end
- PWA -->|"POST /api/token"| API
- API -->|"LiveKit JWT"| PWA
- PWA --> Screen
- Screen --> Room
- Room --> Agent
- Agent --> Vision
- Vision --> Detector
- Git --> Mongo
- Detector --> Mongo
- Detector --> GitHub
- Detector --> Hermes
- Hermes --> Data
- Hermes --> Audio
- Convo --> Audio
- Convo --> Mongo
- Data --> PWA
- Audio --> PWA
- PWA -->|"POST /api/outcome"| API
- API --> Mongo
+ Mongo[("MongoDB Atlas
observations · collisions
interventions · outcomes · vectors")]
+
+ Dev -->|static assets| Caddy
+ Dev -->|"POST /api/*"| Caddy --> API
+ API -->|LiveKit JWT| Dev
+ Dev -->|publish screen| Tracks
+
+ Agent -->|subscribe frames| Tracks
+ Agent --> Detector --> Hermes
+ Hermes -->|cards / messages| DataCh
+ Hermes -->|urgent voice| AudioCh
+ PyAgent <-->|join room · speak| AudioCh
+ DataCh --> Dev
+ AudioCh --> Dev
+ Dev -->|"POST /api/outcome"| Caddy
+
+ API <--> Mongo
+ Agent -->|write observations| Mongo
+ Detector -->|read recall · write collisions| Mongo
+ Hermes -->|write interventions| Mongo
+ PyAgent -->|tool reads| Mongo
+```
+
+> Mongo connectivity is **required at boot** — the API and both agents ping Atlas
+> on startup and exit loudly rather than degrade silently.
+
+### Gemini: roles, models, and triggers
+
+Five distinct Gemini surfaces, each fired by a specific event in the pod and
+mapped to the file that calls it.
+
+```mermaid
+flowchart LR
+ subgraph Triggers["Trigger (event in the pod)"]
+ Frame["Sampled IDE frame
from LiveKit screen track"]
+ NewEvent["New observation
or collision"]
+ Talk["Engineer speaks
in the room"]
+ Urgent["Hermes raises an
urgent intervention"]
+ Session["Pod session
active"]
+ end
+
+ subgraph G["Gemini surface · model · code"]
+ Vision["Vision
gemini-2.0-flash
backend/src/vision/gemini.ts"]
+ Embed["Embeddings
gemini-embedding-001
backend/src/memory/vectors.ts"]
+ Live["Live voice agent
gemini-3.1-flash-live-preview
agents/podman-live-conversation/agent.py"]
+ TTS["Urgent TTS
gemini-3.1-flash-tts-preview
backend/src/voice/live.ts"]
+ Lyria["Background music
lyria-3-clip-preview
backend/src/voice/music.ts"]
+ end
+
+ subgraph Out["Output"]
+ Ctx["Structured work context
{file, symbol, activity, mode, research}"]
+ Recall["$vectorSearch recall
prior intervention + outcome"]
+ Answer["Spoken answer over
repo / git / memory tools"]
+ Voice["Spoken alert
in the room"]
+ Score["Per-pod ambient
score"]
+ end
+
+ Frame --> Vision --> Ctx
+ NewEvent --> Embed --> Recall
+ Talk --> Live --> Answer
+ Urgent --> TTS --> Voice
+ Session --> Lyria --> Score
```