Soccer Video Tools
Contents

User Manual

Every button in Soccer Video Tools, screen by screen. Button names are shown the way they look in the app, like Load; text boxes and lists look like this.

Getting started

Start the app by double-clicking start.bat in the web folder. It opens in your browser at http://localhost:5000. Everything runs on your own PC; your videos are never uploaded.

  1. Add your team under Teams & Rosters: the team name, then each player and their shirt number.
  2. Load the match: Browse to the video file and press Load.
  3. Tag the game: press Space when something happens, pick the player and the event, press Enter. Play carries on.
  4. Tune the clips in Generate Reels → Clip Editor: preview them, zoom in, follow a player.
  5. Render on the Generate tab, or download single clips straight from the Clip Editor.
  6. Publish: copy chapter timestamps for YouTube from YT Chapters.
Browse buttons open a file window on the PC running the app. If it doesn't appear, check behind the browser window. You can also paste a full file path into the box and press Load.

Main screen

The main screen is where you watch the game and tag what happens: the video player on the left, the tagging panel on the right and the event log underneath.

Top bar

ControlWhat it does
Teams & RostersOpens the team and player lists used by the tagging panel. See Teams & Rosters.
Generate ReelsOpens the Clip Editor, the Generate settings and the Watch Reels player. See Generate Reels.
YT ChaptersBuilds YouTube chapter timestamps from your tags. See YT Chapters.
HelpShows the keyboard shortcuts. H opens and closes it too.

Video and player

ControlWhat it does
Video boxThe path of the match video. Paste a path here, or use Browse.
BrowsePicks the video file from your PC.
LoadOpens the video in the player. Large 4K files stream straight from disk. Loading a video also sets up its event log next to it, and brings back any external audio sync you saved for it.
◀◀ ▶ ▶▶Rewind 10 seconds, play / pause and forward 10 seconds. Keys: [ or ←, Space, ] or →.
Time displayCurrent position and the video's length.
Timeline (scrubber)Drag to move through the game. Each tag shows as a small marker on it, and a trim for the full video shows as shaded ends.
- 1.00x +Playback speed, in 0.25x steps. Keys: - and +.
− 1.0x + ↺Zoom the player out, in, and back to the full picture. You can also scroll on the video to zoom where the pointer is, drag to move around, and double-click to reset. This zoom is only for watching (for example to read a shirt number); it doesn't change your videos.

Trim full video

Sets where the full-game video (an option on the Generate tab) starts and ends, for cutting off the warm-up or the walk off.

ControlWhat it does
⇤ Set start hereThe full video starts at the player's current position. Also ticks "Also render the full game video" on the Generate tab.
Set end here ⇥The full video ends at the current position.
Clear trimUses the whole footage again.
Trim displayShows the chosen start and end and the resulting length, or "Not trimmed".

Event log file

Your tags are saved automatically, a moment after each change, to a file called event_log.json next to the video. This includes each clip's zoom, framing and followed path.

ControlWhat it does
Event log boxWhere the tags are saved. It's filled in for you when you load a video.
BrowsePicks a different log file, for example one saved from an earlier session.
LoadLoads the tags from the log file in the box, to carry on where you left off.
Save statusConfirms when the log was last saved.

External audio

Use sound recorded separately (commentary on a phone, or an audio recorder) instead of, or mixed with, the camera's sound. It plays in the app and goes into every video you render.

ControlWhat it does
External audio boxThe audio file's path. Several files can be typed separated by |.
BrowsePicks the audio file. If your recorder splits long recordings into parts, select every part at once; they're sorted by name and joined end to end.
AddAdds more parts after the current ones, for example from another folder. Shown once audio is loaded.
LoadLoads the files typed in the box.
RemoveStops using external audio.
Parts list ↑ ↓ ✕For split recordings: move a part earlier or later, or remove it. If the file names carry the recorder's start times, the app warns about gaps or a wrong order.
-1s -.1 -.01 … +1sNudge the audio earlier or later by 1, 0.1 or 0.01 seconds.
Offset boxThe exact time in the video where the audio file starts. Negative means the audio started before the video.
Auto-syncLines the audio up for you by comparing it with the camera's own sound. Check it by ear afterwards.
Replace game audio / Mix with game audioUse only the external audio, or play it over the camera's sound.
Game and Audio slidersThe camera's volume (in mix mode) and the external audio's volume.

Tagging panel

Press Space when something happens: the game pauses so you can tag it. Pick a player and an event, add a note if you like, and press Enter.

