Skip to content
~/lucas

← Back to projects

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 HttpOnly cookie.
  • 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.