pundit

A desktop app for breaking down game film. Open the match video — one file or several, both halves played straight across the join — and record your commentary over it while you watch. Everything you do to the picture while you talk is recorded with your voice: play, pause, seek, zoom and pan, freehand drawings, and a ring that follows a player you have highlighted. Each recording becomes a clip you can name, tag, annotate and find again.

The second half of the job is getting it out again. Tag goals and the start and end of each period, and pundit keeps the match clock and the score, drawing them into previews and exports. Then export what you need as .mp4 — every clip, the clips carrying one tag, a single clip, a reel of one team's goals, or the whole match — with your voice, your drawings and a picture of you burned in. Transcribe a clip's commentary on your own machine if you want the words as well. It runs on Ubuntu 24.04 and Linux Mint 22, on x86-64.

Getting it

Builds are published on the releases page as a .deb, which you install with sudo apt install ./pundit_*_amd64.deb. Installing says what your machine needs, and to run a build newer than the last release, build it from source.

The guide walks through the app task by task, the changelog says what changed in each version, and the developer page is the way into the code.

Using pundit

pundit is built around one way of working: open the match, watch it, and talk over the moments that matter. Every page here is one part of that, and they are in the order you meet them.

  1. Installing — the package, what your machine needs, and where the app keeps its files.
  2. Projects and matches — starting a match from its video files, opening one you made earlier, and what is inside the folder.
  3. Watching the game — playing, skipping, scanning fast, zooming and fitting the window.
  4. Recording commentary — talking over the game, drawing on it, and the webcam or photo in the corner.
  5. Clips — naming, tagging, previewing and tidying what you recorded.
  6. The scoreboard and match clock — teams, goals and periods, typed in or tagged live.
  7. Slates — marking a range now and recording over it later.
  8. Player highlights — a ring that follows a player.
  9. Transcripts — the words of a clip, written out on your own machine.
  10. Exporting — clips, reels and the whole match as .mp4, and the files that land beside them.
  11. The basket — one film from clips in several matches.
  12. When something goes wrong — where the log is and what to look for.

The keyboard shortcuts page lists every key the app listens for, and what stops each one working.

Installing

pundit ships as a .deb for Ubuntu 24.04 and Linux Mint 22 on x86-64. Download it from the releases page, then, in the folder you downloaded it to:

sudo apt install ./pundit_*_amd64.deb

It appears in the applications menu as pundit. From a terminal it is pundit, or pundit <folder> to open (or create) a project in that folder; with no folder it reopens the last project you had open.

If you have Coach Cuts installed — the name this app went by until 0.8.0 — the same command replaces it. Your settings, your basket and the speech model you already downloaded are carried over the first time pundit runs. If you had pinned Coach Cuts to your panel, pin pundit instead: the old launcher goes with the old package.

What your machine needs

  • GStreamer 1.24 or newer, as Ubuntu 24.04 ships it. The package pulls in the plugins it needs.
  • An x86-64-v3 CPU — Haswell (2013) or newer. The speech recognizer is built for that instruction set.
  • A VA-API driver for hardware video decode and encode. The package recommends intel-media-va-driver (or va-driver-all) and apt installs it by default. Without one, everything still works, but playback, recording and export fall back to software and are much slower.
  • An OpenGL (EGL) capable display, on X11 or Wayland.
  • A microphone, and a webcam if you want to be on camera. You can record with a photo instead.

Where the app keeps things

Nothing about a match is kept outside its project folder. What the app keeps for itself is about this machine, not about any match, so it stays behind when you carry a project to another computer:

WhereWhat
~/.config/pundit/state.jsonThe projects you have had open, the pen you draw with, the speech model you chose, the window's size, the side panels' widths and the slate band's colour.
~/.config/pundit/basket.jsonThe basket and its settings.
~/.cache/pundit/models/The speech model, downloaded the first time you transcribe.
~/Videos/pundit/Films made from the basket (your videos folder, in your language).

If state.json is damaged, the app falls back to the default for whatever it cannot read and keeps the rest — though one bad entry in the recent projects costs the whole list. A damaged basket.json empties the basket.

Building it yourself

To run a build newer than the last release, or to build the package yourself, follow Build from source in the README.

Projects and matches

A project is one match, and it is a folder:

In the folderWhat it is
project.jsonThe match — its videos, clips, events, slates, highlights and settings.
recordings/Your commentary, one file per take.
exports/The videos you export.

The game video stays where it is. A project points at your footage; it never copies, moves or renames it.

Starting a match

Press New match… — in the toolbar, or the big button on an empty window — and pick the game's video files. pundit shows you what it worked out from them, and every line can be changed before anything is made:

  • Projects folder. pundit looks for a folder called pundit at or just above your videos, which is how most people already keep them. Failing that it offers the folder your last project was in, and failing that a pundit folder beside the footage — and says so. Choose… points it somewhere else.
  • Folder name. The date, read out of the file or folder names, then the teams: 2026-09-21-city-athletic. Putting the date first keeps a season in order. Type your own name and it stops following the teams.
  • Teams. The opponent comes from the folder name and goes in away, your club in home. ⇄ swaps them, and the folder name follows as you watch. The scoreboard is set up with your last match's colours and format.
  • The videos, in the order they will play.

Press Create. The project is named <Home> v <Away>.

Nothing is written until every video has been checked. If the second half is a different shape from the first, you are told and no half-made project is left behind. A folder that already holds a project is refused; an empty folder you made yourself is used as it is.

Opening one you made earlier

  • Recent ▾, beside Open Project…, lists the last eight matches you had open, newest first and named after the match. One click switches. A match whose folder has gone — on a drive you have not plugged in, say — goes grey rather than vanishing, so you can plug the drive in and click it.
  • Open Project… (Ctrl+O) opens any folder, and makes a new empty project in a folder that has none.
  • The app reopens your last project on its own when it starts.

You cannot switch projects while an export is running or a preview is open; the message says which.

