Annotate โ Keyboard Reference
:::tip TL;DR
- All annotation is keyboard-first: one hand on keyboard, one on pointing device
- Tool keys are single-key with no modifiers: P (point), B (box), T (temporal event)
- Number keys 1โ6 quick-set the type of the selected event
?toggles the in-app shortcut cheat sheet :::
The Annotate tool is built for speed. Learning the shortcuts below is the single highest-leverage action for annotation throughput. (Authoritative source: the keydown handler in src/App.tsx and src/components/ShortcutModal.tsx.)
Global Controlsโ
| Key | Action |
|---|---|
Space | Play / Pause |
J | Reverse playback (press again while reversing to ramp 2ร โ 4ร) |
K | Pause |
L | Forward playback (press again while forwarding to ramp 2ร โ 4ร) |
โ | Frame step backward |
โ | Frame step forward |
Shift + โ | Jump 10 frames backward |
Shift + โ | Jump 10 frames forward |
Cmd/Ctrl + Z | Undo |
Cmd/Ctrl + Shift + Z | Redo |
Cmd/Ctrl + O | Load project |
Cmd/Ctrl + S | Save project |
Cmd/Ctrl + E | Export dataset |
? | Toggle the shortcut cheat sheet |
Esc | Close the shortcut modal, else deselect + return to the select tool |
Tool Selectionโ
Single-key with no modifiers. Pressing a tool key activates it; Esc returns to the select tool.
| Key | Tool | Behavior |
|---|---|---|
P | Point | Click to place a point annotation (x, y, time) |
B | Box | Click-drag to draw a bounding box (x1, y1, x2, y2, time) |
T | Temporal Event | If an event is currently open, T closes it; otherwise it activates the event tool |
Esc | Select / deselect | Returns to the select tool and clears the current selection |
There is no skeleton/pose (
S) or polygon/mask (G) tool. TheTooltype isselect | point | box | event.
Event Type Quick-Setโ
With a temporal event selected, press a number key to set its type (only types allowed by the current context apply):
| Key | Event type |
|---|---|
1 | serve |
2 | shot |
3 | bounce |
4 | point_end |
5 | net_hit |
6 | out |
Annotation Editingโ
| Action | Shortcut |
|---|---|
| Move annotation | Click + Drag |
| Delete selected | Delete / Backspace |
All edits are non-destructive โ undo/redo history (Cmd/Ctrl+Z / Shift+Z) and a dirty-state indicator track every change.
Context Selectionโ
Context is set via the in-app Context modal (UI), not a keyboard shortcut. It controls which event types are valid.
| Context | Label |
|---|---|
match | Competitive point-based play |
practice | Practice rally or solo on-court practice |
training_off_court | Wall drills, ball machine, gym |
highlight_clip | Edited broadcast or short clip |
unknown | Tennis-like but ambiguous |
Context โ Allowed Eventsโ
The UI automatically enables and disables tools based on selected context. Attempting to annotate a disallowed event type is blocked.
| Context | Allowed events | Disallowed events |
|---|---|---|
match | serve, shot, bounce, net_hit, out, point_end | โ |
practice | shot, bounce | serve, point_end |
training_off_court | shot | bounce, serve, point_end |
highlight_clip | shot, point_end | bounce, serve, net_hit, out |
:::warning Why this matters
Annotating a serve in a practice context would produce invalid training data. The UI enforces these rules โ tool keys for disallowed events produce no action.
:::
Annotation Workflow (Speed Run)โ
Typical flow for annotating one rally:
Spaceโ play videoKorSpaceโ pause on event frameโ/โโ fine-tune to the exact frame- Press a tool key (
P,B, orT) โ activate the tool - Click / drag to place the annotation
- With an event selected, press
1โ6to set its type Cmd/Ctrl+Sto save; repeat from step 1
Next Stepsโ
- Annotate Overview โ architecture and data model
- Pipeline Stages โ how the GPU backend produces events the annotate tool validates
- Output Schema โ
events_timeline.jsonformat used for comparison