<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cato Rendal</title>
    <description>The latest articles on DEV Community by Cato Rendal (@cato_rendal_ce185d1604cd5).</description>
    <link>https://dev.to/cato_rendal_ce185d1604cd5</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4174077%2Fe9af6555-ab89-4e6f-a72d-bcde2577112e.png</url>
      <title>DEV Community: Cato Rendal</title>
      <link>https://dev.to/cato_rendal_ce185d1604cd5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cato_rendal_ce185d1604cd5"/>
    <language>en</language>
    <item>
      <title>AI Monitor: an ESP32 touchscreen companion for Codex, Claude and more</title>
      <dc:creator>Cato Rendal</dc:creator>
      <pubDate>Sat, 10 Oct 2026 03:12:04 +0000</pubDate>
      <link>https://dev.to/cato_rendal_ce185d1604cd5/ai-monitor-an-esp32-touchscreen-companion-for-codex-claude-and-more-27oj</link>
      <guid>https://dev.to/cato_rendal_ce185d1604cd5/ai-monitor-an-esp32-touchscreen-companion-for-codex-claude-and-more-27oj</guid>
      <description>&lt;p&gt;AI Monitor puts supported AI account limits and locally recorded token activity on a small USB touchscreen. You can choose &lt;strong&gt;NOVA&lt;/strong&gt; or &lt;strong&gt;ORBIT&lt;/strong&gt;, two animated desk companions, and keep the usage dashboard visible while working on your main screen.&lt;/p&gt;

&lt;p&gt;The project is open source, built with &lt;strong&gt;LVGL 9.6 and Arduino/PlatformIO&lt;/strong&gt;, and now ships two separate firmware choices in the same repository and Windows package.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmcmoe0qv3677414kblox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmcmoe0qv3677414kblox.png" alt="NOVA and ORBIT, actual LVGL UI previews" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;These images are renders of the actual LVGL interface with synthetic data, rather than photographs of the boards.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch the two-minute overview
&lt;/h2&gt;

&lt;p&gt;Here is a short walkthrough of the project: NOVA and ORBIT, the LVGL screens, provider choices, quota windows, saved themes and the Windows host. It includes English narration, timed captions and chapters. The UI values are synthetic preview data, and the S3 port remains experimental.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/1JR9_E1lWDg" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=1JR9_E1lWDg" rel="noopener noreferrer"&gt;Watch on YouTube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup note:&lt;/strong&gt; if more than one matching USB board is connected, select the display’s explicit COM port instead of &lt;code&gt;auto&lt;/code&gt;, save settings, then start the host. The installed app keeps its own private configuration when moving from another folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update: v1.17.2 — tested from erased P4 flash
&lt;/h2&gt;

&lt;p&gt;A full uninstall-and-reinstall test found two real setup defects: the old P4 factory bootloader declared 4 MB rather than the board’s 16 MB, and Windows could select npm’s Unix Codex launcher. &lt;strong&gt;v1.17.2 fixes both. Do not use v1.17.0 for a new P4 installation.&lt;/strong&gt; Existing application-only updates did not expose that bootloader defect.&lt;/p&gt;

&lt;p&gt;The exact v1.17.2 CI installer was tested with an empty AI Monitor configuration and erased physical P4 flash. Board/providers/key/USB selection and First installation were completed through the GUI; the P4 booted without a manual repair and both Codex/ZCode quotas were received. 185 Python tests, both firmware builds, native LVGL checks and Windows install/upgrade/uninstall checks passed. Factory capacity and partition validation now run before packaging and flashing.&lt;/p&gt;

&lt;p&gt;Windows binaries remain unsigned, so SmartScreen may warn. Microsoft’s earlier-file submission is not approval of this different installer. S3 remains experimental and physically untested; advanced bridge requirements are unchanged.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/catorendal-a11y/ai-monitor-p4-s3/releases/tag/v1.17.2" rel="noopener noreferrer"&gt;Download the corrected v1.17.2 installer and portable package&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Previous update: v1.17.0 — guided AI setup and verified host health
&lt;/h2&gt;

&lt;p&gt;The new Windows &lt;strong&gt;AI setup&lt;/strong&gt; tab has provider checks, Codex install/sign-in and an optional Claude quota link that can be removed without replacing a custom statusline. OpenCode now reads supported local numeric usage automatically; Copilot, Cursor and Antigravity still require an advanced numeric bridge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Host settings&lt;/strong&gt; adds USB retry, local token polling, terminal text size and start/close preferences. Process status, verified USB identity and quota readiness are shown separately. The firmware Settings help reflects the provider changes.&lt;/p&gt;

&lt;p&gt;176 Python tests, both firmware builds, native LVGL checks and packaged Windows installation/upgrade/uninstall checks passed. I also used the exact release installer and application update on my physical P4, preserving settings and confirming live Codex/ZCode quota readiness. S3 remains experimental and physically untested.&lt;/p&gt;

