Load a video to begin coding
Coding Panel
Add buttons in Setup first
Select a drawing on the video to edit its properties — colour, width, fill, caption.
Insights
No events to analyse. Code some events first.
Dashboard
No tiles yet — click + Add tile to start building your dashboard.
Event Log
No events logged yet.
How to Step-by-step guides
Step-by-step guides for common OpenTag tasks. Each guide is self-contained — read it once, follow it forever.
Button types — Events vs Attributes vs Activators
The two main button kinds in OpenTag are Events (the moments you're tagging) and Attributes (the labels that describe those moments). Within Attributes you can turn on Activator behaviour to make pressing the attribute itself ALSO tag an event — that's how one button = one full tagged clip works. Here's the cheat sheet.
A single timestamp on the video — e.g. a Shot, a Tackle. Configure pre-roll and post-roll in seconds so each exported clip includes the lead-in and follow-through (typical: 3s before, 5s after).
First press starts the event, second press ends it. Use for anything with a real duration: possession, period, "Player 7 on the pitch". Up to 20 toggle events can run at once. Any attribute pressed in between automatically attaches to the open toggle.
Adds one label to the most recent event — e.g. Outcome = Goal. Only one value per attribute group sticks: pressing Goal then Miss replaces Goal with Miss.
Same as above but multiple values can be tagged on the same event — e.g. Players involved = P3, P7, P9. Set Multi-value in the attribute's Setup screen.
An attribute that also tags an event when pressed. Use when the descriptor IS the moment — e.g. a "Goal" attribute that creates a Shot event with outcome=Goal in one press. Configure under Setup → attribute → Activator linked to event.
Name the button with a leading + or - and a number — for example +1, -1, +5 Home. Pressing the button silently adds that value to the group's running total. No prompt, no dialog — every press is instant. Built for the speed an analyst actually has.
No checkbox or flag needed — the naming convention IS the declaration. Build scoreboards (+1 Home, +1 Away), momentum swings (+1, +2, +3, -1, -2, -3), or any +/- count you want.
The Code panel shows a live Totals strip with the running sum for every numeric group. The Dashboard exposes sum / mean / min / max aggregations and a cumulative line chart for the same data.
Not strictly a button — a sport-specific pitch you drag onto the canvas. Click any spot to capture an (x, y) location on the most recent event. Shows up as a heatmap in Insights.
Live scoreboard — track Home and Away with one-press buttons
Name a button +1 and pressing it adds 1 to the group's running total. No dialog, no flag, no setup tick-boxes — the naming IS the declaration. Built for the speed of live broadcast tagging.
-
Create the score events
Setup → Add Event → name Home Goal, pick a colour. Repeat for Away Goal. (Point events — single timestamps.)
-
Create the "+1" attributes
Setup → Add Attribute → name +1, group Home Score, link to the Home Goal event. Repeat with group Away Score linked to the Away Goal event. The leading
++ number makes it numeric automatically. -
Tag a goal — one press
Code → press the +1 Home button. OpenTag tags a Home Goal event AND silently records the value 1 against the Home Score group. No prompt. Press again and the total climbs to 2. Tick "Starts the linked event" in the attribute editor if you want one button to do both jobs in one press.
-
Watch the running totals in the Code panel
A Totals strip appears under the status line showing
Home Score: +3 · Away Score: +1live as you tag. Click any chip to play the goals that contributed to that total. -
Build a Hero Counter tile per team
Dashboard (Pro) → + Add tile → Counter → title HOME → Event = Home Goal → Aggregate = Sum of Home Score → tick Scorecard style. Apply. Repeat for Away. Drag side-by-side; turn on Transparent tiles in Settings for a clean broadcast look.
-
Add a session-title text tile
Text tile above the scores → content
{home} v {away}→ big font. The names fill in from Setup → Session Details automatically.
+0.27 for an xG button, +38 for a distance reading, -1 for a turnover deducted. Every press is one click, no typing.Momentum chart — running total over time
A swing-state metric (one team's pressure relative to the other) plotted as a cumulative line — starts at 0, climbs with positive presses, dips with negative ones — so the story of the match reads at a glance.
-
Create a "Momentum" group with +/- buttons
Setup → Add Attribute → group Momentum. Add as many buttons as you need with names like
+1,+2,+3,-1,-2,-3. (Some frameworks rate small advantages as +1 and big chances as +3 — name the buttons to match whatever scoring rubric you use.) No checkbox needed; the +/- in the name is enough. -
Tag through the match — one click each
Press a +1 when the home side has a small advantage, +3 for a clear-cut chance, -2 when they're being battered. The Code panel's Totals strip ticks live so you can see where things stand.
-
Build the cumulative line chart
Dashboard (Pro) → + Add tile → Line → Event = (your linked event, or All events) → Time bin = 30 seconds → Aggregate = Sum of Momentum → Chart mode = Cumulative (running total from 0). Pick green above 0 and red below.
-
Read the chart
The line is the running total at each moment — bumps above 0 = home momentum; dips below = away. Click any dot to play the events in that bin. Tells the story of the half in one glance.
Personalise dashboards with session details
Type variables into a Text tile and OpenTag swaps them for your session's Sport, Home / Away, Date, etc. — so the same dashboard layout produces a different-looking report for every match.
-
Fill in Session Details
Setup → Session Details panel → Sport, Date, Venue, Home, Away, Competition, Notes. A compact breadcrumb appears below the header confirming which session you're tagging.
-
Add a Text tile with variables
Dashboard → + Add tile → Text → type something like:
{home} v {away} {competition} · {date} {venue}Available variables:
{sport}{date}{venue}{home}{away}{comp}(or{competition}){notes}. -
Style it
Use the font / size / weight / colour / alignment controls in the same modal — big bold display font for headers, smaller weight for sub-lines. Make it a transparent tile (Settings → Transparent tiles) for a floating label look.
-
Reuse the dashboard layout
Save the dashboard as JSON. Next match: load the JSON in a fresh session, change Sport / Home / Away in Session Details, the text tile updates automatically. One layout, many reports.
Export your dashboard as a PDF report
Use the Print / PDF button to produce a clean, single-column report — banner up top with your session details, every tile flowing down the page, no app chrome. Saves to PDF via your browser's standard Print dialog.
-
Finish the dashboard you want to share
Make sure Session Details (Sport / Home / Away / Date) are filled in — they appear in the PDF banner.
-
Click 🖨 Print / PDF
The page swaps into print mode (single-column tile layout, big banner at top) and the browser's Print dialog opens.
-
Save as PDF
In the destination dropdown, pick Save as PDF (Chrome, Edge, Safari, Firefox all support this — usually labelled "Microsoft Print to PDF" on Windows or "Save as PDF" on Mac). Save the file. Optionally pick a paper size — A4 portrait or US Letter both work.
-
The view restores automatically
Whether you printed, saved, or cancelled, the dashboard goes back to normal when the dialog closes.
Snapshot a frame — capture a key moment for your report
Click the 📸 button on the video to capture the current paused frame as a JPG. The file downloads to your computer for use anywhere — slides, email, post-match summary. Pro users also get the snapshot dropped onto the Dashboard automatically as an Image tile, pre-titled with the event + timestamp context.
-
Pause on the frame you want
Code tab → scrub or arrow-key to the moment. Pause. The cleaner the frame (no scrub motion blur, no auto-pause mid-frame), the cleaner the snapshot.
-
Click 📸 on the video
Top-right of the video, next to the fullscreen button. Captures at the video's native resolution.
-
JPG downloads to your computer
File name is auto-generated from the most recent event + timestamp (e.g.
shot-12-34.jpg). 85% JPEG quality keeps the file ~150–300 KB for a 1080p still. -
(Pro) Tile lands on the Dashboard
If you have Pro, the same snapshot becomes a new Image tile on the Dashboard, titled "{event name} @ {timestamp}". Drag it to position, resize, set it as a transparent or carded tile in Settings. Save the dashboard JSON to keep it.
Radar profile — visualise a player or team across multiple metrics
A radar (spider) chart with one axis per metric. Each axis is a count of matching events; an optional threshold ring marks the target value. The polygon shows actual values; vertices are clickable to play the contributing events. Use it for player profiles, team scorecards, before/after comparisons.
-
Decide your axes
Pick 4–8 metrics that tell the story of the role. E.g. for a midfielder: Passes · Tackles · Interceptions · Shots · Distance · Saves. Each one is a count of matching events.
-
Add a Radar tile
Dashboard → + Add tile → Radar. The modal opens with 3 default axis rows. Use + Add axis to add more.
-
Fill in each axis
Per row: Label (e.g. "Tackles"), Event (Tackle), optionally Filter group = value (e.g. Player = Player 7), Colour for the axis label, Threshold (optional target — drawn as a dashed reference polygon).
-
Apply and read
The radar fills based on the current session's events. Each axis label appears at its tip in its own colour. The polygon fills with a semi-transparent accent. Where your polygon extends BEYOND the dashed threshold ring you're above target; where it sits inside, below target.
-
Click any vertex to play matching clips
Hover for a tooltip showing value vs target. Click → all events matching that axis play through the standard playlist overlay.
Player = Player 7 (or whichever group identifies players). Save the dashboard layout as JSON; duplicate it for each player by editing the filter value.
Drawing tools — what each one does and how
OpenTag's Draw tab adds shapes, paths, and animations on top of the video for tactical analysis and player feedback. Every tool here is free; only the burn-into-clip export step is Pro. Use the keyboard shortcut listed for each tool to switch fast, and remember that after placing any shape OpenTag auto-flips to Select so you can drag corners / handles immediately.
The "do nothing" / "move things" tool. Click any drawing to pick it; drag the body to translate; drag a corner / endpoint handle to resize or reshape; right-click a tracker marker to delete that sample. Double-click an angle / move / tracker waypoint to commit the placement.
- Pause on the first frame the player appears.
- Click on the player's centre — a head dot is placed and the playhead advances by the configured step size (default 5 frames).
- Click again on the next moment, and so on. Hold Shift + click to advance 3× faster.
- Double-click anywhere when you're done — the path locks. Toggle Done annotating in Properties to lock manually.
- Use Frames per click in Properties to make clicks denser through busy action or sparser through straight runs.
Drag from start to end. After release, OpenTag flips to Select — drag either endpoint to refine. Enable Route simulator in Properties to make the arrow draw itself in across its visibility window. Attach to a tracker (Properties → Attach to player) and the arrow rides with the player.
Same as Arrow but no head. Useful for tactical lines (offside, defensive shape).
Drag from the centre outward — the release point sets the radius. Use the Fill control in Properties (None / 25% / 50%) to highlight zones.
Drag a starting rectangle. On release it becomes a 4-corner polygon — each corner is independently draggable, so you can skew it into any quadrilateral (useful for marking a perspective-projected pitch zone).
Click-drag a scribble. Useful for hand-drawn play diagrams. Route simulator works on freehand too — the stroke draws itself in following your original path.
- Drag from the centre outward — the release point sets the radius.
- Properties → choose Mode: Dim outside darkens everything else; Highlight inside brightens just the spot without touching the rest.
- Pick a Style: Spot (circular pool) or Shaft (broadcast-style beam from the top).
- Adjust strength and edge softness as needed. Multiple spotlights on the same event compose cleanly.
- Pause on the frame where the player is in the wrong position.
- Drag a tight box around them — OpenTag snapshots the entire frame as a freeze backdrop and captures the player as a stamp.
- Click along the path you want the player to take — each click adds a waypoint. The amber bar in the Move lane at the bottom of the timeline shows the animation's duration growing.
- Double-click (or press Done path in Properties) — OpenTag auto-plays the animation: the freeze frame holds, the player stamp slides along the smooth Catmull-Rom curve through your waypoints.
- Toggle Show in clip playback in Properties if you want the move to play during normal scrubbing; off (default) means the move only previews when you click its bar in the Moves lane.
Click where you want the label. Properties auto-focuses on the text input so you can type immediately. Adjust font size, dark background pill, and Attach to player to make a name tag that follows the player as they move.
Drag from the apex (player's head) to the tip (where they're looking). Sets a triangular cone with default 60° spread. Adjust spread and opacity in Properties. Attach to a tracker — cone rotates and slides with the player's head.
Drag from point A to point B. An amber-bordered pill on the line shows the measurement. Calibrate first via Set scale (K) to see real units (metres / yards / feet); otherwise the label reads in pixels.
Three clicks: first arm endpoint, then the vertex (middle point), then second arm endpoint. The reading is in degrees and is independent of calibration. Esc cancels a half-built angle.
Click anywhere to drop a numbered circle. Each subsequent click auto-increments. Tool stays as Sequence so you can rattle out 1-2-3-4 for a play diagram. Press V or Esc to stop.
- Find a reference of known length on the video — a pitch line, an 18-yard box width, a goal.
- Drag from one end of the reference to the other.
- A modal opens; type the real-world length and pick the unit (m / ft / yd / cm).
- The status chip near the fullscreen button turns green. From now on, every Distance shape reads in those units. Calibration persists in Session JSON.
Where did it happen — coding event locations on a pitch
Add a sport-specific pitch to your code window and tag the location of each event. The heatmap and (Pro) zone-breakdown table in Insights show patterns of play that totals alone hide.
-
Drop a pitch on the Setup canvas
Setup tab → drag the Pitch card from the left sidebar onto the canvas. Pick the sport from the dropdown (see the supported list below), optionally link it to specific events (so it only appears in the Code panel when you've tagged one of them), set rotation if your camera is sideline-mounted, and label it.
-
Resize & reposition
Drag the label strip or the pitch face to move. Corner-drag the bottom-right handle to resize — aspect-ratio is locked by default, hold Shift to free-resize. Hover for ↻ rotate, ✎ edit, ✕ delete.
-
(Pro) Add zones
Hover the pitch, click ⛶. In the zone editor, either apply a preset pack (e.g. Football Thirds, Cricket 8 fielding zones) or draw your own rectangles and polygons. Rename inline by double-clicking a zone name in the right-hand list.
-
Tag locations while coding
Code tab → tag an event with a button → click the pitch in the Coding Panel where it happened. A coloured dot lands at the click point. Click again to overwrite. Tag the next event and the marker resets.
-
See the patterns in Insights
Insights tab → scroll past the event totals and cross-tabs → you'll find a per-pitch heatmap card showing every click as a KDE-style density blob. Pick a colour palette in the Insights header (Classic, Fire, Viridis, Cool, Mono). Pro users also see a zone-breakdown table on the right with count + % for each zone (plus an Outside any zone row for clicks that didn't land in any zone).
-
Exports carry the location
CSV gains 4 columns (
LocationPitch,LocationX,LocationY,LocationZones). Sportscode XML gains a<location>block inside each<instance>. Session JSON includes locations automatically.
Supported sports
OpenTag ships pitches for the following sports. Each entry below lists the surface(s) you can drop on the canvas.
Full pitch · Attacking half
Full pitch · Attacking half
Full pitch · Attacking half
Full court · Shooting third
Oval · Wagon wheel
Full court · Half court
Full court · Key + basket
Full court
Full court
Full court
Full pool
Full rink
Full rink
Full field with end zones
Full field
Export MP4 clips of tagged events (in-browser)
Generate one MP4 per event — or one merged highlight reel — without leaving OpenTag. Runs entirely in your browser via ffmpeg.wasm; your video file never uploads anywhere. Free users get a 1-clip preview; Pro unlocks full export, the filter, merged mode, and text overlay.
-
Code your session
Same as any session: load your video in the Code tab, tag events. For Point events set sensible pre/post-roll (Setup → hover → Edit) so each clip includes the lead-in and follow-through. Typical: 3 seconds before, 5 seconds after.
-
Open the export dialog
Either: Export ↓ → Video clips ✂ in the top bar, or Export video clips ✂ at the top of Insights. Both open the same dialog.
-
Filter the events you want
Show [Event ▼] where [Group ▼] = [Value ▼]. Matched count updates live. Then untick any individual events you want to skip (or use the Tick all / Untick all toggle).
-
Pick output mode
Individual files: one MP4 per event, downloaded one by one (filename pattern
{video}_{event}_{HH-MM-SS}.mp4). Single merged video: every selected clip spliced into one MP4 with a 1-second title card before each clip showing "Clip N of M" + the event details. -
Optional: add a text overlay
Tick Add event + attributes as text overlay to burn the event name and attribute values into the bottom of each clip. Useful when sharing without context. Re-encodes (slower than stream copy).
-
Start export and wait
First-time use downloads ffmpeg.wasm (~25MB, one-time, cached afterwards). Then each clip takes ~1-2 seconds (stream copy) or ~real-time (re-encode if overlay is on). The status panel inside the dialog shows progress.
-
Share
Drop the resulting MP4(s) into Google Drive / Dropbox / WeTransfer / Slack. Each clip is a standard MP4 that plays anywhere — no platform sign-up, no video service fees.
Share clips with your players (LosslessCut)
The desktop-app path — works without the browser-based MP4 export, no Pro required. Handy if you've got huge source videos, want lossless desktop-speed cuts, or just prefer LosslessCut's segment-list UI.
-
Code your session
In the Code tab, load your video and tag events with the buttons you set up. Make sure each event has a sensible pre-roll and post-roll (Setup → hover the button → Edit) so clips include the lead-in and follow-through. Typical: 3 seconds before, 5 seconds after.
-
Export the EDL
In the top bar click Export ↓ → EDL. This downloads
opentag-export.edl.csv— a list of clip in/out times paired with event labels. -
Open LosslessCut
Free, open-source video editor. Download from mifi.no/losslesscut — runs on Mac, Windows, and Linux without admin install.
-
Load your video
Drag the original video file into LosslessCut.
-
Import the EDL
File → Import segments → pick the
opentag-export.edl.csvyou just downloaded. Each tagged event becomes a coloured segment on the LosslessCut timeline. -
Filter (optional)
In LosslessCut's segment list, hide or delete segments you don't want to export. For example, keep only Player 1's events, or only successful shots — whatever each player needs.
-
Export clips
Click Export. LosslessCut writes one video file per segment, named with the event label. Because there's no re-encoding this is fast (seconds, not minutes) and lossless.
-
Share
Drop the clip files into a Google Drive / Dropbox / WeTransfer folder, share the link. Each player gets just the clips relevant to them — no platform sign-up, no video service fees.
One button = one full clip (Activator pattern)
When you don't want to think about pressing the Event then a description — just press one button and have the system create the clip for you. Useful for "shot at goal" review where each press should make a clean 10-second clip.
-
Setup the Event button
Drag an Event onto the canvas. Name it Shot, set Mode: Point ◆, Pre-roll: 3, Post-roll: 7. Save.
-
Setup the Attribute that does the work
Drag an Attribute. Name it Successful shot at goal, group Outcome. In the chips, link to Shot. Tick Starts the linked event(s). Save.
-
Tag while watching
In the Code tab with a video loaded, just press Successful shot at goal when you see one. OpenTag automatically creates a Shot event at that timestamp, includes the 3s pre + 7s post in the clip range, and attaches
Outcome = Successful shot at goal. You never have to press the Shot button. -
The 2-second recency window
If you also press the Shot button manually and then press a Starts-event attribute within 2 seconds, the attribute attaches to the existing Shot rather than creating a new one. Lets you mix manual tagging with shortcuts cleanly.
Track possession (or any duration-based state)
For things that have a real length — possession, half, power play, a player on the pitch. The event runs from press one to press two; any attribute pressed in between attaches to it.
-
Create the Toggle events
Drag an Event, name it Possession — Home, set Mode: Toggle ⏵⏸. Save. Repeat for Possession — Away. (Pre/post-roll fields are hidden in Toggle mode — the start and end are the on/off presses.)
-
(Optional) Add an attribute that "swaps" possession
Drag an Attribute called Lost it, group Transition, linked to both Possession events, tick both Starts the linked event(s) and Ends the linked event(s). Pressing it ends a running Possession and is recorded against the closed range. You'd then start the opposite team's possession with one press of its button.
-
Tag a half
In the Code tab, press Possession — Home when Home wins the ball. The button fills with colour and pulses. The status bar shows
● 1 active: Possession — Home 0:12. The session timeline draws a diagonal-stripe bar growing as the video plays. -
End the range
Press Possession — Home again at the moment they lose the ball. The bar locks at that endpoint. The event's duration appears in the Log table's Clip In/Clip Out columns.
-
Watch the totals
Insights → Tier 1 → Event Totals now shows a Mean duration column. After enough possessions you can see average possession length per team at a glance.
Have the last attribute end the event
For a Shot where the outcome is the natural close — Score / Miss / Wide. You start the Shot, fill in details (location, player, type), then press the outcome and the whole Shot wraps in one motion.
-
Setup the Shot event
Shot, Mode: Toggle ⏵⏸. Save.
-
Setup describing attributes (default behaviour)
Location group (Left / Right / Middle), Player group (1–11, Allow multiple values on), Type group (Free kick / Header / Open play). All linked to Shot. Leave both Starts/Ends checkboxes off — these just label the running event.
-
Setup the outcome group as Toggle
Outcome group: Score, Miss, Wide. For each, link to Shot, tick Ends the linked event(s). Pressing any of these on a running Shot will end it (and attach the outcome to the closed range).
-
Tag a shot in one flow
Press Shot → it starts running (1 active). Press Left → attached. Press Player 7 → attached. Press Header → attached. Press Score → Shot ends here, Outcome = Score is attached to the closed range. Status bar drops to "Last: Shot at 0:32" and you're ready for the next one.
Tag multiple players on one event
Shot deflected from Player 1 to Player 2, scored by Player 3 — all on one event without duplicating Shots.
-
Make the Player group multi-value
Setup → edit any Player attribute. Tick Allow multiple values per event. This applies to the whole Player group (one attribute = the same setting for all its peers).
-
Code naturally
Press Shot at 0:30. Press Player 1, Player 2, Player 3 — all three light up and all attach. Press Player 2 again to remove (toggle off). The Coding Panel group label now reads Player [multi] so the behaviour is discoverable.
-
Insights handle it
Tier 1 cross-tab counts each player separately ("once per player"). Total Shots stays accurate. Query Builder Breakdowns include each value with the same "once per player" semantic. CSV exports get pipe-delimited values (
1|2|3). Sportscode XML emits one<label>per (group, value) pair.
Hand a player only their clips
Quick variant of the EDL workflow above. Use the timeline filter to keep only the clips relevant to one player before exporting.
-
Code the session as normal
Make sure Player is a multi-value attribute group (so multi-player events still match).
-
Filter the timeline
In the Code tab session view, set Player → 7. Everything that doesn't involve Player 7 dims; the count updates "Showing 8 of 23". Click any block to verify it's a Player 7 moment.
-
Export EDL (or CSV) and proceed
Filter currently affects the timeline only — the full EDL still exports everything. For Player 7-only clips, manually remove the others in LosslessCut after import using the segment list (matched up with the filter chips you saw). A future update will let the EDL export honour the active filter directly.
Share a session for players to view (no downloads)
Coach uploads the video once to their own storage (Dropbox, Cloudflare R2, YouTube unlisted), shares the session JSON + the video URL with players, and players see a filtered, read-only timeline in their browser. No video file ever crosses OpenTag's hands.
This workflow needs the Load from URL feature, which is on the build list. Status will update here when it ships.
Help Reference
What every part of OpenTag does, in plain language. Looking for step-by-step instructions? Open Workflows instead. By Andrew Callaway.