• v0.2.1 7d02aa8588

    v0.2.1 Stable

    pax released this 2026-04-07 15:46:52 -05:00 | 404 commits to main since this release

    0.2.1

    A theme + persistence + ricer-friendliness release. The whole stylesheet system was rebuilt around a runtime preprocessor with @palette / ${name} vars, every bundled theme was rewritten end-to-end, and 12 theme variants ship instead of 6. Lots of UI state now survives a restart, and Hyprland ricers get an explicit opt-out for the in-code window management.

    This release does not ship a fresh Windows installer — the previous v0.2.0 installer remains the latest installable binary. Run from source to get 0.2.1, or wait for the next release.

    Changes since v0.2.0

    Theming System

    • @palette / ${name} preprocessor — themes start with a /* @palette */ header block listing color slots, the body uses ${name} placeholders that the app substitutes at load time. Edit the 17-slot palette block at the top of any theme to recolor the entire app — no hunting through hex literals.
    • All 6 bundled themes rewritten with comprehensive Fusion-style QSS covering every widget the app uses, every state (hover, focus, disabled, checked), every control variant
    • Two corner-radius variants per theme*-rounded.qss (4px radius, default Fusion-style look) and *-square.qss (every border-radius stripped except radio buttons, which stay circular)
    • Native Fusion sizing — themed widgets shrunk to match Qt+Fusion defaults, toolbar row height is now ~23px instead of 30px, matching what no-custom.qss renders
    • Bundled themes — catppuccin-mocha, nord, gruvbox, solarized-dark, tokyo-night, everforest. 12 files total (6 themes × 2 variants)

    QSS-Targetable Surfaces

    Many things hardcoded in Python paint code can now be overridden from a custom.qss without touching the source:

    • InfoPanel tag category colorsqproperty-tagArtistColor, tagCharacterColor, tagCopyrightColor, tagSpeciesColor, tagMetaColor, tagLoreColor
    • ThumbnailWidget selection paintqproperty-selectionColor, multiSelectColor, hoverColor, idleColor (in addition to existing savedColor and bookmarkedColor)
    • VideoPlayer letterbox colorqproperty-letterboxColor. mpv paints the area around the video frame in this color instead of hardcoded black. Defaults to QPalette.Window so KDE color schemes, qt6ct, Windows dark/light mode, and any system Qt theme automatically produce a matching letterbox
    • Popout overlay bars — translucent background for the floating top toolbar and bottom controls bar via the overlay_bg palette slot
    • Library count label statesQLabel[libraryCountState="..."] attribute selector distinguishes "N files" / "no items match" / "directory unreachable" with QSS-controlled colors instead of inline red

    Hyprland Integration

    • Two opt-out env vars for users with their own windowrules:
      • BOORU_VIEWER_NO_HYPR_RULES=1 — disables every in-code hyprctl dispatch except the popout's keep_aspect_ratio lock
      • BOORU_VIEWER_NO_POPOUT_ASPECT_LOCK=1 — independently disables the popout's aspect ratio enforcement
    • Popout overlays themed — top toolbar and bottom controls bar now look themed instead of hardcoded translucent black, respect the @palette overlay_bg slot
    • Popout video letterbox tracks the theme's bg color via the new qproperty-letterboxColor
    • Wayland app_id set via setDesktopFileName("booru-viewer") so compositors can target windows by class — windowrule = float, class:^(booru-viewer)$ — instead of by the volatile window title

    State Persistence

    • Main window — geometry, floating mode, tiled mode (Hyprland)
    • Splitter sizes — main splitter (grid vs preview), right splitter (preview vs dl_progress vs info panel)
    • Info panel visibility
    • Cache spinbox auto-derived dialog min height (no more clipping when dragging the settings dialog small)
    • Popout window position, dimensions, and F11 fullscreen state restored via Hyprland floating cache prime

    UX

    • Live debounced search in bookmarks and library tabs — type to filter, press Enter to commit immediately. 150ms debounce on bookmarks (cheap SQLite), 250ms on library (filesystem scan)
    • Search button removed from bookmarks toolbar (live search + Enter)
    • Score field +/- buttons removed from main search bar — type the value directly
    • Embedded preview video controls moved out of the overlay style and into the panel layout, sitting under the media instead of floating on top of it. Popout still uses the floating overlay
    • Next-mode loop wraps to the start of the bookmarks/library list at the end of the last item instead of stopping
    • Splitter handle margins — 4px breathing margin on either side so toolbar buttons don't sit flush against the splitter line

    Performance

    • Page-load thumbnails pre-fetch bookmarks + cache state into set lookups instead of N synchronous SQLite queries per page
    • Animated PNG/WebP conversion off-loaded to a worker thread via asyncio.to_thread so it doesn't block the asyncio event loop during downloads

    Fixes

    • Open in Browser/Default App on the bookmarks tab now opens the bookmark's actual source post (was opening unrelated cached files)
    • Cache settings spinboxes can no longer be vertically clipped at the dialog's minimum size; spinboxes use Python-side setMinimumHeight() to propagate floors up the layout chain
    • Settings dialog uses side-by-side +/- buttons instead of QSpinBox's default vertical arrows for clearer interaction
    • Bookmarks tab BL Tag refreshes correctly when navigating bookmarked posts (was caching stale tags from the first selection)
    • Popout F11 → windowed restores its previous windowed position and dimensions
    • Popout flicker on F11 transitions eliminated via no_anim setprop + deferred fit + dedupe of mpv video-params events
    • Bookmark + saved indicator dots in the thumbnail grid: bookmark star on left, saved dot on right, both vertically aligned in a fixed-size box
    • Selection border on thumbnail cells redrawn pen-aware: square geometry (no rounded corner artifacts), even line width on all sides, no off-by-one anti-aliasing seams
    • Toolbar buttons in narrow slots no longer clip text (Bookmark/Unbookmark, Save/Unsave, BL Tag, BL Post, Popout, + Folder, Refresh) — all bumped to fit "Unbookmark" comfortably under the bundled themes' button padding
    • Toolbar rows on bookmarks/library/preview panels now sit at a uniform 23px height matching the inputs/combos in the same row
    • Score and Page spinbox heights forced to 23px via setFixedHeight to work around QSpinBox reserving vertical space for arrow buttons even when setButtonSymbols(NoButtons) is set
    • Library Open in Default App uses the actual file path instead of routing through cached_path_for (which would return a hash path that doesn't exist for library files)

    Cleanup

    • Deleted unused booru_viewer/gui/theme.py (222 lines of legacy stylesheet template that was never imported)
    • Deleted GREEN/DARK_GREEN/DIM_GREEN/BG/BG_LIGHT etc constants from booru_viewer/core/config.py (only theme.py used them)
    • Removed dead missing-indicator code (set_missing, _missing_color, missingColor Qt Property, the unreachable if not filepath.exists() branch in library.refresh)
    • Removed dead score +/- buttons code path

    28 files changed, ~8400 insertions / ~1200 deletions across 13 commits.

    Downloads
  • v0.2.0 33293dfbae

    v0.2.0 Stable

    pax released this 2026-04-07 11:41:26 -05:00 | 418 commits to main since this release

    0.2.0

    New: mpv video backend

    • Replaced Qt Multimedia (QMediaPlayer/QVideoWidget) with embedded mpv via python-mpv
    • OpenGL render API (MpvRenderContext) for Wayland-native compositing — no XWayland needed
    • Proper hardware-accelerated decoding (hwdec=auto)
    • Reliable aspect ratio handling — portrait videos scale correctly
    • Proper end-of-file detection via eof-reached property observer instead of fragile position-jump heuristic
    • Frame-accurate seeking with absolute+exact and relative+exact
    • keep-open=yes holds last frame on video end instead of flashing black
    • Windows: bundle mpv-2.dll in PyInstaller build

    New: popout viewer (renamed from slideshow)

    • Renamed "Slideshow" to "Popout" throughout UI
    • Toolbar and video controls float over media with translucent background (rgba(0,0,0,160))
    • Auto-hide after 2 seconds of inactivity, reappear on mouse move
    • Ctrl+H manual toggle
    • Media fills entire window — no layout shift when UI appears/disappears
    • Video controls only show for video posts, hidden for images/GIFs
    • Smart F11 exit: window sizes to 60% of monitor, maintaining content aspect ratio
    • Window auto-resizes to content aspect ratio on navigation (height adjusts, position stays)
    • Window geometry and fullscreen state persisted to DB across sessions
    • Hyprland-specific: uses hyprctl resizewindowpixel + setprop keep_aspect_ratio to lock window to content aspect ratio (works both floating and tiled)
    • Default site setting in Settings > General

    New: preview toolbar

    • Action bar above the preview panel: Bookmark, Save, BL Tag, BL Post, Popout
    • Appears when a post is active, hidden when preview is cleared
    • Save button opens folder picker menu (Unsorted / existing folders / + New Folder)
    • Save/Unsave state shown on button text
    • Bookmark/Unbookmark state shown on button text
    • Per-tab button visibility: Library tab only shows Save + Popout
    • All actions work from any tab (Browse, Bookmarks, Library)
    • Blacklist tag and blacklist post show confirmation dialogs
    • "Unsave from Library" only appears in context menu when post is saved

    New: media type filter

    • Replaced "Animated" checkbox with dropdown: All / Animated / Video / GIF / Audio
    • Each option appends the corresponding booru tag to the search query

    New: thumbnail cache limits

    • Added "Max thumbnail cache" setting (default 500 MB)
    • Auto-evicts oldest thumbnails when limit is reached

    Improved: state synchronization

    • Saving/unsaving updates grid thumbnail dots instantly (browse, bookmarks, library)
    • Unbookmarking refreshes the bookmarks tab immediately
    • Saving from browse/bookmarks refreshes the library tab when async save completes
    • Library items set _current_post on click so toolbar actions work correctly
    • Preview toolbar tracks bookmark and save state across all tabs
    • Tab switching clears grid selections to prevent cross-tab action conflicts
    • Bookmark state updates after async bookmark completes (not before)

    Improved: infinite scroll

    • Fixed missing posts when media type filters reduce results per page
    • Local dedup set (seen) prevents cross-page duplicates within backfill without polluting shown_post_ids
    • Page counter only advances when results are returned, not when filtering empties them
    • Backfill loop increased to 10 max pages with 300ms delay between API calls (first call instant)

    Improved: pagination

    • Status bar shows "(end)" when search returns fewer results than page size
    • Prev/Next buttons hide when at page boundaries instead of just disabling
    • Source URLs clickable in info panel, truncated at 60 chars for display

    Improved: video controls

    • Seek step changed from 5s to ~3s for , and . keys
    • , and . seek keys now work in the main preview panel, not just popout
    • Translucent overlay style on video controls in both preview and popout
    • Volume slider fixed at 60px to not compete with seek slider at small sizes

    New: API retry logic

    • Single retry with backoff on HTTP 429 (rate limit) and 503 (service unavailable)
    • Retries on request timeout
    • Respects Retry-After header (capped at 5s)
    • Applied to all API requests (search, get_post, autocomplete) across all four clients
    • Downloads are not retried (large payloads, separate client)

    Refactor: SearchState dataclass

    • Consolidated 8 scattered search state attributes into a single SearchState dataclass
    • Eliminated all defensive getattr/hasattr patterns (8 instances)
    • State resets cleanly on new search — no stale infinite scroll data

    Dependencies

    • Added python-mpv>=1.0
    • Removed dependency on PySide6.QtMultimedia and PySide6.QtMultimediaWidgets
    Downloads
  • v0.1.9 5f4af78e91

    v0.1.9 Stable

    pax released this 2026-04-05 22:17:13 -05:00 | 459 commits to main since this release

    Changes since v0.1.8

    New Features

    • Animated filter — checkbox to only show animated/video posts (server-side animated tag)
    • Start from page — page number field in top bar, jump to any page on search
    • Post date — creation date shown in the info line
    • Prefetch modes — Off / Nearby (4 cardinals) / Aggressive (3 row radius)
    • Animated PNG/WebP — auto-converted to GIF for Qt playback

    Improvements

    • Thumbnail selection/hover box hugs the actual image content
    • Video controls locked to bottom of preview panel
    • Score filter uses +/- buttons instead of spinbox arrows
    • Cache eviction triggers after infinite scroll page drain
    • Combobox dropdown styling fixed on Windows dark mode
    • Saved thumbnail size applied on startup

    Fixes

    • Infinite scroll no longer stops early from false exhaustion
    • Infinite scroll triggers when viewport isn't full (initial load, splitter resize, window resize)
    • Shared HTTP clients reset on startup (prevents stale event loop errors)
    • Non-JSON API responses handled gracefully instead of crashing
    Downloads
  • v0.1.8 9c07fbd880

    v0.1.8 Stable

    pax released this 2026-04-05 18:15:15 -05:00 | 503 commits to main since this release

    Changes since v0.1.7

    Windows Installer

    • Inno Setup installer — proper Windows installer with Start Menu shortcut, optional desktop icon, and uninstaller
    • --onedir build — instant startup, no temp extraction (was --onefile)
    • optimize=2 — stripped docstrings/asserts for smaller, faster bytecode
    • No UPX — trades disk space for faster launch (no decompression overhead)
    • noarchive — loose .pyc files, no zip decompression at startup

    Performance

    • Shared HTTP client for API calls — single TLS handshake for all Danbooru/Gelbooru/Moebooru requests
    • E621 shared client — separate pooled client (custom User-Agent required)
    • Site detection reuses shared client — no extra TLS for auto-detect
    • Priority downloads — clicking a post pauses prefetch, downloads at full speed, resumes after
    • Referer header per-request — fixes Gelbooru CDN returning HTML captcha pages

    Infinite Scroll

    • Auto-fill viewport — if first page doesn't fill the screen, auto-loads more
    • Auto-load after drain — checks if still at bottom after staggered append finishes
    • Content-aware trigger — fires when scrollbar max is 0 (no scroll needed)

    Library

    • Tag categories stored — saved as JSON in both library_meta and bookmarks DB
    • Categorized tags in info panel — Library and Bookmarks show Artist/Character/Copyright etc.
    • Tag search in Library — search box filters by stored tags
    • Browse thumbnail copied on save — Library tab shows thumbnails instantly
    • Unsave from Library in bookmarks right-click menu

    Bugfixes

    • Clear preview on new search
    • Fixed diagonal grid navigation — viewport width used for column count
    • Fixed Gelbooru CDN — Referer header passed per-request with shared client
    • Crash guards — pop(0) on empty queue, bounds checks in API clients
    • Page cache capped — 10 pages max in pagination mode
    • Missing DB migrations — tag_categories column added to existing tables
    • Tag click switches to Browse — clears preview and searches clicked tag

    Download

    booru-viewer-setup.exe — Windows installer. Installs to AppData, creates shortcuts, includes uninstaller. Data stored in %APPDATA%\booru-viewer\.

    Downloads
  • v0.1.7 1983f6bc54

    v0.1.7 Stable

    pax released this 2026-04-05 17:56:09 -05:00 | 505 commits to main since this release

    Changes since v0.1.5

    Infinite Scroll

    • New mode — toggle in Settings > General, applies live
    • Auto-loads more posts when scrolling to bottom
    • Staggered loading — posts appear one at a time as thumbnails arrive
    • Stops at end — gracefully handles API exhaustion
    • Arrow keys at bottom don't break the grid
    • Loading locked during drain to prevent multi-page burst
    • Triggered one row from bottom for seamless experience

    Page Cache & Deduplication

    • Page results cached in memory — prev/next loads instantly
    • Backfilled posts don't repeat on subsequent pages
    • Page label updates on cached loads

    Prefetch

    • Ring expansion — prefetches in all 8 directions (including diagonals)
    • Auto-start on search — begins from top of page immediately
    • Re-centers on click — restarts spiral from clicked post
    • Triggers on infinite scroll — new appended posts prefetch automatically

    Clipboard

    • Copy File to Clipboard — works in grid, preview, bookmarks, and library
    • Ctrl+C shortcut — global shortcut via QShortcut
    • QMimeData — uses same mechanism as drag-and-drop for universal compatibility
    • Sets both file URL (for file managers) and image data (for Discord/image apps)
    • Videos copy as file URIs

    Slideshow

    • Blacklist Tag button — opens categorized tag menu
    • Blacklist Post button — blacklists current post

    Blacklist

    • In-place removal — blacklisting removes matching posts from grid without re-searching
    • Preserves infinite scroll state
    • Only clears preview when the blacklisted post is the one being viewed

    UI Polish

    • QProxyStyle dark arrows — spinbox/combobox arrows visible on all dark QSS themes
    • Diagonal nav fix — column count reads viewport width correctly
    • Status bar — shows result count with action confirmations
    • Live settings — infinite scroll, library dir, thumbnail size apply without restart

    Stability

    • All silent exceptions logged
    • Missing defaults added for fresh installs
    • Git history cleaned

    Download

    booru-viewer.exe — Windows standalone (requires VP9 Video Extensions for WebM playback)

    Downloads
  • v0.1.6 7b6a9ab911

    v0.1.6 Stable

    pax released this 2026-04-05 15:40:16 -05:00 | 525 commits to main since this release

    Changes since v0.1.5

    Infinite Scroll

    • New mode — toggle in Settings > General: "Infinite scroll (replaces page buttons)"
    • Hides prev/next buttons, auto-loads more posts when scrolling to bottom
    • Posts appended to grid, deduped, blacklist filtered
    • Stops gracefully when API runs out of results (shows "end")
    • Arrow keys at bottom don't nuke the grid — page turn disabled in infinite scroll
    • Applies live — no restart needed

    Page Cache & Deduplication

    • Page results cached — prev/next loads instantly from memory within a search session
    • Post deduplication — backfilled posts don't repeat on subsequent pages
    • Page label updates on cached page loads

    Prefetch

    • Ring expansion — prefetches in all 8 directions (up, down, left, right, diagonals)
    • Auto-start on search — begins prefetching from top of page immediately
    • Re-centers on click — clicking a post restarts the spiral from that position
    • Triggers on infinite scroll — new appended posts start prefetching automatically

    Slideshow

    • Blacklist Tag button — opens categorized tag menu in slideshow toolbar
    • Blacklist Post button — blacklists current post from slideshow toolbar
    • Blacklisting clears slideshow — both preview and slideshow cleared when previewed post is blacklisted

    Copy to Clipboard

    • Ctrl+C — copies preview image to clipboard (falls back to cached file)
    • Right-click grid — "Copy Image to Clipboard" option
    • Right-click preview — "Copy Image to Clipboard" always available

    Live Settings

    • Most settings apply instantly — infinite scroll, library directory, thumbnail size, rating, score
    • Removed "restart required" labels

    Bugfixes

    • Blacklisting doesn't clear unrelated preview — only clears when the previewed post matches
    • Backfill confirmed working — debug logging added
    • Status bar keeps result count — shows "N results — Loaded" instead of just "Loaded"
    • Fixed README code block formatting and added ffmpeg back to Linux deps

    Download

    booru-viewer.exe — Windows standalone (requires VP9 Video Extensions for WebM playback)

    Downloads
  • v0.1.5 2156dec91d

    pax released this 2026-04-05 12:47:57 -05:00 | 557 commits to main since this release

    Stable Release

    First stable release of booru-viewer.

    Changes since v0.1.4

    Slideshow

    • Preview cleared while open — media only plays in slideshow, info panel with tags expands to fill the space
    • Video position sync — remembers playback position between preview and slideshow both ways
    • Video state sync — mute, volume, autoplay, loop mode shared between preview and slideshow
    • Focus-aware — key events and scroll-to-volume only fire when slideshow window is active
    • Monitor selector — Settings > General lets you pick which monitor slideshow opens on
    • Ctrl+P privacy screen — works from slideshow, hides window and pauses video
    • Minimum window size — prevents squishing when dragged by window manager

    Video Playback

    • 3-way Loop/Once/Next — click to cycle: Loop (repeat), Once (stop at end), Next (advance to next post)
    • Autoplay/Manual — only shown when Next mode is active
    • Mid-playback toggle — switching modes takes effect immediately
    • Space to pause — hover over preview and press Space
    • Click-to-seek — click anywhere on the seek bar to jump
    • Scroll-to-volume — scroll wheel adjusts volume in preview and slideshow

    Library

    • Video thumbnails — ffmpeg if available, play icon placeholder fallback
    • Right-click context — Open in Default App, Open Folder, Copy Path, Delete
    • Multi-select delete
    • Unreachable warning — red text when library directory is missing or unmounted
    • Configurable directory — Settings > Paths with browse button
    • Slideshow navigation — arrow keys work in Library tab slideshow

    Prefetch

    • Spiral prefetch — gradually preloads entire page outward from clicked post with gentle pacing
    • Renamed setting — "Prefetch whole page over time"

    UI Polish

    • Right-click doesn't change preview — selects thumbnail visually, shows context menu without restarting video
    • Hover highlight — lighter border on thumbnail hover
    • Blacklisting clears preview — both tag and post blacklist
    • QProxyStyle dark arrows — spinbox and combobox arrows visible on all dark QSS themes
    • Two indicators — yellow star (bookmarked), green dot (saved), both QSS-controllable

    Bookmarks

    • Fully renamed from Favorites — all UI, signals, and API
    • Decoupled from saves — bookmark without saving, save without bookmarking
    • Import signal fix — bookmark imports properly refresh the view

    Stability

    • Missing defaults added — fresh installs won't hit empty setting values
    • All silent exceptions logged — no more swallowed errors
    • Expanded Linux install docs — per-distro package commands, venv setup, GStreamer deps
    • Removed old custom_css_guide.txt — replaced by themes/README.md
    • Fixed PyInstaller spec — removed reference to deleted file

    Download

    booru-viewer.exe — Windows standalone (requires VP9 Video Extensions for WebM playback)

    Downloads
  • v0.1.4 72e4d5c5a2

    v0.1.4 Stable

    pax released this 2026-04-05 01:38:41 -05:00 | 619 commits to main since this release

    Changes since v0.1.3

    Library Rewrite

    • Three-tab layout — Browse | Bookmarks | Library
    • Bookmarks (formerly Favorites) — posts tracked in DB, like browser bookmarks. Can revisit from cache.
    • Library — browse saved files on disk with sorting (date, name, size) and folder sidebar
    • Independent operations — bookmarking and saving are now decoupled. Bookmark without saving, save without bookmarking.
    • Unbookmarking no longer deletes saved files
    • Saving no longer auto-bookmarks
    • Configurable library directory — Settings > Paths with browse button

    Visual Indicators

    • Yellow star for bookmarked posts
    • Green dot for saved posts
    • Red dot for missing files (NAS/external drive offline)
    • All three QSS-controllable: qproperty-bookmarkedColor, qproperty-savedColor, qproperty-missingColor

    Library Tab

    • Video thumbnails via ffmpeg first-frame extraction
    • Right-click context — Open in Default App, Open Containing Folder, Copy File Path, Delete from Library
    • Multi-select delete — bulk delete files from library
    • Unreachable warning — red text when library directory is missing or unmounted

    Slideshow

    • Preview cleared while slideshow is open — media only plays in slideshow, info/tags still visible in main app
    • Preview restores on close — current post reloads when slideshow exits
    • Video position sync — remembers playback position between preview and slideshow both ways
    • Actions hidden for Library — no Bookmark/Save buttons when browsing library in slideshow
    • Actions toggle dynamically — switching tabs with slideshow open shows/hides buttons
    • Focus-aware — key events and scroll-to-volume only fire when slideshow window is active
    • No more external player — video errors logged instead of opening in system player

    Blacklist

    • Add post URLs manually — "Add..." button in Settings > Blacklist accepts multiple URLs
    • Backfill — filtered posts replaced from next API pages to fill page size

    Other

    • Auto cache eviction — runs live after each download when enabled
    • Renamed terminology — Favorite→Bookmark throughout UI and code
    • Configurable library path — custom save directory applied on startup

    Download

    booru-viewer.exe — Windows standalone (requires VP9 Video Extensions for WebM playback)

    Downloads
  • v0.1.3 f06888e11d

    v0.1.3 Stable

    pax released this 2026-04-04 20:42:40 -05:00 | 661 commits to main since this release

    Changes since v0.1.2

    Slideshow Mode

    • Toolbar — Favorite and Save/Unsave toggle buttons showing current post state
    • Up/Down navigation — J/K and arrow keys navigate by grid row
    • F11 toggle — Switch between fullscreen and windowed
    • Ctrl+H — Hide/show all UI for distraction-free viewing
    • Page boundary — All directions past edges load next/prev page
    • Text input safety — Slideshow keybinds don't interfere with search bar

    Tag Categories

    • Info panel — Tags grouped by category with color coding: Artist (gold), Character (green), Copyright (purple), Species (red), General, Meta (gray)
    • Blacklist Tag menu — Right-click shows categorized submenus (Danbooru/e621)
    • Danbooru & e621 — Categories parsed from API; Gelbooru/Moebooru fall back to flat list

    Blacklist

    • Paste-friendly — Text box in settings, paste space or newline separated tags
    • Toggleable — Enable/disable checkbox without deleting tags
    • Client-side filtering — No more tag limit errors from server-side negatives
    • Auto-enable — Right-click blacklist enables and re-searches immediately

    Theming

    • 6 bundled themes — Nord, Catppuccin Mocha, Gruvbox, Solarized Dark, Tokyo Night, Everforest
    • Fusion style — Custom QSS now switches to Fusion for consistent rendering
    • Grid selection — QSS selection-background-color controls thumbnail highlight
    • Theme docsthemes/README.md with complete QSS reference for every widget

    Favorites

    • Bulk actions — Multi-select right-click: Save All, Unsave All, Move All, Unfavorite All

    Library

    • Unsave from Library — Grid right-click, preview right-click, and slideshow toolbar
    • Save/Unsave toggle — Single button in slideshow showing current state

    Search

    • Inline history — Dropdown arrow inside search bar (no more "v" button)
    • Manage Saved Searches — Dialog for deleting individual saved searches
    • Session cache — Cacheless mode clears search history on exit

    Privacy & Transparency

    • Network tab — Settings > Network shows all hosts contacted with request counts
    • Zero telemetry — Confirmed by full codebase audit
    • Privacy section in README

    Performance

    • Persistent event loop — Single background thread for all async operations
    • Directory pre-scan — Saved file checks via set lookups instead of per-post exists()
    • Batch DB — Single-transaction bulk favorite inserts
    • Database indexes — favorites.folder and favorites.favorited_at

    Bugfixes

    • Fixed async error handling — exceptions no longer silently swallowed
    • Fixed close race condition — async thread joins before DB close
    • Fixed slideshow state buttons not updating after async favorite/save
    • Fixed grid up/down in last incomplete row
    • Fixed preview stealing keyboard focus from grid
    • Fixed QTextEdit text color in Windows dark mode
    • Fixed Gelbooru HTML entities in tags (' → ')
    • Fixed Save button width clipping

    Download

    booru-viewer.exe — Windows standalone (requires VP9 Video Extensions for WebM playback)

    Downloads
  • v0.1.2 127442e8d7

    v0.1.2 Stable

    pax released this 2026-04-04 19:56:20 -05:00 | 675 commits to main since this release

    Changes since v0.1.1

    Slideshow Mode

    • Video support — Slideshow mode now plays MP4, WebM, and GIF files
    • Seek controls, and . seek 5 seconds back/forward in videos, Space toggles play/pause
    • Bidirectional sync — Clicking posts in the main grid updates the slideshow, and vice versa
    • Arrow key navigation — Left/Right/H/L navigate posts in slideshow (including during video playback)

    Navigation

    • Page boundary navigation — Arrow keys past the last/first post automatically load the next/prev page (works in grid, preview, and slideshow)
    • All directions — Up/Down/J/K at grid boundaries also trigger page turns
    • Auto-select — After a page turn, the first or last post is automatically selected and previewed

    Pixiv Ugoira Support

    • Auto-convert — Pixiv ugoira .zip files (frame archives) are automatically converted to animated GIFs
    • Cached — Converted GIFs are cached so subsequent loads are instant

    Video Playback

    • Seamless looping — Short videos no longer flash/flicker when looping (uses native QMediaPlayer.Loops.Infinite)
    • No double audio — Main preview video pauses when slideshow opens

    Other

    • Session cache — New "Clear cache on exit" option in Settings > Cache
    • Filetype field — Info panel now shows the file type (JPG, PNG, WebM, etc.)

    Download

    booru-viewer.exe — Windows standalone (requires VP9 Video Extensions from Microsoft Store for WebM playback)

    Downloads