The game videos

Add Source Video… adds more footage to the match. The videos play as one timeline, in the order listed under Sources. Drag them to reorder, and the clock and every clip's place in the game follow. A video whose shape differs from the others is refused.

The ✕ beside a video removes it, and is greyed out once a clip, a match event, a slate or a highlight uses that video.

If you move or rename your footage, its video shows as Missing; Relink… points the project at where it is now.

Older projects

A project made by an older version of pundit is upgraded the first time you save it. The old file is kept beside it as project.json.v<old version>, so you can go back to the older version if you need to — losing whatever changed since.

Watching the game

The videos in a match play as one timeline: the readout and the scrubber count them as one game, and playback carries straight on across the join.

Playing and skipping

  • Space plays and pauses.
  • ← → (or A D) skip 3 seconds; with Shift, 10.
  • , and . step one frame back or forward while paused, and the readout shows tenths of a second.
  • [ and ] jump to the previous or next goal or period mark.
  • The mouse wheel scrubs, over the picture or the scrubber: a notch is 3 seconds, Shift makes it 10, and rolling away from you goes forward. It keeps working while you record, where dragging the scrubber does not.
  • Dragging the scrubber snaps to a goal or period mark once the pointer is within a few pixels of it, and lets go when you drag on past — so letting go on a mark lands exactly where ] would. Right-click the scrubber to turn Snap to match events off or on; the choice is remembered on this computer. The same menu's Band colour… opens the settings, where the selected slate's band is coloured.

Scanning fast

While playing, L speeds up through 2×, 4×, 8×, 16× and 32×, and J slows down again; the speed button beside Play steps through the same speeds and wraps back to 1× after 32×. Every frame is still decoded at 32×, so what you see is the game, not key frames flashing past. The sound is muted above 1×, and any pause puts you back to 1× on the frame you were looking at.

Zooming and panning

  • 3 zooms in and 2 zooms out, towards the pointer when it is over the picture. 1 goes back to the whole picture.
  • Ctrl + wheel (or Ctrl + two-finger scroll) zooms about the pointer.
  • Once zoomed in, a click-drag pans.

Zoom is part of what a recording captures, so zooming while you talk replays in the clip and its export.

The scoreboard on the picture

Once the teams are set up, the clock and score are drawn in the top left as you scan — by the same code that burns them into an export, so what you see is what you will get. The board hides while you drag the scrubber and comes back when you let go.

Making room

  • Fit (F) closes the window up around the picture so the black bars go. It only ever makes the window smaller, and never redraws the picture at a different size. Leave full screen first.
  • The side panels have a grip either side of the video: drag it to widen the sidebar or the inspector. The widths are remembered on this machine.
  • Volume sets how loud the game is while you watch. It does not change what is exported.

Recording commentary

Press R and talk. Everything you do while recording is captured with your voice — play, pause, skips, scrubbing, zoom and pan, and your drawings — and replays in step in the preview and the export. Press R or Esc to stop, and a clip appears named for the moment you started.

Undo and redo are off while you record. Tagging goals, marking slates and ringing players all still work: they belong to the footage, not to the take.

Choosing the camera and microphone

Devices… chooses the Camera and Microphone. While you record, a level bar shows the microphone is being heard, and a small self-view in the corner shows you where your inset will land.

Drawing

Drag on the picture to draw. There are six pen colours, each with a dark edge so it reads on grass and on kits. A drawing fades five seconds after you lift the pen; untick Auto-clear and it stays until you press C. Drawings replay where and when you made them, and they stay put on the picture rather than moving with the zoom.

The inset: size and corner

Each clip carries a picture of you in a corner of its export. In the inspector, Inset size and corner picks Small, Medium or Large, and the bottom right, bottom left or top right — never the top left, which is where the scoreboard sits. The caption bar stops where the inset begins, so your words are never underneath you.

The last size and corner you picked is what the next recording uses, so you can set it once before a session. Show webcam in export (Show avatar in export when you record with a photo) turns the inset off for one clip.

A photo instead of the webcam

Choose a picture under Inset in Devices… and the project records your voice only: the camera is never opened. Your picture sits in the corner as a circle and swells as you talk — live while you record, and in the finished video. The picture is copied into the project folder as avatar.<ext>, keeping its own extension, so your original is never touched; Remove deletes the project's copy and goes back to the webcam.

The photo is a setting of the project, not of the machine: every take in that match uses it.

Over a diagram: the whiteboard

To talk over a still picture — a pitch layout, a set-piece diagram — instead of the game, choose it under Whiteboard in Devices… and press W rather than R. The diagram fills the picture for the whole take and you draw on it as usual; W again stops. Each take keeps its own copy of the diagram inside the project, so changing or deleting your file later changes nothing already recorded.

The take is still tied to the moment of the match you started it from, which is where it sits among your clips. While it runs the game is behind the diagram, so playing, skipping, tagging, marking a range and ringing a player are refused.

Clips

Every recording is a clip. Select one in the Clips list and the inspector shows what you can change about it.

Finding them again

  • Name and Notes are yours to write.
  • Tags are comma separated, and offer the tags you have already used as you type.
  • Filter by tag narrows the list to the clips with one tag.
  • Drag clips to reorder them, or Sort by position to put them in game order. The order is the order they export in.

Playing one back

Preview clip plays a clip as it will export — your voice, your drawings, the inset and the scoreboard, all in step with the game. Jump to clip start takes the game video to where the clip begins, without playing the commentary.

Tidying up

  • Delete, or Delete clip, deletes the selected clip. Its recording goes to a trash folder inside the project, and Ctrl+Z puts it back where it was — but only in the same session, and only until you open another project. Undo is held in memory, so quitting pundit loses it, and opening a project empties the trash of both the one you are leaving and the one you are opening. Once either happens the recording is gone for good. If you are not sure, keep the clip.
  • Ctrl+Z and Ctrl+Shift+Z undo and redo every change to a clip.
  • Right-click a clip for its menu, which also has Add to basket — see the basket.

