The UI overhaul.
Nothing you have breaks. Every saved config and all five presets build byte-identical policy to v1.9.5 — verified against the actual v1.9.5 code, not assumed.
Three-state permission settings
The eight Default*Setting content-setting keys were checkboxes that only ever wrote block. "Ask" wasn't expressible at all. If you wanted Brave to prompt for location rather than hard-refuse it, SlimBrave couldn't say that.
They're now selectors offering the values Chromium actually accepts, defaulting to Not managed so nothing changes until you choose.
The legal values are not uniform, and this release doesn't guess:
| Setting | Options |
|---|---|
| Web Notifications, Location Access, Motion Sensors | Allow / Ask / Block |
| WebUSB, Web Serial, WebHID, Local Fonts, Multi-Screen | Ask / Block only |
Chromium has no Allow state for those last five. Offering one would write a value the browser rejects.
Windows GUI
A fixed window with three independently scrolling columns. The old layout computed a window height and reflowed two columns into three on short displays. That constant was wrong — 1140 against a measured 1144 — and the safety net then produced exactly the scrollbar the constant existed to prevent. The new layout deletes that whole class of bug.
- One-click preset buttons across the top, with a status line.
- Re-sync Registry re-reads live policy into the UI without restarting.
- Presets are embedded in the script, so the buttons work even if you used the one-line install and have no
Presets/folder. A test asserts the embedded copies still match the JSON files, so they can't drift.
TUI (Linux and macOS)
Collapsible categories, each header carrying a live count of what it's managing — so a folded section still tells you whether anything inside it is set.
On launch, the folds reflect what's already applied. A clean machine opens on a short overview; a configured one opens on exactly the sections it's enforcing. Nothing is stored — it's derived from the policy read at startup.
/searches as you type. A match inside a folded section is revealed, so a fold can never hide a result.- PageUp/PageDown and Home/End, none of which were bound before.
?for a key overlay.- Fold markers fall back to ASCII when the terminal's codeset can't encode them —
cursesraisesUnicodeEncodeErrorpast theexcept curses.errorguard, which would have crashed the app on a plain VT100.
Also fixed
A latent IndexError: KEY_UP from the button row indexed the selectable-row list unguarded. Harmless before, reachable the moment a search returns no matches.
Under the hood
Tests went 278 → 372, including three-way parity between the PowerShell and Python feature tables, the embedded-preset drift check, and a property test that the cursor is never left on a hidden row after any fold or filter change.
Verifying this release
7873407c5b30b8310dc2956971584b6437b28fcacc09b166d466ed08b9513c9e SlimBrave.ps1
29bf69edbe2fb5cea22dd1be4900ab643bc08d0f70a1a5366caa57471e0219bc slimbrave-linux.py
1d01de4d1bfba2b8908bb1c0b7dba70418ff6583c6dc505c963454d2b2d211a0 slimbrave-mac.py
Get-FileHash -Algorithm SHA256 .\SlimBrave.ps1sha256sum slimbrave-linux.py # Linux
shasum -a 256 slimbrave-mac.py # macOSTags are not signed — there's no maintainer signing key published yet, so don't read an unsigned tag as a sign of tampering. See SECURITY.md.
macOS is best-effort. It's covered by CI and the test suite, but the Configuration Profile approval flow ends in a GUI step no test can reach. Please open an issue if something breaks.