Stays on your machine — nothing is uploaded.
Get a bout with:get_bout_video.py 479
How to code a bout
what each field is for
Four fields produce one Touch Log row. Only one of them is typed — the rest are a key per touch.
- Bout ID — top right, typed once per bout. It must match the
Bout #in the Bout Log, or the sheet cannot join the two. This is the only field you type. - Load the video — Video file for a download
(
get_bout_video.py 479), or YouTube link for an unlisted upload. Lamp detection and the marked-video export need a local file; coding works either way. - Mark every touch — play at .5×, press Enter the moment the light goes on. Mark all of them first if you like, then go back and code. Every mark is numbered T1, T2, T3… along the timeline. To move one: drag the pin with the mouse, or use [ ] for 0.25s steps, or move to playhead. Drag is live — the video scrubs with it.
- Zone — where on the strip the touch was decided, in the coach's three areas: 1 Box, 2 Offensive, 3 Defensive. Required on every touch.
- Won or lost — W or L. Required on every touch.
- Loss reason — only on the touches he lost, exactly one of
Distance, Timing, Choice, Movement.
Leave it empty on won touches. These are the letters the sheet stores, so
DTTin a cell means three losses: one Distance, two Timing. - Note — optional, for anything a letter cannot carry.
The four export buttons.
Copy for Touch Log puts one tab-separated row on the clipboard — Bout ID,
then touches / wins / reason-letters for each of the three zones. Click the Bout ID cell
of a row in Input 2. Touch Log and paste; it fills ten columns across.
The Check column there verifies the coding against the official score.
Copy chapters gives you a timestamp list to paste into a YouTube description, which
turns each touch into a clickable marker on that video's scrub bar (YouTube needs the first
at 0:00, three or more, and 10s apart — the list is built to satisfy that).
Download .csv is the same row as a file. Marked video re-renders the bout with
the labels burned into the top-right corner.
Dark or light. auto follows your system, dark and light override it either way, and the choice is remembered. Dark is the default because a video review tool belongs in a dark room. The light palette is a warm off-white rather than a cool slate, so the brass accent still belongs to the page — it is a second palette, not an inversion of the first. Every colour pair in both is measured against WCAG AA by a test, which is how a grey that had been failing for weeks turned up.
On a phone. A shared link is usually opened on a phone, so review mode is built for one: turn the handset sideways and the picture takes the screen. The Fullscreen works even on an iPhone, where Safari has no fullscreen for anything but a bare video — the page fills the screen itself, so the notes and controls come with it; tap it again or press Escape to leave. The Touches and Comments panels fold — tap the heading — and the touch list starts folded on a small screen so the video comes first. Folding works here too, and each panel remembers how you left it. Coding a bout is still desk work: it wants a keyboard and a mark you can place to the quarter-second.
How a replay runs. Picking a touch jumps to just before it and plays on, so you see the action and what follows. Two choices sit beside the speed buttons and both follow you into review: pause before next touch stops just short of the next mark — the next light is what ends an action, which is a better unit than a count of seconds — and loop this touch plays the same one over and over until you move on. The hold label seconds control how long a note stays on the picture, and how long the last touch of a bout runs for.
The Summary tab. The bout you have open, read the way Coach Medhat’s analysis reads it: the score derived from your own coding, the score progression touch by touch, every scoring action for both fencers, points by strip zone with the win rate behind them, and the leak rate per zone and reason. Only actions that actually scored appear — an action you used on a touch you lost is not a point. What the numbers say lists the figures a recommendation would be built from and stops there; the reading of them is the conversation with your coach.
Review mode. Review in the clip panel puts the bout on screen the way you would actually watch it back: a large picture, your touches listed beside it, your notes over the video, and only Play, Prev, Next and Replay. Fullscreen fills the display. Click any touch to jump to it. Nothing can be edited here — Exit review returns to coding.
Sharing a bout. Share… in the clip panel makes a link anyone can open — no account, nothing to install — at one of three levels. Watch opens exactly that review view and needs no account, which is what makes it worth sending. Watch and comment adds a note per touch, appearing in the Comments panel here; leaving notes needs an account, so every note has a name behind it. Links expire (30 days by default) and Stop sharing kills one immediately. You can also hide the fencers’ names from visitors. Treat a link like the video itself: anyone who gets it can open it.
Event names suggest themselves. The Event box offers every event you have already typed, so a tournament stays one name — "October NAC" and "Oct NAC" would otherwise become two separate groups in the library. Pick from the list rather than retyping.
Actions — what each of you did. Every touch takes an action for both fencers, from the agreed list: Attack, Attack (Remise), Attack (with Beat), Attack on Prep, Beat the Blade, Counter Attack, Counter-Parry Riposte, Long Attack, No action logged (wrong call), One Shot, Other, Parry Riposte, Prep, Pull Short, Pull Short - Miss, Reprise, Reprise (Late), Simultaneous. Coding saved under a spelling since retired is folded onto the surviving name when it loads. A jumps to yours, S to theirs. The list is not closed — + add an action names a new one and remembers it, and an action already used in a clip shows up even on a browser that has never seen it. Whoever won the touch is the one whose action scored, so that is the one shown over the video and in the touch list.
The opponent’s hand. Right or left, on the clip — click the same one again to clear it. It is there so win rate can be cut by lefty and righty, the way the Google Sheet dashboard does; without it that comparison cannot be made here.
Notes on the video. Whatever you code shows over the picture while the playhead is inside that touch — the touch number, zone, result and reason, plus the Note you typed, like subtitles. Type in the Note box and it appears as you type. Switch it off with notes on video beside the transport when you want a clean picture. The same labels are burned into the top-right corner by Marked video.
Attaching a video to a clip yourself. Hover any row in the library and a ↷ appears beside the ×: it attaches whatever video is open now to that clip, then loads that clip’s coding. Use it when a clip points at the wrong video, or at none. Hovering a row also shows which video it is currently linked to, so you can see before you act.
If a clip loses its video. A clip in the library marked no video linked still holds its coding but cannot be opened, because a video is how a clip is found. Load the right video and the tool notices: it offers Link to Clip #n rather than quietly starting another clip, and holds off saving until you choose that or Start a new clip. Deleting a clip also keeps a local copy of its touches for a while: load the same video and a Restore button appears. Neither is a substitute for the fact that deleting on the server is final — it asks first for a reason.
Stopping half way is fine. Marking is saved as you go, and Save now in the clip panel confirms it with a timestamp so you can close the tab knowing where you stand. Come back, open the clip from the library on the left (or just paste the same link), and every mark is where you left it. Delete clip removes it for good after asking.
The library, on the left. Every clip you have coded, grouped by event or by month, with a search across titles, events, bout numbers and fencer names. Grouped by event a tournament’s bouts are listed in the order they were fenced — P1, P2, P3 — so a pool reads top to bottom; grouped by month the newest is first. Bouts and Study are separate tabs, and study clips never count towards your own figures. Hover a row and the × deletes that clip — it asks first and tells you how many coded touches would go, since that is hand work and nothing restores it. The video itself is never touched.
Keep your own copy. Export everything, under the library, downloads every clip — touches, zones, reasons, notes, the coach’s comments and the video links — as one JSON file. Worth doing after a coding session: the database behind this holds no backups of its own, and a coded bout is an hour you cannot get back. Share links are left out of the file on purpose, since they are live keys.
Forgotten password. Forgot your password? in the sign-in box emails a link; follow it and you can set a new one straight away. The link is good for about an hour.
An account is needed to code. Coding and the summary sit behind sign-in; a bout someone has shared with you opens without one, which is what makes a link worth sending. Signing in also means the marks follow you to another device and the library on the left lists every clip you have coded.
Marked video needs a local file. It works by reading the picture
frame by frame, and a YouTube player gives the page no access to the picture — so the
button stays greyed out on a YouTube bout. Download the bout first
(get_bout_video.py 479), load it as a video file, then it lights up. It records
in real time, so a 3-minute bout takes 3 minutes; leave the tab open and don't scrub.
The output is .webm, and the watermark shows the bout number, the running
score, and the current touch.
Speed and quality. .25×–2× are one click, or type any
speed in the box. YouTube only honours its own rates and will snap yours to the nearest.
Quality is a request: YouTube overrides it for bandwidth and for resolutions the
upload does not have, so its own gear menu has the last word. A local file plays at
whatever you downloaded — get_bout_video.py already pulls 1080p.