The Light System
Three states. No ambiguity. Each session is a single light whose color tells the truth.
Philosophy
The name Irrlicht comes from the folklore of the Harz, the ancient mountain range in central Germany. An Irrlicht is a will-o'-the-wisp — a ghostly light that drifts over the moors and bogs near the Brocken, luring wanderers off the safe path and into the marsh. Harzer miners reported phantom lights in the tunnels near Clausthal-Zellerfeld — sometimes a warning, sometimes a promise of ore ahead.
The most famous Irrlicht appears in Goethe's Faust. On Walpurgis Night, an Irrlicht guides Faust and Mephistopheles up the Brocken, lighting their way through the Traum- und Zaubersphäre — the realm of dream and sorcery. A treacherous companion on a treacherous path.
This Irrlicht flips the myth. Instead of a deceptive light that leads you astray, it is the tamed will-o'-the-wisp — small, honest lights that appear exactly where your attention should go. You run four Claude sessions across three projects. Without Irrlicht, you tab between terminals, guess which agent is stuck, and interrupt work that was humming along fine. With Irrlicht, a glance at the menu bar tells you everything: which sessions are thinking, which need you, and which are done.
The Three States
Irrlicht's state model is MECE — mutually exclusive, collectively exhaustive. Every session is in exactly one state at any given moment. There is no fourth state, no "unknown", no "cancelled". Three states, three colors, three meanings.
working
The agent is actively processing. This includes text generation, tool calls, shell commands, hooks, compaction, and API retries. The session is busy and does not need your attention.
- Text is being streamed to the terminal
- A tool call is executing (file writes, grep, bash)
- The context window is being compacted
- An API request is in flight or being retried
waiting
A user-blocking tool is open — the agent has stopped and needs your judgment before it can continue. The story pauses until you respond.
Only two tools trigger the waiting state:
AskUserQuestion— the agent is asking you a clarifying questionExitPlanMode— the agent wants to leave plan mode and start executing
ready
The agent is idle at the prompt, waiting for your next instruction. The turn is complete — either the agent finished its work, the process exited, or a task was cancelled. The session is available for new work.
- The agent completed its response and is showing the prompt
- The agent process exited (gracefully or otherwise)
- You cancelled a running task with ESC — the agent is back at the prompt
- The session has been idle beyond the grace period
Decision Tree
The state machine evaluates each transcript update with a simple three-step decision:
-
Is there an open user-blocking tool?
If the last tool result is pending and the tool isAskUserQuestionorExitPlanMode, the state is waiting. -
Is the agent actively processing?
If there are recent transcript events indicating generation, tool execution, or API activity, the state is working. -
Otherwise
The state is ready. The agent is idle and the session is available.
Context Pressure
Context pressure is orthogonal to the three states. It measures how full the agent's context window is and overlays a second dimension onto whatever state the session is in. A session can be working at any pressure level.
| Level | Utilization | Color | Meaning |
|---|---|---|---|
safe |
0 – 70% | green | Plenty of room. No action needed. |
caution |
70 – 85% | yellow | Context is filling up. Be aware. |
warning |
85% – 155K tokens | red | Running low. Consider wrapping up or starting a new session. |
critical |
155K+ tokens | crimson | Auto-compaction imminent. Finish the current task. |
Irrlicht sends macOS notifications at two thresholds:
- 80% utilization — a heads-up that context is getting heavy
- 95% utilization — urgent warning before auto-compaction kicks in
critical pressure can still be working, waiting, or ready. The two dimensions are independent.
Cost Estimation
Irrlicht estimates per-session cost by combining model pricing with the token breakdown from each transcript. Input tokens, output tokens, and cache reads are tracked separately and priced according to the model being used (e.g., Opus, Sonnet, Haiku).
- Per-session cost — computed from the cumulative token counts and the model's pricing tiers, displayed in the session detail view
- Per-project aggregation — all sessions belonging to the same project are summed in the UI, giving you a running total for the project's spend
Costs are estimates based on published API pricing. Actual billing may differ due to caching, batching, or pricing changes.
Menu Bar Rendering
Sessions appear in the macOS menu bar as a row of colored dots. Each dot is one session, its color reflecting the current state. Projects are grouped together so related sessions sit side by side.
| Sessions | Display |
|---|---|
| 0 | A single white sparkle — clean slate, no active sessions |
| 1 – 5 | One colored dot per session, grouped by project |
| 6 | All six dots shown, menu bar getting full |
| 7+ | First 5 dots shown, then an ellipsis indicating overflow |
The menu bar is designed to be glanceable. You should never need to open the dropdown to answer the question "does anything need me right now?" — if you see an orange dot, the answer is yes.