Desktop booru client built with Qt for Python (PySide6) — a reimplementation of the Flutter app Boorusama
Project description
Boorusama-Qt
A desktop reimplementation of Boorusama (the Flutter booru client) built with Qt for Python (PySide6) instead of Flutter/Dart.
It's a multi-backend image-board browser with a pluggable engine architecture: adding a new booru is a single module (or, for many sites, just a config profile).
Browse view — infinite-scroll grid with tag search.
Post viewer — full image with category-grouped, clickable tags and metadata.
Table of contents
Features
- 🔌 Pluggable engines — Danbooru, Gelbooru, and a config-driven generic
engine (moebooru/philomena profiles, e.g. yande.re, Konachan). Add more by
dropping a module into
boorusama/engines/. - 🔍 Search with per-token tag autocomplete (category-colored).
- 🖼 Responsive thumbnail grid with infinite scroll and a two-tier (memory + disk) image cache.
- 🔎 Full post viewer — large image, category-grouped clickable tags,
metadata, prev/next navigation (arrow keys), favorite (
F), download. - ♥ Local favorites and search history (SQLite-backed).
- 📚 Pools browsing (where the backend supports it, e.g. Danbooru).
- ⤓ Download manager with live progress.
- 🚫 Blacklist (Danbooru-style AND/OR rules) and a safe-mode toggle.
- 🎨 Theming — dark / light / midnight palettes with a custom accent color.
- 👤 Per-source login (API keys) for sites that require/benefit from it.
Install & run
Requires Python 3.11+ (PySide6 6.6+ is pulled in automatically).
From a release package
Grab the wheel from the latest release, then:
# with uv (recommended) — installs an isolated `boorusama-qt` command
uv tool install ./boorusama_qt-0.1.0-py3-none-any.whl
boorusama-qt
# …or into an environment with pip
pip install ./boorusama_qt-0.1.0-py3-none-any.whl
boorusama-qt
From source
git clone https://github.com/1Git2Clone/boorusama-qt
cd boorusama-qt
# with uv
uv run python main.py
# …or a classic venv
python -m venv .venv && source .venv/bin/activate
pip install -e .
python main.py
Build the packages yourself
uv build # → dist/boorusama_qt-*.whl and *.tar.gz
Architecture
boorusama/
├── core/ backend-agnostic foundation
│ ├── models.py Post, Tag, Pool, Rating, Account dataclasses
│ ├── engine.py BooruEngine ABC + capabilities/config
│ ├── registry.py engine registration & instantiation
│ ├── workers.py QThreadPool helpers (run_async)
│ └── imageloader.py async image fetch + mem/disk cache
├── engines/ one module per backend family
│ ├── danbooru.py
│ ├── gelbooru.py
│ └── generic.py config-driven (moebooru / philomena profiles)
├── services/ local features
│ ├── storage.py SQLite favorites + history
│ ├── blacklist.py tag/rating filtering
│ └── downloads.py streaming download manager
├── ui/ PySide6 widgets & windows
│ ├── main_window.py nav rail, source switcher, content stack
│ ├── search_bar.py debounced autocomplete
│ ├── post_grid.py infinite-scroll grid
│ ├── post_viewer.py full viewer + tag/metadata panel
│ ├── pages.py favorites / history / downloads / pools
│ ├── settings_dialog.py sources, login, appearance, content filters
│ ├── widgets.py FlowLayout, TagChip, PostThumbnail
│ └── theme.py QSS palettes
├── config.py JSON settings + source definitions + paths
├── context.py central AppContext wiring everything together
└── app.py QApplication bootstrap
Adding a new booru
For Danbooru/moebooru/Gelbooru-shaped JSON APIs, add a profile to
PROFILES in engines/generic.py and a default SourceConfig in
config.py. For anything bespoke, subclass BooruEngine, implement
search_posts (and optionally autocomplete_tags, search_pools, …), and
decorate it with @register_engine.
Development
This project uses uv for everything; see
CONTRIBUTING.md
for the full guide.
Git hooks
The repo ships hooks under .githooks/. Enable them once per clone:
git config core.hooksPath .githooks # or: sh scripts/setup-hooks.sh
- pre-commit — runs
ruff checkandruff format --check(fast). - pre-push — runs the full CI-equivalent gate before anything leaves your
machine:
rufflint + format,pyright, and the headless smoke test. This is the local stand-in for branch protection — a failing gate aborts the push.
Bypass in an emergency with git commit --no-verify / git push --no-verify.
Quality gates
The same checks the hooks and CI run, to invoke by hand:
uvx ruff check . # lint
uvx ruff format --check . # formatting (drop --check to fix)
uv run --with pyright pyright # type check
QT_QPA_PLATFORM=offscreen uv run python scripts/ci_smoke.py # headless smoke test
Notes on backends
- Danbooru — fully supported (search, autocomplete, pools, login, per-category tags).
- yande.re / Konachan — work out of the box via the generic
moebooruprofile. - Gelbooru — now requires an API key (
user_id+api_key) for its JSON API even for reads. Add credentials under Settings → Sources & Login; errors otherwise surface in the status bar.
Keyboard & mouse
In the post viewer:
| Key | Action |
|---|---|
← / → |
Previous / next post |
F |
Toggle favorite |
Esc |
Back to grid |
Browser-style history (anywhere) — moves through searches, pools, opened posts, and sidebar pages:
| Input | Action |
|---|---|
Mouse Back (button 4) / Alt+← |
Back |
Mouse Forward (button 5) / Alt+→ |
Forward |
Status
This is a faithful but from-scratch port focused on the core Boorusama loop and the major feature surfaces. It is not affiliated with the original project.
License
Released under the GNU General Public License v3.0 or later — see
LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file boorusama_qt-0.1.1.tar.gz.
File metadata
- Download URL: boorusama_qt-0.1.1.tar.gz
- Upload date:
- Size: 49.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57b280fa4cfd40bbda9817538c02def897b30ab316310bac920950537aa05cd8
|
|
| MD5 |
8ccaa69ed08f8388c98c71d1652537db
|
|
| BLAKE2b-256 |
8a11bb89f7848f104876b90af23c1fa04518c3ae3f07921405b319357b1eac52
|
File details
Details for the file boorusama_qt-0.1.1-py3-none-any.whl.
File metadata
- Download URL: boorusama_qt-0.1.1-py3-none-any.whl
- Upload date:
- Size: 62.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.17 {"installer":{"name":"uv","version":"0.11.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ae702270a12172605315ad6c1c4638054a3fa830a0e23b6f300f51049db42b3e
|
|
| MD5 |
7e8940c919523fefeeb958aef0227e77
|
|
| BLAKE2b-256 |
5794a5bd76abf9b81ebad375b650f05823ecf284d254ddb9d99590cf98db4c6c
|