AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
Windows 트레이에서 모든 Claude Code 세션을 표시: 작동 중·대기 중·완료 여부를 확인하고 창 전환 없이 프롬프트에 답변합니다
Every Claude Code session in the Windows tray: see which one works, waits or is done, and answer its prompts without switching windows.
개발 도구C# · PowerShellGitHub @BelalovBM온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Tray traffic light for Claude Code on Windows: which session works, waits or is done; answer prompts from a panel or the phone
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A tray traffic light for Claude Code on Windows. One small .exe, no installer.
Beta (0.9). Everything described here works and was tested, but not yet on many different computers (display scaling, screen readers, several monitors). Changes are listed in CHANGELOG.md; problems and ideas are welcome in Issues (the report of --selfcheck, see below, helps a lot with anything about the look).README 전문 보기 ↗A tray traffic light for Claude Code on Windows. One small .exe, no installer.
Beta (0.9). Everything described here works and was tested, but not yet on many different computers (display scaling, screen readers, several monitors). Changes are listed in CHANGELOG.md; problems and ideas are welcome in Issues (the report of --selfcheck, see below, helps a lot with anything about the look).
| Colour | Meaning |
|---|---|
| 🟡 yellow | Claude Code is working |
| 🟡 yellow with clock hands | Claude only waits for a background task it started (a build, tests) and goes on by itself when it ends |
| 🔵 blue | Claude Code is compacting the conversation (can take a few minutes); you get a pop-up when it starts and when it ends |
| 🔴 red | Claude Code is waiting for you (for example a permission prompt), or an API error stopped it (a usage limit, overloaded servers, a lost sign-in) |
| 🟢 green | the task is finished, ready for the next one |
| ⚪ grey | no active sessions |
It works with Claude Code in the console and in the VS Code extension, and shows every running session at once. The icon shows the most urgent state. The menu also shows Claude's usage limits (5 hours and the week), the tokens used and what they would cost at API prices, and how full each session's context is.
ClaudeCodeTrafficLight.exe from the releases page and run it. No administrator rights are needed.~/.claude/settings.json (the original is backed up once as settings.json.trafficlight.bak).Claude Code started inside WSL is not supported yet: it keeps its settings in the Linux home folder, out of reach of the hooks. If the program finds such an installation in a running WSL distribution, the Claude Code page of the settings says so.
Windows SmartScreen may warn about an unsigned file: choose More info → Run anyway. The source code is here, and the build is a single script.
/compact of your own, keeps details an automatic compaction may lose. The compaction point of each model is learnt from Claude Code's own automatic compactions (not from the summaries it prepares in the background, which start earlier), so the percentage appears after the first one.A request shows up in a panel near the tray; the state changes come as ordinary Windows notifications. Each kind can be switched off on the Notifications page.
On a smartwatch or fitness band: the pushes are ordinary notifications of the ntfy app, so a watch or band paired with the phone shows them once ntfy is allowed in its notification settings (in the watch's companion app on the phone). A fitness band shows the text; a smartwatch that shows the buttons of a notification lets you answer a question or a permission prompt from your wrist, as below.
The topic name works like a password: anyone who knows it can read and send messages to it. A long random one is generated for you; keep it private. By default a push contains only the project folder name; the chat title and Claude's message text are sent only if you enable "Include Claude's message text". You can use your own ntfy server.
In Settings → Phone → ntfy server choose My own ntfy server and enter its address, for example https://ntfy.example.org. For a server with access control enter a user name and password, or an access token (it starts with tk_; leave the user empty). The secrets are stored encrypted, and they stay remembered when you switch back to the public ntfy.sh (which never receives them). The phone listens on one server only, so after a switch subscribe to the topic again in the ntfy app.
A minimal Docker setup with access control:
docker run -d --name ntfy -p 8080:80 -v ntfy-data:/var/cache/ntfy \
-e NTFY_BASE_URL=http://localhost:8080 -e NTFY_CACHE_FILE=/var/cache/ntfy/cache.db \
-e NTFY_AUTH_FILE=/var/cache/ntfy/user.db -e NTFY_AUTH_DEFAULT_ACCESS=deny-all \
binwiederhier/ntfy serve
docker exec -it ntfy ntfy user add alice
docker exec ntfy ntfy access alice "ccl-*" read-write
docker exec ntfy ntfy access alice "ccr-*" read-write
docker exec ntfy ntfy access everyone "ccr-*" write-only
Topics created by this app start with ccl- (notifications) and ccr- (answers to permission prompts). The last rule lets the Allow/Deny buttons on the phone post an answer without signing in; only your own account can read those topics. Use https for a server that is reachable from the internet.
This was tested against the official ntfy image with a normal user, an access token and exactly these access rules (password and token modes, sending, and answering).
When Claude Code asks permission to run a command or change a file, you can answer without going back to its window, in two ways. Both are off by default and are switched on in Settings → Permission prompts:
A question with answer options (a single question, one choice) works the same way: the options become the buttons or menu items (the phone shows at most three), and the chosen answer goes back to Claude Code. Questions of other shapes stay on the screen.
Think before enabling it:
PermissionRequest hook to Claude Code's settings only while it is switched on.How it was checked: the whole cycle (request, push with buttons, tap, decision, wrong and replayed tokens, timeout, answer on the computer first) was tested against a local ntfy-compatible server. How the action buttons behave on your phone depends on the ntfy app, so use Send test request first.
Claude Code's own Remote Control lets you continue a session from claude.ai or the Claude app: you see the whole conversation and can type into it. This program does something smaller:
The two do not get in each other's way: use the traffic light to know when to look, and Remote Control when you need the whole session.
The menu shows how much of Claude's 5-hour and weekly limits is used, as /usage does. Claude Code gives these figures to no hook, and its status line, which gets them, does not run in VS Code. So the app takes them from where Claude Code itself keeps them: whenever you run /usage (or reach a limit), Claude Code saves the exact figures in ~/.claude.json.
Between two /usage runs the app estimates what was used since from the session transcripts on this computer and adds it to the last exact figure; such a figure is marked with ≈. How much a token counts is learnt from your own /usage figures, separately for each model, newer figures counting more, so the estimate follows a change of model by itself. Nothing about the size of the limits is built in: each plan (Pro, Max) is learnt from its own figures. After a change of plan, the figures of the old one no longer count, and nothing is estimated until the next /usage. A new model with no figures yet counts like its family (a new Opus like the previous Opus) until it has figures of its own. Every new /usage puts the figures right again; the more often you run it, the closer the estimate. Use of Claude on other devices (claude.ai, the phone, another computer) is not in the transcripts here, so it shows up only at the next /usage. So far the estimate has stayed within one or two percentage points of the next /usage; Anthropic shows whole percentages, so about one point is the closest it can be.
Refine the limits by itself (off by default) runs that /usage for you whenever the estimate may be more than 1% off (one percentage point of the whole limit: ≈60% shown, 59–61% in fact): after a rise of 10 percentage points since the last exact figure (2 from 90% on, where every one matters), when a model without figures of its own is used, or when the exact figure is an hour old (a quarter of an hour from 90% on), and only while a session works. The threshold follows how well the estimate did: at each exact figure the app sees how far its estimate was off, and if it starts to miss (a model, an effort or a size of context its weights were not learnt on), the threshold comes down so that the expected error stays within 1%, down to 2 percentage points; as the estimate gets right again, it goes back to 10. Whatever the reason, a brake keeps it rare: never sooner than 5 minutes after the last run, twice as long after each failure up to an hour, and a restart of the program does not reset it; a last limit of 300 runs a day, above what the brake lets through, stops it only if the brake itself fails, with a notice. The app starts Claude Code's own command hidden, claude -p "/usage" --no-session-persistence with hooks off: it asks no model, so it uses no limit, and it is not saved as a session. Claude Code asks Anthropic with its own sign-in; the app only starts the command. It finds Claude Code by itself (its installer's folder, the PATH, the VS Code extension); one elsewhere can be chosen on the same page. Claude Code has to reach Anthropic by itself here: a proxy set only in a .bat file or in VS Code's settings does not apply, so put it into the env block of ~/.claude/settings.json. If three runs in a row fail, one notice says why. For a sign-in without a subscription (an API key, for example) there are no such limits, and the app shows none.
The app itself never contacts Anthropic and never reads or uses your Claude sign-in: Anthropic does not allow other programs to use it. The exact figures it has seen are kept in usage-limits.json next to the program. The Notifications page switches each part on or off.
Below the limits the menu also shows, under its own title with the date of the prices ("Use at API prices (prices of 10/29/2026)"), how many tokens Claude Code used today and in the last 30 days, and what that would cost at Anthropic's API prices: Today ≈ $4.29 · 10M tokens and 30 days ≈ $1,098 · 3.3B tokens. On a subscription it shows what the same work would cost by the token; with a sign-in by API key, which has no such limits, the block stands alone and comes close to the bill. Every kind of token counts at its own price: input, writing to the prompt cache (for 5 minutes or for an hour), reading from it, and the reply, thinking included; web searches and fast mode too. Most of the tokens are usually reads of the cache: Claude Code sends the whole context with every step. Like the limits, it counts only what the transcripts on this computer show. Settings → Claude Code → Use at API prices switches it off and holds the prices.
The prices. Those of the current models are built in, taken from Anthropic's price list when the version was made. The same card lists the models of your transcripts with their input, output and cache-read prices in dollars per million tokens, and where each price came from: the program, LiteLLM (with the date) or you. Update prices from LiteLLM loads the open price file of LiteLLM, a community project on GitHub (not Anthropic), and takes the prices of its Claude models; Update the prices from LiteLLM once a day (off by default) does it by itself, so they stay current without anyone looking after them. The card says when they were last loaded, and the menu and the statistics say how current the prices are ("prices of 29.10.2026": the day of the last load, or the day the built-in ones were checked). LiteLLM goes first: a price you type stays only for a model LiteLLM does not have. The file is not taken on trust: a price missing from it keeps the one known, and one more than five times off the known one is left out. Default prices drops what was typed or loaded. They can be checked against Anthropic's price list. A model with no price counts in the tokens only, and a line names it.
Statistics… in the tray menu (and a link on both cards of the limits and of the prices) opens a window with the use of today (as it opens), of 7 or of 30 days:
/compact, /clear); and the number of compactions.Tokens are exact: they are the counters of Anthropic's servers that Claude Code writes into its transcripts. Dollars are tokens × prices. The share of the limit is an estimate (≈), by the same weights as the limits. Not in the transcripts, so not in the statistics: other computers and claude.ai, the summaries Claude Code makes when it compacts, and its small service requests.
Claude Code runs a hook on every event. The hook is this same .exe started with --hook; it reads the event and passes it to the running tray app through a local named pipe. If the tray app is not running, the hook exits silently and never disturbs Claude Code. Nothing leaves your computer except the optional ntfy push. No telemetry.
As a fallback, the app also reads the small per-process files Claude Code keeps in ~/.claude/sessions (session id, folder, busy/idle). This lets it find sessions that were already running when it started, and notice that a task was interrupted (which fires no hook). That file format is not a documented interface and may change between Claude Code versions; if it does, only this fallback stops working, the hooks are unaffected.
HKCU\Software\Classes\AppUserModelId), deletes its settings, log, requests journal and the saved figures of the limits and contexts (they sit next to the .exe) and exits. The original settings.json.trafficlight.bak backup is kept..exe (its folder opens automatically).To only disconnect from Claude Code and keep the program, use Disconnect on the same page.
The program collects nothing and sends nothing about you or how you use it: no telemetry, and no update checks unless you switch them on (General → Look for new versions: once a day, one anonymous request to GitHub for the latest release; About → Check for new versions does it once). Otherwise it uses the network only when you ask for the prices of the models (below) or set up the phone: then it sends notifications to the ntfy server you chose (ntfy.sh or your own) and listens there for your answers. What the notifications contain (the name of a session, the text of a request) is described on the Phone and Permission prompts pages. If Refine the limits by itself is on, it starts Claude Code's own /usage every few minutes while a session works (Claude Code then asks Anthropic, as when you type it). For the prices of the models it makes one anonymous request to GitHub for LiteLLM's price file when you press Update prices from LiteLLM, and once a day if you switch that on in Settings → Claude Code. For the usage limits and the context of each session it reads, on this computer only, the session transcripts and the figures Claude Code keeps in ~/.claude.json; nothing of it is sent anywhere, except the line with the percentages at the end of a push when that is switched on. Everything else stays on the computer: the settings, the log, the requests journal and the figures of the limits and contexts sit next to the program and are removed by Remove everything.
The release files are not code-signed, so Windows SmartScreen may warn on the first start (More info → Run anyway). What makes them checkable instead:
.github/workflows/build.yml), and the build is deterministic: building the same commit gives a byte-identical file.SHA256SUMS.txt in each release lists the checksum of the exe. Compare it with Get-FileHash ClaudeCodeTrafficLight.exe in PowerShell.The program sends nothing anywhere unless you set up the phone notifications; see Privacy.
ClaudeCodeTrafficLight.exe --selfcheck shows the program with made-up sessions, takes a picture of every window (settings pages in both themes, the tray menu, the request panel, a notification, the statistics) and writes report.txt with the Windows version, the scale of each monitor and the theme, all into a selfcheck-<date> folder next to the program. It needs no Claude Code and changes nothing on the computer. It takes about 40 seconds; leave the mouse and keyboard alone meanwhile. Pictures of the menu and the notification are taken from the screen, so a bit of the desktop around them may be in them.
Requires the .NET SDK only for building (the result runs on the .NET Framework 4.8 that ships with Windows):
powershell -File build.ps1 # -> bin\ClaudeCodeTrafficLight.exe
powershell -File tools\make-icon.ps1 # regenerates src\app.ico
To add a language, copy lang\en.txt to lang\<code>.txt and translate it. A lang folder next to the .exe overrides the built-in texts.
Copyright © 2026 BelalovBM. Licensed under the GNU General Public License v3.0.
If you like the program and want to support the development of similar projects, you can donate. See DONATE.md.
TRON network (TRX, TRC-20 tokens such as USDT): TUKeo9zL3YwwmBdh2pr2HfetANm32UtD4x
/usage