The scoreboard and match clock

Tell pundit who is playing and when the goals and periods happen, and it keeps the clock and the score for you. Both are drawn on the picture while you scan, and burned into every preview and export.

Setting up the teams

Set up teams… in the Match panel opens the match setup:

  • Home team and Away team: each one's name and kit colours. The swatches open a colour picker with a row of common kit colours, or take a hex code.
  • Format: the number of Periods, the Minutes each, and any Overtime periods.
  • My video starts after kick-off: tick it if your footage begins part-way into the game, and the clock still reads the right time.

A new match starts with your last match's colours and format already filled in.

Tagging as you watch

KeyMarks
ZA home goal
XAn away goal
VThe start or end of a period

Each one marks the game video at the playhead, and shows on the scrubber — goals in the scoring team's colour. [ and ] jump between them, and dragging the scrubber snaps to them (Watching the game). They work while you are recording too.

The clock follows the frame on screen, so it reads the same match time either side of a pause in your commentary.

Typing events in

Edit events… opens the events as lines, one per event:

2 14:05 home goal

meaning the second video, 14 minutes 5 seconds in, a home goal. Paste events takes a whole list at once; every line is echoed back as understood, already there, or refused with the reason, and adding them all is one undo. A line with no video number goes on the video you choose under Lines with no number are:.

Two rules keep a typo from moving the clock:

  • A time always has a colon. A number on its own at the start of a line is a video number, so 900 home goal is refused ("there is no video 900") rather than read as 15 minutes.
  • Kick-off and restart words are refused. Periods are counted in order, so one stray start or stop would shift every period after it. A list of restarts is not a list of periods.

To fix one event, click it in the list and it opens as a single line. Enter applies the change and Esc leaves it alone.

Goals and the reel

Each goal's row in the Match panel can trim where its piece of the goals reel starts and ends. By default a piece starts 20 seconds before the goal and runs 6 seconds after it.

Slates

A slate is a range of the game you mark now and record commentary over later. It is the way to watch a match through once without stopping to talk.

Marking a range

Press I where the moment starts and O where it ends. The range goes into the Slates list in the sidebar, where you can name it and tag it. Both keys work while you are recording, because you spot the next moment while talking over this one.

The slate is saved the moment you press I, so a range you never finished is a row with an open end, there for you to finish or delete. O closes the most recent open range on the video you are watching.

To move a mark, put the playhead where it belongs and press Set in or Set out on the selected slate. The selected slate's range is drawn on the scrubber, in the slate colour its row is selected in. To change that colour, for the band and the row alike, open Settings… (or right-click the scrubber and choose Band colour…). To watch it, double-click the row or choose Preview slate from its menu: the game plays from the start of the range and stops at its end.

Typing ranges in

If you already have the moments written down, press Type… in the Slates header (it is there as soon as the project has a video) and paste them into the box, one per line:

2 14:05-14:40 corner routine [corners, set piece]

That is video 2, from 14:05 to 14:40, named corner routine, tagged corners and set piece. The video number is optional — the box's picker says which video a line without one is on — and so are the name and the tags. End a range with a dash and nothing after it, 14:05-, to leave it open. A time on its own is refused, so a list of match events pasted into the wrong box adds nothing. Each line is echoed back before you press Add, and the lines that can't be added stay in the box for you to fix.

Click a row to retype it as a line. A slate you retype keeps its title, and the clip you recorded from it is left as it was. The row's → selects the slate and shows its first frame, ready for R.

Recording over one

Select a slate and press R — the transport button reads Record range while a slate is selected — or choose Record from the row's menu. The game jumps to the range's start and the take begins. At the end of the range the game pauses on its last frame while you finish your sentence; the recording keeps going until you stop it.

The clip that comes out already carries the slate's name and tags. The slate stays in the list after its take, because coaches re-record.

Words over the range

Type a title in the field under the slate's name. Any export or preview that shows that stretch of the game shows the words along the bottom, in place of the clip's caption, which comes back when the range ends. If the clip has no caption showing by then, the title fades out instead. The name is your filing; the title is what a viewer reads. A slate with a title shows a T in the list — hover it to read the words.

To move the words, re-mark the slate with Set in and Set out. To remove them, clear the field. A range with no end yet shows nothing until you press O. The live picture while you scan never shows a title; a straight copy of the whole match cannot carry one either.

Working through a theme

Filter the list by a tag — "corners", say — and the Slates list becomes a queue: after each take it moves on to the next range with that tag that has not been recorded yet, and parks the game there. Press R, talk, stop, and the next one is waiting. Cancel a take and it stays on the same range.

Press G to start: it selects the first range in the filtered list still waiting to be recorded and parks the game there, so the whole pass can run from the keyboard. It is also the way back to a range you skipped — the pass only moves forwards, but G always starts from the top.

When the last one is done the status bar says so — "All 8 'corners' ranges shot", or "All 8 ranges shot" with no filter. It only says it when every range in the list really is recorded; if you skipped one earlier, the pass just stops.

Player highlights

A highlight is a ring at a player's feet, with a label you type in, that follows them across the picture.

  1. Press H for the highlight tool, and pause.
  2. Drag a box around the player. A ring appears with its label.
  3. Move on through the game and drag another box around the same player. The ring glides between the boxes you place.

The ring belongs to the footage, not to a clip, so it shows wherever that footage does: while you scan, while you record, in a preview, and in every export that crosses it, the goals reel included. It stays on the player as you zoom and pan. You can place one while recording as well as outside a take.

The Highlights panel, under the Match panel, lists the ringed players. Select one to change its label or colour, to delete it, or to remove the box on the frame you are looking at with Delete key here. Those edits are off while you are recording.

Esc drops the selected ring, then leaves the tool. A highlight cannot ride a stream-copied whole match.

Transcripts

Transcribe, on a clip's transcript row in the inspector, writes out what you said, using whisper.cpp on your own computer. The transcript is yours to edit.

