Weekly Update
Date: 2026-06-08 To: Isaac Botkin
Summary
This week focused on the plumbing that lets the new system stand in for the existing app: bringing existing data over (migration) and keeping it current (one-way sync). We built the full migration pipeline for users, drills, courses, scores, favorites, friendships, challenges, and achievements, plus a live sync engine that mirrors ongoing changes from the existing app table by table — together backed by over 160 automated tests, all passing. On the product side, the web app gained friend discovery (search by username and add-by-QR), events and range bag, social and media features, and a working par timer, and the challenge system learned to freeze standings and score fairly after a challenge ends. We also added a first layer of instance verification so the apps only talk to a legitimate, licensed server. Next stretch is testing and hardening what’s built, finishing friend discovery and challenges polish, and continuing migration validation against real data.
Environments
Staging
- Marketing: https://staging.range-day.app/
- Dashboard: https://staging-dashboard.range-day.app
- PWA: https://staging-my.range-day.app
Production
- Marketing: https://range-day.app/
- Dashboard: https://dashboard.range-day.app (WIP)
- PWA: https://my.range-day.app (WIP)
Beta Program & Discovery
- Opened onboarding/discovery conversations with three training organizations this week, each starting from researched, personalized outreach (under NDA)
- Discovery centers on measurable progress — getting each instructor to describe how they track their people’s progression today, which is the natural bridge to what RDP offers
- Early signal: the measurable-progress thesis is landing — both detailed replies framed their proudest moments as students measurably breaking through (one went from optics to equal performance on iron sights and is now prepping for competition), which is exactly the score-history + reporting story we’re building toward
- Open question worth a scope call: both named promotion / reaching new students as their real bottleneck — should RDP do anything here, or is marketing deliberately out of bounds?
- Status by org:
- Cry Havoc Training (Neil Meyers) — replied with thoughtful answers to the discovery questions; follow-up next
- Code Red Solutions (Ann Marie Suter — also an A Girl & A Gun chapter lead) — replied with thoughtful answers to the discovery questions; follow-up next
- Go Outside And Train (GOAT) (Jeremiah) — welcome sent; awaiting reply
- Full write-up: 2026-06-08 Beta testers - discovery findings vs feature set — discovery signal mapped against what’s built, what’s out of scope, and the marketing scope question
Last Week
- Built the data migration pipeline (ETL) from the existing app — users, drills, courses, single- and multi-shooter scores, course results, favorites, friendships, challenges, achievements, and content — now backed by 75 automated tests, all passing
- Built a one-way sync that keeps the new system up to date with the existing app (the old Supabase): as people make changes there — to their profiles, friends, drills, courses, scores, achievements, and challenges — those changes are automatically carried over and applied here, with anything that can’t be brought over set aside for review rather than dropped — covered by 89 automated tests, all passing
- Added friend discovery to the apps — search by username and add-by-QR-code — across the web app and both mobile platforms
- Expanded the web app with events and range bag, social and media features (gallery, share), and a working par timer with start beep
- Improved the challenge system — scoring now settles fairly after a challenge closes (best-of derived scoring), standings freeze at completion, and locked achievements stay partially hidden until earned
- Added a first layer of instance verification — apps perform a signed handshake and refuse to run against an unverified server, with supporting license tooling in the CLI
- Created a shared API client and a staging end-to-end test suite
- Stood up a POC playground (hosted on Cloudflare Pages) for mobile UI skeletons, a 3D drill viewer, and animation experiments
This Week
- Validate the migration against real exported data and close any gaps surfaced by the consolidated validation report
- Stress-test the sync to make sure changes always arrive in the right order, never get duplicated, and that anything set aside for review is handled correctly — even under heavy, real-world activity. I expect to see any existing Range Day app changes to Supabase relfect in our staging environment
- Finish friend discovery polish and continue challenge UX refinement
- Continue to connect deployment pipeline to deploying out beta versions of iOS and Android apps
- Pick up the dashboard event builder and roster builder
- Continue UX polish and wireframes with Ryan as design guidelines come in
- Resolve the open Analytics & Crash Reporting decision
Changelog
New since the 2026-06-01 update.
Data Migration (ETL from existing app) — 75 automated tests, all passing
- ETL foundation for users and drills
- ETL for courses
- ETL for single-shooter scores
- ETL for multi-shooter and course-result scores
- ETL for favorites and friendships
- ETL for challenges
- ETL for achievements and content
One-Way Sync (live mirror from existing app) — 89 automated tests, all passing
- Sync service skeleton — claim/apply/mark loop
- Sync outbox SQL and dead-letter table
- Sync event router
- Handlers: users (INSERT/UPDATE with identity repair, favorites diff, dry-fire delta), friendships, user_achievements, custom_drills + community_drills, custom_courses, completed_* scores (expansion + void), challenges + user_challenges, read_push_press
- Consolidated validation report and full-chain ordering test
Friend Discovery
- Username search (server + PWA)
- @username shown in native friend search results
- Friend codes for QR add-by-scan (server)
- QR friend codes UI and in-app scanner (PWA)
- Native in-app QR scanners (iOS + Android)
PWA (Dioxus — Rust compiled to WebAssembly)
- Events and range bag flows — status-safe edits and RFC5545 ICS export
- Social features, media gallery, par timer, and share overlay
- Authentic par-timer beep with one-tap restart
- End-to-end scoring/sync correctness, navigation, and dev wiring
- Empty-leaderboard explanation and in-flow offline banner
- Network-first service worker shell to stop stale-cache/SRI blocks
Challenges & Achievements
- Post-challenge derived-best scoring (Option B) with detail UX
- Standings frozen at completion
- Hybrid achievement visibility — locked detail masked until earned
- Locked flag for unearned achievements
Instance Verification (Phase 1)
- Signed instance handshake with fail-closed client gates across server, PWA, dashboard, iOS, and Android
- License module in shared core and license tooling in the CLI
Tooling & Testing
- Shared rangeday-api-client crate and staging end-to-end suite
- Dockerfile fix to copy all workspace member manifests
Playground / POC Hosting
- POC demo catalog with build/serve and Cloudflare Pages CI
- Mobile UI skeletons, live-reload watcher, and Bevy mobile support
- 3D drill viewer trimmed under the Cloudflare Pages WASM size limit
- Lottie logo-splash proof of concept
Docs & Planning
- Roadmap split into Legacy (parity) and Pro tracks
- Friend Discovery work item and decision
- Analytics & Crash Reporting open decision added
- Playground POC hosting work item