beısl
Who ate the frame?
Beisl is performance tracing for games on Linux. One line in your launch options; it samples the whole stack with perf, bookmarks the hitches through MangoHud’s frametime log, and hands you the verdict by layer — kernel, GPU driver, the game itself, DXVK, or wine. Any wine. That’s rather the point.
The headline view
The whole thesis is one bar.
A trace is thousands of stack samples. Beisl buckets every one of them by the layer its module belongs to and answers the only question a stutter really asks: who ate the frame? Not a flamegraph first — a verdict first, with the receipts one click below. And beside every share, an honest number: how much of that layer it could actually name.
| Layer | Share | Symbol coverage |
|---|
A big layer with low coverage is where installing that layer’s debuginfo actually buys you fidelity — the issues panel says which package.
The regular’s verdict
“The good pour” is Beisl’s first real capture — Blood West, picked because it runs great: 45% kernel, 32% the game’s own JIT, ~3% DXVK, wine under half a percent. The other two nights and the coverage figures are illustrative. One house rule made this bar possible: brand burgundy never appears in it. The wine segment is the app’s own data red, the driver wears its vendor’s colour — Beislrot frames, layer colours testify.
The side-channel
The hitches, bookmarked.
MangoHud is not the product — it’s the bookmark ribbon. Its frametime log,
flushed every frame, timestamps the worst hitches; Beisl turns those
timestamps into markers into the perf trace. So instead of
staring down a whole-session flamegraph, you jump straight to
the five worst hitches and what wine was doing during each.
The frametime log survives up to a crash, and the CSV rides along in the
run directory next to perf.data, the logs, and
session.json.
| Tier | Wine | What you get |
|---|---|---|
| Full | SpritzWine / Prater | retained debug info — internal statics, not just exports |
| Exports | stock Proton, GE — any stripped build | module maps ⋈ export tables — exported functions, zero cooperation needed |
| Distro | system wine | your distro’s debuginfo packages — often very good |
Impartial by construction
Any wine. That’s the point.
The capture path never touches a particular wine: the wrapper, MangoHud and
perf sample whatever runs — stock Proton, GE,
Lutris-wine, system wine, SpritzWine, even a native Linux game. Which makes
Beisl an impartial critic: it can trace the baseline half of an A/B
(“same game, same driver, different runtime”) just as happily as the house’s own pour.
And the house pours from two taps these days — a Valve-tree build and an
upstream-WineHQ build carrying the full Rust mix — so the cleanest A/B of all,
same Rust, different base, is on the menu too.
Symbol fidelity is tiered instead of assumed — and every trace is stamped with its tier, so a comparison never silently reads full symbols against partial ones.
The house stance
“Confirming a good game is good is a first-class result, not a null one.”
Beisl is the honest regular, not a doom tool. It says so with conviction when it wasn’t the wine — which is exactly why you can trust it when it says it was. Good runs are a result too.
The other kind of verdict
And a wall is a result too.
Some games don’t stutter. They hit a wall: an anti-cheat driver wine can’t load, a function it never implemented, a path it can’t resolve. No frames to itemize, because none were ever poured. Beisl knows those walls by shape and says so while the game is still up: “Heads up”, not “No problems detected” beside the game’s own error dialog.
The trace keeps the receipt: the wall in plain words, the line that proves it, and every driver the game asked for, marked builtin or not. That roster is read from the wine tree that actually ran, so Beisl says “unknown” instead of guessing.
A default Proton launch runs WINEDEBUG=-all, so the wall
leaves nothing to find. Turn PROTON_LOG on and Beisl reads
that too, keeping a copy as proton.log before Proton bins
it. The switch is yours; the reading is ours. What turns up goes to
gamebus, where findings are housed and filed:
beisl-compat drafts the ProtonDB or AreWeAntiCheatYet
report and marks what you sent. Nothing is submitted behind your back.
The same window lists the launches gamebus could not name with
authority, for you to dismiss, correct or promote.
| Signature | What happened | Fixable |
|---|---|---|
| kernel-driver | the game asked wine to load a kernel-mode driver it doesn’t ship (an anti-cheat, most likely) | not on this machine |
| wine-stub | the game called a function this wine doesn’t implement | upstream wine |
| volume-guid | wine couldn’t resolve a volume-GUID path (status c00000cb) |
upstream wine |
How it works
Launch option in, verdict out.
-
Pour
Put
beisl %command%in the game’s Steam launch options — or set it as the Lutris wrapper, or runbeisl wine game.exe. No game patching, no ptrace: PMU sampling, so even anti-tamper titles tolerate it. -
Play
Beisl sets the table: MangoHud logs frametimes every frame,
perfrecords the stack, and everything — trace, logs, CSV,session.json— lands in a per-run directory under~/.local/share/beisl/traces/. -
The verdict
A crash is analyzed on the spot. A clean run is kept and politely asked about: Analyze or Discard — your trace, your call. Analysis yields the layer bar, the frametime timeline, and the issues panel.
beisl %command% · beisl --check — the CLI that runs the
show and vets your host: perf, symbolizer, paranoid level, MangoHud, GPU quirks
like dual ICDs.
beisl symbols <run-dir> — the same layer split as a text bar,
plus artifact.json and report.txt you can hand to
anyone. Or to a machine: the bundled beisl-mcp server lets an AI
client list your runs and read every artifact, report and log — read-only,
stdio-only, inert until you wire it into a client.
beisl-setup — preflight checklist with guided fixes, then the
results view: the vendor-coloured layer bar, frametime chart with spike
bookmarks, and which debuginfo would sharpen the picture.
Quickstart
On tap in two minutes.
- Steam
beisl %command%in Launch Options - Lutris
beislas the wrapper / pre-launch command - Bare wine
beisl wine game.exe - SpritzWine a “Record performance” toggle in the control panel — no launch options at all
Steam’s newest client launches games with a bare system PATH —
the setup checklist ships a one-click fix so a plain beisl %command%
keeps working (upstream bug).
Beisl is young, but 0.4.0, the Packaging release, runs end to
end and comes two ways: an AppImage, one file that stays where
you keep it and sets up four small launchers instead of unpacking
itself, or the tarball with its own installer. Both are on the
0.4.0 release page
with SHA256SUMS, beside a source and a vendor tarball
that build with the network off. Releases are built on Debian 12, so
they start on Ubuntu 22.04 and Debian 12 too. Recipes for Arch,
Fedora (COPR), openSUSE and Nix sit in
packaging/;
no distro ships a package yet, and Flatpak is designed, not built.
Inside: a results view that reports the median you actually felt, a
trace library that is honest about broken runs, compat walls called
while the game is up, beisl-compat to review them, an
MCP server that answers "anything crash since we last talked?", man
pages, and a degraded recording tier for a locked-down box. The
Exports symbol tier is proven on real captures;
Full-tier symbols are en route. Source and issues at
codeberg.org/SpritzWine/beisl.
# the AppImage: one file, kept where you like. Nothing is
# copied out of it; ~/.local/bin gets four launchers.
chmod +x Beisl-*.AppImage
./Beisl-*.AppImage install # or double-click: the setup window
# or the tarball, from the extracted bundle:
./beisl install # four tools + man pages (`man beisl`)
# once: vet the host (perf, llvm, paranoid, MangoHud, GPU)
beisl --check
# Steam → your game → Properties… → Launch Options:
beisl %command%
# next launch is traced; each run keeps its own dir:
# ~/.local/share/beisl/traces/run-*/
The house
Three Viennese siblings: the house pours the wine — and keeps the pub that vets it. Two glasses are on tap: spritzvalve on Valve’s Proton tree, the one anti-tamper titles boot on and what Prater — the distribution people actually install — is built from; and spritzwine on upstream WineHQ, the endeavour itself, now tracking wine 11.13 with the full Rust mix. Its own builds, everyone else’s too; the regulars don’t play favorites.