Code Window iDrag Event or Attribute buttons from the sidebar onto the canvas. Reposition by dragging. Hover to edit ✎ or delete ✕. 0 buttons
MENU

Load a video to begin coding

00:00 / 00:00

Coding Panel

No events tagged

Add buttons in Setup first

Annotation tools
Defaults for new drawings

Select a drawing on the video to edit its properties — colour, width, fill, caption.

Tag events to populate the timeline

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.

Coding panel Concepts Free

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.

Point Event
Single moment

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).

⏵⏸
Toggle Event
Ranged moment

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.

Attribute (Single value)
Descriptor

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.

Attribute (Multi-value)
Descriptor

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.

Activator attribute
One press = one event

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.

±
Numeric attribute
Live scoreboards · momentum · running totals

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.

Pitch widget
Spatial

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.

All buttons can have an optional keyboard shortcut for fast live tagging. Set it in the button's Setup screen — single character (q, w, 1, etc.).
Numeric attributes Dashboard Free + Pro

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.

  1. Create the score events

    Setup → Add Event → name Home Goal, pick a colour. Repeat for Away Goal. (Point events — single timestamps.)

  2. 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.

  3. 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.

  4. Watch the running totals in the Code panel

    A Totals strip appears under the status line showing Home Score: +3 · Away Score: +1 live as you tag. Click any chip to play the goals that contributed to that total.

  5. 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.

  6. 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.

Same pattern, any metric. Sub +1 with anything: +0.27 for an xG button, +38 for a distance reading, -1 for a turnover deducted. Every press is one click, no typing.
Numeric attributes Dashboard Pro

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Use Diverging mode instead for per-bin (not cumulative) view — useful when you care about "what happened in this minute" rather than "where are we overall". Mean aggregate gives average pressure-per-bin; Min / Max spot the extreme moments.
Dashboard Personalise Pro

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.

  1. 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.

  2. 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}.

  3. 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.

  4. 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.

Dashboard Export Pro

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.

  1. Finish the dashboard you want to share

    Make sure Session Details (Sport / Home / Away / Date) are filled in — they appear in the PDF banner.

  2. Click 🖨 Print / PDF

    The page swaps into print mode (single-column tile layout, big banner at top) and the browser's Print dialog opens.

  3. 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.

  4. The view restores automatically

    Whether you printed, saved, or cancelled, the dashboard goes back to normal when the dialog closes.

Sharing it: attach the PDF to an email, post-match summary, or end-of-season report. The PDF is a frozen snapshot — when you want live updates, the in-app dashboard is the source.
Video Reports Free + Pro

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.

  1. 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.

  2. Click 📸 on the video

    Top-right of the video, next to the fullscreen button. Captures at the video's native resolution.

  3. 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.

  4. (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.

Heads up: the snapshot captures the raw video pixels — drawings, spotlights, and other overlays sit on a separate canvas and aren't included. (Ask if you want this baked in.) Cross-origin videos (some CDN-hosted sources) block frame readback for security; the toast will tell you when that's the case.
Dashboard Tactical reports Pro

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.

  1. 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.

  2. Add a Radar tile

    Dashboard → + Add tile → Radar. The modal opens with 3 default axis rows. Use + Add axis to add more.

  3. 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).

  4. 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.

  5. 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.

For per-player profiles: filter each axis by Player = Player 7 (or whichever group identifies players). Save the dashboard layout as JSON; duplicate it for each player by editing the filter value.
Draw tab Reference Free

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.

Select V
Universal

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.

Track player T
Tracking
  1. Pause on the first frame the player appears.
  2. Click on the player's centre — a head dot is placed and the playhead advances by the configured step size (default 5 frames).
  3. Click again on the next moment, and so on. Hold Shift + click to advance 3× faster.
  4. Double-click anywhere when you're done — the path locks. Toggle Done annotating in Properties to lock manually.
  5. Use Frames per click in Properties to make clicks denser through busy action or sparser through straight runs.
Arrow A
Annotation

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.

