web app ยท native Android app ยท home-screen widget ยท zero fake numbers on-device
โ the actual widget, on an actual home screen, showing actual numbers
A 12-tile glanceable HUD for your machine's (or phone's) vital signs โ CPU, RAM, disk, network, battery โ rendered like a mission-control panel, not a spreadsheet.
Ships two ways:
| ๐ web | ๐ฑ android |
|---|---|
| TanStack Start SPA, deploy anywhere | Capacitor-wrapped native app |
| animated, always-on dashboard | real home-screen widget, resizable |
| great for a second monitor / kiosk | reads actual hardware via native Kotlin |
๐ผ๏ธ click for the full in-app view
The web/in-app HUD โ 12 cards, sparklines, a scanline overlay because we have taste. Same real numbers as the widget, same process, no drift between the two.
We don't fake numbers we can't actually read. Android has locked down or never exposed some of these to apps โ here's exactly what's real vs. what's structurally impossible without root:
show me ๐
| metric | on native Android | why |
|---|---|---|
| ๐ battery %, voltage, temp, charge | โ real, live | BatteryManager โ fully public API |
| ๐ง RAM used / total | โ real, live | ActivityManager.MemoryInfo |
| ๐พ storage used / total | โ real, live | StatFs |
| ๐ถ network throughput | โ real, live | TrafficStats, sampled per tick |
| โฑ๏ธ uptime | โ real, live | SystemClock.elapsedRealtime() |
| ๐งฎ CPU cores / clock | โ real, best-effort | /sys/.../cpufreq, blocked on some OEMs |
| ๐งฎ CPU usage % | โ flat 0 |
blocked for apps since Android 8, no root |
| ๐ฎ GPU usage % | โ flat 0 |
no public API at all, ever |
| ๐ฉบ battery health % | โ flat 100 |
Android only exposes a coarse GOOD/OVERHEAT/DEAD enum |
On web/dev mode, all of the above are simulated with a random walk purely for the demo animation โ clearly a fallback, never shipped as "real" on a real device.
bun install # ๐ฆ deps
bun run dev # ๐ web dev server๐ฑ building the Android app + widget
bun run build:capacitor # static client-only bundle โ capacitor-www/
bunx cap sync android # copy web assets into the native shell
cd android
./gradlew assembleDebug # ๐ค APK at app/build/outputs/apk/debug/Then long-press your home screen โ Widgets โ System HUD. Drag to resize โ it swaps between a compact 2ร2 and the full 12-card grid depending on how much room you give it.
flowchart LR
A[๐จ React + TanStack Start] -->|bun run build:capacitor| B[๐ฆ static bundle]
B -->|Capacitor| C[๐ฑ Android shell]
C --> D[๐งฉ SystemStatsPlugin]
E[๐ฉ Kotlin: BatteryManager ยท StatFs ยท TrafficStats] --> D
E --> F[๐ Home-screen widget]
D -->|same real data| A
- Web: React 19 + TanStack Start/Router + Tailwind v4,
JetBrains Monodoing all the heavy lifting on vibes. - Native bridge: a tiny Capacitor plugin exposes the exact same reading the widget uses, so the in-app screen and the widget never disagree.
- Widget: classic
RemoteViews(not Glance) โWorkManagerfor a 15-min battery-friendly floor, plus a ~30sAlarmManagertick since every read here is a cheap local syscall, not a network call.
- real battery / RAM / disk / network / uptime on-device
- resizable native widget matching the web UI pixel-for-pixel
- adaptive app icon
- rooted-device path for real system-wide CPU%
- iOS widget (WidgetKit) โ same honesty rules apply
- a "why is my GPU tile always 0" FAQ nobody will read
built with ๐ค and an unreasonable amount of respect for real data by @pi0trdotsys
// sigma.forecast() > the dashboard waits for no one_