MyScheduler
A shift-scheduling app that works both for a single worker with a spreadsheet and for a manager running a whole team.
- Role
- Solo developer
- Stack
- React · Vite · TypeScript

MyScheduler started from a simple observation: most shift workers are handed their rota as a spreadsheet, and most scheduling tools ask them to abandon that spreadsheet entirely. So the app has two modes that share one interface.
In solo mode, a worker uploads their xlsx and immediately gets a readable week and month view. Nothing leaves the browser — the schedule is parsed client-side and stored in IndexedDB via Dexie, so there is no account to create and no data to trust anyone with. In team mode, a manager plans shifts for the whole team, publishes drafts once they are ready, and handles shift-change requests coming back from employees. That side is backed by Supabase and PostgreSQL.
The hard part is that no two employers format their rota the same way. Rather than maintaining a growing pile of per-employer parsers, the app uses Gemini to map an arbitrary spreadsheet layout onto its internal schedule model, so an unfamiliar file shape still imports correctly.
Engineering notes
AI as a parser, not a feature
Gemini handles the xlsx-to-schedule mapping, which turns an open-ended parsing problem into a bounded one. It runs at import time only, so the rest of the app stays fast and fully deterministic.
Two storage backends, one UI
Solo mode runs entirely on IndexedDB with no account, while team mode uses Supabase. Keeping both behind the same interface meant the privacy-first path never became a stripped-down second-class version.
Row Level Security as the authorization layer
Team data is scoped with Postgres RLS policies rather than checks in application code, so an employee cannot read another team member schedule even if a client-side guard is bypassed.