Self-Hosted Media Platform
A private media archive and player with no CMS, no database, and no rented media stack.
I built this because I wanted a media system I could understand end to end. The filesystem decides what exists. JSON describes it. Caddy, PHP, and vanilla JavaScript do the rest. The result is a private media server that can browse, filter, and stream a mixed library of films, shows, and audio without a database, subscription, or heavyweight framework.
System shape
- Filesystem media library
- Ingest script
- Structured JSON catalogs
- PHP-rendered pages
- Client-side filtering and browsing
- Custom media player
- Caddy session auth and protected streaming
What I built
- An ingest script that compares the files on disk to structured JSON catalogs, pulls OMDb metadata, and keeps JSON writes in one place
- Two browsing modes: metadata cards for films and shows, plus a recursive tree browser for collections that do not fit that model
- A custom player that handles audio and video through one interface, including HTTP range requests for video seeking
- Session auth at the Caddy layer, covering pages, JSON indexes, poster images, and raw media files
- Client-side filtering that loads sources once, keeps state in the DOM, and avoids re-fetching on every filter change
Infrastructure
- Linux, Caddy, PHP-FPM, Cloudflare
What this demonstrates
- JSON-backed UI rendering without a database dependency
- Client-side filtering, browsing, and state management over structured content
- Custom playback controls across audio and video
- Protected asset delivery across pages, indexes, images, and raw media
- Frontend implementation shaped by real infrastructure constraints