ControlWhat it does
Team listChooses which team's players appear below.
Player buttons #9 MateoPicks the player for the tag. Players come from Teams & Rosters.
GA tag with no particular player, such as an opponent's goal. Picked for you if you choose Goal without a player. "G" tags go into the goals reel but never into a player reel or a name overlay.
Event buttons Touch Pass Shot Steal Save Foul Goal OtherPicks what happened. Keys: T P S X V F G O. The event decides the clip's length (see Category Windows).
Note boxOptional text, like "header from the corner". It appears in the event log and in YouTube chapters. N jumps to it.
Save Tag (Enter)Saves the tag at the paused moment and resumes play. Needs a player and an event.
Cancel (Esc)Drops the tag and resumes play.

Event log

ControlWhat it does
A row in the tableClick it to jump the player to that moment.
× on a rowDeletes that tag.
Undo (U)Removes the most recent tag.
Clear AllDeletes every tag, after asking you to confirm.

Teams & Rosters

Teams and players are saved on your PC and appear in the tagging panel's Team list and player buttons.

ControlWhat it does
New team name + AddCreates a team. Enter works too.
A team in the listClick it to show and edit its players on the right.
× next to a teamRemoves the team and all its players, after asking you to confirm.
Player name + # + AddAdds a player to the selected team, with an optional shirt number (0–99).
# box on a playerChanges that player's shirt number. Numbers show on the player buttons and in name overlays, like "#9 Mateo".
× next to a playerRemoves the player from the team. Tags you already made for them are kept.
× (top right)Closes the window. Esc also works.

Generate Reels

Turns your tags into videos. It has three tabs: Clip Editor to check and frame each clip, Generate to render everything, and Watch Reels to play the results.

Clip Editor

Every tag becomes a clip that starts a little before the tagged moment and ends a little after it.

ControlWhat it does
Category Windows: Default, Shot / Save, GoalSeconds before and after the tag for each kind of event. Defaults: 3 s and 3 s for most events, 4 s and 4 s for shots and saves, 7 s before and 6 s after a goal.
Refresh ClipsRecalculates the clip list after you change the windows or your tags.
A row in the clip tableSelects the clip and opens its adjuster below. The Zoom column shows its framing, for example "1.5x + follow · 9:16 1.20x".
▶ on a rowPreviews that clip.
Before / After slidersLengthen or shorten this clip only, from 0 to 30 seconds each way.
Reset to Category DefaultPuts this clip back to its category's window.
Preview Clip / StopPlays the clip in the preview below, or stops it. Playback stops at the clip's end.
Download clipRenders just this clip, with the Generate tab's settings (name overlay, logo, audio, framing), and saves it to your browser's Downloads folder. No output folder needed. Downloading the same clip again is almost instant.
Download 9:16The same, as a vertical video for Instagram and TikTok.
Overlapping clips merge automatically when reels are rendered, so a quick shot, save and goal play as one smooth sequence.

Clip preview

The preview shows exactly what the rendered clip will look like.

ControlWhat it does
Scroll / drag / double-click on the previewZoom in on the action, move the framing around, or reset to the full picture.
Zoom readout 1.5x → 2560×1440The zoom and the size the clip will render at. Zoom goes up to 2x on 4K footage. Zoomed clips are shrunk to a standard size and never enlarged, so they stay sharp. 1080p footage can't be zoomed.
Use this framing for clipSaves the current zoom and position to the clip, so the rendered clip uses them.
Clear zoomRemoves the clip's zoom (and any followed player).
× on the previewCloses the preview.
Reel sizes: a reel renders at the size of its most-zoomed clip, and the other clips are shrunk to match. A reel with a 2x clip is 1080p; one with no zoom stays 4K.

Follow a player

Makes the zoomed framing follow one player through the clip, like a camera operator. It needs footage above 1080p.

ControlWhat it does
Follow a playerZooms in to 1.5x if needed and pauses. Click the player in the preview, ideally in a frame where they're clearly visible. The app then tracks them through the clip; the first time, it downloads its 36 MB tracking model.
Confidence stripUnder the preview: green = confident, amber = another player was close by, red = lost (position estimated), white marks = your clicks. Click the strip to jump there.
Correct position herePause where the framing lost the player (usually amber or red), press this, then click the player. Tracking restarts from that point; earlier parts stay as they were.
Remove nearest correctionRemoves the correction click closest to the playhead and re-tracks.
Follow a different playerStarts again with a new first click.
Stop followingKeeps the clip's zoom but no longer follows anyone.

The followed path is saved with the clip automatically, and is used in both landscape and 9:16 videos. Dragging the preview doesn't move the framing while a player is followed.

9:16 framing

Positions the slice that vertical (9:16) videos keep.

