TimeOff Planner
A PWA to book paid leave and RTT days and track balances month by month. It left Vercel and Supabase for my own server.
In productionPrivate source code
- Vue 3
- Vite
- Node.js
- SQLite
- OpenID Connect
- Playwright
- Docker
Context
An app to book paid leave and RTT days (the French working-time-reduction days), with two balances: the forecast, which counts every leave booked (drafts and requests included), and the confirmed balance, which only counts leave that was approved or imposed.
It’s designed mobile-first, where you check things, and completed on desktop, where you book your leave. You sign in with Google, registration is open, and everyone only sees their own data.
What I did
- A single Node service, no framework: it serves the PWA and a JSON API, with a SQLite database (one file) and five SQL migrations.
- Google sign-in (OpenID Connect with PKCE) and a session in an
HttpOnlycookie. - Strict account isolation: every query is filtered by account, so a row that belongs to someone else simply can’t be found. A dedicated test checks it.
- Deny by default: any new route is protected without me having to think about it.
- Tests: around 80 unit tests and about fifty end-to-end Playwright scenarios.
Leaving Supabase
Until October 2026, the app ran on Vercel with Supabase. I migrated it to my own server, keeping the accounts and data:
- read-only export of the data;
- SQLite database built separately, then compared against the reference;
- migration script designed to stop at the slightest discrepancy;
- accounts matched through their Google identifier;
- nightly database backup once live.
Supabase’s row-level security is replaced by the server’s account filter, covered by tests.
// For my 2026 projects, I work with AI agents (Claude Code): I frame the need, write the specification, then review and validate the code.