Skip to content
← portfolio·
case study

Sprout

active2025

A cross-platform childcare tracking system for parents, caregivers, and daycares — built around the principle that a child has one continuous timeline.

Whether you're a single parent logging naps at home, co-parents sharing a day across schedules, or daycare staff recording events during care hours — Sprout unifies it all into one timeline. Context changes; data persists.

iOSAndroidOffline-firstOpen source
⬡ view on github
Sprout — home with quick actions — light theme
app

Two Views Of The Day

Caregivers log events from the home grid. The same events flow into a continuous calendar timeline you can scrub by day, and a date-grouped list for at-a-glance review — same data, two lenses.

Sprout — timeline calendar view — light theme
timeline
Sprout — list view grouped by date — light theme
list
architecture

How It Works

No custom API server. Clients talk directly to Supabase with authorization enforced at the database level via Postgres Row Level Security. The mobile app is offline-first — all reads and writes go through a local SQLite database synced by a lightweight engine.

// sync architecture
mobile app
UI
React Native
SQLite + Drizzle
useLiveQuery · offline reads
Sync Engine
push / pull · pending queue
Supabase
Postgres + RLS · Auth Storage · Realtime (future)
stack

Tech Stack

Mobile
Expo SDK 54 · React Native 0.81 · React 19
Language
TypeScript (strict mode)
Routing
Expo Router (file-based)
Local DB
expo-sqlite + Drizzle ORM
Sync
Custom lightweight sync engine (push/pull)
Backend
Supabase — Postgres, Auth, Storage, Realtime
State
TanStack Query (mutations + loading state)
Monorepo
Turborepo + pnpm workspaces
features

Key Features

Offline-first — reads always from SQLite, no spinner on data load
One continuous timeline per child regardless of caregiver
Role-based access: parent, caregiver, admin, org staff
Event types: naps, meals, diapers, notes, messages
Visibility controls: all / parents-only / org-only
Automatic conflict resolution via last-write-wins on updated_at
Sync activates on sign-in; app is fully usable offline without auth
Photo uploads via Supabase Storage
Real-time live updates via Supabase Realtime (in roadmap)
Cross-platform — iOS + Android from single codebase