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 + 120 hrs
Combined total
$7,750

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

Each item links to the commit on GitHub (cheersync/mobile) โ€” repo access required to open.

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 media processing & pipeline simplification

24.0 hrs ยท $1,200
TaskHoursCost
A1Approach & spikeSelect and verify an on-device video-compression library for Expo SDK 57 (image resize is already available via expo-image-manipulator), confirm output formats the in-app and web players accept, and settle size/quality targets.2.5$125
A2On-device video compression / resizeCompress and resize recorded or picked video on the device before upload โ€” the core new capability, with iOS/Android codec handling. Smaller files also make multipart upload unnecessary.5.0$250
A3On-device image resizeResize headshots (and other images) on the device with expo-image-manipulator before upload.2.0$100
A4On-device thumbnail generationGenerate the video thumbnail on the device, replacing the thumbnail the server pipeline used to produce.2.5$125
A5Retire server-side (Amazon) video processingChange the asset flow so the uploaded, already-resized file and on-device thumbnail are used directly instead of waiting on the AWS transcode. Decommissioning the AWS pipeline itself (Lambda / MediaConvert / S3 triggers) is infra work coordinated separately.3.5$175
A6Upload progress UIA live upload-progress indicator on the tryout screen, replacing the indeterminate spinner (final design pending with Nelson & John).2.5$125
A7Cross-device & network testingVerify compression quality and size, and upload, on iOS and Android across a range of source videos and network conditions.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 A24.0 hrs$1,200
B

Remove web upload & client-database layer

16.0 hrs ยท $800
TaskHoursCost
B1Remove web video & image upload UIRetire the record-video dialogs, the Video Upload Center, the upload status bar, and the local preview / player components, and point users to the mobile app to capture media.3.5$175
B2Tear out the client database & sync layerRemove the Dexie / IndexedDB store, the 640-line ClientSyncProvider, and the web upload manager that powered offline-capable, resumable web uploads.4.0$200
B3Rewire media display to the APIPoint the tryout, roster, and teams views at server-sourced recordings and headshots (now uploaded from mobile) instead of the local database โ€” the main effort in the teardown.5.0$250
B4Remove dead code & regression testDrop the now-unused Dexie dependency and orphaned components, and regression-test the tryout, roster, and teams flows end to end.3.5$175
Subtotal โ€” Stream B16.0 hrs$800
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 per-gym plan type (all-star vs. 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
C5Set the gym plan (all-star vs. high-school)Add the plan choice to the relevant create and edit flows so each gym is set as an all-star or high-school plan and 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 media processing & pipeline simplification24.0$1,200
BRemove web upload & client-database layer16.0$800
CAge grids to database + gym types20.5$1,025
Planned work120.0$6,000
Completed + planned155.0 hrs$7,750

Timeline & confidence

The planned work is roughly 120 hours of development โ€” an estimated 4 to 8 weeks to complete end to end, depending on a 40 to 20 hour-per-week pace.

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, image resize via expo-image-manipulator, and the self-contained web upload/sync layer). The softest figures are the design-dependent or newly-introduced items โ€” customizable scoring, email to parents, the multiple-locations rework, and on-device video compression (a new library) โ€” which each warrant a short design or spike pass and could move once scoped. Estimates exclude any AI-assisted acceleration and assume "how-to" video content is produced separately.