Project Estimate ยท Scope of Work

CheerSync โ€” 2027 Improvements & Platform Work

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.

Prepared for
CheerSync
Prepared by
Allen Tang
Date
August 17, 2026
Billing rate
$50 / hour
Completed + planned
35 + 108 hrs
Combined total
$7,150

Scope & estimate

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.

Essential Important Beneficial Nice to have
Completed to date

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.

โœ“

Mobile app foundation

35.0 hrs ยท $1,750
Delivered workHoursCost
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 โ€” completed35.0 hrs$1,750
Commit-level breakdown โ€” 42 feature & fix commits, Jul 22 โ€“ Jul 29 2026
Project setup & build pipeline 10 commits
  • Jul 22 Initial Expo (React Native) app
  • Jul 22 NativeWind preset for Tailwind
  • Jul 25 Expo SDK 57 compatibility (builds & runs)
  • Jul 25 react-native-css-interop dependency for NativeWind on pnpm
  • Jul 25 Hoist node_modules for EAS builds (pnpm node-linker)
  • Jul 25 pnpm nodeLinker=hoisted + babel-preset-expo
  • Jul 26 EAS Update (OTA) with fingerprint runtime + channels
  • Jul 26 appVersion runtime policy for EAS Update
  • Jul 26 Split into CheerSync Dev and Production variants
  • Jul 27 iOS App Store Connect id in the production submit profile
Authentication & navigation 5 commits
  • Jul 26 Supabase auth (email/password + Google) with protected routing
  • Jul 26 Magic-link + Google auth (platform-aware)
  • Jul 26 Rebuild Settings to match web (editable account + org)
  • Jul 27 Align tabs with web, add org selection + athlete detail
  • Jul 27 OTP code entry for magic-link sign-in
Season management 3 commits
  • Jul 26 Season context โ€” scopes Roster and Teams by season
  • Jul 26 Season management control (pick or create seasons)
  • Jul 26 Dedicated /seasons screen
Roster & athletes 9 commits
  • Jul 27 "Add Athlete" button on the Roster tab
  • Jul 27 Edit name / birth year and delete an athlete
  • Jul 27 Refetch on focus so edits/deletes reflect immediately
  • Jul 27 Web-safe delete confirm + icon buttons under photo
  • Jul 27 Ionicons instead of emoji
  • Jul 27 Tap photo to upload a new headshot
  • Jul 27 Fix headshot upload silently failing on web
  • Jul 27 Clearer headshot upload errors + picked File on web
  • Jul 29 Minimal back label + keyboard-aware edit sheets
Tryouts 8 commits
  • Jul 27 Editable coach determination, tier, and notes
  • Jul 27 Play tryout videos in-app
  • Jul 27 "Add Tryout" flow on the athlete page
  • Jul 27 Edit, rate, and delete tryouts
  • Jul 27 Fit video to screen in the in-app player
  • Jul 27 Record or upload tryout videos
  • Jul 27 Add Video on web (custom source sheet + web upload)
  • Jul 27 Web: go straight to the file picker
Teams 7 commits
  • Jul 26 Wire Teams list and Team detail to real data
  • Jul 27 Assign athletes to stunt positions + position counts
  • Jul 27 "Add Team" button on the Teams tab
  • Jul 29 List athletes per stunt position on team cards
  • Jul 29 Render per-position athletes as chips
  • Jul 29 Paint team detail instantly via shared cache
  • Jul 29 Show headshot avatar inside roster chips
2027 Improvements roadmap

Essential

25.0 hrs ยท $1,250
FeatureVersionHoursCost
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.Both2.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.Web2.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.Both5.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.Web8.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.Both3.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.Both4.0$200
Subtotal โ€” Essential25.0 hrs$1,250

Important

16.5 hrs ยท $825
FeatureVersionHoursCost
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.Both3.0$150
Move "Add Tryout" to the topReposition the button so it's reachable without scrolling past a growing list of evals.Both1.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.Both6.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.Both6.0$300
Subtotal โ€” Important16.5 hrs$825

Beneficial

13.0 hrs ยท $650
FeatureVersionHoursCost
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.Web5.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.Both5.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.Web3.0$150
Subtotal โ€” Beneficial13.0 hrs$650

Nice to have

5.0 hrs ยท $250
FeatureVersionHoursCost
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).Both3.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.Web2.0$100
Subtotal โ€” Nice to have5.0 hrs$250
Committed engineering streams
A

Mobile multipart video upload

23.5 hrs ยท $1,175
TaskHoursCost
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 A23.5 hrs$1,175
B

Retire web video recording & upload

4.5 hrs ยท $225
TaskHoursCost
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 B4.5 hrs$225
C

Age grids to database + gym types

20.5 hrs ยท $1,025
TaskHoursCost
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 C20.5 hrs$1,025

Estimate summary

LineHoursCost
Completed to date35.0$1,750
Essential25.0$1,250
Important16.5$825
Beneficial13.0$650
Nice to have5.0$250
AMobile multipart video upload23.5$1,175
BRetire web video recording & upload4.5$225
CAge grids to database + gym types20.5$1,025
Planned work108.0$5,400
Completed + planned143.0 hrs$7,150

Timeline & confidence

The full estimate is roughly 108 hours of development. Nothing here is all-or-nothing: every priority tier and each committed stream is independent and can be scheduled in any order, so work can start with the Essential items and the committed streams and proceed down the list.

How firm these numbers are. Hours are grounded in a codebase review, so the descriptions reflect what already exists (the rating widget's range support, the SES email pipeline, the existing flag field, Expo 57's byte-range reads). The softest figures are the design-dependent items โ€” customizable scoring, email to parents, and the multiple-locations rework โ€” which each warrant a short design pass before their build and could move once scoped. Estimates exclude any AI-assisted acceleration and assume "how-to" video content is produced separately.