feat: initial port of claude-code-usage-monitor as a floating bubble

Windows-only floating, draggable circular bubble showing Claude Code
and Codex usage. Derivative of CodeZeno/Claude-Code-Usage-Monitor (MIT),
relicensed under Apache 2.0 with upstream attribution in NOTICE.

- Ported verbatim: poller, updater, tray_icon, theme, localization,
  diagnose, models (~2,700 LOC)
- Original: bubble (circular layered window, drag-anywhere via
  WM_NCHITTEST+HTCAPTION, snap-to-edge, Ctrl+Wheel resize, auto-hide
  on fullscreen), panel (expanded 5h/7d view), app (orchestrator,
  single-instance mutex, polling thread, context menu, dual-bubble
  lifecycle), settings (settings.json persistence)
- Cargo.toml features cover Win32 GDI, HiDpi, Registry, Threading,
  Shell, WindowsAndMessaging, and KeyboardAndMouse
This commit is contained in:
tiennm99 committed 2026-05-15 21:27:31 +07:00
commit c0f3e3f860
42 files changed
+7046

No files matched your search

+8
View File
@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none">
<rect x="0.5" y="0.5" width="15" height="15" rx="1" stroke="#D97757" stroke-width="1"></rect>
<rect x="2" y="2" width="5" height="5" rx="1" fill="#D97757"></rect>
<rect x="9" y="2" width="5" height="5" rx="1" fill="#F3D6CC"></rect>
<rect x="2" y="9" width="5" height="5" rx="1" fill="#D97757"></rect>
<rect x="9" y="9" width="5" height="5" rx="1" fill="#F3D6CC"></rect>
<path d="M 10 2 L 11 2 L 11 7 L 10 7 C 9.448 7 9 6.552 9 6 L 9 3 C 9 2.448 9.448 2 10 2 Z" fill="#D97757"></path>
</svg>

After

Width:  |  Height:  |  Size: 575 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

+25
View File
@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="none">
<rect x="4" y="36" width="248" height="184" rx="16" stroke="#D97757" stroke-width="8"></rect>
<rect x="15" y="72" width="19" height="48" rx="4" fill="#D97757"></rect>
<rect x="38" y="72" width="19" height="48" rx="4" fill="#D97757"></rect>
<rect x="61" y="72" width="19" height="48" rx="4" fill="#D97757"></rect>
<rect x="84" y="72" width="19" height="48" rx="4" fill="#D97757"></rect>
<rect x="107" y="72" width="19" height="48" rx="4" fill="#D97757"></rect>
<rect x="130" y="72" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="153" y="72" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="176" y="72" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="199" y="72" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="222" y="72" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="15" y="136" width="19" height="48" rx="4" fill="#D97757"></rect>
<rect x="38" y="136" width="19" height="48" rx="4" fill="#D97757"></rect>
<rect x="61" y="136" width="19" height="48" rx="4" fill="#D97757"></rect>
<rect x="84" y="136" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="107" y="136" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="130" y="136" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="153" y="136" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="176" y="136" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="199" y="136" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<rect x="222" y="136" width="19" height="48" rx="4" fill="#F3D6CC"></rect>
<path d="M 134 72 L 143 72 L 143 120 L 134 120 C 131.791 120 130 118.209 130 116 L 130 76 C 130 73.791 131.791 72 134 72 Z" fill="#D97757"></path>
<path d="M 88 136 L 89 136 L 89 184 L 88 184 C 85.791 184 84 182.209 84 180 L 84 140 C 84 137.791 85.791 136 88 136 Z" fill="#D97757"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

+10
View File
@@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
<rect x="1" y="1" width="30" height="30" rx="4" stroke="#D97757" stroke-width="2"></rect>
<rect x="3" y="4" width="8" height="11" rx="2" fill="#D97757"></rect>
<rect x="12" y="4" width="8" height="11" rx="2" fill="#D97757"></rect>
<rect x="21" y="4" width="8" height="11" rx="2" fill="#F3D6CC"></rect>
<path d="M 23 4 L 25 4 L 25 15 L 23 15 C 21.895 15 21 14.18 21 13.167 L 21 5.833 C 21 4.82 21.895 4 23 4 Z" fill="#D97757"></path>
<rect x="3" y="17" width="8" height="11" rx="2" fill="#D97757"></rect>
<rect x="12" y="17" width="8" height="11" rx="2" fill="#D97757"></rect>
<rect x="21" y="17" width="8" height="11" rx="2" fill="#F3D6CC"></rect>
</svg>

After

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 284 B

+14
View File
@@ -0,0 +1,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none">
<rect x="2" y="2" width="44" height="44" rx="6" stroke="#D97757" stroke-width="4"></rect>
<rect x="7" y="10" width="6" height="12" rx="2" fill="#D97757"></rect>
<rect x="14" y="10" width="6" height="12" rx="2" fill="#D97757"></rect>
<rect x="21" y="10" width="6" height="12" rx="2" fill="#D97757"></rect>
<rect x="28" y="10" width="6" height="12" rx="2" fill="#F3D6CC"></rect>
<path d="M 30 10 L 31 10 L 31 22 L 30 22 C 28.895 22 28 21.105 28 20 L 28 12 C 28 10.895 28.895 10 30 10 Z" fill="#D97757"></path>
<rect x="35" y="10" width="6" height="12" rx="2" fill="#F3D6CC"></rect>
<rect x="7" y="26" width="6" height="12" rx="2" fill="#D97757"></rect>
<rect x="14" y="26" width="6" height="12" rx="2" fill="#D97757"></rect>
<rect x="21" y="26" width="6" height="12" rx="2" fill="#F3D6CC"></rect>
<rect x="28" y="26" width="6" height="12" rx="2" fill="#F3D6CC"></rect>
<rect x="35" y="26" width="6" height="12" rx="2" fill="#F3D6CC"></rect>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB