Personal app
PRIME SALT
Personal project
A personal game for real-life goals: goals become bosses (main, mini, raid), tasks deal damage and earn XP, ranks run E to SS, 7 stats across 5 pillars (Income, Health, Education, Life, Deen), and 4 screens (Tasks, Profile, Vault, Puzzle Board). Runs locally, installs like an app and works offline.

A life, fought for.
- automated tests in 8 files
- 79
- screens
- 4
- boss types
- 3
- stats
- 7
- pillars
- 5
The brief
Turn real-life goals into a game I actually want to play every day.
What I built
- Goals as bosses (main, mini, raid) that tasks damage
- XP and ranks from E to SS
- 7 stats across 5 pillars
- Installs like an app and works offline (service worker)
Three hard problems
Problem Finishing one task can do many things at once: damage a boss, defeat it, cascade into its main boss, and pay XP and levels. Half an update would break the game.
How I solved it The combat maths is pure: it returns a plan without touching the database, and one database transaction applies the whole plan. A cascade can never loop, because a main boss never cascades.
Problem Bosses expire and the weekly fight is judged by date, but nothing runs in the background to check.
How I solved it Expiry and the weekly result are worked out lazily, every time the data is read, so the game is always right when you look, with no scheduler at all.
Problem Uploading trophies and media is a classic way into a server.
How I solved it Every upload goes through one shared check: the extension and the file’s own magic bytes must agree, and the file is saved under a safe generated name.
What I learned
It taught me to make every change all or nothing, and to treat every upload as a possible attack.
The stack
- Node.js
- Express 5
- SQLite (better-sqlite3)
- multer
- GSAP
- Plain HTML, CSS and JS
- Service worker
- Web Audio
Proof

