Hub
Private app, login onlyPersonal Laravel app for our household: a watchlist with ratings, a 2000+ title book catalogue, a finance planner, a puzzle collection and a family tree with its own API.
- 2000+books in the catalogue
- 5sections, from films to family tree
- 200+automated tests
- ~2 sfrom deploy to live
Hub is the app our household runs on. It started as a plain PHP site and I rebuilt it from scratch in Laravel 13, with Blade, Alpine.js and Tailwind and no heavy frontend framework, so every page loads fast.
It holds what we track at home: films and series we want to see or have rated, a book collection, our monthly budget, a puzzle collection and a family tree. Every section has its own role, so another household member only sees what is theirs.
- Watchlist and ranking that fetch posters, genres and running times from OMDb, with genre filters and a running-time slider
- A book catalogue built for 2000+ titles: the whole list loads once and only the visible rows are drawn, with an A–Z rail, live search and status tabs
- A finance planner with income, fixed costs per category, budget pots, savings goals and an expected balance for the month
- A family tree imported from GEDCOM, with a pan-and-zoom pedigree view, a timeline and a list of missing data
- A JSON API for an AI research assistant, secured with a per-user token that changes every day
- Runs in Docker behind a reverse proxy; code changes go live with a single deploy script
How it works
A rebuild that kept the data
The first Hub was plain PHP. Hub 2 is a new Laravel app, and an import service moved everything from the old database across. It has a dry-run mode, so I could check the full import before it wrote a single row.
A GEDCOM parser of its own
The family tree comes from a GEDCOM file, the standard export of genealogy software. Hub parses it itself, works out the families and how people are related, and builds the pan-and-zoom pedigree from that.
Deploys in seconds
The container only holds the runtime (PHP 8.5 and Apache); the code is mounted from a shared folder. A deploy script syncs the code, so a template or CSS change is live in about two seconds. Migrations and caches run when the container starts.
Backups from the app
An admin page makes a full database backup with mysqldump and can restore one, so a backup never depends on logging in to the server.
Mitchel van Emmerik