Skip to main content

Desktop booru client built with Qt for Python (PySide6) — a reimplementation of the Flutter app Boorusama

Project description

Boorusama-Qt

CI Release License: GPL v3 Python Qt for Python Linter: Ruff Checked with pyright

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).

Boorusama-Qt browsing Danbooru

Browse view — infinite-scroll grid with tag search.

Boorusama-Qt post viewer

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 check and ruff format --check (fast).
  • pre-push — runs the full CI-equivalent gate before anything leaves your machine: ruff lint + 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 moebooru profile.
  • 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

boorusama_qt-0.1.0.tar.gz (49.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

boorusama_qt-0.1.0-py3-none-any.whl (62.1 kB view details)

Uploaded Python 3

File details

Details for the file boorusama_qt-0.1.0.tar.gz.

File metadata

  • Download URL: boorusama_qt-0.1.0.tar.gz
  • Upload date:
  • Size: 49.4 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

Hashes for boorusama_qt-0.1.0.tar.gz
Algorithm Hash digest
SHA256 20884b7382b21e5a61ae739314c944126b0fbe7efcd6d44fe07f807e4260febd
MD5 9323cab8e5017b13cc230a536955cece
BLAKE2b-256 1346d17feb8df417011fb804c06653f6a8309a805c1f4860567e50354a07404f

See more details on using hashes here.

File details

Details for the file boorusama_qt-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: boorusama_qt-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 62.1 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

Hashes for boorusama_qt-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 86055e9376f0d20042ed025e31d589b32ed94d90d70e5393e2a296a53e281763
MD5 663172d67a7bd090f686cbf35de656c6
BLAKE2b-256 78d520cc5824b3b0cda053f1cdd8510dcf9af5b1af4bb444a1abad397caff9dc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page