Features & Technology Stack

Everything My Music offers, split by who can use it.

Feature Overview

Published — for listeners
  • Track library with search by title, artist, or album
  • Audio player with play, pause, seek, and volume controls
  • Next / previous track navigation
  • Shuffle button to randomize track order and sort by title, artist, album, genre, duration, created, updated, or rating
  • Smooth background art cross-fade on track change
  • Responsive layout — works on mobile and desktop
  • Audio and cover art served via worker proxy route — works on any domain
  • Live track data from Cloudflare R2 — updates on page load
  • Static site export for fast, lightweight deployment
  • Multi-theme color schemes with live switcher
  • Star ratings on each track — click to rate, averages persisted in D1
  • New/updated track badges — tracks added or modified since your last visit get NEW or UPDATED labels. No badges shown on first visit.
  • Development issue log with tabs, search, severity badges, and commit-level resolutions
  • URL updates when playing a track — shareable links with auto-play
Admin — for developers
  • Local track drafts with add, edit, and delete — no server writes until publish
  • Search and sort tracks by title, artist, album, genre, duration, created, or updated
  • iTunes metadata (title, artist, album, genre) and cover art lookup directly from browser (CORS)
  • One-click publish uploads all tracks + files to R2 in a single request
  • Published diff shows added, updated, and removed tracks
  • File upload validation (type, size, extension) on publish
  • Cloudflare Access Zero Trust authentication for admin and admin-only API routes (/api/publish, /api/me)
  • Authenticated user identity via Cf-Access-Authenticated-User-Email header
  • /api/me endpoint returning authenticated user info
  • Safe git operations with argument array (no shell injection)
  • npm run audit — dependency vulnerability checker
  • Security lint rules via eslint-plugin-security
  • Worker-side R2 proxy for audio and cover art serving
  • R2 bucket binding for server-side data operations
  • Cloudflare R2 external storage for audio and cover art
  • Reset ratings per track via checkboxes and bulk delete API
  • On-demand browser-based e2e tests via Puppeteer — 17 tests covering page load, search, sort, shuffle, audio player, ratings, and track link validation

Technology Stack

LayerTechnologyPurpose
FrameworkNext.js 16App Router, worker deployment
UI LibraryReact 19Client components, hooks, context
LanguageTypeScriptType safety across the entire stack
StylingTailwind CSS v4Utility-first styling with @theme
TestingVitest + RTLUnit tests with React Testing Library
LintingESLinteslint-config-next, core-web-vitals, security plugin
DataJSON fileAdmin writes to R2 on publish. Published site reads from R2
Audio detectionHTMLAudioElement APIClient-side duration from metadata
External APIiTunes Search APIMetadata and cover art lookup
ThemingCSS custom properties7 color schemes with runtime switching
AI toolingopencodeConversational development workflow
Object storageCloudflare R2Audio/cover storage with bucket binding and worker-side proxy
AuthenticationCloudflare AccessEdge JWT validation + user identity headers for admin and API routes

Architecture

Public Site — Data Flow

Public site architecture diagram

Admin & API — Internal Flow

Admin and API architecture diagram