How I Built a Personal Ops Dashboard with Next.js, Supabase, and AI
A look inside the private Next.js dashboard I built to manage 13 live sites — site status monitoring, personal AI, offline-capable notes, multi-tenant architecture, and more.
Why I Built It#
When you're running multiple web projects simultaneously — each with its own domain, database, analytics, and user base — managing everything becomes its own part-time job. I was constantly switching between Vercel, Supabase, Google Analytics, email, and three different todo apps. Nothing was connected.
So I built a private ops dashboard at wonsukchoi.co — a single Next.js app that centralizes everything I need to manage my projects. This post covers what's in it, the technical decisions behind it, and what I learned.
What's Inside#
The dashboard is organized into five tab groups. Here's what each one does.
System: Site Status Monitor#
The most immediately useful feature monitors all 13 of my live sites on a 30-second polling interval, checking two things per site:
HTTP reachability — a HEAD request to each domain with a 5-second timeout. Any response is "up"; a timeout or network error is "down."
Supabase DB health — a HEAD request to each project's PostgREST endpoint (https://<ref>.supabase.co/rest/v1/). Since multiple sites share the same Supabase instance, I deduplicate by project ref — 13 sites resolve to just 5 unique DB checks. Any HTTP response, even a 401, confirms the DB is reachable.
The widget also tracks domain expiry dates with color-coded urgency: green beyond 60 days, yellow at 30–60, orange at 14–30, red under 14. Dates are editable inline and persisted to localStorage.
Tools: Personal AI#
A private chat interface connected to OpenRouter — Claude Sonnet 4.5, Claude Opus 4.5, GPT-4o, GPT-4o Mini, and Gemini 2.0 Flash. Model switching is live mid-conversation. Responses stream token-by-token using the Vercel AI SDK.
Having model selection in-context is genuinely useful: draft quickly with a fast model, switch to Opus for anything that needs deeper reasoning.
Content: Journal and Notes#
Journal is an AI-assisted daily writing space. Notes is a persistent reference system — nested category hierarchy, optional per-note password protection, bulk move/delete, image uploads to Supabase Storage, and an offline sync queue so writes aren't lost when the network drops.