ControlWhat it does
9:16 framing / Done with 9:16Shows the whole picture with a tall outline of the vertical slice, or goes back to the normal view.
Drag the outlineMoves the slice. Its position is saved to the clip as you let go.
Scroll on the previewZooms the slice. The readout shows the size, e.g. "1.26x → 720×1280". 4K stays 1080×1920 up to 1.125x and can zoom to about 1.7x at 720×1280.
Reset 9:16Goes back to centring on the clip's zoom.

A clip that follows a player has its slice follow them too. Footage under 1280 rows uses the blurred-background layout, so there's nothing to position.

Generate tab

Renders every reel at once. These settings also apply to single-clip downloads.

ControlWhat it does
Video fileThe loaded video (filled in for you).
Output directory + BrowseThe folder the videos are saved to.

Overlay Settings

Show on player reelsAdds the player's name (and number) to their clips.
Text position, Font sizeWhich corner the name goes in, and how big it is (12–120).
Logo watermark + BrowseA PNG or JPG logo, such as your club crest, put on every video.
Logo position, Logo size, Logo opacityIts corner, its size (5–40% of the width) and how see-through it is. If the name and logo would share a corner, the name moves out of the way.

Full Video

Also render the full game videoAlso saves the whole game as one video, trimmed if you set a trim.
Add the logo watermark to the full videoPuts the logo on it too. This re-encodes the whole game, which is slow. Unticked (and with no zoom), the full video is copied without re-encoding, which is nearly instant.
Zoom sliderZooms the whole game up to 2x, for example about 1.1x to crop out a camera's burned-in clock and logo. A preview shows what's kept.
KeepWhich part of the picture the zoom keeps: top (crops the bottom), centre, or bottom.
Output sizeStandard size, never enlarged (1.1x of 4K = 1440p, 2x = 1080p), or the same size as the source.
Start at / End at + Set to current / ClearThe full video's trim, typed as m:ss or h:mm:ss, or taken from the player's position. Same as the trim buttons on the main screen.

Vertical (9:16) for Instagram & TikTok

Also export vertical 9:16 versionsSaves every reel again at 1080×1920 (or 720×1280 for zoomed clips) in a vertical folder, plus each clip on its own in vertical/clips, ready to post.
LayoutCrop to fill: a full-height slice of the picture, positioned per clip with 9:16 framing. Whole picture over a blurred background: the full wide shot across the middle. Footage under 1280 rows always uses the blurred layout.

Rendering

Re-encodeCuts exactly on the frame you chose, but takes longer. It turns on by itself when overlays or zoom are used. Off, plain clips are copied almost instantly but may start a fraction of a second early.
Use GPU encodingEncodes on your NVIDIA, AMD or Intel graphics card, which is much faster. The app shows which one it found, and uses the CPU if none works.
Install ffmpeg automaticallyShown only if ffmpeg (the video engine) is missing. Installs it for you.
Generate ReelsRenders everything, with a progress bar. Clips that haven't changed since the last render are reused, so re-renders are fast.

What you get: GOALS_only.mp4, a players folder with one reel per player, ALL_HIGHLIGHTS.mp4, the full game if chosen, and the vertical folder if chosen.

Watch Reels

ControlWhat it does
Output directory + BrowseThe folder your reels were saved to (filled in after a render).
LoadLists the videos in that folder.
A video in the listPlays it in the player below.
× on the playerCloses it.

YT Chapters

Writes chapter timestamps for your YouTube video description, so viewers can jump straight to each goal. They match the full-game video, including its trim.

ControlWhat it does
Include: Goals, Shots, Saves, Steals, Fouls, Passes, Touches, OtherWhich events become chapters. Goals, shots, saves, steals and fouls are ticked to start with.
Show player nameAdds the player to each chapter, like "Shot — Nico".
Include notesAdds the tag's note in brackets.
Merge events within … secCombines events close together into one chapter, keeping the biggest moment (a goal beats a shot).
GenerateWrites the chapter list into the box, starting with "0:00 Start". YouTube needs at least three chapters; the app reminds you if there are fewer.
Copy to ClipboardCopies the list, ready to paste into your video's description.
Trimmed full video? If "Also render the full game video" is ticked with a trim, the timestamps are shifted to match it and events cut off by the trim are left out.

Keyboard shortcuts

Press H in the app to see these any time.

Playback

Space
Pause and start tagging
[ ←
Back 10 seconds
] →
Forward 10 seconds
, .
Step 1 second back / forward (paused)
- +
Slower / faster

Tagging

Enter
Save the tag
Esc
Cancel and resume play
N
Jump to the note
U
Undo the last tag
H
Show shortcuts

Events

T P S
Touch, Pass, Shot
X V F
Steal, Save, Foul
G O
Goal, Other

Zoom (player)

Z
Zoom in
Shift Z
Zoom out
0
Reset zoom