Line L
Annotation

Same as Arrow but no head. Useful for tactical lines (offside, defensive shape).

Circle C
Annotation

Drag from the centre outward — the release point sets the radius. Use the Fill control in Properties (None / 25% / 50%) to highlight zones.

Rectangle / quadrilateral R
Annotation

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).

Freehand F
Annotation

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.

Spotlight H
Emphasis
  1. Drag from the centre outward — the release point sets the radius.
  2. Properties → choose Mode: Dim outside darkens everything else; Highlight inside brightens just the spot without touching the rest.
  3. Pick a Style: Spot (circular pool) or Shaft (broadcast-style beam from the top).
  4. Adjust strength and edge softness as needed. Multiple spotlights on the same event compose cleanly.
Move player M
Animation
  1. Pause on the frame where the player is in the wrong position.
  2. Drag a tight box around them — OpenTag snapshots the entire frame as a freeze backdrop and captures the player as a stamp.
  3. 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.
  4. 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.
  5. 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.
A
Text label X
Annotation

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.

Field of view G
Tactical

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.

Distance D
Measurement

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.

Angle N
Measurement

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.

Sequence marker Q
Tactical

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.

Set scale K
Setup
  1. Find a reference of known length on the video — a pitch line, an 18-yard box width, a goal.
  2. Drag from one end of the reference to the other.
  3. A modal opens; type the real-world length and pick the unit (m / ft / yd / cm).
  4. The status chip near the fullscreen button turns green. From now on, every Distance shape reads in those units. Calibration persists in Session JSON.
All shapes (except Move) accept Visibility (Show from / until), Attach to player (slide with a tracker), Route simulator (line / arrow / distance / freehand), and Flash (any shape) effects via the Properties panel. Compose freely.
Spatial capture Pitches + zones Free + Pro

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.

  1. 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.

  2. 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.

  3. (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.

  4. 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.

  5. 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).

  6. 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.

Football (Soccer)
Full pitch · Attacking half
Rugby Union
Full pitch · Attacking half
Field Hockey
Full pitch · Attacking half
Netball
Full court · Shooting third
Cricket
Oval · Wagon wheel
Tennis
Full court · Half court
Basketball
Full court · Key + basket
Volleyball
Full court
Futsal
Full court
Handball
Full court
Water Polo
Full pool
Ice Hockey
Full rink
Roller Hockey
Full rink
American Football
Full field with end zones
Lacrosse
Full field
Free vs Pro: dropping pitches, capturing locations, the heatmap, and Log/CSV/XML location columns are all free. Pro unlocks zone drawing, preset packs, and the zone-breakdown count table.
Video clips Pro Most common

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.

  1. 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.

  2. 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.

  3. 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).

  4. 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.

  5. 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).

  6. 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.

  7. 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.

Heavy source videos (multi-GB) may strain browser memory — process in smaller batches if you hit issues. For huge sources or many clips at once, the LosslessCut workflow below is still the fastest path.
Sharing LosslessCut Free

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.

  1. 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.

  2. 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.

  3. Open LosslessCut

    Free, open-source video editor. Download from mifi.no/losslesscut — runs on Mac, Windows, and Linux without admin install.

  4. Load your video

    Drag the original video file into LosslessCut.

  5. Import the EDL

    File → Import segments → pick the opentag-export.edl.csv you just downloaded. Each tagged event becomes a coloured segment on the LosslessCut timeline.

  6. 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.

  7. 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.

  8. 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.

Coming soon: a "Load from URL" feature so coaches can share just a session JSON and a video link. Players open OpenTag, paste the link, load the JSON, and view a filtered timeline — no clip downloads at all.
One-press tagging Activator attributes Free

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.

  1. Setup the Event button

    Drag an Event onto the canvas. Name it Shot, set Mode: Point ◆, Pre-roll: 3, Post-roll: 7. Save.

  2. 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.

  3. 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.

  4. 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.

