BertCut (beta)

This application endeavors to be the fastest way to cut, crop, and/or overlay video. I'm making this because I couldn't find a free application where the usability of these basic features weren't unbearably burdened by a bloated feature set.
Install
winget install RobWalsh.BertCut
Once installed, BertCut keeps itself up to date from
GitHub Releases: it checks on startup and applies
the update when you close the app. Your sessions and key bindings live in %USERPROFILE%\.bertcut
and are untouched by an update.
Unstable
The latest build, which might not be in winget yet.
The main release and unstable build overwrite each other. The title bar says which you are on. Your data is untouched by switching between them.
Layout
src/BertCut.Core timeline model, edits, export planner, audio correlation
src/BertCut.Media ffmpeg decode, probing, preview compositing, audio playback,
export process driving
src/BertCut.App WPF shell, timeline, settings screen
tests/ 348 tests; the ffmpeg-dependent ones skip if it isn't installed
Core deliberately depends on nothing but the BCL, so ripple-delete arithmetic, the
timeline↔source mapping, and every ffmpeg argument are testable headlessly.
Building and running from source
Windows and the .NET 10 SDK. tools/ffmpeg/ is not in the repository — it is ~200 MB and
tools/fetch-ffmpeg.ps1 reproduces it.
.\tools\fetch-ffmpeg.ps1 # one-time, ~200 MB
dotnet build .\BertCut.slnx
dotnet test .\BertCut.slnx # the ffmpeg-dependent tests skip if fetch-ffmpeg.ps1 has not been run
dotnet run --project src\BertCut.App
Build the solution rather than a csproj: the solution pins x64, which the 64-bit-only FFmpeg
libraries require.
You can also pass a file directly, or associate .mp4 with the installed BertCut.exe:
dotnet run --project src\BertCut.App -- "C:\recordings\demo.mp4"
See docs/build-and-release.md for packaging, the tag-driven release
workflow, and how updates reach installed copies.
Testing the interface
dotnet test covers everything below the window. The window itself is driven by a harness
that hosts the real MainWindow in-process, parked offscreen and refused activation, so a
run cannot appear over what you are doing or take the keyboard from you:
dotnet build .\BertCut.slnx
.\tools\BertCut.Harness\bin\x64\Debug\net10.0-windows\BertCut.Harness.exe --script .\tools\ui\smoke.bcs
It opens a synthesised clip, marks a range, ripples it away, and writes a PNG at each step —
each one printed as SHOT . Scripts are a line per command (open, key I, goto 90,
shot, state, assert-status …); --help lists them. Keystrokes are resolved through the
real key map and dispatched through the same entry point the toolbar uses, so no operating
system input is synthesised and nothing competes with the desktop. tools/ui/sync.bcs does
the same for the two-angle overlay sync, and zoom.bcs, keyframes.bcs, loop.bcs and
gif.bcs for the timeline strip, the keyframe snap, looping and importing a GIF.
A run is also silent: preview audio goes to a sink that consumes it at real time and discards
it, so the whole playback path runs without anything coming out of the speakers. --audio
opts in.
Because the app restores a session by content key, each run is given its own state directory
through BERTCUT_STATE_DIR and cannot disturb %USERPROFILE%\.bertcut.
Licence
MIT. See LICENSE.
The installer and the portable build bundle FFmpeg, unmodified, under the
LGPL: BtbN's win64-lgpl-shared build of the n8.1 line, whose licence travels alongside the
binaries as ffmpeg\LICENSE.txt. Sources and the build recipe are at
BtbN/FFmpeg-Builds, and tools/fetch-ffmpeg.ps1 is the
exact fetch this repository performs.