TrackingApp
Budget: €3,000 – €5,000 EUR
1) Product Summary
F1-style running tracker (watch + mobile + web) that shows real-time telemetry: position on circuit, gap to leader and chaser, performance colors (green/red/purple), laps/sectors, shortcut detection, and “create route” mode (record circuit by running it).
Monetization: monthly subscription and event access codes.
2) Scope by Platform
Common watch logic
Sensors/GPS: ~1 Hz sampling; speed filter (EWMA); route smoothing (Kalman/Savitzky-Golay).
Route projection: nearest-point on polyline + curvilinear distance s.
F1 telemetry:
Gaps: gap_lead, gap_chase (heavy calc done in mobile/backend; watch displays summary).
Colors: green = personal best, purple = event best, red = slower.
Sectors/laps: defined by s cuts.
Shortcut detection: distance > threshold for >T seconds, or abnormal Δs → flag.
“Create route” mode: record points (≥10 m apart) and send polyline back to mobile.
Comms: watch <-> mobile (short messages), mobile <-> backend (WebSocket/MQTT).
Garmin (Connect IQ)
Type: Watch App.
Language: Monkey C.
Messaging: Phone-App Messages / web requests.
UI: sector, gap texts, color indicator, icons (REC/OFF-TRACK), simplified mini-track.
Suunto
Rely on Suunto App SDK.
Equivalent UI (sector/gaps/colors, REC flag).
Recording mode; send points back to mobile.
Offload heavy calc to mobile/backend.
Polar
Similar approach via Polar SDK:
Watch shows gaps/colors/REC; mobile handles projection and gaps.
3) Technical Architecture
Backend
Node.js + Express (REST) + WebSocket/MQTT.
Database: Postgres + PostGIS or MongoDB (GeoJSON).
Redis Pub/Sub for real-time fan-out.
Services: auth & subscriptions, event codes, route CRUD, telemetry ingest, gaps/records/cheat detection, notifications.
API contracts
POST /positions: { event_id, user_id, ts, lat, lon, s?, v? }.
GET /events/:id/status: { leader_gap, chaser_gap, sector_color, flags }.
POST /circuits: { name, polyline, sectors }.
POST /recorded: { user_id, event_id, polyline[] }.
POST /codes/verify: { code } ⇒ { valid, event_id, expires_at }.
GET /me/subscription: status/expiry.
Mobile app (iOS/Android – one app for all brands)
Maintains WebSocket/MQTT with backend.
Forwards watch messages → backend; receives gaps/colors ← backend and sends to watch.
Map view (Mapbox/Google), “pit wall” view.
Account management, subscriptions, event codes.
Circuit upload to watch; record mode control.
Suggested stack: React Native/Expo.
Web (viewer/organizer)
React + Mapbox GL.
Dashboards for race organizers: positions, gaps, sectors, anti-cheat flags, CRUD of circuits/events/codes.
4) Algorithms / Rules
Projection: nearest-point to polyline (PostGIS ST_LineLocatePoint or client-side).
Speed: instant (EWMA filtered) + lap/sector averages.
Gaps: (s_leader − s_user)/v_ref; safe fallback when v_ref ≈ 0.
Colors:
Green = new personal best sector,
Purple = new event record sector,
Red = slower.
Shortcut detection: dist(point, polyline) > threshold OR abnormal Δs ⇒ flag.
Create route: start/stop recording; sample ≥10 m; simplify; save as circuit.
5) Non-functional
Battery: watch sends tiny messages (1 Hz, <200 B).
Latency: <500 ms E2E for gaps/colors.
Backend uptime: >95% MVP.
Privacy: TLS; minimal PII; pseudonyms optional.
6) Freelancer Deliverables
Common
Full source + README + build scripts (CI/CD basic).
API docs (OpenAPI).
Seed scripts (demo event + 10 bots).
Garmin
Connect IQ app (Monkey C) with UI (sector/gap/color), recording mode, phone messaging.
VS Code project + build .bat.
Tested in simulator + checklist of devices (Fēnix/Epix/Forerunner).
Suunto / Polar
Equivalent watch apps with messaging, recording, compact UI.
Test instructions.
Mobile (one app)
Screens: login, subscription, events, map viewer, controls (upload circuit, start/stop recording).
Watch connectors (Garmin, Suunto, Polar).
Stable WS/MQTT client.
Backend + Web
Node.js backend + Postgres/PostGIS or Mongo.
React+Mapbox admin/viewer.
Docker compose for local dev.
F1-style running tracker (watch + mobile + web) that shows real-time telemetry: position on circuit, gap to leader and chaser, performance colors (green/red/purple), laps/sectors, shortcut detection, and “create route” mode (record circuit by running it).
Monetization: monthly subscription and event access codes.
2) Scope by Platform
Common watch logic
Sensors/GPS: ~1 Hz sampling; speed filter (EWMA); route smoothing (Kalman/Savitzky-Golay).
Route projection: nearest-point on polyline + curvilinear distance s.
F1 telemetry:
Gaps: gap_lead, gap_chase (heavy calc done in mobile/backend; watch displays summary).
Colors: green = personal best, purple = event best, red = slower.
Sectors/laps: defined by s cuts.
Shortcut detection: distance > threshold for >T seconds, or abnormal Δs → flag.
“Create route” mode: record points (≥10 m apart) and send polyline back to mobile.
Comms: watch <-> mobile (short messages), mobile <-> backend (WebSocket/MQTT).
Garmin (Connect IQ)
Type: Watch App.
Language: Monkey C.
Messaging: Phone-App Messages / web requests.
UI: sector, gap texts, color indicator, icons (REC/OFF-TRACK), simplified mini-track.
Suunto
Rely on Suunto App SDK.
Equivalent UI (sector/gaps/colors, REC flag).
Recording mode; send points back to mobile.
Offload heavy calc to mobile/backend.
Polar
Similar approach via Polar SDK:
Watch shows gaps/colors/REC; mobile handles projection and gaps.
3) Technical Architecture
Backend
Node.js + Express (REST) + WebSocket/MQTT.
Database: Postgres + PostGIS or MongoDB (GeoJSON).
Redis Pub/Sub for real-time fan-out.
Services: auth & subscriptions, event codes, route CRUD, telemetry ingest, gaps/records/cheat detection, notifications.
API contracts
POST /positions: { event_id, user_id, ts, lat, lon, s?, v? }.
GET /events/:id/status: { leader_gap, chaser_gap, sector_color, flags }.
POST /circuits: { name, polyline, sectors }.
POST /recorded: { user_id, event_id, polyline[] }.
POST /codes/verify: { code } ⇒ { valid, event_id, expires_at }.
GET /me/subscription: status/expiry.
Mobile app (iOS/Android – one app for all brands)
Maintains WebSocket/MQTT with backend.
Forwards watch messages → backend; receives gaps/colors ← backend and sends to watch.
Map view (Mapbox/Google), “pit wall” view.
Account management, subscriptions, event codes.
Circuit upload to watch; record mode control.
Suggested stack: React Native/Expo.
Web (viewer/organizer)
React + Mapbox GL.
Dashboards for race organizers: positions, gaps, sectors, anti-cheat flags, CRUD of circuits/events/codes.
4) Algorithms / Rules
Projection: nearest-point to polyline (PostGIS ST_LineLocatePoint or client-side).
Speed: instant (EWMA filtered) + lap/sector averages.
Gaps: (s_leader − s_user)/v_ref; safe fallback when v_ref ≈ 0.
Colors:
Green = new personal best sector,
Purple = new event record sector,
Red = slower.
Shortcut detection: dist(point, polyline) > threshold OR abnormal Δs ⇒ flag.
Create route: start/stop recording; sample ≥10 m; simplify; save as circuit.
5) Non-functional
Battery: watch sends tiny messages (1 Hz, <200 B).
Latency: <500 ms E2E for gaps/colors.
Backend uptime: >95% MVP.
Privacy: TLS; minimal PII; pseudonyms optional.
6) Freelancer Deliverables
Common
Full source + README + build scripts (CI/CD basic).
API docs (OpenAPI).
Seed scripts (demo event + 10 bots).
Garmin
Connect IQ app (Monkey C) with UI (sector/gap/color), recording mode, phone messaging.
VS Code project + build .bat.
Tested in simulator + checklist of devices (Fēnix/Epix/Forerunner).
Suunto / Polar
Equivalent watch apps with messaging, recording, compact UI.
Test instructions.
Mobile (one app)
Screens: login, subscription, events, map viewer, controls (upload circuit, start/stop recording).
Watch connectors (Garmin, Suunto, Polar).
Stable WS/MQTT client.
Backend + Web
Node.js backend + Postgres/PostGIS or Mongo.
React+Mapbox admin/viewer.
Docker compose for local dev.