Time-based events Toggle mode Free

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.

  1. 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.)

  2. (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.

  3. 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.

  4. 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.

  5. 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.

Cap: up to 20 toggle events can run concurrently. So you can track Half 1 + Possession + Player 1 on pitch + Player 2 on pitch + … without limits in practice. The status bar lists every active range.
Auto-deactivation Toggle attributes Free

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.

  1. Setup the Shot event

    Shot, Mode: Toggle ⏵⏸. Save.

  2. 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.

  3. 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).

  4. 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.

Why this works: attributes that label state stay on Attach; the one attribute that concludes the event uses Toggle. You don't have to remember to press Shot again to stop it.
Multi-value Free

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.

  1. 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).

  2. 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.

  3. 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.

Sharing Timeline filter Pro

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.

  1. Code the session as normal

    Make sure Player is a multi-value attribute group (so multi-player events still match).

  2. 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.

  3. 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.

Planned

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.

↻ Show the Getting Started guide

Privacy Notice  ·  Terms of Use

Setup

Where you design your coding panel. Drag Event or Attribute cards from the sidebar onto the canvas, fill in the popup, and the button appears. Drag to reposition; hover for edit/delete.

Events — moments or ranges in footage

Two modes:

  • Point ◆ (default) — single timestamp with optional pre/post-roll (e.g. shot at goal, set 3s pre, 7s post for a 10-second highlight clip).
  • Toggle ⏵⏸ — time-based. First press starts, second press ends. Use for things that have duration: Possession-Home, Player 1 on the field, Half 1, Power play. Up to 20 toggles can run concurrently. Pre/post-roll is hidden in this mode (the on/off presses define the range).

Each event has a name, colour, and optional keyboard shortcut. Use Shot; Pass; Goal in the name field to bulk-create.

Attributes — labels that describe events

Each attribute belongs to a group (Outcome, Player, Zone…). The Link to Events chips set which events the attribute belongs to. By default, pressing an attribute attaches it to any currently active linked event(s), or to the most recent event if none are active. Two optional checkboxes change that:

  • Starts the linked event(s) — pressing this attribute creates the linked event at the current timestamp, in addition to attaching itself. Saves a click compared to pressing the event button first. If a linked event is already active (or was tagged within the last 2 seconds), it attaches instead of starting a new one. Example: a "Successful shot at goal" attribute auto-starts a Shot event with the clip pre/post-roll.
  • Ends the linked event(s) — pressing this attribute closes any currently active linked event, applying pre/post-roll, and attaches itself to the closed range. Example: a "Lost possession" attribute ends a running Possession event.
  • Tick both for a flip-on-flip-off toggle — first press starts, second press ends.
  • Leave both off for pure attach (default).

Multi-value attribute groups

By default each group holds one value per event (Outcome=Success replaces Outcome=Fail on the same event). Tick Allow multiple values per event in the attribute editor to make the whole group multi-value — useful for Player groups so a single Shot can record Player 1 and Player 2 and Player 3. Pressing the same value again removes it (toggle on/off). The Coding Panel shows a "multi" badge on these group labels.

Numeric attributes — scoreboards, momentum, measurements

Name an attribute starting with + or - and a number — e.g. +1, -3, +5 Home, +0.27. Pressing the button silently adds that value to the group's running total. No checkbox to tick — the naming IS the declaration. Build scoreboards (+1 Home; +1 Away), momentum buttons (+1; +2; +3; -1; -2; -3 in a "Momentum" group), or any +/- count you want.

If a numeric attribute has no linked event, pressing it auto-creates a session event named after the group at the current timestamp — so scoreboards work with zero Setup ceremony. The Code panel shows a live Totals strip with the running sum per numeric group; click any chip to play the contributing events.

Bulk creation — semicolons in either field

Name +1; -1 in the Name field creates two buttons. Group Home Score; Away Score in the Group field creates them in two groups. Both together creates the cross-product — a full scoreboard (4 buttons) in one save.

Config files

Save Config exports just your button layout as JSON, reusable across sessions. Load Config restores it. This is separate from a Session file, which contains the config plus all coded data.

