Loaf is designed to replace crowded, outdated file managers with an interface that looks modern, runs fast, and doesn't compromise on functionality. Built using Rust for native system performance and Qt6 Quick / QML for fluid Material 3 Expressive animations.
Note: Loaf is still at a very alpha stage, expect bugs or missing features. Contributions of any kind are very welcome!
- Fast by Design: Built with a high-performance Rust backend and hardware acceleration for snappy folder navigation and low memory usage.
- Material 3 Expressive UI: Modern interface with fluid spring animations, modular rounded geometry, and curated icons.
- Dynamic Theming & Opacity: 8 built-in palettes, automatic accent extraction from your desktop wallpaper, and granular slider control over window transparency, foreground, and background opacity.
- Low-Power Mode: Automatically disables animations, transparencies, and blur effects when on battery or low-spec hardware to conserve resources.
- Tabs & Split View: Multi-task efficiently with browser-style tabs (
Ctrl+T) and side-by-side dual pane view (F3). - Flexible View Modes: Responsive Grid and Detailed List views featuring connected, fluid item selection.
- Drive & Storage Dashboard: A dedicated "This PC" hub with partition usage bars, mount/eject controls, and customizable layouts.
- Total Interface Customization: Tailor the UI to your workflow—show, hide, or reorder sidebar entries, toolbar buttons, headers, and context menu actions.
- Full Nautilus Scripts Support: Run your existing Nautilus scripts directly from the context menu for automated file actions.
- Power Actions: Built-in context options for Open In Terminal, Open With..., and elevated administrative operations.
- Quick Look: Press
Spaceto instantly preview images, videos, audio, and documents without launching an external app. - Rich Thumbnails: High-resolution thumbnail generation for photos, video clips, PDFs, and font files.
- Built-in Archive Engine: Browse, extract, and compress
.zip,.tar.*,.7z, and other standard formats directly within the directory tree.
- Network Storage: Connect and browse network shares effortlessly over SMB, WebDAV, and other standard protocols.
- P2P Link Sharing: Generate a local link to instantly beam files and folders to any phone, PC, or browser on your network.
- Native XDG File Picker: Built-in desktop file portal integration that replaces generic system dialogs with Loaf's full interface across all your apps.
Install or update Loaf using the interactive script:
curl -sSL https://raw.githubusercontent.com/m-uvex/loaf-fm/main/install.sh | bash
Download pre-compiled binaries from the Releases page.
chmod +x Loaf-*.AppImage
./Loaf-*.AppImage
sudo apt install ./loaf_*_amd64.deb
Install from the AUR (Community maintained):
yay -S loaf-fm-bin
# or
paru -S loaf-fm-bin
Or install the downloaded package manually:
sudo pacman -U ./loaf-*.pkg.tar.zst
sudo dnf install ./loaf-*.rpm
Run directly:
nix run github:m-uvex/loaf-fm
Declarative setup via Flakes:
# flake.nix
inputs.loaf.url = "github:m-uvex/loaf-fm";
# configuration.nix
{ inputs, pkgs, ... }: {
nixpkgs.overlays = [ inputs.loaf.overlays.default ];
environment.systemPackages = [ pkgs.loaf ];
}The dev shell provides all Qt6 dependencies and toolchains automatically:
nix develop --command cargo build --release
- Build tools: Rust (1.75+), C++17 compiler, CMake, Ninja,
pkg-config - Qt6 libraries:
qtbase(including private headers and QtDBus),qtdeclarative,qtsvg,qtwayland - Fedora:
sudo dnf install qt6-qtbase-devel qt6-qtbase-private-devel qt6-qtdeclarative-devel qt6-qtsvg-devel qt6-qtwayland-devel - Debian/Ubuntu:
sudo apt install qt6-base-dev qt6-base-private-dev qt6-declarative-dev libqt6svg6-dev qt6-wayland-dev - Arch:
sudo pacman -S qt6-base qt6-declarative qt6-svg qt6-wayland
Qt Linguist tools (lupdate/lrelease) compile the translations/*.ts catalogues into the
binary. The UI language follows the system locale, can be changed in Settings → Interface →
Language, or overridden for one launch with LOAF_LANG (e.g. LOAF_LANG=id_ID ./target/release/loaf).
Contributors: to regenerate the master catalogue, run
lupdate cpp qml translations/loaf_<locale>.ts. Edit translations with Qt Linguist (linguist), compile them with
lrelease translations/loaf_<locale>.ts -qm loaf_<locale>.qm, and list each locale in
qml/settings/languages.json so the Language picker shows it.
Optional at runtime (features degrade gracefully without them):
7zip/p7zip(zip, 7z, rar, iso, encrypted archives),tar,zstd,cpioudisks2(mount, eject, unlock encrypted drives, rename labels)- Optional MTP USB phone support:
kio-extraspackage on Arch (pacman -S kio-extras), Debian/Ubuntu (apt install kio-extras), orpkgs.kdePackages.kio-extrason NixOS. This package provides the canonical session D-Bus serviceorg.kde.kmtpd5(executed viakio-extras-service/kiod6) for USB phone browsing and read/write transfers. On NixOS, install it at the system level (environment.systemPackages = [ pkgs.kdePackages.kio-extras ];andservices.dbus.packages = [ pkgs.kdePackages.kio-extras ];) so its D-Bus service is registered in the session activation registry, rather than merely in a transientnix-shell. A full KDE Plasma desktop environment or manually running daemon is not required (the host D-Bus session bus activates the service on demand across Hyprland, Sway, GNOME, etc., provided the service file is registered). When absent or unregistered, MTP devices degrade cleanly without affecting local disk browsing or causing UI hangs; KIOFuse is not required. ffmpegthumbnailer/evince-thumbnailer(video and PDF thumbnails)xdg-utils,libsecret(secret-tool, to remember drive passphrases),polkit(Open as Administrator)
Features degrade gracefully if these are not installed:
kio-extras– MTP USB phone support (requires session D-Bus registration)7zip/p7zip,tar,zstd– Archive browsing and extractionudisks2– Drive management, mounting, and passphrase unlockingffmpegthumbnailer,evince-thumbnailer– Video and PDF thumbnailspolkit– Admin file operations
cargo build --release
./target/release/loaf
loaf [OPTIONS] [PATH...]
PATH Folder to open, or a file to show selected in its folder
-p, --path <DIR> Start in DIR
-m, --mini Start in the compact layout
--new-window Open a separate window instead of a tab in the running one
--class <NAME> Use NAME as the window class (Wayland app id / WM_CLASS)
--portal Serve the xdg-desktop-portal file chooser (D-Bus activation)
-v, --verbose Print diagnostic messages
--version Print the version
-h, --help Print help
- Single-Instance IPC: Running
loaf <path>when an instance is already active attaches the path as a new tab by default. - Desktop "Show in Folder": Registers as the default
org.freedesktop.FileManager1D-Bus provider so browsers and external apps reveal files directly in Loaf. - Window Rules: Passing
--class <NAME>spawns an isolated instance with a distinct identity, making it easy to configure floating, sizing, or workspace rules in Hyprland, Sway, or i3. - System File Dialogs: Running with
--portalallows Loaf to replace generic system open/save file pickers. See docs/portal.md for details.
| Shortcut | Action |
|---|---|
Ctrl + Z |
Undo last operation |
Ctrl + Y / Ctrl + Shift + Z |
Redo last operation |
Ctrl + H |
Toggle hidden files |
Ctrl + L |
Edit path bar directly |
Alt + Left / Mouse Back |
Navigate back in history |
Alt + Right / Mouse Forward |
Navigate forward in history |
Alt + Up / Backspace |
Navigate to parent directory |
F2 |
Rename selected item |
Delete |
Move selected items to Trash |
Ctrl + A |
Select all items |
Ctrl + C / Ctrl + X / Ctrl + V |
Copy / Cut / Paste |
Arrow Keys |
Move selection across files and folders |
Enter / Return |
Open selected item |
Escape |
Dismiss modal / Close context menu / Defocus search |
Shift + Delete |
Delete permanently (asks first) |
Space |
Quick Look preview |
F2 (several selected) |
Rename several items at once |
Ctrl + T / Ctrl + W |
New tab / Close tab |
Ctrl + Tab / Ctrl + Shift + Tab |
Next / previous tab |
F3 |
Toggle split view |
F5 / Ctrl + R |
Reload the folder |
F9 |
Expand / collapse the sidebar |
Ctrl + F |
Search |
Ctrl + N |
New window |
Ctrl + Shift + N |
New folder |
Ctrl + D |
Add the folder to the sidebar |
Ctrl + S / Ctrl + Shift + I |
Select by pattern / Invert selection |
Ctrl + Shift + C |
Copy path |
Alt + Enter |
Properties |
Ctrl + + / Ctrl + - / Ctrl + 0 / Ctrl + Scroll |
Icon size |
Ctrl + 1 / Ctrl + 2 |
Grid / List view |
Alt + Home |
Home folder |
loaf/
├── src/
│ ├── main.rs Entry point: command line, single instance, QML engine
│ ├── pane.rs LoafEngine: one file view as a threaded QAbstractListModel
│ ├── core.rs LoafCore: file operations, undo/redo, drives, places, settings
│ ├── native.rs Rust side of the C++ helpers (cpp/)
│ ├── fsops.rs Copy/move/delete with progress, cancel and filesystem flush
│ ├── trash.rs freedesktop.org trash (home and per-drive)
│ ├── archive.rs Archive create/extract/list through 7-Zip, tar, cpio
│ ├── listing.rs Directory scanning, natural sort, incremental diffs
│ ├── watcher.rs inotify folder and device watchers
│ ├── search.rs Background recursive search
│ ├── apps.rs / xdg.rs Desktop entries, MIME defaults, user dirs, bookmarks, recent
│ ├── icons.rs / drives.rs Icon themes; block devices through UDisks
│ └── info.rs / theme.rs Quick Look and Properties data; dark mode and wallpaper palette
├── cpp/ Async thumbnail provider, clipboard, MIME, D-Bus services
├── qml/
│ ├── main.qml Main window: top bar, tabs, split view, menus and dialogs
│ ├── FilePane.qml One file view (grid / list, selection, inline rename)
│ ├── Sidebar.qml Places, bookmarks, Recent, Starred and Trash
│ ├── QuickLook.qml Space-bar preview
│ ├── PropertiesDialog.qml / BatchRenameDialog.qml / ConflictDialog.qml
│ ├── OperationsPanel.qml / Toast.qml Progress pill and messages
│ ├── PCView.qml This PC tab: storage devices and frequent folders
│ ├── SettingsView.qml Theme preferences, icons, behavior, and experimental toggles
│ ├── Theme.qml Material 3 design token engine & palette derivation
│ ├── LoafIcon.qml Vector icon resolver for Phosphor typography
│ └── components/ Reusable Material 3 component library
│ ├── LoafPopup.qml Elevated popup container with smooth transitions
│ ├── LoafMenu.qml Cascading menus and keyboard navigation
│ ├── LoafMenuItem.qml Individual menu rows with sequential stagger animation
│ ├── LoafButton.qml Tonal, filled, outlined, and text button variants
│ ├── LoafSwitch.qml Spring-animated Material 3 pill toggle switch
│ ├── LoafSegmented.qml Sliding segmented controls for view/sorting modes
│ ├── LoafDialog.qml Centered modal dialog surfaces
│ ├── LoafTextPrompt.qml Input modals (New Folder, New File, Rename, Password)
│ ├── LoafCard.qml Interactive and surface card containers
│ ├── SectionHeader.qml Unified dashboard and section headers
│ ├── UsageBar.qml Smooth progress/storage capacity bar
│ └── DriveCard.qml Mountable, partitioned, and external drive cards
├── packaging/ Packaging recipes, .desktop entries, icons, and dist artifacts
├── assets/
│ ├── fonts/ Phosphor font weights (Regular, Bold, Fill, Duotone, Light, Thin)
│ └── resources.qrc Qt resource manifest
├── Cargo.toml Rust package manifest
└── flake.nix Nix flake declaring devShell and default package
We welcome contributions of all kinds! Please see CONTRIBUTING.md for guidelines on branch targets (main), setting up your development environment with or without Nix, architecture overview, and testing instructions.
This project is licensed under the MIT License. See LICENSE for the full license text and THIRD-PARTY-LICENSES.md for third-party notices and LGPL compliance details.