The speech model

The picker beside the button chooses the model:

ModelDownload
small.en488 MBThe default. More accurate; about 0.7× real time on a typical laptop.
base.en148 MBFaster, less accurate.

The first time you transcribe with a model, pundit downloads it into ~/.cache/pundit/models/ and keeps it — the button says so, as Download 488 MB and transcribe, before you press it. After that, nothing leaves your machine. The model you choose is remembered for this computer, not for the project.

While it runs

Transcribing is always something you ask for; recording never starts it. Clips you ask for queue behind each other, and the inspector shows how long the current one has been going.

Recording always wins. Starting a recording stops a transcription in progress and puts that clip back at the front of the queue, so the take gets the whole machine.

Using your own model file

If $PUNDIT_WHISPER_MODEL names a model file, pundit uses that instead of the picker, which greys out and shows the file.

Exporting

Export… opens the export sheet. Each thing you pick becomes one H.264 .mp4 in the project's exports/ folder, named <target> - <project>.mp4. Exporting the same target again replaces the earlier file.

What to export

TargetWhat you get
All clipsEvery clip, in the clip list's order, as one video.
A tagThe clips carrying that tag.
The selected clipThat clip alone. A clip's right-click menu has Export video… too.
A goals reelEach team that scored has one, and All goals appears when both did.
The whole matchThe game with the clock and score, and no commentary.

Every clip carries a caption bar along the bottom with its number, name and tags — the number as 2 / 5, and left off a video of one clip, where it would only say 1 / 1 — your inset in its corner, your drawings, any player highlights it crosses, and the scoreboard in the top left. A slate's title, where the clip crosses its range, takes the caption bar's place while that stretch is on screen (see Slates).

The inspector's Caption bar picker says how long a clip's caption shows: Whole clip, the First 3 seconds, or Off. A new take gets whatever you picked last.

Resolution and quality

Resolution is 720p or 1080p. Quality is Low, Medium or High: higher looks better and costs more space. There is no size target, so a busy passage costs what it costs. As a guide, a 56-minute match at 1080p comes out at about 2.7 GB at Medium and 4.5 GB at High.

Goals reels

A reel is every goal, in match order, each cut with its build-up: by default from 20 seconds before the goal to 6 seconds after. Goals close together become one piece. Trim any goal's piece from its row in the Match panel. A reel has the game's sound and no commentary.

The whole match

The whole match can be a straight copy of your footage instead of an encode: it finishes in about a minute rather than an hour, at about a quarter of the size, with not a pixel lost. The scoreboard then travels beside the picture rather than on it — as a subtitle track inside the file, and as an .srt beside it that VLC loads on its own and YouTube accepts as a caption file. Highlights and titles cannot ride a copy, and the sheet says so.

A copy needs footage it can carry: H.264 in an MP4 file, with AAC sound (or none), and every video recorded the same way as the first. A phone or camera usually records exactly that; Matroska or HEVC footage is encoded instead.

The scoreboard picker

ChoiceMeans
DefaultThe best available: the whole match is copied when its footage allows it, and the board is burned in everywhere else.
Burned into the pictureThe board is drawn on the picture, always.
Separate trackCopy the whole match and carry the board as subtitles — and refuse, naming the file, if the footage cannot be copied.

Only the whole match can carry the board beside the picture. A clip or a reel asked for on a separate track has it burned in, so the board is never lost. With the whole match ticked, a line under the picker warns that a copy cannot carry highlights, titles or drawings. On Default, whether the footage can be copied is only checked when you press Export — footage that cannot is encoded with the board burned in.

Music under a goals reel

With a goals reel ticked, a Music under the reel row appears. Pick a genre and the reel gets a song from it, mixed under the game's sound — which is turned down, so a goal still sounds like a goal — fading in at the start and out at the end.

The genres are the subfolders of your music folder: press Folder… and choose a folder holding, say, rock/ and edm/, each with a few mp3, ogg, opus, flac, wav or m4a files. Each match usually gets its own song from the genre, and exporting the same match again keeps it as long as the genre's songs and the project's folder name stay the same. A song shorter than the reel simply ends, and the rest is the game's sound, still turned down.

Finding music

No songs yet? Press Find music… beside Folder…, type a genre and press Search. pundit asks Openverse for music of two to ten minutes that you may use in a video — public domain, or CC BY, which only asks you to credit it — and lists up to twenty songs, those tagged with your genre first. Add fetches one into your music folder under that genre (~/Music/pundit/ if you have not chosen one) and picks that genre for the reel. Nothing goes over the network until you press Search.

Each song arrives with a .credit.txt beside it, and a reel exported with that song gets <reel>.credits.txt beside the film: the song, its page and its licence, ready to paste into a video's description. Keep a song's file name as it arrived — the credit is matched to it by name. Licences are as Openverse reports them, so check a song's page before you publish.

If the genre you picked has no songs left in it when you export, the reel is refused with a message saying so, rather than made without music. The genre and the folder are remembered on this computer, not in the project.

Mute source audio

Tick Mute source audio to leave the game's sound out and keep your commentary only. A whole match has no commentary, so muted it comes out silent; a goals reel muted is its music alone, or silent with no music picked. Muting can make a whole match copyable that was not — sound the file will not carry cannot stand in the way of the copy.

The sheet remembers your choices for the project.

The files beside the video

  • Chapters. Every export with more than one piece has chapters, so a video player can jump straight to a clip or a goal. The whole match's chapters are its kick-off, periods and goals.
  • <name>.chapters.txt, the chapter list ready to paste into a YouTube description, which is the only way chapters reach a video on YouTube. It starts at 0:00, leaves out any chapter within ten seconds of the one before (YouTube ignores the whole list otherwise), and is not written at all when fewer than three chapters are left.
  • <name>.srt, the scoreboard as subtitles, beside a copied whole match.