&lt;p&gt;The installer is still unsigned. The exact file was submitted to Microsoft for review; the decision is pending and SmartScreen may still warn. No Windows protections are disabled.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/catorendal-a11y/ai-monitor-p4-s3/releases/tag/v1.17.2" rel="noopener noreferrer"&gt;Download v1.17.2: installer, portable ZIP and SHA-256 checksums&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Previous update: v1.16.1 — explain the quota, test the installation
&lt;/h2&gt;

&lt;p&gt;The display now explains usage through &lt;strong&gt;SET &amp;gt; AI USAGE&lt;/strong&gt;. Each option shows the remaining percentage and whether the data is reported, missing, stale, updating, offline or in error. The choice is saved per provider and applies to both NOVA and ORBIT.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Codex:&lt;/strong&gt; 5 HOURS is the short-term limit; 7 DAYS is the weekly limit. The page points users to ChatGPT sign-in in the PC app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZCode:&lt;/strong&gt; 5 HOURS / 7 DAYS are model quotas when reported; &lt;strong&gt;MONTHLY MCP&lt;/strong&gt; is a separate tool-call allowance. The page explains the user's own ZAI Coding Plan key. Monthly MCP is not a monthly token budget. The host now includes the monthly MCP row and stops labeling weekly model usage as monthly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code:&lt;/strong&gt; reported quotas need the optional statusline bridge. &lt;strong&gt;Gemini CLI:&lt;/strong&gt; recorded activity only. Other editors require a numeric bridge rather than automatic account import.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Favhy6xv7pbl3zg2vopjh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Favhy6xv7pbl3zg2vopjh.png" alt="Codex quota choices and sign-in instructions" width="800" height="480"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flaxr275l983pldyetlk2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flaxr275l983pldyetlk2.png" alt="ZCode model windows and monthly MCP allowance" width="800" height="480"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Actual LVGL UI renders with synthetic values, not photographs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A known missing window can be selected in advance, but its percentage stays unavailable until real data arrives. Live values update while Settings is open; option identities remain stable during touches. REFRESH explicitly reloads the available rows. Alerts still monitor every window, independent of the one chosen for the companion display.&lt;/p&gt;

&lt;h3&gt;
  
  
  One installer, guided provider setup
&lt;/h3&gt;

&lt;p&gt;Run &lt;strong&gt;AI-Monitor-Setup-v1.16.1-windows.exe&lt;/strong&gt; to install the full Qt app, runtime, flasher and both firmware choices for your Windows user. No separate Python/PlatformIO installation or administrator access is required. You still choose your own board/providers and supply your own account or key; neither an AI nor a board is preselected.&lt;/p&gt;

&lt;p&gt;The Windows app has NOVA artwork, instructions for all eight AI choices, a masked key field, and persistent firmware progress/error messages. First installation requires checking the USB target and typing FLASH; application updates verify the existing display identity. Double-clicking the command-line flasher explains its role and offers to open the graphical Firmware tab. &lt;strong&gt;Closing the app after Start host succeeds leaves the independent host running in the background.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The wider AI column retains 40-pixel percentages, 20-pixel provider names and 16-pixel status text. Notifications have a 136-pixel banner, 24-pixel heading, 20-pixel body and a 60-pixel dismiss target.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the delivered binaries
&lt;/h3&gt;

&lt;p&gt;Validation includes &lt;strong&gt;148 Python tests&lt;/strong&gt;, native LVGL/protocol tests for both profiles, NVS checks, both firmware builds and exact packaged GUI/flasher startup. Windows smoke tests cover a clean installation, upgrade and uninstall while preserving private settings. The P4 application update and stable boot were also verified on the physical board.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits remain explicit:&lt;/strong&gt; the original Waveshare S3 is experimental and untested on physical S3 hardware. The Windows apps remain unsigned, so SmartScreen may warn; installing them does not disable Windows protection. Tested setup is not a guarantee for every Windows policy or hardware combination.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/catorendal-a11y/ai-monitor-p4-s3/releases/tag/v1.16.1" rel="noopener noreferrer"&gt;Download v1.16.1: installer, portable ZIP and SHA-256 checksums&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the robot actually follows
&lt;/h2&gt;

&lt;p&gt;The robot reacts to &lt;strong&gt;increases in recorded token counters&lt;/strong&gt;. Quota polling is a separate signal: fetching an account limit does not make the robot look busy.&lt;/p&gt;

&lt;p&gt;The first counter sample establishes a baseline. Some clients write their usage only after a request finishes, so animation can lag generation. This is an activity display, not a billing ledger or a per-token stream.&lt;/p&gt;

