A camp that runs on one app
OPPC Youth Summer Camp ran on paper rosters, cash envelopes, and group texts. Parents, students, and staff needed one system instead. We built the whole platform and we still run it: a React Native app on the App Store, plus a Django backend that keeps the camp moving 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 then pickup, which is the single most stressful moment of the day. Parents arrive in waves. Staff need to know who is here and who is authorized, and all of it happens on a parking lot with phones in hands. You can buy camp software that handles the billing. The curb is where we had to build.
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. A parent pulls into the pickup lot, the app checks them in, and their kids appear on the staff dismissal board in real time. Carpools are handled, and staff can override any of it.
- Real-time messaging. Group chats per camp group over WebSockets, with polls, reactions, pinned posts, moderation, and quiet-hours-aware push notifications.
- Payments. Camp lunch is a one-time payment, taken through Square and reconciled by webhook. Families who pay at the front desk are tracked as offline payments.
- 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. We shipped a fix that evening. Arrival check-ins now count only inside a pickup time window, and only inside a rectangular fence drawn around the actual pickup lot with the street left out. Staff also got a one-tap "clear" for false positives. Backend, config, and app update were all live before pickup the next day. We run this product ourselves, so the loop from problem to fix is measured in hours.
Outcomes
- Every enrolled family was onboarded before opening day. Nobody needed a password, and nothing piled up in support.
- Pickup runs off a live queue, which replaced the clipboards and the shouted names.
- Announcements, schedules, payments, and chat all live in one place.
- An operational issue found in the morning is routinely fixed by the afternoon, over the air.