Valeron · Platform Architecture

System Architecture

as of 2026-04-12

Layered view of the Valeron platform. Solid borders = built and working. Dashed = planned. Dotted = deferred.

Client Layer — Interfaces
web-platform-app
Next.js · Vercel
app.valeron.ai — golfer dashboard
My Rounds, round detail, hole videos
Supabase SSR auth + middleware
admin.valeron.ai — admin console
Fleet, courses, sessions, users pages
Role-based routing (ACL-8, 9)
ace_pilot
React Native · mobile
Deferred — Janice golfer UI used instead
Pairing flow v3 exists but parallel
mobile-field-app
Mobile web app
Nav mode commands for field testers
Connects to robot over LAN
OAuth + data queries
pair + start-session
publish course_features
Cloud Layer — Supabase (ace_cloud)
Supabase · project mdzicvnnocnxdmukapjk
PostgreSQL + RLS
14 migrations tracked
accounts courses devices trackers profiles sessions shots course_features publish_log device_associations map_sessions captures
RLS on all tables (golfer-scoped)
memberships table (ACL-3)
get_user_role() function (ACL-4)
Admin-aware RLS (ACL-5)
Edge Functions (Deno)
8 deployed
pair v4
sessions v4
courses v2
users-by-device v3
start-session v5
end-session v2
end-my-session v2
active-device v2
ACE-19 env-var auth pattern
CI drift guard (ACL-22)
Auth + Storage
Supabase managed
Google, Apple, Magic Links
ES256 JWT (rotated from RS256)
shot-videos Storage bucket
@valeron.ai domain restriction
Role hierarchy enforcement
users-by-device at pairing
Ferry uploads sessions + videos
KYT publishes features
On-Course Hardware
Golf Course · LAN connected
Robot Jetson (ace00)
Janice · ace_supervisor · Python aiohttp · :8080
ROS2/nav2 navigation stack
Observer UI (operator web)
Golfer UI (/golfer path)
JWT pairing (ES256)
SessionStore (local SQLite)
ShotStore (local)
Video proxy to Capture
Multi-session API (ACL-27)
Capture Jetson (ace00-capture)
Shot tracker pipeline · camera + ML
Shot detection + video recording (MP4)
Web API for video serving (Janice proxies)
mock_capture for dev/demo
Shot enrichment: hole + lat/lng (ACL-26)
Connectivity model: Cloud ONCE at pairing (brief online moment), then dark for the round. Robot ↔ Capture always on LAN. Phone ↔ Robot via LAN (Tailscale HTTPS for camera access).
Tools + Sync
desktop-ferry-app
TypeScript CLI · laptop at cart barn
End-of-day sync bridge
Pulls sessions/shots from Janice API
Uploads to Supabase (sessions, shots, Storage)
Multi-session enumeration (ACL-28)
Tauri desktop app (ACL-29)
Data path
Janice API (LAN) → enumerate + pull
Supabase (cloud) → upload + mark synced
web-mapper-app (KYT)
Next.js · course mapping tool
Geofence/path editing on Mapbox
Publish to course_features (service-role)
publish_log snapshot history
Only 2 of 8 courses mapped
nav2_tuner (Jamal)
Python Flask · nav2 param tuning
Browser GUI for nav2.yaml editing
SSH deploy to robot + git commit
Legend
Built + working
Planned
Deferred
OK
Planned
Deferred
Three Personas · Role Hierarchy (Phase 1)
valeron_admin
All accounts, all courses
Phase 1 (now)
course_admin
One account, all its courses
Future
course_employee
One account, one course
Future
Golfer
Own data only (no membership)
Already works
Generated from cloud-platform-service session 2026-04-12 — regenerate when architecture shifts