Every file also says what it is in its own details: a title, the day the footage was recorded, and — once the teams are set up and kick-off is tagged — the final score and both team names.

While it runs

The sheet shows each target's progress and when the run will finish. Cancel export stops the run and keeps the files that already finished.

The basket

The basket makes one film out of clips from several matches — every goal you conceded from corners this season, say.

  1. In any project, right-click a clip and choose Add to basket.
  2. Open another match and add more. The basket keeps them, in the order you added them, across projects and across restarts.
  3. Press Basket (N)…, beside Export… — N is how many pieces are waiting. It works with no project open.
  4. Name the film, choose the Resolution and Quality, and press Start.

The film goes into a pundit folder in your videos folder, never over an existing one: a name already taken gets (2).

What each piece carries

Each piece draws its own match's scoreboard and clock, and its caption bar reads <match> | <clip> | <tags> — for as long as that clip's Caption bar setting says, so a clip set to Off shows none. A titled slate the piece crosses shows its title there as it would in any export. The film's chapters are its pieces. Every piece is mixed at the same default volumes, so the level does not jump between matches; Mute source audio leaves the game's sound out of all of them.

When a piece cannot be used

A row says so when its project cannot be read or its clip has gone. The footage itself is only checked when you press Start, so a row that looks fine can still be refused then — the message above the button names the folder. Use the row's ↑ ↓ and × to reorder or remove pieces, or Clear to empty the basket.

When something goes wrong

Where the log is

