
Snohomish Radio Aero Club
2025 - 2026
What. The website and operations platform for the Snohomish Radio Aero Club, the RC flying club I belong to. It started as a redesign over the 2025 Christmas holidays and turned into the software the club runs on: a public site, a member portal, and a competition system with its own hardware.
Why. The old site was a static brochure and everything else lived in spreadsheets and on paper. Officers needed to change content without going through a webmaster, members needed their information in one place, and race days needed to stop being run off a clipboard.
How.
- Public site — club info, posts, events, and a field map. Live conditions at the field come from the club's own Weather Underground station with a NOAA forecast as the fallback, cached in Firestore on a five-minute TTL; the field camera is embedded from Twitch. There is also a gaussian-splat 3D viewer of the flying field.
- Member portal — a digital membership card with admin-designable templates, a member directory with per-field privacy controls, a "what I fly" aircraft registry with per-aircraft visibility, a classifieds marketplace, member-to-officer messaging, and a field-log feed whose photos auto-file into a dated gallery.
- Events — typed events with banners, CSV import, an iCal feed members can subscribe to from Google or Apple Calendar, and a PDF engine that produces list views, annual grids, and a 28-page saddle-stitch imposition for the printed club calendar.
- Membership — an auth-gated application with waiver capture and PDF generation, dues tiers through hosted PayPal, and primary/spouse account linking.
- Competitions — eight formats across pylon racing, F5J and open duration, decathlon, and fun-fly. Seasons, heats, lap counting, registration with QR check-in, leaderboards with coalesced recomputes, score-sheet OCR import, OBS overlays for race-day streams, and CSV/PDF export.
- Five installable PWAs — Contestant, Judge, Race Admin, Registration, and Field Notes, each with its own manifest and an offline outbox, because connectivity at the field is not a given.
- The stopwatch — ESP32 firmware (Seeed XIAO ESP32S3, OLED or round TFT, BLE) with a Python flasher, talking to the race-admin app over Web Bluetooth. Laps sync and the display shows live heat status.
- Roles — three tiers enforced in Firestore security rules, nine club offices, and a contest-director role scoped per competition type.
Officers edit club history, header images, posts, and feature flags from the admin console, and posts can be distributed to an email list.
Stack: Next.js 15 App Router, React 19, TypeScript, Firebase (Auth, Firestore, App Hosting), Tailwind + shadcn/ui, Genkit + Gemini, three.js, PlatformIO/ESP32, Web Bluetooth.
Links: sracinc.com
Built Dec 2025 – Jul 2026, across roughly 970 commits. The holiday redesign was only the first month of it.