Case study 18 / 18 · Tools
AI OPS
My project: Redesigned and rebuilt from a forked quota display
Status: In daily use on a wall screen; 15 desktop releases, v0.3.0 to v0.12.1
A retro, pixel-art operations dashboard for developers who run AI tools and their own servers. One always-on screen shows AI subscription quotas, API spend, local models, servers, containers, deploys, CI and DNS, as a web app and a self-updating desktop app for macOS and Linux.
Case study
AI OPS is my retro, pixel-art operations dashboard for AI tools and self-hosted infrastructure. It runs as a local web app and as a self-updating Electron desktop app for macOS and Linux. It began as a fork of a small Codex and Claude quota display; I kept that core and redesigned and rebuilt everything around it.
The problem
A developer who uses AI tools and runs their own servers ends up watching a dozen dashboards: subscription limits that reset on their own schedules, API spend, local models, servers and containers, deploys, CI and DNS. AI OPS answers “is everything OK, and how much AI do I have left?” on one screen that is pleasant to look at all day.
What was built
- A wall-screen dashboard with 42 contrast-checked themes, 41 bundled fonts plus the Nerd Fonts catalog, movable S–XL widgets, night dimming, a burn-in guard and kiosk mode.
- Monitoring for multi-account Codex and Claude quotas, ten AI API providers, five local-model servers and agent token stats, alongside five VPS providers, health checks, Vercel, GitHub and Cloudflare.
- A single-file, dependency-free, read-only VPS agent that reports disks, memory, processes, pending updates and every Compose stack, container, PM2 app and systemd service.
- Alerts to Telegram, Discord, ntfy, signed webhooks and native notifications, with quiet hours and recovery messages.
- Settings where every connection has a Test button and secrets are write-only.
- An Electron app that updates itself in place from GitHub Releases, verifying the version and signature before swapping bundles, with rollback.
- Bit’s Arcade: a platformer with 6 worlds and 18 stages, and Bug Defense, a typing game covering about 2,300 developer commands and terms, tied to XP and 22 achievements.
Key decisions
- The server uses only node: built-ins, because the desktop build does not bundle node_modules with the collector; a packaging test enforces it.
- One collector runs from source, as a systemd service or inside the desktop app, and the app attaches to one already running instead of starting a second.
- The original split between a read-only board and a local admin listener stayed in place, and every new connection had to fit it.
- Display preferences are stored per screen, so one server can drive a wall display, a laptop and a phone differently.
- Nerd Fonts are fetched one face at a time with HTTP byte ranges and verified before caching.
Outcomes
- 15 desktop releases for macOS (Apple Silicon, Intel and universal) and Linux, v0.3.0 to v0.12.1.
- 158 unit tests and 21 browser tests.
Where it stands
In daily use on an always-on wall screen. The repository is private, and the Mac build is ad-hoc signed rather than notarized.
How it was built
Frontend
- React 19 — The dashboard, Settings and Bit’s Arcade
- Vite
- TypeScript
- Progressive web app — Installable board, plus an ES5 legacy view for old screens
Backend
- Node.js 24 — The collector, run as TypeScript with node: built-ins only and no framework
Data
- SQLite — Usage, history and game progress
AI
- Codex and Claude subscriptions — Multi-account quotas, reset countdowns and run-out forecasts
- Ollama, LM Studio, vLLM, LocalAI and llama.cpp — Local-model health
Integrations
- Hostinger, DigitalOcean, Hetzner, Linode and Vultr — VPS metrics, with several accounts per provider
- Vercel — Deployments and live domain checks
- GitHub — CI, pull requests and releases
- Cloudflare — Zones, DNS, SSL, Workers and Pages
- Telegram, Discord, ntfy and signed webhooks — Alerts
Infrastructure
- Electron — macOS and Linux desktop app with in-place updates from GitHub Releases
- Docker and systemd — Run the read-only VPS agent
Testing
- node:test — 158 unit tests
- Playwright — 21 browser tests