Repository navigation
Releases
v1.1.2
Reliability & security follow-up: restores Image-to-Prompt drop-to-replace and closes the entire R8 external audit.
Fixed
- Image to Prompt: drop a new image on top of the existing one works again. A Gradio 6.30 regression had shrunk the drop zone to a 16 px corner icon once a file was loaded, so drops silently did nothing. The whole tab is now a valid drop surface and extraction re-runs on every drop (newest file wins). Browser-verified with regression tests.
- Security — credentials can no longer leak across origins. Your board's API key is now only ever sent to the board you queried: any cross-origin redirect hop goes unauthenticated (the behavior httpx itself guarantees). A compromised board or open redirect can no longer steal it.
- Tag Dictionary importer: interrupted imports no longer lose tags. The crash-safe checkpoint previously persisted not-yet-processed tags, and
--resumewould then skip them forever. The checkpoint now stores only what was actually enriched, so a Ctrl-C mid-import recovers cleanly on the next run. - System Status no longer clips long text. Wrapped query summaries and long URLs render in full instead of "Query comple…".
- Dependencies: brotli updated to 1.2.1 (2 advisories fixed);
pip-auditon the locked dependency set now reports no known vulnerabilities. - Minor: the "not valid JSON" error now includes the offending URL, and the two redirect-handling paths in the HTTP client are cross-referenced so they cannot silently diverge.
Tests
231 tests, all green; ruff clean; mypy clean (32 files); pip-audit clean (Pillow 12.x ignores documented and dated, unfixable while Gradio 6 pins pillow<13).
Requirements
Unchanged: Python 3.11+, pip install -r requirements.txt, run start.bat / start.sh (or python app.py). Interface at http://127.0.0.1:7863 (auto-increments if busy).
v1.1.1 — Security hardening, Furbooru source & polished UI
Security & correctness (external audit R7, items A–H)
- SSRF redirect guard actually fires now: manual redirect following (max 5 hops) with public-host re-validation on every hop
- 3-way config merge: cleared state stays cleared, no cross-instance credential clobbering
- Hermetic test suite (fake DNS), honest
pip-auditignore list with parity test - Long-text UI overflow fixed; image cache now byte-bounded (4 GiB default)
- Tag-dictionary importer survives dropped connections (partial catalog + idempotent checkpoints)
New features
- Furbooru as a first-class source (28 total, 7 API families), anonymous Philomena JSON API
- Source capability metadata (
api_family,auth_required,supports_tags,supports_rating_filter,status) - Dynamic source-count badge in the header (counts the registry; no more hardcoded number)
- Refreshed README screenshots (5, light + dark themes, all SFW)
QA: 225 tests green, ruff clean, mypy clean. Full notes in RELEASES.md.
v1.1.0 — Offline Tag Dictionary, Light/Dark theme & 1,000-tag Danbooru importer
HaDeS Booru v1.1.0 is a major update: a fully offline Tag Dictionary, a professional Light/Dark theme system, and a resumable importer that grows the local catalog to the 1,000 most popular Danbooru tags.
Highlights
- Offline Tag Dictionary — new tab backed by a local SQLite catalog. Exact and alias lookups resolve in sub-milliseconds with no network. Bilingual (English definitions always shown; Spanish only when a genuine translation exists). Each entry shows category, post count, known aliases, and a Danbooru wiki link. A live indicator tells you how many tags are available locally.
- 1,000-tag Danbooru import — grow the catalog from the command line. Resumable, rate-limit-aware, fault-isolated, and it cleans wiki markup (including template macros) on import.
- Light / Dark / System theme — switchable from the top bar, persisted across sessions, WCAG AA contrast, with Inter and JetBrains Mono bundled locally (zero external font requests).
- Per-session personal lists — in
--sharemode your blacklist/whitelist stay in your session and are never exposed to remote visitors. - 3-layer DAPI tag categorization — more accurate artist / copyright / character classification for Gelbooru-family boards.
- Under the hood — shared adapter pagination, modular UI package, hardened CI (pinned actions, mypy + coverage + weekly
pip-audit), and Gradio 6.30 compatibility.
Grow the Tag Dictionary
The app ships with a curated offline seed catalog (38 foundational tags, 75 aliases), so the dictionary works out of the box. To grow it to the 1,000 most popular Danbooru tags:
python -m hades_booru.tag_dictionary.importer --top 1000
Flags: --resume (default — skip tags already imported), --no-resume, --skip-wiki (metadata + aliases only, faster first pass), --seed-only (no network). Add a Danbooru API key in Settings to roughly double the safe import speed (~8 min with a key, ~15–20 min without).
Run it
pip install -r requirements.txt
python app.py
- Windows: double-click
start.bat - Linux / macOS:
./start.sh
The UI opens at http://127.0.0.1:7863. Port 7863 avoids clashing with Stable Diffusion WebUI/Forge (7860/7861) and ComfyUI (8188); if it's busy, the app automatically binds the next free port.
Notes
python app.py --shareopens a public Gradio tunnel. Personal lists are isolated per session, but avoid it if you've stored personal API credentials.- Requests to private / loopback / LAN addresses are blocked by default. To reach a self-hosted LAN board, set
HADES_ALLOW_PRIVATE_HOSTS=1.
Quality
212 tests passing · ruff clean · mypy clean (32 files).
Tag dictionary data (tags, aliases, and wiki definitions) is imported from Danbooru via its public API and stored locally in hades_booru/tag_dictionary/data/tags.sqlite3 (git-ignored, never bundled in this release).
v1.0.7 — Audit R6 hardening: credential-leak fix, SSRF guard, cache & config safety
Post-release audit (R6) hardening — 1 High, 6 Medium, 20 Low findings; all High/Medium and practical Lows fixed, the rest tracked in ROADMAP.md.
Security
Danbooru credential-leak fix (High, existed since v1.0.0): URL host matching is now exact (host == domain or *.domain) across all 7 adapters, and fetch-by-URL pins the API call to the adapter's own domain. Crafted links like https://danbooru.donmai.us.evil.example/posts/1 can no longer receive your Basic-Auth credentials.
SSRF guard: requests to private/loopback/reserved/link-local addresses are blocked — including on every redirect hop — and error responses no longer echo the body into the UI. Override with HADES_ALLOW_PRIVATE_HOSTS=1 for a self-hosted LAN board.
History privacy: pasted API URLs no longer store sensitive query params (api_key, token, password, login, user_id, …) in config.local.json.
Cache poisoning: image downloads are validated with magic bytes before being cached (no more HTML pages re-served as .jpg); already-poisoned entries are detected and re-downloaded.
Multi-instance safety: config saves are file-locked and merged with disk state, so two instances from the same folder no longer clobber each other.
Robustness
Image-to-Prompt restricted to PNG/JPEG/WebP (rejected before Pillow plugins parse) + explicit 64 MP cap; response caps (16 MiB JSON/XML, 512 MiB streamed media); javascript: hrefs disabled; ZIP error state reset per export; rating flag reset before fetch-by-URL; dark mode enforced (light mode had 1.05:1 contrast); start.bat cd /d fix; ZIP/TXT filenames with time + _2/_3 collision suffix; magic-byte-first extensions; config schema_version.
Dependencies
certifi 2026.10.19 (PYSEC-2026-4320 fixed); lock regenerated from a clean venv. Pillow pinned to 12.3.0 — Gradio 6.x hard-pins pillow<13 and 13.x breaks fresh installs; the 24 Pillow-13 CVEs are documented and explicitly ignored in CI with justification, to be removed once Gradio supports Pillow 13.
Tests: 143 passing (18 new regression tests) · ruff clean · CI pip-audit verified passing.
v1.0.6 — Search history, Top tags, smarter port, drop-to-replace
Quality-of-life release focused on workflow speed and zero-friction launch.
What's new
- Recent searches + Top tags (side by side): your last 12 queries are kept in a Recent searches dropdown (deduplicated, most-recent-first). Pick one to drop it straight into the Search-tags bar, or Clear to wipe the history without touching the search bar. Beside it, a Top tags picker lists your most-reused individual tags — Add appends one to the Search-tags bar (deduplicated, no auto-run) so you can build tag queries faster. Only successful searches are recorded, and history persists in
config.local.json. - Sensible default port + auto-fallback: the default port moved from
7860to7863, so it no longer collides with Stable Diffusion WebUI / Forge (7860/7861) or ComfyUI (8188). If the port is busy, the launcher probes the next ports (up to 50 tries) and binds the first free one — the app always comes up, and the chosen URL is printed to the console. - Drop-to-replace in Image to Prompt: drag a new image into the Extract tab even when one is already loaded — the newest file wins. A new Clear Image button resets the file, preview, and all extracted sections at once.
Hardening (pre-release audit)
- Gallery download failures are now logged (post id + URL) instead of being swallowed silently.
- Port bind races produce a clear, actionable launcher error instead of a raw traceback.
- The Top-tags picker always resets its selection after a search or a Clear (no stale picks).
- The Recent searches dropdown is selection-only; free text belongs in the Search-tags bar.
Requirements & quick start
- Python 3.11+ (desktop; Windows/macOS/Linux)
unzip HaDeS-Booru-v1.0.6.zip
pip install -r requirements.txt
start.bat # Windows
# or: bash start.shv1.0.5
What's new
Bug fix
- Gallery navigation (Next / Previous) — the Previous/Next buttons in Gallery & Inspector now actually move the selected image in the gallery, not just the prompt and inspector panels. The selection is driven through Gradio 6's
selected_indexprop, so the highlighted thumbnail, the preview modal, and the inspector all stay in sync.
Naming
- Tab rename — the Personal Tag List tab is now simply called Blacklist (ES: Lista Negra), matching the terminology already used inside the panel. Heading renamed in both languages. No behavior change.
Quality
- 6 new regression tests covering the navigation fix (arity on both return paths, selection index per direction, prompt follows the selected post).
- 100 tests, all green;
ruffclean.
Installation
unzip HaDeS_Booru_v1.0.5.zip
cd HaDeS_Booru
pip install -r requirements.txt
python app.pyHaDeS Booru v1.0.4 — Image to Prompt correctness + e621 rating fix
Patch release fixing seven issues found by an external audit of the v1.0.3 feature set.
Image to Prompt
- A1111 multi-line format: 'Steps: N' and the rest of the settings line no longer leak into the Negative Prompt box (works with or without a 'Negative prompt:' marker).
- JPEG/WebP comments written by A1111 (UNICODE prefix, UTF-16) now decode correctly instead of producing garbled '\x00' tags; ASCII prefix padding no longer leaks.
- PNG XMP (dc:subject) is now actually read — previously only JPEG/WebP XMP was. Both dc:term and rdf:li subject forms are parsed.
- ComfyUI prompt graphs: positive/negative are resolved by following the sampler node's positive/negative links. Graphs with non-consecutive or inverted node ids no longer swap sections; unlinked text nodes are preserved.
- Whitelist entries without a trailing * now match exactly (a 'solo' whitelist no longer silently keeps 'solo_focus'/'soloist'); wildcards unchanged.
- The success tag counter and tag chips only count positive tags.
Search
- e621: a 'General' rating selection no longer returns zero results. Adapters now report when the rating filter was applied server-side and the UI stops re-filtering by equality (e621's safe bucket is rated 's').
Quality
- 16 new regression tests covering every fixed case (94 total, all green), ruff clean, pip-audit in CI.
HaDeS Booru v1.0.3 — Personal tag filters + Image to Prompt
What's new
- Personal tag blacklist: extend the default excluded-tag list with your own tags (comma or newline separated, * wildcard) from the Normalization tab. Persisted in config.local.json; "Reset Default Excluded Tags" no longer wipes your personal list.
- Personal tag whitelist: force-keep tags that would otherwise be filtered (e.g. commission), even if they appear in the defaults or your blacklist. Wildcards supported.
- One-click post blacklist: from the Inspector dock, add every currently-filtered tag of the selected post to your personal blacklist at once.
- Image to Prompt (new tab): drag & drop a PNG/JPEG/WebP and its embedded data is extracted automatically, 100% locally: Stable Diffusion / A1111 parameters, ComfyUI prompt graphs (decoded from JSON), booru comment tEXt chunks, NovelAI-style prompt chunks, Civitai XMP, and JPEG/WebP EXIF UserComment. Results land in three dedicated copyable boxes: Positive Prompt, Negative Prompt, and Generation Settings (one key per line). Positive and negative pass through your active normalizer (trigger word on the positive only, blacklist/whitelist included).
- Windows launcher: start.bat fixed (ASCII-safe, CRLF, no more "LORA no se reconoce como un comando" and no more mojibake).
Quality
- Pre-release audit: 3 Gradio wiring bugs fixed; 11 new runtime wiring regression tests.
- 77 tests green, ruff clean, pip-audit clean in CI.
v1.0.2 — Fixes & hardening
Fixes & hardening (follow-up to v1.0.1)
- Server-side rating filter refinements: Danbooru v2 boards now respect the anonymous 2-tag limit (rating metatag only injected when safe, with automatic HTTP 422 fallback); Moebooru uses canonical
rating:safe/questionable/explicitmetatags; E621/E926 userating:s|q|emetatags with E926 SFW rating normalization. - Credential security & management: saved credentials use generic masked placeholders (no
user_id/api_keyvalues in Gradio's/configpayload) + new "Clear Saved Credentials" action (memory and disk). - Thread-safe adapter warnings & bounded retry:
BooruAdapter.last_warningisolated per thread; HTTP 429Retry-Afterwaits capped at 30 s. - Cross-platform fix: "open folder in explorer" on macOS/Linux no longer crashes (invalid
check=kwarg removed fromsubprocess.Popen). - Normalizer & taxonomy:
exclude_categoriesnow respected forraw_tags-only posts (Zerochan, Art Platforms); accurate Gelbooru_(series)/_(game)/_(cosplay)categorization; multi-tag Pawoo queries warn when truncated to the first hashtag. - i18n: restored Spanish "o" in the search placeholder.
- 46 tests, all green;
pip-auditclean in CI.
Install
git clone https://github.com/Devildonia/HaDeS-Booru.git
cd HaDeS-Booru
pip install -r requirements.lock
Windows: start.bat · Linux/macOS: ./start.sh → open http://127.0.0.1:7860
HaDeS Booru v1.0.1 — server-side rating + locked, audited deps
HaDeS Booru v1.0.1 — Server-side rating filter + locked, audited dependencies.
What's new
- Server-side rating filter (G/S/Q/E): Danbooru v2 boards, Moebooru boards, E621/E926, and DAPI boards now send the rating to the source API instead of downloading everything and filtering locally. "Unrated" and sources without server-side support keep the client-side safety filter.
requirements.lockpins the full dependency tree for reproducible installs.- CI runs
pip-auditagainst the locked tree on every push. - Test suite: 39 tests, ruff clean, app builds OK.
Requirements: Python 3.11+
pip install -r requirements.txt
python app.pyWeb UI: http://127.0.0.1:7860 — Windows: start.bat — Linux/macOS: ./start.sh
HaDeS Booru v1.0.1 — Filtro de rating en servidor + dependencias fijadas y auditadas.
Novedades
- Filtro de rating en servidor (G/S/Q/E): los boards Danbooru v2, Moebooru, E621/E926 y DAPI ahora envían el rating a la API de origen en lugar de descargar todo y filtrar en local. "Sin clasificar" y las fuentes sin soporte conservan el filtro local de seguridad.
requirements.lockfija el árbol completo de dependencias para instalaciones reproducibles.- CI ejecuta
pip-auditsobre el árbol fijado en cada push. - Suite de tests: 39 tests, ruff limpio, la app arranca OK.
Requisitos: Python 3.11+
pip install -r requirements.txt
python app.pyUI web: http://127.0.0.1:7860 — Windows: start.bat — Linux/macOS: ./start.sh