An old phone hangs on a USB cable next to my monitors and shows four things at once: CPU and GPU temperature and load, memory and VRAM in use, the remaining limit on whichever coding agent I am working with, and the progress of a ComfyUI generation.
Why a phone instead of a window on the monitor
During video generation or a long batch I need those numbers continuously, not on demand. Switching windows to check them costs time, and a permanently open window would take up part of a monitor — I have two and both have work in progress on them.
I used an old Xiaomi 11T Pro for it: AMOLED, 2400 × 1080, otherwise unused.
What is on the display
- CPU and GPU temperature and load on two large gauges, always with a written state as well — Normal, Elevated, High, Critical. Never colour alone, everyone reads that differently.
- Memory and VRAM including free space and a mark showing where the peak reached.
- Remaining limits of vibe coding agents — a big number, a draining bar and the reset time.
- ComfyUI generation progress, which appears only while something is actually being generated.
What it is made of
Sensors are read by LibreHardwareMonitor, which has to run as administrator — without elevated rights it will not release the temperature sensors. The rest is five parts:
LibreHardwareMonitor → reads sensors, HTTP on port 8085
server.ps1 → port 8099: page, /api, /state, /limits
adb reverse tcp:8099 → the phone sees the PC as its own localhost
PROMPTLAB app → renders the dashboard full screen
watchdog.ps1 → watches all of the above and wakes the display
None of it goes onto the network. The server listens on localhost only and the phone reaches it over the USB cable thanks to adb reverse. That is also why there is no login — anyone who reaches your computer's localhost has access anyway. Just never expose that port outside.
Two decisions it rests on
The dashboard is a single HTML page and runs inside the app on the phone, not on the computer. The app contains a single WebView that displays the page full screen. The computer sends it once and after that only supplies numbers. That is how it survives the PC going to sleep: when data stops arriving, the page switches itself to a "System asleep" screen and waits. If the computer were rendering it, the display would be left with a frozen image of the last state.
A dedicated app instead of a browser. Chrome will not go full screen without a user gesture, and you cannot trigger that gesture over adb. A page in a browser also cannot turn the display on. The app does both and needs only the INTERNET and WAKE_LOCK permissions — it is one WebView and two Java files.
Reading vibe coding agent limits
This is the part I use most. Everyone works with a different agent, so it can read the two most widespread ones. Claude Code sends JSON to the status line which includes rate_limits with the five_hour and seven_day windows. All you have to do is save them to a file from your own status line — it refreshes with every response of any running session.
When that file is older than five minutes and you are at the computer, the script requests a fallback once every five minutes via claude -p /usage. Codex is queried differently, over JSON-RPC through codex app-server. Neither consumes tokens.
Without these tools the bottom row stays empty and the rest of the dashboard keeps working.
AMOLED and burn-in
A static image on an AMOLED risks burn-in, so dimming happens in three stages:
180 s idle → idle mode, content at 42 % and slowly drifting
300 s idle → the page goes black and releases the display lock
mouse movement → the watchdog turns the display back on within 10 s
Under the black nothing is drawn at all and CSS animations stop as well — a hidden element would otherwise keep waking the phone's GPU. This reduces the risk, it does not eliminate it. Leave the phone its own short screen-off timeout as well, and turn off "stay awake while charging" in the settings.
What you need
Windows 10 or 11 with PowerShell, which is part of the system. LibreHardwareMonitor, installed with winget install LibreHardwareMonitor.LibreHardwareMonitor. A phone with Android 7 or newer, USB debugging enabled and adb from platform-tools.
You can build the APK yourself with the build.ps1 script, which runs aapt2, javac, d8 and apksigner — no Gradle. Or open the dashboard in the phone's browser first: it will not be full screen and will not light the display by itself, but you will see what it looks like.
How to try it
The whole thing is one HTML page with no libraries, a few PowerShell scripts and an APK of a few tens of kilobytes. The code is on GitHub under the name promptlab-telemetry-dashboard, under the MIT licence.
Check first that LibreHardwareMonitor gives you data: install it, run it as administrator, enable port 8085 under Options → Remote Web Server and open http://localhost:8085/data.json. Once you see your own temperatures there, all that remains is getting those numbers to the phone.