P-06 · BUILD / PROJECT · 2026 SHIPPED

EasyShifts

Multi-tenant shift scheduling and payroll, built for and used by a boutique fitness studio in Singapore.

STACK: TypeScriptWebAuthnAES-256-GCMPlaywrightHeadless Chromium

What it is

Shift scheduling and month-end payroll for small businesses that run on shifts, built for a real client (a boutique fitness studio in Singapore) and running in their production. Coaches submit availability, the system builds the roster, the owner reviews and publishes it, and at month end the pay is computed from what was actually published.

Having a client rather than a hypothesis changed the product. Half the features I assumed were essential were never asked for, and the one thing that mattered most was something no generic scheduler does.

The opinions in the engine

The scheduling engine holds opinions a generic scheduler doesn’t, learned from watching a real studio run rather than from a fairness metric in a textbook. Those opinions are business rules, so they live where the owner can read them and argue with them, not buried in a scoring function.

A draft week under review, backups where cover is thin

Details I’d point at

Publishing produces the roster as an image or PDF, ready for the group chat, because that’s where a studio actually reads its roster.

Sign-in is WebAuthn passkeys with magic links as the fallback. Bank and PayNow identifiers are encrypted at rest with AES-256-GCM. Tenant isolation is strict and audit logging is on throughout. This is payroll, and payroll disputes are settled by records.

The notification layer covers email, WhatsApp, Telegram and push, and the entire product demos end to end with no external accounts configured.

Payroll follows the same discipline as the roster: pay rules are configuration the owner controls, not code someone has to redeploy, and a run drafts itself from the periods that were actually published, so the pay and the schedule can never drift apart.

Month-end payroll, drafted from the periods that were actually published

Where it stands

Roughly 70,000 lines, about 1,300 automated tests plus Playwright end-to-end coverage, shipped to production in around two weeks of evenings. In live use.