The training tracker gets a real backend
The training tracker started as a browser-only PWA. Data lived in IndexedDB -- local, fast, and completely stuck on whatever device you logged it from. Useful enough, but the moment I wanted to log a session on my phone and check progress on my laptop, it fell apart.
Today we fixed that. And then some.
The UI got a proper expansion first
The app now covers six workout types instead of three: StrongLifts 5x5, rowing, kettlebell, barbell, dumbbell, and a dedicated body section for weight and measurements. The kettlebell list went from five exercises to fifteen. Row and kettlebell sessions got inline edit and delete. Body weight moved off the home page and into its own section with separate progress charts for weight, waist, hips, thighs, and upper arms. The bottom nav grew to eight items and became horizontally scrollable instead of cramped.
Then the backend
I had a Hostinger VPS I'd never really used. It came with n8n pre-installed via Docker and Traefik as the reverse proxy. That turned out to be a perfect foundation -- adding a new service meant adding a new block to docker-compose.yml with the right Traefik labels. SSL and routing came for free.
The backend is PocketBase -- a single open-source binary that runs as a Docker container and exposes a clean REST API with an admin dashboard out of the box. I set up the domain aetheriumforge.cloud to point to the VPS, created a subdomain for PocketBase, ran a Python script to create all eight collections and open their access rules, then rewrote the entire frontend data layer to talk to the API instead of IndexedDB.
One small debugging moment: PocketBase returned 400 errors on any request that sorted by created. Turned out the version I was running didn't support sorting by that system field directly. Switching the sort to session_date -- a field I control -- fixed it immediately.
The result
Log a session on your phone at the gym, open the laptop at home, the data is there. First time I've deployed a self-hosted backend from scratch and had it actually work in one session.
The domain will become home base for everything I build on the VPS. n8n is already there. Next up is an MCP server wrapper on top of PocketBase so Claude can query training history directly -- ask for a progress summary, spot patterns, get coaching without leaving the conversation.