pundit writes what it is doing to standard error. Started from the applications menu on an X11 session (Linux Mint's default), that lands in ~/.xsession-errors; started from a terminal as pundit, you see it directly. When you report a problem, the last few dozen lines are the most useful thing you can send.

Playback is slow or jerky

Every time a video loads, pundit logs one line saying how it is being decoded:

grep "bus: loaded" ~/.xsession-errors | tail -1

On a machine decoding in hardware it names a vah264dec or vah265dec decoder, memory:DMABuf and egl. Anything else — avdec_…, SystemMemory or glx — means the slow path: check a VA-API driver is installed (intel-media-va-driver or va-driver-all).

If playback slows only while the monitor is off or asleep, start the app as vblank_mode=0 pundit.

Exports are slow

Without a VA-API driver, export falls back to the x264enc software encoder, which is much slower. The whole match exports in about a minute when it can be copied rather than encoded.

Recording will not start

The message says what was missing. If it is the camera, check it is chosen in Devices…, or record with a photo instead.

A project will not open

  • "This project was made by a newer version of pundit" — install that version again.
  • A missing video shows as Missing under Sources; Relink… points the project at where it is now.
  • Going back to an older version — the first save after an upgrade keeps the old file beside the new one, as project.json.v<old version>. Rename it back to project.json to use it with the older build, losing what changed since.

Settings gone strange

The app's own files are listed under Installing. Moving one aside resets just that: your projects are never stored there.

Keyboard shortcuts

The keys work whenever you are not typing in a box. pundit catches them before anything on screen can, so a slider you have just dragged will not quietly steal your arrow keys — but a text field takes everything, including Esc, until you leave it.

Almost nothing here needs a modifier: the four Ctrl combinations are Ctrl+0 under Zooming in, and the three under The project at the bottom.

Watching the game

KeyWhat it does
SpacePlay or pause
← → or A DSkip back or forward 3 seconds
Shift + thoseSkip 10 seconds instead
, .One frame back or forward, while paused
[ ]Jump to the previous or next match event
J LWhile playing: slower or faster, 1× up to 32×
FShrink the window to fit the footage

J and L only do something while the video is actually playing, and any pause puts you back to 1×. Every frame is still decoded at 32×, so what you see is honest at speed rather than key frames flashing past.

F only ever makes the window smaller — it closes the window up around the picture so the black bars go, rather than redrawing the picture to fill the window, so what you are looking at never changes size or shape. Leave full screen first; there is no shape to change in full screen.

Zooming in

KeyWhat it does
3Zoom in
2Zoom out
1 or Ctrl+0Back to the whole picture

If the pointer is over the picture, zooming moves towards where it is pointing. Zoom is off while a preview is open, because a preview always plays at the whole picture — a change would only show once you closed it.

Recording

KeyWhat it does
RStart or stop recording
WStart or stop recording over the whiteboard diagram
EscStop recording
CClear what you have drawn

W records over the diagram picked in the Devices popover instead of the game video; see the whiteboard. C works while a take is actually running. Drawing itself is the mouse, with the pens beside the video.

Marking the match

KeyWhat it does
ZHome goal
XAway goal
VStart or stop a period

These mark the game video at the playhead, so you can tag while you watch. They work while you are recording too — a goal belongs to the footage, not to the take you happen to be in the middle of.

You can also type events in as lines (Edit events… in the Match panel), which is the way to fix a time you got wrong.

Marking a slate

A slate is a range you mark now to record commentary over later.

KeyWhat it does
IStart of the range
OEnd of it
GSelect the first range still to shoot, and go to it

The slate is saved the moment you press I, so nothing is lost if you stop there — you will see a row with an open end, which you can finish or delete. O closes the most recent open range on the video you are watching. Press I twice and you get two slates; delete the one you did not mean.

To shoot one, select it and press R — the transport button reads Record range while a slate is selected — or choose Record from the row's menu. At the end of the range the game pauses on its last frame while the recording keeps going, so you can finish your sentence. See slates.

G does nothing while you are recording or a preview is open; see working through a theme.

Ringing a player

KeyWhat it does
HTurn the highlight tool on or off
EscDrop the selected ring, then leave the tool

A ring belongs to the footage, so it shows up wherever that footage does — scanning, recording, a preview, and every export that crosses it.

Clips

KeyWhat it does
DeleteDelete the selected clip
EscClear the selection

A deleted clip goes to a trash folder inside the project and Ctrl+Z puts it back where it was.

The project

KeyWhat it does
Ctrl+OOpen a project
Ctrl+ZUndo
Ctrl+Shift+Z or Ctrl+YRedo

Undo and redo are off while you are recording.

What Esc does

Esc is the one key whose job depends on what is in front of you. It takes the innermost thing first, so you never lose more than you meant to:

  1. A message on screen — dismisses it. Return does this too, and nothing else.
  2. A sheet that is open — closes it. If you are in one of its text boxes, the first Esc leaves the box and the next closes the sheet, so a half-typed paste does not vanish on one keystroke.
  3. The highlight tool — drops the selected ring, then leaves the tool. Both before it will stop a recording, so ringing a player during a paused take cannot end the take by accident.
  4. A recording — stops it.
  5. A preview — closes it.
  6. A selected clip — clears the selection.

Home and End do nothing on purpose: they are swallowed so a slider you touched cannot jump the video to one end.

Changing them

F1 (or the Keys button beside Fit) opens the Keys sheet, which lists every key and what it does. Set… on a row waits for the next key you press and gives it to that action; a key another action held is taken from it, and the sheet says which. ✕ leaves an action with no key. Your changes are remembered on this computer. Esc, Tab, Return, Home and End cannot be reassigned.

The keys on this page are the ones pundit starts with.

Changelog

The format is based on Keep a Changelog, and this project follows Semantic Versioning.

Versions 0.1.0 to 0.5.0 were built and installed by hand and never published as releases, so there is nothing to download for them. Their dates are the day each one was cut, and 0.1.1's handful of changes are listed under 0.1.0. The first published release is 0.6.0, which contains all of them.

Everything up to and including 0.7.0 was released under the name Coach Cuts, which the app was called until 0.8.0 renamed it.

[Unreleased]

[0.11.0] - 2026-10-02

Added

  • Switch between the matches you have been in, from one button. Recent ▾, in the toolbar beside Open Project…, drops down the last eight projects you had open — newest first, and each one named after the match rather than its folder. So you see Rovers v Athletic instead of 20260917-canfield, and when two matches are against the same opponent the folder name shows underneath to tell them apart. One click switches. The project you are in is ticked, and that row does nothing if you click it.

    • A project whose folder has gone goes grey instead of vanishing — and it is still there to click. That is deliberate: if a match lives on a drive you have not plugged in this morning, you want to see it sitting there, plug the drive in, and click it. If every row is grey the list says so, because "my projects are gone" and "my drive is not plugged in" should not look the same.
    • Opening a project is now refused while an export is running or a preview is open, with a message saying which — it used to be allowed, and the run would carry on rendering from the project you had just left.
  • One button starts a match. New match… — in the toolbar, and the big button on the empty window when nothing is open — asks for the game's video files and then shows you everything it worked out from them, with every line editable before anything is made: which pundit folder the project goes in, what the match folder will be called, the opponent's name, and the videos in the order they will play. Type your own club in, press Create, and you have a project named after both teams with the scoreboard already set up from your last match's colours and format. Your footage does not move — not copied, not renamed, not touched; the project just points at where it already is.

    • It finds the projects folder by looking for a folder called pundit at or just above the videos, which is the way you already keep them. If there isn't one it offers the folder your last project was in, and failing that a pundit folder beside the footage — and says so, so you can point it somewhere else with Choose….
    • It reads the date out of the file names or the folder name and puts it at the front of the folder name, 2026-09-21-city-athletic, which is what keeps a season in order. A four-digit year on its own is never taken as a date, so an age-group folder named for a birth year doesn't date your match to a decade ago.
    • The opponent comes from the match folder's name and goes in the away slot, with your club in home. ⇄ swaps them, and the folder name changes as you watch — which is the quickest way to see which way round you want it. Type in the folder name yourself and it stops following the teams.
    • If the folder you name already holds a project it says so and refuses; an empty folder is used as it is, so a folder you made by hand is fine to point at. And nothing at all is created until every video has been checked — if the second half turns out to be a different shape from the first, you get told and there is no half-made project left behind.
  • Choose how big your inset is, and which corner it sits in — per clip. The inspector has two new pickers beside "Show avatar in export": Small / Medium / Large, and bottom right / bottom left / top right. Medium in the bottom right is what every clip has always been, so nothing you have already recorded looks any different. Use it when the action is on the side your face is covering: move yourself to the other corner, or out of the way entirely by going up top. The caption bar always stops where the inset stands, so your words are never underneath you — which does mean a Large inset leaves a caption about seven characters less room. There is no top left, because that is where the scoreboard lives and you would just be sitting behind it.

  • The last size and corner you picked is what the next recording uses. Set it on any clip and every take after that starts there, so you can decide once before you record rather than fixing each clip afterwards — and the self-view in the corner while you record shows you where it is actually going to end up. Fixing one clip afterwards still only changes that clip.

Fixed

  • An exported file could be named something a shared drive refuses. Export file names are built from the clip or tag name, and only / and : were being replaced. A name holding \, *, ?, ", <, > or | wrote a file fine on this machine and then failed to copy to a Mac, a Windows machine or a network share — which is where the exports go. All of them become - now. Nothing else about the name changes: the capitals, the spaces and the length are exactly as they were, so a file you have already exported keeps its name and its subtitle and chapter files beside it.
  • Two halves added at once could go into a project backwards. If you picked both files in one Add Source Video… and the second was a copy — the kind a browser or file manager names … (1).mp4 — they were added in the wrong order, with nothing on screen to say so. Because the order of the videos is the match timeline, that put the match clock out by about a half, moved every clip's position in the game, and burned the wrong time into any export. A copy now follows the file it is a copy of. This does not repair a project you have already made: if you think one is affected, drag the videos into the right order in the sidebar and the clock follows.

[0.10.0] - 2026-09-27

Added

  • Fit the window to the video. Press F, or the Fit button by the pens, and the black bars above and below the picture go away. The window closes up around the picture rather than the picture being redrawn to fill the window — so what you are looking at does not change size or shape, there is simply no more black around it. It only ever makes the window smaller, which is why it can never send the window off the edge of your screen. If the window is too small for the footage's shape to fit at all, it says so instead of half-doing it. Leave full screen first: a full-screen window has no shape to change.
  • Drag the side panels wider. There is a grip either side of the video; pull it and the sidebar or the inspector takes the room, which is worth having on a big screen where a long clip name used to be cut off with space to spare. The widths are remembered between sessions, per machine — they describe your screen, not your project, so they follow you rather than the folder you open. The panels widen but do not narrow: the inspector's controls were laid out to fit the width it has, and taking that away would push one of them off the edge.

[0.9.0] - 2026-09-25

Added

  • Mark a range now, record the commentary later. Watching a match through, press i where a moment starts and o where it ends: that range goes into a Slates list in the sidebar, where you can name it and tag it without stopping to talk. When you come back, Record on the row jumps to the range's start and arms the take — and the clip that comes out already carries the slate's name and tags, so the work you did live is not done twice. Both keys work while you are recording, because you spot the next moment while talking over this one. The slate stays in the list after its take: coaches re-record.

Fixed

  • The scroll wheel scrubbed the wrong way. Rolling the wheel away from you now goes forward, as it does in a video player. It used to follow the convention for scrolling a document, where pushing the content up walks a timeline backwards — consistent on paper, wrong in the hand.

Changed

  • The wheel scrubs over the picture too, not only over the scrubber: a notch is 3 seconds, Shift makes it 10, and it works while recording. Ctrl+wheel still zooms about the pointer, and a drag still pans once you are zoomed in.

[0.8.0] - 2026-09-25

Changed

  • The app is now called pundit — pundit Understands Nothing, Discusses It Thoroughly. It was Coach Cuts, a name it inherited from the macOS app it was ported from, and it is being used for more than football, so it needed one of its own that is not tied to a sport. What this means in practice: the command is pundit, the menu entry is pundit, the package is pundit, and apt install ./pundit_0.8.0_amd64.deb removes coach-cuts as part of the same command.
  • Your settings, your basket and your speech model come with it. On the first run, the app takes over the two directories the old name left behind (~/.config/coach-cuts and ~/.cache/coach-cuts), so the project you last had open, the pen you draw with, the basket you filled and the 488 MB speech model you already downloaded are all still there, and nothing is fetched again. If a directory under the new name already exists, the old one is left alone for you to delete.
  • $COACH_CUTS_WHISPER_MODEL is now $PUNDIT_WHISPER_MODEL, if you had set it by hand.
  • If you pinned Coach Cuts to your panel or favourites, re-pin it. The old package is removed by the install, so the launcher it owned goes with it; the new entry is pundit, with the same icon.
  • A basket's film now lands in pundit in your videos folder, not Coach Cuts. Films already written keep their old folder.

Removed

  • The macOS app is no longer in the tree. This is a Linux program, and the Swift original it was written against had not been built or maintained for months. It is kept whole at the git tag macos-reference for anyone asking what the original did. Nothing in the Linux app changes.

[0.7.0] - 2026-09-25

Added

  • The basket: one film from several matches. Add a clip to the basket from whichever project you have open, move to another match, add another, and press Start — you get a single video of all the pieces, in the order you added them, each carrying its own match's scoreboard and clock. It's in a clip's menu ("Add to basket") and behind the Basket… button beside Export…, which works with no project open. The film lands in Coach Cuts in your videos folder.
  • The score and match clock on the picture while you scan, drawn by the same code that burns them into an export, so what you see is what you'll get. It disappears while you drag the scrubber and comes back when you let go.
  • The mouse wheel scrubs when the pointer is over the scrubber: a notch is 3 seconds, Shift makes it 10, and it keeps working while you record, where dragging the scrubber doesn't.

Changed

  • The scoreboard and the webcam or avatar inset sit in the picture's corners rather than floating a little way off them, and the caption bar stops where the inset begins instead of running underneath it.

[0.6.0] - 2026-09-24

The first published release. Every version below this one was built and installed by hand, so this release is all of them together — the changelog says what each one added.

Added

  • A chapter list to paste into a YouTube description. Every export that has chapters now writes a plain .chapters.txt beside the video: one line per chapter, starting at 0:00. Paste the whole thing into the video's description and YouTube turns it into a chapter strip under the player. (Uploads ignore the chapters stored inside the file, which is why the list exists.) Chapters closer together than ten seconds are left out, because YouTube refuses the whole list otherwise.

Changed

  • A goals reel's chapters read as prose — Goal 3 — Rovers 2-1 — instead of repeating the caption burned across the picture, and the one where the goals cross into the second half says so.

Fixed

  • A transcription that failed part-way no longer stops the ones behind it. Every clip queued after it used to sit there silently until you cancelled.

[0.5.0] - 2026-09-24

Added

  • Type or paste in match events instead of tagging them live. Edit events… in the Match panel takes one event per line — 2 14:05 home goal, meaning the second video, 14 minutes 5 seconds in — and a whole list at once. Each line is echoed back as understood, already there, or refused with the reason, and adding them all is a single undo.
  • Fix a wrong event by retyping one line. Click an event in the list and it opens as a single line: the video, the time and the kind. Enter applies it and the list re-sorts; Esc leaves it alone. A goal keeps the trims you gave it.
  • A colour picker for team kits. The swatches in Set up teams… now open a picker with a row of common kit colours, a hue strip and a shade area. You can still type a hex code, and the picker follows it.
  • Every exported file says what it is. The video carries its title and the day the footage was recorded and, once you have set up teams and tagged kick-off, the final score and both team names — so a video player or an upload can show them without you typing anything.

Changed

  • A goal's clip starts 20 seconds before the goal rather than 30, which is closer to where the build-up actually begins. You can still trim each goal.

[0.4.0] - 2026-09-23

Added

  • The whole match exports as a straight copy of your footage. It finishes in well under a minute instead of an hour, at about a quarter of the size, with nothing lost — the original picture and sound are copied rather than recorded again. Drawings and highlights can't ride a copy, and the export sheet says so.
  • The scoreboard as a subtitle track. A copied match comes with the clock and score as subtitles — both inside the file and as an .srt beside it — so VLC shows them as the match goes and Subtitle → Sub Track switches them off. The .srt can also be attached to a YouTube upload, where the board shows the same way. A new Scoreboard picker in the export sheet chooses how the board travels.

Fixed

  • Exports are about half the size at every quality. The encoder had been running with no discipline about file size — a 56-minute match at High came out at about 7.9 GB. It is now about 4.5 GB, and about 2.7 GB at Medium. The picture, and the burned-in scoreboard text, are as crisp as before.
  • Machines with no hardware video encoding were ignoring the quality you picked. They exported everything at roughly the same low quality whatever you chose. Low, Medium and High now each mean something on those machines too.

[0.3.0] - 2026-09-23

Added

  • Record with a picture of yourself instead of the webcam. Choose a photo under Inset in Devices… and the camera is never opened — no camera light, no permission prompt. Your picture sits in the corner as a circle and swells as you talk, live while you record and in the finished video. The picture is copied into the project folder, so your original is untouched.

[0.2.1] - 2026-09-22

Added

  • Export the whole match as one video, with the clock and score burned in and no commentary or webcam inset.
  • A goals reel per team. Each side that scored gets its own reel, named from Set up teams…, and an All goals row appears when both sides scored.
  • Chapters named for whoever's watching — "Kick-off", "Rovers goal 1-0", "Half time" — rather than the caption bar's wording.

[0.2.0] - 2026-09-22

Added

  • A goals reel. Every goal becomes one video, each goal cut with the build-up before it. Trim where a goal's piece starts and ends, per goal, from its row in the Match panel.
  • Chapters in every exported file, so you can jump straight to a clip or a goal in a video player.
  • Goal and period marks on the scrubber, each goal in the scoring team's colour, with [ and ] to jump from one to the next.
  • Player highlights. Press H, pause, and drag a box around a player: a ring appears at their feet with a label you can type into. Place another box further on and the ring glides between them — while you watch, in previews and in exports. It stays with the player when you zoom and pan.

Changed

  • A project made by an earlier version is upgraded the first time you save it. The old file is kept beside the new one in the project folder, so you can go back to the earlier version if you ever need to, losing whatever changed since.

[0.1.0] - 2026-09-22

The first Linux release, as a .deb for Ubuntu 24.04 and Linux Mint 22 on x86-64.

Added

  • Projects. A project is a folder: your settings, your commentary recordings, and your exports. The game video stays where it is. The app reopens your last project on its own.
  • Your game film as one timeline. Add one video or several — both halves, say — reorder them, and play straight across the join. The readout and scrubber count them as one match.
  • Scanning. Space plays and pauses. ←/→ (or A/D) skip 3 seconds and Shift+←/→ skip 10. , and . step back and forward one frame while paused, with tenths in the readout. J and L scan down and up through 2×, 4×, 8×, 16× and 32×, and pausing puts you on the frame you were watching.
  • Zoom and pan. Ctrl + two-finger scroll zooms toward the pointer, plain scroll or a click-drag pans, 3 and 2 zoom in and out, and 1 goes back to the full picture.
  • Recording commentary. Press R and talk over the film with your webcam and microphone. Everything you do to the picture while recording — play, pause, seek, zoom, pan — replays in step afterwards. Press R or Esc to stop, and a clip appears named for the moment you started.
  • Drawing while you record. Drag on the picture to draw: six pen colours, each with a dark edge so it reads on grass and on kits. Drawings fade five seconds after you lift, or stay until you press C if you untick Auto-clear. They replay where and when you drew them.
  • Clips you can find again. Name them, tag them, add notes, and filter the clip list by tag. Reorder them by dragging, or sort them into game order. Ctrl+Z and Ctrl+Shift+Z undo and redo.
  • Preview. Play a clip back with your commentary, your drawings and your webcam inset, all in step with the film, before you export anything.
  • Scoreboard and match clock. Set up the two teams, their colours and the match format, then tag goals and the start and end of each period with Z, X and V. The clock and score follow the playhead and are drawn into previews and exports. If your footage starts after kick-off, tick the box in the setup sheet and the clock still reads correctly.
  • Transcripts. Transcribe a clip's commentary on your own computer with whisper.cpp. Choose the more accurate model or the faster one; the app downloads it the first time and keeps it, and nothing else leaves your machine. The transcript is yours to edit.
  • Export. One .mp4 per target — every clip, the clips with one tag, or a single clip — at 720p or 1080p, into the project's exports/ folder. Each clip carries a caption bar with its number, name and tags, and the webcam inset can be turned off clip by clip. A running export shows its progress and can be cancelled without losing the files that already finished.
  • Hardware video where your machine has it, for playback and export, with a slower software fallback where it doesn't.

Developers

pundit is a Rust workspace under crates/, with a Slint user interface and GStreamer doing the video work. The design of the Linux app is written up in the Linux port design spec, and the conventions every change is held to — the zero-copy decode path, the capture clock, the export graph, the crate dependency rules — are in CLAUDE.md.

The crates

  • crates/pundit-core — pure logic: the project format, the playback timeline, zoom, and stroke replay. It declares no media dependency at all, and CI runs its tests on a machine with no GStreamer installed.
  • crates/pundit-media — everything GStreamer: the source player, capture, the export frame driver and the overlay rasterizer.
  • crates/pundit-app — the Slint user interface, the command bus and the event layer.
  • crates/pundit-harness — headless integration tests driven over the command bus.

API documentation

The rustdoc for each crate, built with private items included:

Building and design history

  • Build from source — the packages to install, and how to run the tests and build the .deb.
  • docs/superpowers/ — the specs, plans and measurement spikes behind every phase of the port, in date order.