Case study
Tandem
Childcare scheduling for families working shift work
A mobile web app that helps parents in the skilled trades coordinate childcare around changing shifts. This covers my full-stack ownership across the 16-week build: privacy-aware guest auth, typed real-time architecture, and the data models behind shared scheduling.
- Role
- Lead Full-Stack Developer
- Timeline
- Sep – Dec 2025 (16 weeks)
- Team
- 3 developers, 5 designers
6–7 → 3–4
Steps in the core scheduling path
16 weeks
Concept to deployed product
8
People on the team
The problem
Tandem was built for parents in the skilled trades, who deal with early starts, overtime, and shift changes that land with little notice. Competitive analysis showed scheduling tools and childcare platforms exist separately, but nothing supported shared childcare coordination between families in one place.
Persona research confirmed the recurring pain points in shift-based households: sudden schedule changes, fragmented communication, and very little time to evaluate childcare options when plans break.
- Users needed to plan childcare fast, around work schedules that move.
- No single tool combined scheduling, childcare, and shared responsibility.


What I owned
I owned guest access, the real-time collaboration layer, and the profile-linked sharing data models behind multi-user coordination.
Guest auth needed a full lifecycle (create, consume, clear) with cookies tuned for cross-origin iframe embedding: HttpOnly, Secure, SameSite=None. The Socket.IO layer uses centralized typed event contracts and room-scoped handlers rather than global broadcast, paired with persist-first messaging: save over HTTP before the WebSocket fanout, so a refresh or a dropped packet never costs state.
- Cross-origin guest auth with hardened cookies and a complete session lifecycle.
- Typed Socket.IO contracts enforced across every handler and hook.
- Room-scoped channels, not global broadcast; persist-first messaging for durability.



The outcome
Consolidating scheduling and sharing into one flow cut the common scheduling path from roughly 6–7 interactions to 3–4 focused actions, which matters most exactly when a shift changes at short notice.
Shared availability and group status became readable at a glance, removing the need to switch between a separate calendar and chat for the core coordination loop.
- Core scheduling reduced from ~6–7 steps to ~3–4 actions.
- Availability and participation status unified into a single view.
- No dependency on external calendar or chat tools for core coordination.



Stack
- Next.js
- React
- TypeScript
- Tailwind CSS
- Drizzle ORM
- Neon Postgres
- Clerk Auth
- Socket.IO
- FullCalendar
- IBM watsonx
- Groq SDK