A simple, lightweight file browser built with Python, GTK4 and libadwaita.
This is a Python/GTK rewrite of the original Flutter app, following the same
"clean architecture" layout as dupotEasyFlatpak
(domain/ for entities, use cases and contracts; infrastructure/ for GTK
UI and system access).
- Browse your home folder and navigate into subfolders
- Click a folder to open it, click a file to open it with its default app
- Dark/light/system theme, toggleable from the header bar
- Available in English, French and Italian
- tab features
- Preferences persisted under
$XDG_DATA_HOME/org.dupot.filebrowser/
![]() Home folder |
![]() Navigation by column |
![]() Path is editable |
![]() Folder context menu |
![]() Tag a folder with a color |
![]() File properties |
Grid view |
![]() Details view |
![]() Columns view |
![]() Parameters |
Regenerated from a demo dataset (not your real files) with:
./generate_screenshots.pysrc/
main.py entry point, gettext + settings bootstrap
domain/
conf/path_conf.py asset & user-data path resolution
entity/ UserSettingsEntity, FileEntryEntity
contract/ interfaces implemented by infrastructure/
UseCase/list_directory_uc.py list + filter + sort a directory
infrastructure/
api/ SystemApi (filesystem), UserSettingsApi
ui/ AppWindow, PathPage, ParametersDialog, sidebar
locales/ gettext .po/.mo per language
assets/logos/ app icon
assets/icons/{light,dark}/ file-type row icons (baked PNGs, not looked up in the host icon theme)
export/flatpak/ desktop file, appdata.xml, icon set
org.dupot.filebrowser.yml flatpak-builder manifest
This project uses a Nix flake to provide GTK4/libadwaita + PyGObject without touching your system packages:
nix develop
python src/main.pyWithout Nix, install GTK4, libadwaita and PyGObject through your distro's
packages (e.g. on Fedora: sudo dnf install python3-gobject gtk4 libadwaita)
and just run python3 src/main.py.
Languages: en fr it — .po files live in
src/infrastructure/locales/<lang>/LC_MESSAGES/dupot_file_browser.po.
After adding new _("…") strings in the Python code, run:
./generate_translations.sh # extracts strings → .pot, merges into .po, compiles .moStrings passed as variables to _() (the theme/language choice labels in
domain/entity/user_settings_entity.py) aren't picked up by xgettext
automatically — they're listed by hand in
src/infrastructure/locales/dynamic_hints.pot and merged in by the script.
flatpak-builder --user --install --force-clean build-dir org.dupot.filebrowser.yml
flatpak run org.dupot.filebrowser







