DevPulse: DevLog #3 – Ship Day
Today was the day DevPulse went live. After two devlogs of architecture and backend work, this session was about closing the loop — wiring the frontend, surviving some brutal debugging, and actually deploying to production.
The Dashboard Comes Alive
The frontend was the last big piece. I built the full dashboard in vanilla JS and HTML — stat cards with live counters, a real-time activity feed, language bars, share/embed section, and settings. No framework, just clean DOM manipulation talking directly to the C++ backend over WebSockets.
The design follows the same philosophy as the backend: minimal dependencies, maximum control.
The Bug That Broke Everything
This is the one I’ll remember.
I opened dashboard.js in my editor, made some changes, and the app broke completely. The dashboard was permanently stuck on “Loading…” — nothing rendered, no errors I could find at first.
After digging into the network tab I found the real culprit: the file was 0 bytes. My editor had crashed mid-save and truncated the entire file to nothing. Docker had then faithfully copied the empty file into the container, so loadMe was never defined — hence the ReferenceError: Can't find variable: loadMe in the console.
On top of that, the first time I logged in via GitHub OAuth, the JS files were being fetched by GitHub’s servers (140.82.121.5), not my browser — which meant the browser never got them at all. The inline bootstrap script fired before the files loaded and called a function that didn’t exist yet.
The fix was twofold: restore the file, and move the bootstrap IIFE into dashboard.js itself so it only runs once the file is actually parsed.
Landing Page Redesign
The original landing page was functional but generic. I rebuilt it from scratch:
- Grid background with an indigo glow orb
- Space Mono for all numbers and code elements, DM Sans for body copy
- Bento grid feature layout
- Terminal mockup showing the webhook flow in real time
- Live demo profile preview with animated commit ticker
- Scroll reveal animations on every section
The goal was for it to feel like a real product, not a side project.
Demo Account
Since reviewers can’t sign in with their own GitHub to see the dashboard, I hardcoded a demo account (hackclub-demo) that seeds itself on every server startup via seedDemoAccount() in main.cpp. It has realistic stats, language breakdown, and activity feed entries — all inserted directly via SQLite at boot. No CLI, no manual steps, survives every deploy.
Deployment
Deployed to Fly.io with a persistent SQLite volume. The whole stack — C++ binary, static files, SQLite DB — runs in a single 512MB container. Cold starts are fast because there’s no runtime to boot, just an executable.
Fly config gotcha: I had both [http_service] and [[services]] defined, which caused duplicate port binding. Removed the [[services]] block and the health check was pointed at /health which didn’t exist — changed it to /.
What’s Live
- devpulse.fly.dev
- devpulse.fly.dev/u/hackclub-demo
- Embeddable SVG badge:

Log in to leave a comment