Dashboard, sessions, students, drills, and more
Coach Features
The coach dashboard is the primary interface. All coach-facing pages are wrapped in the DashboardLayout component with a collapsible sidebar for navigation.
Dashboard
Route: /dashboard
The dashboard is a widget-based overview of the coach's activity. It includes:
- HeroStats -- Key metrics: total students, total sessions, average ride score
- SessionFeed -- Recent sessions with status indicators
- AthleteHeroCard -- Featured athlete spotlight with recent activity
- PerformanceChart -- Ride score trends over time (Recharts)
- UpcomingSchedule -- Next scheduled lessons
- QuickActions -- Shortcuts to upload, add student, schedule lesson
- ConditionsWidget -- Current surf conditions at home break
- SurfForecastWidget -- Multi-day forecast preview
Sessions
Route: /sessions (list), /sessions/[id] (detail)
Session List
Paginated list of all sessions with:
- Status filters: complete, processing, uploading, failed
- Sort by date (newest/oldest)
- Delete sessions
- Click to open session detail
Session Detail (Coaching Workspace)
The core coaching interface for analyzing session footage:
- VideoPlayer -- HLS-based video player with frame-by-frame controls
- AnnotationPanel -- Add text, drawing, and voice annotations at specific timestamps
- DrawingCanvas -- Freehand drawing overlay on the video frame
- RideScorer -- Score individual rides across criteria (wave selection, positioning, speed, style, power, flow)
- AIInsightsPanel -- AI-generated analysis results (see AI Video Analysis)
- Multi-clip support -- Sessions with multiple clips show a clip selector
Upload
Route: /upload
Two methods for importing session footage:
- Direct Upload -- Drag-and-drop or file picker. Files are compressed client-side using FFmpeg WASM before being sent to the AI processing backend. Concurrent upload pool limited to 2 simultaneous uploads.
- Frame.io Import -- Browse connected Frame.io accounts, navigate folders, and select video assets for import (up to 10 clips per import).
Both methods create a session record with clips and send footage to Modal for AI analysis.
Students (Athletes)
Route: /students (roster), /students/[id] (detail)
Athlete Roster
- Searchable list with skill-level filter (beginner, intermediate, advanced, pro)
- Add Student modal: name, email, age, stance (regular/goofy), skill level
- Click to view individual student profile
Student Detail
- Skill Tree -- Visual taxonomy of surf skills with assessed progress levels
- Ride Scores -- Historical ride scores across sessions
- Session History -- All sessions the student has been linked to
- Equipment -- Gear quiver (boards, fins, wetsuits, etc.)
- Achievements -- Earned badges and milestones
Drills
Route: /drills
A library of exercises categorized by type and difficulty:
- Categories: Water, Land, Mental, Fitness
- Skill Levels: Beginner, Intermediate, Advanced, All
- Full CRUD for creating/editing drills
- Multi-step instructions (stored as JSON)
- Drill images for visual reference
Lessons
Route: /lessons
Lesson scheduling with two views:
- Calendar View -- Monthly calendar with lesson indicators
- List View -- Sortable list of upcoming and past lessons
- Assign students, set location/spot, duration, and notes
- Link drills to lessons for structured session plans
- Surf condition forecast integration for scheduled dates
Analytics
Route: /analytics
Recharts-powered analytics dashboard with date-range filtering:
- Student growth over time
- Session frequency and trends
- Ride score distributions and averages
- Skill assessment progress across the roster
- Lesson and drill assignment activity
Training Plans & Goals
Route: /plans
- Training Plans -- Multi-week structured programs per student. Each week supports a text focus, notes, and drill assignments via dropdown selector. Drills are shown as removable chips within each week and persist to the
plan_jsonJSONB field. - Goals -- Metric-based goals (sessions, scores, skills, drills, waves, custom) with target values and milestone checkpoints
Competitions
Route: /competitions (list), /competitions/[id] (detail)
Full competition management:
- Formats: Single elimination, double elimination, round robin, expression session
- Heats -- Create rounds with multiple heats, assign students with jersey colors and seeds
- Scoring -- Wave-by-wave scoring (0--10 scale), interference tracking
- Results -- Automatic placement based on best wave scores
Billing
Route: /billing
Billing is integrated with Stripe for real payment processing:
- Coaching Packages -- Create packages with pricing, session counts, and duration. A Stripe Product and Price are automatically created when a checkout is initiated.
- Stripe Checkout -- Each package has a "Charge Student" button that opens a student selector and redirects to a Stripe-hosted checkout page. Supports both one-time payments and recurring subscriptions (based on whether the package has a duration).
- Stripe Customer Portal -- Active subscriptions have a "Manage" link that opens the Stripe Customer Portal for cancellation, payment method updates, and invoice history.
- Webhooks --
/api/stripe/webhookhandlescheckout.session.completed,customer.subscription.updated,customer.subscription.deleted, andinvoice.payment_failedevents to keep subscription and payment records in sync. - Revenue Stats -- Real-time stats for total revenue, monthly revenue, active subscriptions, and active packages.
Other Features
| Feature | Route | Description |
|---|---|---|
| Messages | /messages | Real-time coach-student messaging with conversation threads |
| Journal | /journal | Session journal entries with mood/energy/confidence ratings (1-5) |
| Highlights | /highlights | Curate highlight reels with continuous auto-play, skip controls, and JSON export |
| Compare | /compare | Side-by-side synced video comparison of two sessions |
| Community | /community | Leaderboard (ride scores), community posts with likes |
| Reports | /reports/[id] | Shareable session reports (public route) |
| Settings | /settings | Coach profile, avatar upload, notification preferences, theme picker, billing link, account deletion |
| Invite | /invite/[token] | Student invite acceptance page (public) |