Personal Project
Radio Calico
April 2026 – Present
A production-ready, full-stack HLS radio player that streams a live lossless (16-bit / 44.1 kHz) audio broadcast with real-time now-playing metadata, animated album art, an elapsed-time visualizer, and a per-user like/dislike rating system persisted in PostgreSQL. Built with a multi-stage Docker setup, nginx reverse proxy, and a comprehensive security-focused CI/CD pipeline.
Key Features
-
Live HLS streaming: lossless 16-bit / 44.1 kHz audio
via
HLS.js, lazy-loaded on first interaction for near-instant initial page load. - Real-time metadata: track title, artist, album, year, and category tags update in sync with each track change from a CloudFront endpoint.
- Like / dislike ratings: per-user votes persisted in PostgreSQL by IP address; toggle support with live count display.
- Animated visualizer: CSS-driven audio visualizer and elapsed time display synchronized with playback state.
-
Multi-stage Docker build: separate
deps-prod,deps-all,dev,prod, andnginximages; Express port internal-only in production. - Full Jest test suite: 99 tests across 4 files covering API routes (pg-mem in-memory Postgres), frontend DOM behavior (jsdom + fake timers), metadata fetching, and audio player events.
-
4-stage security CI:
npm audit+ Trivy (Docker CVE scan) + Semgrep (SAST) + Gitleaks (secrets detection), all running in parallel with the Jest job on every push and PR. -
Page-speed optimizations: self-hosted WOFF2 fonts,
.webpimage fallbacks, timestamp cache-busting on album art fetches.
Architecture
-
Traffic flow (prod): browser → nginx:80 →
static files (
public/) or/api/*proxied to Express on internal port 3000. Express is never exposed to the host in production. -
Makefile workflow:
make prod,make dev(nodemon + bind-mounts),make test,make scan; Docker Desktop starts automatically if not running.