Release notes

BUGFIX

Windows system tray no longer blanks out or duplicates, and panel cards sync flawlessly

The Windows panels and system tray (the icon menu tucked in the corner of your taskbar) now look much cleaner. When you drag a quota card to change its order and then reload a theme, the system now rereads the shared saved order first, so your Claude, Codex, and Antigravity cards will line up exactly the same way across all draggable panels. Previously, the tray would prematurely position its hidden window before it finished rendering, dragging an empty white or dark rectangle onto your screen at launch; furthermore, if you accidentally launched the tray twice, the second instance would fight the first over the shared WebView2 (the component that renders web content within desktop apps) user-data directory, fail to initialize, and linger as a bare white rectangle. Now, the window is positioned right before it becomes visible, and after a visible panel switch the placement is re-applied as before; moreover, the tray holds a named mutex (a lock mechanism ensuring only one copy runs at a time) during its lifetime, so a second launch simply shows a localized "already running" notice and exits. It's like a storefront where employees used to roll up the shutters before dressing the mannequins, or two managers trying to open a shop at the same address; now they perfectly arrange the display before opening the doors, and the second manager politely leaves upon seeing the "Open" sign.

BUGFIX

Safer quota sync prevents quota data drops on Windows and startup crashes on macOS

Your quota data will no longer vanish when you run multiple Claude Code windows at the same time, and a related fix resolves a disastrous startup crash for macOS users. Previously on Windows, if two instances refreshed the status line simultaneously, the file lock (a mechanism preventing simultaneous file edits) operated in a non-blocking manner (immediately giving up if the lock wasn't available). The resulting OSError was silently swallowed, leaving the read-modify-write cycle for rate_limits (quota data) completely unsynchronized, causing data drops. Windows now polls (repeatedly checks) for the lock until acquired, with a 10-second deadline; if the file system genuinely doesn't support locking, it safely falls back to an atomic write (saving the entire change in one uninterruptible motion). In a test of 200 concurrent runs, data loss plummeted from 21 incidents to zero. Furthermore, the initial fix for this Windows lock issue introduced an errno.EDEADLOCK constant that simply doesn't exist on macOS, causing every macOS user's app to crash instantly upon loading. It now falls back to the supported errno.EDEADLK when the former is undefined. It's like multiple accountants trying to write in the same ledger: previously on Windows they'd just grab at the book, fail to get a pen, and lose track of the records, while on macOS the accountants saw the new queuing rules, got confused, and walked off the job entirely; now they patiently wait in line for the pen, and know how to adapt when the rulebook uses unfamiliar terms.

Original changelog

Original changelogWindows system tray no longer blanks out or duplicates, and panel cards sync flawlessly
**Windows panel card order now follows across themes**: reloading a theme after dragging a quota card now rereads the shared saved order before state injection, so every draggable panel opens with the same Claude, Codex, and Antigravity card order.
**The tray panel no longer appears as an empty white/dark rectangle at launch**: pywebview's `resize()` and `move()` call `SetWindowPos` with `SWP_SHOWWINDOW`, and the tray placed its still-hidden window as soon as the panel document loaded — dragging the unrendered panel onto the screen on every start. The window is now placed right before it is shown; after a visible panel switch the placement is re-applied as before.
**Launching the Windows tray twice no longer leaves a blank white window**: a second instance fought the first over the shared WebView2 user-data directory, so its panel failed to initialize and lingered on screen as a bare white rectangle. The tray now holds a named mutex for its lifetime; a second launch shows an "already running" notice (localized) and exits instead.
Original changelogSafer quota sync prevents quota data drops on Windows and startup crashes on macOS
**The status line no longer drops quota data when two Claude Code instances refresh at once on Windows**: the hook's file lock was blocking on POSIX (`fcntl.flock(LOCK_EX)`) but non-blocking on Windows (`msvcrt.locking(LK_NBLCK)`), and a contended lock raised `OSError` that was swallowed — leaving the `rate_limits` carry-forward read-modify-write in `save()` completely unsynchronized. Windows now polls the lock until it is acquired (10s deadline), matching POSIX semantics; genuinely unsupported locking still falls back to the atomic write alone. Measured over 200 concurrent hook pairs: `rate_limits` were lost 21 times before, 0 times after.
**The Claude Code hook no longer crashes on macOS**: a constant introduced by the Windows lock fix above referenced `errno.EDEADLOCK`, which doesn't exist on macOS — importing `usage_statusline.py` failed immediately for every macOS user. Now falls back to `errno.EDEADLK` when `EDEADLOCK` isn't defined.