Three work streams: bring resumable multipart video upload to the mobile app, make mobile the single place to record videos, and move age grids into a database with support for a new high-school gym customer type.
This estimate covers three independent work streams. Each can be scheduled and billed separately, so the client can approve all three or sequence them individually.
| Task | Hours | Cost |
|---|---|---|
| A1Discovery & technical approachValidate the deployed backend endpoints, map the port from the web upload manager, and prototype range-based file reads in React Native. | 2.5 | $125 |
| A2Chunked file reading from disk (Expo)Memory-safe utility to read a local video in byte ranges and feed each chunk to the uploader — the core piece not available out of the box on mobile. | 4.0 | $200 |
| 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 | 24.5 hrs | $1,225 |
| Task | Hours | Cost |
|---|---|---|
| B1Remove record/upload entry points from webRetire the record-video dialogs 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 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 Google Sheets / the bundled file 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, driven by the gym-type flag. | 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 Sheets output, with edge-case checks around cut-off dates. | 3.0 | $150 |
| Subtotal — Stream C | 20.5 hrs | $1,025 |
The estimate reflects roughly 49.5 hours of focused development across the three streams. Work is delivered as feature branches with pull requests for review. Run end to end, expect a calendar turnaround of about 2.5 to 3.5 weeks depending on review cycles and device-testing availability; the streams are independent and can also be scheduled one at a time.