The mobile app work already delivered, plus a code-grounded estimate of the 2027 Improvements roadmap and the committed platform work โ every line reviewed against the actual web, API, and mobile codebases and priced at $50/hour.
Everything in one breakdown: the 2027 Improvements features grouped by the planning doc's priority tiers, followed by the committed engineering streams. Hours and descriptions are grounded in a review of the codebase โ where existing infrastructure or data already covers part of a request, the estimate reflects it. Feature rows are tagged by version โ Web Mobile Both โ and clarifications from the doc's review comments are folded into the descriptions and marked in blue. The doc's "School Mode / graduating year" request is delivered by Stream C (Age grids) below. Every group is independent and can be scheduled or billed on its own.
Work already delivered to bring the Expo mobile app to its current state โ reconstructed from the repo's commit history (57 commits across 6 active working days, ~15,800 lines added). These are actuals, not estimates, billed at the same $50/hour.
| Delivered work | Hours | Cost |
|---|---|---|
| Project setup & build pipelineExpo SDK 57 app with NativeWind/Tailwind, pnpm workspace hoisting, and EAS build + EAS Update (fingerprint runtime + channels), split into separate Dev and Production app variants. | 7.0 | $350 |
| Authentication & navigationSupabase auth with protected routing, magic-link + Google sign-in and OTP code entry, plus organization / tenant selection. | 5.0 | $250 |
| Season managementA dedicated Seasons screen and a season context that scopes the Roster and Teams tabs. | 3.0 | $150 |
| Roster & athletesLive roster, add / edit / delete athletes, headshot capture & upload (web and native), and roster avatar chips. | 7.0 | $350 |
| TryoutsAdd / edit / rate / delete tryouts, editable coach determination, tier and notes, an in-app video player, and record / upload of tryout videos. | 8.0 | $400 |
| TeamsTeams list and detail wired to live data, add team, and athlete assignment to stunt positions with per-position counts and chips. | 5.0 | $250 |
| Subtotal โ completed | 35.0 hrs | $1,750 |
Each item links to the commit on GitHub (cheersync/mobile) โ repo access required to open.
| Feature | Version | Hours | Cost |
|---|---|---|---|
| Jump straight into a new tryoutAfter adding a tryout, navigate directly into its screen instead of leaving the coach to find it in the list โ a real speed-up for back-to-back evals. | Both | 2.0 | $100 |
Coach notes on the Teams pageNote fields already exist on athletes (positionNotes, levelNotes, otherNotes); surface them in the athlete's video view on the Teams page, not only on the athlete page. | Web | 2.5 | $125 |
Customizable scoringThe rating widget already accepts a min/max range โ so the work is storing a configurable range in settings and threading it through where scores are entered. Per review: allow different ranges per skill (jumps 1โ5, tumbling 1โ10), which also means normalizing an athlete's total across mixed ranges. | Both | 5.0 | $250 |
| Email tryout videos to parentsReuses the existing AWS SES email pipeline, but athletes have no parent-contact field today โ so this adds parent-email capture (athlete form + roster import) plus a new send view. The most-requested item. Per review: needs a new workflow; design to be prototyped first. | Web | 8.0 | $400 |
Split stunt position "Base" into Main / Side BasePer review: split "Base" into two positions (not a rename), so Coach Determination reads Flyer, Main Base, Side Base, Backspot, Tumbler. Touches the web Position enum, the mobile position list, position filters and the stunt icon, plus a migration of existing "Base" values. | Both | 3.5 | $175 |
| In-app & marketing "how-to" videosBuild the in-app help section and marketing-site placement for onboarding walkthrough videos. Video production / content itself is a separate effort. | Both | 4.0 | $200 |
| Subtotal โ Essential | 25.0 hrs | $1,250 | |
| Feature | Version | Hours | Cost |
|---|---|---|---|
| Tap a photo to enlargeOpen a full-size view of an athlete's headshot on tap/click (a lightbox on web, a viewer on mobile), instead of only offering retake / replace. | Both | 3.0 | $150 |
| Move "Add Tryout" to the topReposition the button so it's reachable without scrolling past a growing list of evals. | Both | 1.5 | $75 |
| Password login optionSign-in today is magic-link / email OTP on both platforms (plus Google on mobile). Add password sign-in and a set-password / reset flow, and enable the email-password provider โ built on web and mobile. | Both | 6.0 | $300 |
| Rework multiple-locations / seasons handlingReplace the plan-based season-count bandaid with a real model for multi-location gyms without penalizing single-location gyms that need extra seasons. Needs a design decision first โ this figure is a placeholder for the build once scoped. | Both | 6.0 | $300 |
| Subtotal โ Important | 16.5 hrs | $825 | |
| Feature | Version | Hours | Cost |
|---|---|---|---|
Flag an athleteA flag boolean already exists on team placements but is unused and has no message. Add a comment field, the flag + hover UI on the Teams page, and wire visibility. Per review: visible to all coaches, managers, and owners. | Web | 5.0 | $250 |
| Stunt groupsNew concept โ teams have no stunt-group entity today. Add stunt groups within a team and assign athletes to positions in each. | Both | 5.0 | $250 |
| Richer export reportsExtend the existing team-roster export (it writes to a Google Sheet) with additional columns, including overall and individual tryout scores. | Web | 3.0 | $150 |
| Subtotal โ Beneficial | 13.0 hrs | $650 | |
| Feature | Version | Hours | Cost |
|---|---|---|---|
| Customizable roster sortingSorting today is a hardcoded name/score toggle. Refactor to a multi-key sort and add attributes. Per review: Level and Birth Year for club programs, Graduating Year for school programs (uses the gym type from Stream C). | Both | 3.0 | $150 |
| Fix stuck video thumbnailsVideos deleted on the athlete page can still show as stuck "loading" on the Teams page โ a cache / state-invalidation bug after deletion. Diagnose and clear the stale state. | Web | 2.0 | $100 |
| Subtotal โ Nice to have | 5.0 hrs | $250 | |
| Task | Hours | Cost |
|---|---|---|
| A1Discovery & technical approachValidate the deployed backend endpoints, map the port from the web upload manager, and confirm the chunk-read approach on Expo SDK 57. | 2.5 | $125 |
| A2Chunked file reading from disk (Expo)Read the video in byte-range chunks using expo-file-system 57's File-handle API (already in the app) and feed each chunk to the uploader โ lighter than first assumed now that the platform exposes byte-range reads directly. | 3.0 | $150 |
| A3Multipart orchestration (start โ part โ complete)Implement the full flow against the existing edge functions: request the upload, sign and PUT each part, collect ETags, and finalize. | 5.0 | $250 |
| A4Parallel uploads, retry & abortUpload parts with a concurrency limit, retry individual failed parts, and cleanly abort the upload on a fatal error. | 3.0 | $150 |
| A5Size-threshold routing & single-part fallbackRoute files over the multipart threshold to the new path while keeping small files on the existing single-request upload. | 1.5 | $75 |
| A6Upload progress UIAggregate per-part progress into a live progress bar on the tryout screen, replacing the current indeterminate spinner. | 2.5 | $125 |
| A7Cross-device & network testingVerify on iOS and Android across a file-size matrix, including flaky-network and mid-upload interruption / resume behavior. | 3.5 | $175 |
| A8Code review, QA fixes & bufferPull-request review, addressing feedback, and headroom for edge-case fixes surfaced during testing. | 2.5 | $125 |
| Subtotal โ Stream A | 23.5 hrs | $1,175 |
| Task | Hours | Cost |
|---|---|---|
B1Remove record/upload entry points from webRetire the record-video dialogs (RecordVideoDialog2, RecordVideoDialogShadcn) and upload triggers from the web tryout flows, and replace them with clear guidance to record in the mobile app. | 3.0 | $150 |
| B2Clean up unused code & regression testRetire the now-unused web upload manager and related code paths, and regression-test the tryout and roster flows. | 1.5 | $75 |
| Subtotal โ Stream B | 4.5 hrs | $225 |
| Task | Hours | Cost |
|---|---|---|
C1Data model & migration designDesign the age-grid schema (table or document), add a gymType flag (all-star / high-school) and graduation-year fields, and plan the move off the bundled 4,300-line grid file / Google Sheets. | 3.0 | $150 |
| C2Build schema & import existing gridsCreate the database schema and a one-time import of the current age-grid data out of the bundled file / Google Sheets into the database. | 4.0 | $200 |
| C3Serve age grids from the databaseExpose the grids via the API and point the app at it, replacing the bundled data file and the manual Google-Sheets script. | 4.5 | $225 |
| C4Graduation-year division logicAdd graduation-year resolution for high-school gyms alongside the existing birth-year logic โ which currently lives in several places across web and mobile โ driven by the gym-type flag. Delivers the doc's "School Mode / graduating year" request. | 4.0 | $200 |
| C5Surface gym type in gym / season setupAdd the all-star vs. high-school choice to the relevant create and edit flows so new customers can be configured correctly. | 2.0 | $100 |
| C6Validation & testing (both gym types)Verify division results for all-star and high-school gyms against current output, with edge-case checks around cut-off dates. | 3.0 | $150 |
| Subtotal โ Stream C | 20.5 hrs | $1,025 |
The planned work is roughly 108 hours of development โ an estimated 4 to 7 weeks to complete end to end, depending on a 40 to 20 hour-per-week pace.