Code

Where you tag the footage. Load a local video file, hit Event buttons (or their keyboard shortcut) to log timestamped events. Press Attribute buttons after to describe the most-recent event — or to start/end active toggle events via the Starts/Ends-event flags.

Live indicators

  • Active toggle events get a filled coloured fill, a pulsing border, and a leading dot in the Coding Panel.
  • The status bar shows ● N active: with each running event and its start time.
  • The session timeline shows live ranges with a diagonal stripe pattern that extends as the video plays.
  • Attribute buttons whose value is currently on the active event light up in solid accent colour.
  • Totals strip — when any group is numeric (uses the +/- name pattern), a row of chips appears under the status bar showing the running sum per group. Click any chip to play the events that built that total.

Snapshot frames

📸 button on the video captures the current frame as a JPG at native resolution. File downloads to your computer; Pro users also get the snapshot dropped onto the Dashboard as an Image tile pre-titled with the event + timestamp.

Session breadcrumb

A small strip beneath the header shows whatever Session Details you've filled in (Sport · Competition · Home v Away · Venue · Date). Updates live as you type in Setup. Hidden until at least one field has a value. Same fields are available as {var} tokens in Dashboard Text tiles (e.g. {home} v {away}).

Coding panel layouts

  • List — buttons grouped by type (Events, then each Attribute group).
  • Spatial — buttons positioned to mirror your canvas layout, scaled to fit the panel.
  • Float — panel detaches and becomes a draggable, resizable overlay; the video goes full-width.

Resizable panel

Drag the vertical splitter between the video and coding panel to make either side wider. Min width is clamped so nothing disappears.

Keyboard shortcuts

  • Space — Play/Pause
  • / — Seek ±5 seconds
  • Your assigned key — Trigger that Event button

Disabled while typing in any input or text area.

Session view & filter

Timeline below the video — one swimlane per event type, each block showing clip extent. Click any block to seek the video to that moment. The filter bar at the top has dropdowns for Event and each attribute group; pick values to dim non-matching blocks (the count updates: "Showing 5 of 12"). Use this to quickly find e.g. all of Player 1's successful shots, or all Possession-Home moments.

Spatial Capture — Pitches & Zones

OpenTag includes sport-specific pitch diagrams you can drop into your code window. Clicking a pitch while coding records the location of an event — and (Pro) classifies it into named zones.

Pitches (Free)

Drag the Pitch card from the sidebar onto the Setup canvas. Pick a sport from the dropdown (14 surfaces — Football, Rugby, Hockey, Netball, Cricket, Tennis, Basketball), optionally link it to specific events, set rotation (0°/90°/180°/270°), and label it. Once placed, drag to reposition, corner-drag the handle (bottom-right) to resize (hold Shift to break the aspect-ratio lock). Hover for ↻ rotate, ✎ edit, ✕ delete.

Click to capture (Free)

In the Code tab, after tagging an event, click the pitch in the Coding Panel. A coloured dot lands at the click point and the location is stored on the event — including the (x, y) coordinates in the pitch's native viewBox space (rotation-corrected). Clicking again overwrites. Move on to the next event and the marker resets.

Zones (Pro)

Pro adds a ⛶ zones button to each pitch's hover controls. The zone editor opens in a slide-out modal with three drawing modes:

  • Rectangle — click-drag on the pitch to draw a rectangle, then name it inline.
  • Polygon — click for each vertex, double-click (or Enter) to close. Esc cancels.
  • Select — click a zone to select; drag the body to move or drag a corner/vertex handle to reshape. Delete key removes.

An Apply preset dropdown loads sport-specific zone packs (e.g. Football Thirds, Halves, 5 Channels, Boxes & D; Cricket 8 fielding zones; Rugby 22s & in-goal; etc.) — apply, then edit to taste. Double-click a zone's name in the right-hand list to rename inline.

Heatmap & counts (Insights)

