India T293 · Coaching Platform
Where data comes in, and where it goes out
A flow map of input sources · capture routes · storage · output pages, organized by cadence (hourly / daily / per-event). The colored dot on each row is its automation status. Each grey arrow is one data pipeline.
8
Fully automated — no human touch
0
Semi-auto — awaiting backend deploy/trigger
3
Manual — file download + parsing
11
data streams · 20+ output pages
AUTO — auto-collected & refreshed
SEMI — pipeline built, awaiting trigger/deploy
MANUAL — manual upload then parse
⏱ HourlyEvent day · flows that refresh every hour
Source · locationCapture · collect/uploadStoreOutput · pages
SourceOpen-Meteo forecast APIapi.open-meteo.com · 54.4423, 18.5927 (Sopot)
→
CaptureBrowser auto-fetchOn load + every 10 min · no key · ×1.5 ERA5 cal
→
StoreNo storage (realtime)In-browser · always latest
→
Outputindex · briefingGrade badge · forecast cards · setup chips (auto)
Sourcewindy.app widgetspot 365452 · station EPGD (Gdańsk)
→
CaptureEmbedded widget JSForecast · wind map · live station (3)
→
Storewindy.app serversExternal hosting · widget calls direct
→
Outputindex windy panelAuthoritative forecast source · collapsible
SourceMetaSail race trackerRC wind · tracks · ranks (broadcast in-race)
→
Capturelive.html auto-refreshPolling in-race · MetaSail wind needs no cal
→
StoreIn-memorySession only · export JSON after race
→
☀ DailyFlows arriving each morning / around sessions
Source · locationCapture · collect/uploadStoreOutput · pages
SourceAthlete morning check-inAthlete phone · sleep · wellness · urine · pain
→
→
StoreApps Script → sheetDAILY_CONDITION
→
SourceTraining log (post-session)Coach/athlete · setup · drills · sRPE · obs
→
→
StoreApps Script → sheetTRAINING_LOG
→
SourceCoach observationsWeather · athlete behavior notes · daily notes
→
CaptureForm / spreadsheet entryOBS spreadsheet
→
StoreCOACH_OBS_* sheetsWEATHER · ATHLETE · DAILY_NOTES
→
🗓 Per-event · WeeklyAnalysis flows arriving per race / week
Source · locationCapture · collect/uploadStoreOutput · pages
SourceRace results + GPS tracksMetaSail export · GPS device .gpx
→
CaptureManual download + parseparse-gps-spec · extract speed/maneuver/VMG
→
StoreStatic JSON filesdata/rm-*.json · top5-*.json · wc-*.json
→
SourceFederation PDF reportYAI Federation Report · eval sheet
→
CaptureManual text extract + parsedata/pdf-*.txt → structured
→
StoreStatic JSON / JSfed-report · eval-matrix
→
SourcePre-event self-assessmentAthlete · confidence/speed by A–X band
→
→
StorePRE_EVENT_ASSESSMENT sheetCross-check with GPS band analysis
→
SourceABCDX canonical guideCoach Danny PDF · 2026-04-10 v1.0
→
CaptureManually encoded in codeRarely changes · grade bounds + setup matrix
→
StoreIn-code constantsRIG matrix · data/wind-grades.js
→
SourceWeekly training loadTRAINING_LOG 7-day rollup
→
CaptureCompute (ATL/ACWR)sRPE × time → AU · spike detection
→
StoreDerived valuesseason.js rollup (sheet when live)
→
Core · single source of truth
Backend — Google Apps Script web app
India T293 Athlete Management · v6.0
AccessdoGet / doPost · JSONP (CORS workaround)
MAIN sheet1LGM8TLsQDgbxMrsNigCixlgUfQ--Ci1HQDoj4VEfFk4
OBS sheet1QmwBUj6x5hhyz-jsfVT_B0vKN0CzM9r3mST1ZzaW6Yc
Coachspotechtv@gmail.com
ATHLETE_PROFILESDAILY_CONDITIONTRAINING_LOGCOACH_CONDITIONCOACH_TRAINING_LOGRACE_RESULTSCOACH_DAILY_NOTESANALYSISCOACH_OBS_WEATHERCOACH_OBS_ATHLETEPRE_EVENT_ASSESSMENT
Endpoint is live
The doGet JSON endpoint is deployed. Dashboards now read the live sheet (with season.js as offline fallback). Deploying this single endpoint flipped all 6 semi-auto streams to live at once.
Form writes● working — POST connected
Dashboard reads● live — doGet JSON deployed
Weather● live — Open-Meteo + windy.app
Reference · source location & upload method
Where it comes from and how it's uploaded
Opinion · raising the bar via code migration
What, in what order
Phase 1 · now
Deploy the endpoint
Deploy the already-written doGet JSON endpoint to Apps Script. Almost no code change — flips demo → live sheet. Biggest effect for the least effort.
→ semi-auto 6 → auto 6
Phase 2 · next
Automate capture
The pain is the 3 manual streams (race · GPS · PDF). Run the MetaSail/GPS parser on a schedule (Apps Script time trigger or a small server) to auto-refresh race JSON. This — not design — is the real cost.
→ manual 3 → 1 (PDF only)
Phase 3 · at scale
Migrate the stack
As multi-event, multi-year data grows, move static HTML + Apps Script → a real DB (Supabase/Postgres) + app framework. Port the design system and components as-is — today's screens are the spec.
→ start after the schema is fixed
Design vs data — my take
They aren't rivals — they're different layers. Design is the delivery layer; the real moat is the data model + analysis logic — A–X band segmentation, %-of-Top5 benchmarking, per-band gap diagnosis, grade→rig prescription. That's what other teams can't copy.
So the order I'd recommend: ① fix the data schema first (the 11-sheet structure is already effectively the schema) ② remove manual cost via capture automation ③ then migrate the framework. If you switch frameworks while capture is still manual, you'll keep uploading files by hand on top of expensive code. Completeness comes not from "porting to code" but from "removing the cells where human hands go in." Keep HTML as the fast-moving presentation skin and pull the automation levers (Phase 1 & 2) first — that's the most efficient path.