What Practice Mode Does For You
A player touches the ball 2-3 times in a game situation that might appear across 5 games. In a shooting drill they get 15-20 reps in one session. That volume is enough to see technical consistency - or the lack of it. FIS practice mode is built to capture it.
Same pole, same sensors, same setup. Change the session type and everything that comes out the other end is built for the training field instead of match day - load alerts while the session is running, a coach report before the drive home, a personal report for every player, and a development record that builds week by week.
During the session
📊 Live coaching dashboard
Open a browser on any tablet - no app, no account. See every player's load in real time, drill by drill. Bilateral drift alerts fire before a player shows symptoms. Rep counts update automatically. The system tells you what drill it thinks you're running; you confirm or correct with a tap.
After the session
📧 Coach report by email
Before the drive home: session summary, drill sequence, per-player load, individual flags - who showed bilateral asymmetry, whose technique variance was high, who improved meaningfully vs. their own baseline. Hours later, a second enriched report adds deep technique metrics once the sensor data uploads.
For every player
🎯 Personal player report
Each player gets their own report: which drills, how many reps, which role, physical output, and three key metrics vs. their own baseline. One positive observation. One focus area. Nothing compared to teammates - development is personal.
Across the season
📈 Feeds the development record
Every practice session writes to the longitudinal development layer. Weekly and monthly reports accumulate automatically. Practice-to-match transfer becomes visible over time - which skills are showing up in games, and which ones are still developing under full-game pressure.
Live Coaching Dashboard
The Grafana coaching dashboard at http://fis.local:3000 shows a practice-specific view during sessions. Open it on any tablet on the field WiFi - no app install, no account. The goal is to surface things you can act on right now, not to overwhelm with data.
Always visible
- Current detected drill type and elapsed time in the drill
- Rep count for the current drill
- Per-player load bars - sprint count and decel count this drill, updating live
- Bilateral load balance per player - color shifts as asymmetry grows
Alert conditions
- 🟡 Bilateral drift: a player is loading one side meaningfully more than their own normal — flag for load management
- 🔴 Critical asymmetry: drift has reached a level where substituting or reducing load is worth considering now
- 🟡 Sensor offline: a sensor has stopped reporting
- 🟡 Low battery: sensor below 20%
️ The bilateral drift alert fires against each player's own warmup baseline - not a squad average. A player who always runs asymmetric won't false-positive. The flag means this player is drifting from their own normal, which is the signal that matters.
Practice Reports
Two reports per session: one for the coach covering the full squad, one for each player covering only their own data. Both arrive by email. Both follow the same two-pass model as game reports - Pass 1 at end of session, Pass 2 after the GEM uploads its datasets to S3.
Coach Report
Surfaces what you couldn't see while running the session - consistency across reps, load distribution, and individual flags worth a conversation.
Pass 1 - end of session
Session summary
- Drill sequence with timestamps and detection confidence
- Per-drill load: sprint count, decel count, work rate per player
- Squad bilateral balance: warmup baseline vs. end of session - who drifted and by how much
- Touch count and kick velocity distribution by drill
Pass 1 - end of session
Individual flags
- Consistency score per player per drill: low variance = technique is grooved; high variance = still learning
- Preferred foot usage: did they use their weak foot when the drill left both available?
- Pressure response: did decision speed hold up in high-pressure reps vs. early easy reps?
- Load asymmetry flags: >15% bilateral drift from warmup baseline
- Notable improvements vs. prior sessions
Pass 2 - after sensor upload
Technical detail
- Kick velocity distribution: mean, max, variance per player per drill
- Time to release under pressure vs. without
- Turn entry speed in 1v1: how fast are they committing to direction changes
- Physical load curve by drill minute: are players fatiguing within a drill block?
Pass 2 - after sensor upload
Drill observations
- Dominant foot tendencies under pressure, directional biases
- Attacker vs. defender outcome summary for 1v1 drills
- Rep-by-rep trend: are players improving within the session or fatiguing?
- Auto-generated session narrative: plain-language summary of key observations
For players and families. The player report is separate from the coach report - it goes to the player portal and is written to be understood by a player and their family, not just their coach.
Player Report
Personal and forward-looking. Referenced only against that player's own data - never a ranking or comparison to teammates. Written to be reviewed by a parent and player together, then discussed with the coach.
Pass 1 - end of session
What you worked on
- Drill-by-drill participation: which drills, how many reps, which role
- Physical output: distance, sprint count, work rate per drill
- Touch count and kick events - which foot
- Did you use both feet today?
Pass 1 - end of session
How you did
- Kick velocity: today's average vs. your own recent average
- Decision speed: today vs. your baseline
- Consistency score: how similar were your reps to each other?
- One positive highlight from today
- One focus area for next session
Pass 2 - after sensor upload
Technique detail
- Kick velocity progression across reps: did you maintain power as the session went on?
- Bilateral load: how evenly were you using both feet?
- Pressure response: how did your decision speed change under defensive pressure?
Player reports reference only that player's own data. No rankings. No comparisons to teammates. Development is personal; comparisons are the coach's job.
Game patterns in the practice context
The Pass 2 practice report can optionally include a game patterns block drawn from the most recent match. It sits alongside the session data as a separate section - not mixed into drill metrics. It shows which sequences the team ran in the last game, what they produced, and which opponent patterns appeared most frequently against them.
Whether that context influences session planning is the coach's decision. The report provides the observation; the connection to what gets worked on at training belongs to the person running the session.
Coaching Assistant Tablet UX
The tablet UI during practice is a confirm-and-correct tool, not a from-scratch annotation tool. The system tells the assistant what it thinks is happening; the assistant confirms, corrects, or adds context the system can't see. Connect at http://fis.local:3001/practice on the field WiFi - no app install, no account.
Left panel - what FIS thinks
- Current detected drill type + confidence badge
- Elapsed time in current drill segment
- Role assignments per player (colour-coded: green = attacker, blue = defender, grey = neutral)
- Rep count for current drill
- Live bilateral load alert strip (yellow = asymmetry flag, red = critical)
Right panel - confirm / correct
- Drill picker - scrollable list of drill vocabulary. Tap to override.
- Role swap button - tap any player to toggle their role for the current rep
- New drill button - starts a new drill segment regardless of what the system detected
- Water break / pause button - suppresses detection during non-activity
- Notes field - free text attached to the current drill segment
Drill Detection
FIS attempts to identify the current drill automatically from the combined vision and sensor data stream. Manual override by a coaching assistant is always available and takes precedence. The goal is to reduce the annotation burden - the assistant confirms or corrects, rather than driving everything from scratch.
️ Detection philosophy: Vision sees where players are and how they're distributed. Sensors see what their feet are doing. Neither alone is sufficient for reliable drill identification - together they give a strong signal for most common drill types. The system states its confidence level and always allows human override.
Setup vs. Match Day
| Item | Match | Practice |
|---|---|---|
| Pole position | Midfield, one pole | Same - midfield, one pole |
| Sensors | One team (tracked players) | Both groups, all players |
| Live stream | Required - parents at field and remote | Not required. Recording still runs for archive and Pass 2. |
| Coaching dashboard | Grafana match view (possession, territory) | Grafana practice view (load per drill, bilateral alerts) |
| Tablet UX | Optional - for note-taking | Active - coaching assistant confirms drill segments |
| Session end trigger | Final whistle detected | Manual "end session" tap on tablet |
| Pass 1 delivery | Before pack-up is done | Before the drive home - same timing target |
| Report delivery | Email to coach after final whistle | Email to coach after session ends |
| 4K archive | Yes - full game | Yes - full session. Used for Pass 2 player clips. |
Both Teams Wearing Sensors
In a match, one team is tracked and the other is ambient background. In practice, both sides wear sensors and both are first-class data subjects. Most practice drills are relational - the attacker's metrics are only interpretable in the context of the defender they were working against, and vice versa.
What bilateral coverage enables
- Attacker decision speed measured against actual defensive pressure - not simulated
- Defender load and cut patterns during the same rep the attacker's technique is assessed
- Head-to-head tracking: does a specific attacker's performance change against faster defenders?
- Rotation detection - when players swap roles between reps, the system tracks which player wore which role for how many reps
- Team shape and support metrics apply the same way in a scrimmage as they do in a full game - compactness, pressing, and passing patterns are visible in practice, not just on game day
Role assignment per rep
Each rep carries a role context: attacker, defender, neutral, feeder, goalkeeper. Derived from drill detection or confirmed by the coaching assistant. A kick event from an attacker in the penalty area means something different than the same event from a defender clearing their lines.
Session Configuration
Practice sessions use the same session.yaml format as match sessions with a type: practice flag. The roster builds automatically from NFC check-in — no pre-load needed. An optional planned drill sequence can be pre-seeded; the system auto-detects if not specified.
Drill Detection Reference
The system detects twelve drill types across three confidence tiers: high-confidence (warmup, shooting, 1v1, small-sided game), medium-confidence (crossing, passing through pressure, rondo, finishing from crosses), and low-confidence requiring confirmation (set pieces, shadow play, GK-specific, fitness runs). Each type has defined vision and sensor conditions.
Practice Event Log Schema
Practice sessions extend the base event log with drill segmentation and role context. Every event type gains a drill_id and role field when written inside a drill segment. Drill start/end, rep boundaries, role swaps, and manual overrides are all discrete event types in the same log.