The Insights tab shows a per-pitch card with two halves:

  • Heatmap (Free) — a KDE-style density heatmap of every click on that pitch, drawn on a canvas overlay. Honours rotation. Pick from 5 colour palettes (Classic, Fire, Viridis, Cool, Mono) in the Insights header.
  • Zone breakdown (Pro) — a sorted count table of how many events landed in each zone, with an Outside any zone row for the rest.

Filtering the heatmap by event type, attributes, and time windows is coming as a Pro feature in a future release.

Exports

  • CSV gains four columns at the end: LocationPitch, LocationX, LocationY, LocationZones (pipe-delimited).
  • Sportscode XML adds a <location> block inside each <instance> with <pitch>, <x>, <y>, and <zones>.
  • Session JSON includes locations on each session event automatically.

Insights

Tier 1 — Overview (Free)

  • Event Totals — count and percentage of each event type. For Toggle events, a Mean duration column appears (computed across closed ranges; still-active toggles are flagged).
  • Cross-tabs — one matrix per attribute group, events × values, cells shaded by frequency. Multi-value attribute groups count each value separately ("once per player").

Tier 2 — Query Builder

Build custom queries from constrained dropdowns populated by your own coded data. No hardcoded sport assumptions. Five query types:

  • Breakdown — Show me [Event] broken down by [Group]
  • Cross-tab — [Event] as [Group] × [Group] with row-% mode
  • Time distribution — How often do [Event] happen every [N min]
  • Filtered view — Show [Event] where [Group] = [Value], optionally broken down further
  • Compare events — Pick two or more events, compare across a group side by side

Every breakdown / cross-tab shows count and percentage side by side — no toggle needed.

Numeric metrics

Any attribute group that uses the +/- name pattern (e.g. +1, -3, +0.27) is automatically detected as numeric. Insights tier 1 surfaces a Numeric metrics card with N, Sum, Mean, Min, Max per metric. Categorical cross-tabs skip numeric groups so they don't get junk columns.

Click-to-play clips from any Insights cell

Every count cell in Event Totals, in any per-group cross-tab, in Query Builder results, and in the zone-breakdown table is clickable. Clicking starts a playlist that walks the matching events with a small Prev/Next/Stop overlay on the video. Same machinery powers the Dashboard tile clicks.

Location heatmaps + filter (Pro)

Each pitch you've tagged events on gets a heatmap card showing every click as a coloured density blob (pick from 5 palettes: Classic, Fire, Viridis, Cool, Mono). Pro users also get a per-card filter row: Show [Event ▼] where [Group ▼] = [Value ▼], with a live "X of Y events" count and a Reset button. Each pitch's filter is independent — narrow one card to a player's shots without affecting the other. Free users see the full heatmap (no filter) plus an upgrade prompt.

Dashboard (Pro)

A curated canvas of tiles that present the story your data tells. Each tile is a saved query; every cell, bar, slice, dot or heat zone clicks through to play the matching clips. Build for the team meeting, save the layout as JSON, reload it for the next match, print to PDF when you're done.

Tile types (9)

  • Counter — single big number. Optional Scorecard style (96 px display font for HOME / AWAY scoreboards) and Compare with previous window (running totals with a ↑+3 / ↓-2 delta line).
  • Bar chart — horizontal bars per group value. Default single-accent colour (same variable, same colour); tick Multi-colour for cycling palette.
  • Pie chart — slices coloured by an 8-hue palette, with a labelled legend showing count + percentage per slice.
  • Cross-tab — 2-axis matrix with optional heatmap-palette cell tint (Classic / Fire / Viridis / Cool / Mono / None). Rotated axis labels on the left + above.
  • Heatmap — embedded location heatmap from a chosen pitch. Click the whole tile to play the events that built it.
  • Line chart — events (or numeric aggregate) per time bin. Three modes: Standard (0 at bottom), Diverging (0 in middle, +/− two-colour fill), Cumulative (running total from 0 — momentum, score-over-time).
  • Radar chart — N-axis polygon plot. One axis per metric, optional threshold ring, vertices clickable.
  • Text — narrative tile. Variables {home}, {away}, {sport}, {date}, {venue}, {comp}, {notes} auto-fill from Setup → Session Details. Full font / size / weight / alignment / colour controls.
  • Image — upload a PNG / JPG / SVG, or click the 📸 button on the video to drop a frame straight onto the dashboard.

