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
Outputlive · race-cockpitLive fleet ranks · speed gap
☀ DailyFlows arriving each morning / around sessions
Source · locationCapture · collect/uploadStoreOutput · pages
SourceAthlete morning check-inAthlete phone · sleep · wellness · urine · pain
Captureathlete_checkin formPOST · action: conditionSubmit
StoreApps Script → sheetDAILY_CONDITION
Outputindex · profile · briefingWellness bars · status dots · alerts
SourceTraining log (post-session)Coach/athlete · setup · drills · sRPE · obs
Capturetraining_log formPOST · setup scales + notes
StoreApps Script → sheetTRAINING_LOG
Outputdebrief · profileSession debrief · load totals
SourceCoach observationsWeather · athlete behavior notes · daily notes
CaptureForm / spreadsheet entryOBS spreadsheet
StoreCOACH_OBS_* sheetsWEATHER · ATHLETE · DAILY_NOTES
Outputdebrief · briefingCoach comment layer
🗓 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
Outputrace-analysis · benchmark · scatter · overlay%-of-Top5 by band · track compare
SourceFederation PDF reportYAI Federation Report · eval sheet
CaptureManual text extract + parsedata/pdf-*.txt → structured
StoreStatic JSON / JSfed-report · eval-matrix
Outputfederation-reportCampaign baseline · printable
SourcePre-event self-assessmentAthlete · confidence/speed by A–X band
Capturepre_event_assessment formPOST · band matrix
StorePRE_EVENT_ASSESSMENT sheetCross-check with GPS band analysis
Outputathlete-profileSkill radar · gap diagnosis
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
Outputindex setup chips · briefing · scatterGrade→rig prescription · band segments
SourceWeekly training loadTRAINING_LOG 7-day rollup
CaptureCompute (ATL/ACWR)sRPE × time → AU · spike detection
StoreDerived valuesseason.js rollup (sheet when live)
Outputindex load bars · profileInjury-risk flag
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

DataSource locationUpload / capture methodCadenceStatus
Weather forecastOpen-Meteo (ERA5/ICON)Auto-fetch · no key · ×1.5 calHourlyAUTO
Weather widgetwindy.app spot 365452 · EPGDEmbedded widget scriptHourlyAUTO
Live raceMetaSail RClive.html auto-refreshIn-raceSEMI
Morning check-inAthlete phoneWeb form → POST conditionSubmitDaily AMSEMI
Training logCoach tabletWeb form → POSTDaily PMSEMI
Coach observationsCoachForm / direct spreadsheet entryDailySEMI
Race resultsMetaSail exportManual download + parse scriptPer-eventMANUAL
GPS tracksGPS device (.gpx)Drag-drop / parseSessionMANUAL
Federation reportYAI PDFManual text extract + parsePer-eventMANUAL
Pre-assessmentAthlete self-assessmentWeb form → PRE_EVENT_ASSESSMENTPer-eventSEMI
Wind grade criteriaCoach Danny canonical PDFManually encoded in code (rare)StableMANUAL
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.

SYSTEM MAP · India T293 Coaching Platform — 11 streams · Apps Script backend · A–X canonical framework