Activity dots show whether Codex is working without estimating activity from rate-limit changes. The widget receives lifecycle signals from official local Codex hooks and keeps the state in memory.
- One quiet dot while Codex is idle and a three-dot wave while work is active
- Start and completion events for parallel Codex sessions
- One active turn per session, so one completed session cannot hide another active session
- A completion animation after the final active turn finishes
The widget accepts only the lifecycle event type and the session and turn identifiers provided by Codex. It does not collect prompts, responses, transcript contents, transcript paths, or model output.
- Open Settings from the desktop widget, taskbar-label menu, or tray menu, then find Codex activity under Features.
- Select Install hooks.
- Review the exact proposed
~/.codex/hooks.jsoncontent and confirm the change. - Select Copy /hooks and open Codex.
- Paste
/hooksinto Codex and trust the newUserPromptSubmit,Stop, andSessionEnddefinitions. - Return to Settings and select Check again.
Codex owns hook trust. New or changed definitions require approval in Codex. The widget only reads the reported trust state.
To remove the handlers, return to Codex activity under Features in Settings and select Remove hooks. The widget preserves unrelated hooks and unknown configuration fields.
The same review-before-write flow is available from PowerShell in the directory containing the widget executable:
.\CodexUsageWidget.exe --install-activity-hooksTo remove the recognized Codex Usage Widget handlers:
.\CodexUsageWidget.exe --uninstall-activity-hooksThe setup code recognizes only the exact command formats generated by current and earlier portable versions of Codex Usage Widget. Similarly named handlers from other applications are left unchanged.
- Hook signals stay on the current Windows account through a current-user-only named pipe.
- A small PowerShell bridge sends the signal without starting the WPF widget for each event.
- Activity state is never persisted, so the widget does not build a work history.
- The widget does not read Codex authentication data.
- No hook data is sent to telemetry, analytics, or a remote backend.
Hook installation is always explicit. Normal widget startup does not create or modify hook configuration.
Activity state starts empty when the widget starts. A task that began before the widget or hooks were ready cannot be reconstructed.
Each session owns at most one active turn. A later UserPromptSubmit replaces an orphaned
turn in that session, and a late Stop for the old turn cannot clear the new one. Duplicate
events are harmless. SessionEnd removes only the matching session.
If Codex terminates without sending a final lifecycle event, a later turn in the same session replaces the stale turn. Restarting the widget also clears all in-memory activity state. The widget does not use an arbitrary timeout because legitimate Codex tasks can run for a long time.
If the widget is closed, the hook bridge exits successfully after a short connection attempt and Codex continues normally.