&lt;p&gt;Local activity adapters cover &lt;strong&gt;Codex, ZCode, Claude Code, Gemini CLI and supported OpenCode SQLite schemas&lt;/strong&gt;. Codex uses the signed-in official CLI for supported account quota, ZCode can use an optional Z.AI coding-plan key, and Claude quota can use its documented statusline bridge. Gemini supplies recorded activity only. Other selectable providers require an external numeric telemetry bridge; selecting a name does not automatically connect its editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interface
&lt;/h2&gt;

&lt;p&gt;Besides the companion view, the screen has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A provider dashboard and individual quota windows.&lt;/li&gt;
&lt;li&gt;Reset countdowns, manual refresh and low/critical quota warnings.&lt;/li&gt;
&lt;li&gt;Session history and last-valid values during temporary provider failures.&lt;/li&gt;
&lt;li&gt;Two robots and four saved color themes: Forest, Ocean, Amethyst and Ember.&lt;/li&gt;
&lt;li&gt;Brightness presets, idle fades and a night schedule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9v4jnkvgbuhy43wa3v7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs9v4jnkvgbuhy43wa3v7.png" alt="ORBIT with the Ocean theme" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two boards, different display backends
&lt;/h2&gt;

&lt;p&gt;The original target is the &lt;strong&gt;GUITION JC4880P433 ESP32-P4&lt;/strong&gt;, with a ST7701S MIPI DSI display and GT911 touch. Its portrait panel is rotated into an 800 × 480 landscape UI, and brightness uses hardware PWM.&lt;/p&gt;

&lt;p&gt;Version &lt;strong&gt;v1.13.0&lt;/strong&gt; adds the &lt;strong&gt;original Waveshare ESP32-S3-Touch-LCD-4.3&lt;/strong&gt; as a separate, &lt;strong&gt;experimental&lt;/strong&gt; target. That board uses a native 800 × 480 ST7262 RGB panel, GT911 touch, a CH422G expander, 16 MB flash and 8 MB OPI PSRAM. The B/C variants are not supported.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The S3 firmware has not been tested on physical hardware.&lt;/strong&gt; It compiles and the shared native tests pass, but touch alignment, RGB stability, tearing and sustained operation still need a real board test.&lt;/p&gt;

&lt;p&gt;A useful hardware lesson from this port: similar-looking screens need different brightness handling. The original S3 board exposes an LED on/off switch, so intermediate brightness dims the rendered image with a touch-transparent overlay. Only zero switches the LEDs off. It does not reduce LED power like the P4's PWM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the UI shared
&lt;/h2&gt;

&lt;p&gt;Both boards share the dashboard, robot artwork, themes and protocol. Their drivers stay separate. LVGL and backlight changes belong to one UI task, while the host communicates through bounded AIM1/JSON frames.&lt;/p&gt;

&lt;p&gt;The S3 backend uses one PSRAM framebuffer, RGB bounce buffers and a partial LVGL draw buffer to fit its smaller memory budget. Its Arduino core and matching Espressif PSRAM XIP SDK are pinned separately from P4. A single RGB framebuffer can still show tearing; passing a build is not a substitute for observing the hardware.&lt;/p&gt;

&lt;p&gt;CI builds both targets, and the project has &lt;strong&gt;176 synthetic Python tests&lt;/strong&gt;, protocol checks for both board identities, NVS settings tests and tests of the actual LVGL screens under both profiles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/catorendal-a11y/ai-monitor-p4-s3" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; contains source, screenshots and setup instructions. The &lt;a href="https://github.com/catorendal-a11y/ai-monitor-p4-s3/releases/tag/v1.17.2" rel="noopener noreferrer"&gt;v1.17.2 Windows release&lt;/a&gt; includes the host runtime, firmware flasher and both firmware variants, so users do not need Python or PlatformIO installed.&lt;/p&gt;

&lt;p&gt;Extract the whole ZIP, open &lt;strong&gt;AI-Monitor.exe&lt;/strong&gt;, choose your exact board and AI providers in First-time setup, and install the matching firmware. Fresh installations have neither a board nor an AI provider preselected. S3 uses its &lt;strong&gt;USB TO UART&lt;/strong&gt; connector for flashing and everyday host data.&lt;/p&gt;

&lt;p&gt;The PC companion reads selected usage sources and sends display data over USB. Provider credentials stay on the PC; no maintainer keys are distributed. Project-owned code and robot artwork use MIT, while bundled components and provider marks retain their own terms. The USB protocol builds on &lt;a href="https://github.com/tobymarks/esp32-ai-monitor" rel="noopener noreferrer"&gt;tobymarks/esp32-ai-monitor&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'd welcome feedback on the interface and, especially, hardware testing from anyone with the original Waveshare S3 board. The board guide in the repository lists the remaining checks.&lt;/p&gt;

</description>
      <category>esp32</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>arduino</category>
    </item>
  </channel>
</rss>
