An offline Windows 10/11 file browser built for my personal preferences.
- Offline - BertBrowser does not connect to the Internet except a startup check against GitHub Releases for app updates.
- Fast global search - MFT indexing and USN journal tracking for fastest possible performance.
- Directory sizes — Show total size on directories, just like files.
- Split panes with tabs - Infinite pane splitting and tabs per pane.
- Themes - Rich theming system, with many pre-loaded themes.
winget install RobWalsh.BertBrowser- Or grab the latest installer and run it.
- Or download the latest portable executable if you'd rather not install anything.
The latest code in main, rebuilt and published on every push. It gets the same test suite a release
gets and none of the settling time.
- Grab the unstable installer, or the unstable portable build.
It replaces an installed copy rather than sitting beside it, and from then on that copy updates
along unstable instead of along releases. The title bar says which you are on — BertBrowser 1.1.3-unstable.42
against BertBrowser 1.1.2. Your data in %USERPROFILE%\.bertbrowser is untouched either way, and
running the stable installer
over the top puts you back.
git clone https://github.com/robgwalsh/bertbrowser.git
cd bertbrowser
dotnet build bertbrowser.sln # build
dotnet test bertbrowser.sln # run tests
dotnet run --project src/BertBrowser.App # launch
dotnet run --project src/BertBrowser.App -- C:\Some\Dir # launch at a specific folderNote that warnings are treated as errors across the solution (Directory.Build.props), so a clean build is a warning-free build.
See docs/build-and-release.md for packaging, the tag-driven release workflow, and how updates reach installed copies.
tools/BertBrowser.Harness allows testing the BertBrowser in a headless way: it builds the app's own service graph and shows the real
MainWindow parked outside every monitor and refused activation, then drives it with a small script
language and captures it with RenderTargetBitmap — a software re-render of the visual tree, so
being offscreen and covered costs nothing.
$harness = "tools\BertBrowser.Harness\bin\Debug\net10.0-windows\BertBrowser.Harness.exe"
& $harness --script tools\ui\smoke.bbs # browse, search, move, rename, delete, undo
& $harness --script tools\ui\themes.bbs # every built-in theme, and the dialogs
& $harness --script tools\ui\tree.bbs --sandbox C:\Source\treecheck --allow-outside
& $harness -c "tree .; refresh; shot look" # ad hoc; prints the PNG path
& $harness --helpEach run gets a throwaway fixture tree and its own scratch BERTBROWSER_DATA_DIR, so it never
touches your real index, settings or themes. It starts no programs, never touches the clipboard, and
refuses to write outside its sandbox — the harness drives the real transfer, rename and delete
executors, not stubs.
| What | Where |
|---|---|
| Size-cache + search-index database | %USERPROFILE%\.bertbrowser\bertbrowser.db |
| Window/session settings | %USERPROFILE%\.bertbrowser\settings.json |
Delete the folder to reset the app completely.
src/BertBrowser.Core— everything testable and UI-free: SQLite persistence and migrations, path canonicalization, search-index and directory-size services.src/BertBrowser.App— the WPF shell (MVVM via CommunityToolkit.Mvvm, DI via Microsoft.Extensions.DependencyInjection).tests/BertBrowser.Core.Tests— xUnit tests for Core; they run against real temp SQLite databases and directory trees.tools/BertBrowser.Harness— hosts the real window offscreen and scripts it;tools/ui/*.bbsare the scripts.
See CLAUDE.md for a deeper architecture walkthrough (path-key invariants, migrations, the size-scan algorithm).