Canvas behaviour

Tiles are freeform-positioned (drag from the header / grip; resize from the bottom-right corner). Snap-to-alignment guides appear during the drag — light-blue lines confirm when your tile edges line up with neighbours. Settings in the dashboard header configures the background (grid / white / uploaded image with opacity) and toggles Transparent tiles for a presentation look.

Aggregations on numeric metrics

Counter and Line tiles offer Count of events (Σ presses) · Sum of · Mean of · Min of · Max of on any numeric attribute group. Picking an event that has a linked numeric group auto-defaults the aggregate to Sum and pre-selects the metric. Decimals picker controls precision (Auto keeps integers integer; 0/1/2/3 force fixed places).

Save / Load / Print

Save downloads opentag-dashboard.json. Load accepts a dashboard JSON file (asks whether to append or replace). 🖨 Print / PDF swaps the page into a single-column report layout with a session metadata banner at the top, then opens the browser's Print dialog — pick Save as PDF to download.

Click-to-play

Every numeric cell, bar, pie slice, cross-tab cell, line dot, radar vertex, and heatmap is a clip-cell. Clicking starts a playlist player on the video with Prev / Next / Stop controls. The mini overlay shows "Clip 3 of 12 · {event} @ {timestamp}" so you know what's playing.

Log

Sortable table of every tagged event. Click a row to edit — change the event type, timestamp, pre/post-roll, end time (for toggles), or attribute values, all drawn from your Setup definitions. Click a timestamp to jump the video; click × on a row to delete (or use the Delete button inside the edit modal); Clear All wipes everything (with confirmation). Columns include the Clip In / Clip Out times — for Point events these are timestamp ± pre/post-roll; for Toggle events they're the start and end of the range. Multi-value attribute groups show one pill per value. Location coordinates aren't editable from the Log — re-tag via the Code tab's pitch widget to update them.

Export formats

  • CSV — Spreadsheet-ready, one row per event, attribute columns per group. Opens in Excel / Sheets / any data tool.
  • EDL — Edit Decision List for LosslessCut. Use this if you'd rather cut clips in LosslessCut and don't need OpenTag's in-browser MP4 export. See Workflows → Share clips with your players (LosslessCut) for the full pipeline.
  • Sportscode XML — Hudl Sportscode and compatible tools. Events become coded instances with colour and label data preserved.
  • Session JSON — Full backup: config + coded events + session metadata. Use Load Session to restore.
  • Video clips ✂ (in-browser MP4 export, Pro for the full feature; Free gets a 1-clip preview). Opens a dedicated dialog with a filter row, per-event checkboxes, an output-mode toggle (individual files / single merged video with title cards), and an option to add the event name + attributes as a text overlay at the bottom of each clip. Powered by ffmpeg.wasm running entirely in your browser — your video never leaves your machine. Also reachable from the Export video clips ✂ button at the top of Insights. See Workflows → Make highlight reels from tagged events.

Account & tiers

The Sign in button (top right) is optional — the full tool works without an account. Tagging, exports, Insights (including Query Builder and click-to-play clips) are completely free. Pro (£99 / year) unlocks the Dashboard, zone tools, per-user usage stats, and the full video-clip export.

Upgrade from the Account button (top right). Cancel anytime via Stripe's Customer Portal. 14-day refund period for UK / EU consumers.

Support

The core of OpenTag — tagging, exports, location heatmaps, the full Query Builder — is free and stays free. Pro (£99 / year) unlocks the Dashboard, zone tools, and zone filtering, and helps fund hosting plus ongoing development.

Got a feature idea, hit a bug, or something feels off? Use Feedback in the top bar — browser info is attached automatically and we read everything.

© Andrew Callaway