A camp that runs on one app
OPPC Youth Summer Camp needed to replace paper rosters, cash envelopes, and group texts with one system — for parents, students, and staff. We designed, built, and now operate the entire platform: a React Native app on the App Store and a Django backend running the camp in real time, every day of the season.
- 144
- families onboarded, all passwordless
- 295
- automated backend tests
- 2
- apps in one: parent and staff experiences
- < 1 day
- typical fix-to-fleet time via OTA updates






The OPPC Youth Summer Camp app — parent and staff experiences
The problem
Camp operations are unforgiving: a hundred-plus families, dozens of staff, daily attendance, lunch money, field trips, and the single most stressful moment of the day — pickup. Parents arrive in waves, staff need to know who is here and who is authorized, and everything happens on a parking lot with phones in hands. Off-the-shelf camp software handles billing; almost none of it handles the curb.
What we built
- Passwordless onboarding. Staff import the roster from a CSV; every parent gets a magic-link email and is signed in on their phone in one tap. 144 families onboarded without a single password-reset support request.
- Geofenced pickup queue. When a parent arrives in the pickup lot, the app checks them in automatically and their kids appear on the staff dismissal board in real time — with carpool support and staff overrides.
- Real-time messaging. Group chats per camp group over WebSockets, with polls, reactions, pinned posts, moderation, and quiet-hours-aware push notifications.
- Payments. One-time camp lunch payments via Square, with webhook reconciliation and offline-payment tracking for families who pay at the front desk.
- Staff operations. Daily group attendance, an exception-first staff dashboard, clock in/out, pickup history, and field-trip rosters.
How it's built
React Native (Expo) on the front end with file-based routing and role-based navigation; Django REST + Django Channels on the back end with PostgreSQL and Redis; JWT auth with biometric unlock; Square's Web Payments SDK for billing; Expo push notifications; nginx, Gunicorn, and Daphne on a small cloud VPS with GitHub Actions CI/CD and automated database backups. 295 backend tests guard the parts that can't fail at 3pm on a Tuesday.
From the field: tuning the geofence with real data
On day one, a handful of parents driving past the camp on a nearby street were checked in by accident. That evening we shipped a fix: arrival check-ins now only count inside a pickup time window and within a rectangular fence drawn around the actual pickup lot — excluding the street — plus a one-tap staff "clear" for false positives. Backend, config, and app update were all live before pickup the next day. Operating our own product means the feedback loop is measured in hours, not release cycles.
Outcomes
- Every enrolled family onboarded before opening day — no passwords, no support backlog.
- Pickup runs from a live queue instead of clipboards and shouted names.
- Announcements, schedules, payments, and chat consolidated into one channel.
- Operational issues found in the morning are routinely fixed by the afternoon via over-the-air updates.
