🎨 Dashboard UI Refresh
A complete visual overhaul of the Triggarr dashboard — tighter hierarchy, clearer health feedback, and a new activity timeline — without changing any backend data shapes.
Design System Foundations
- Focus-visible rings — consistent triggarr-green outline on all interactive elements for keyboard users
- Reduced-motion support — respects OS-level
prefers-reduced-motionto flatten all transitions - Geist Mono typography — monospace surfaces (log, timestamps, indicators) use Geist Mono from Google Fonts
- Elevation token — new
--color-triggarr-card-elevatedfor hover states on interactive cards - Wider layout — main content container widened from
max-w-5xltomax-w-7xlto fit the activity rail
Navigation
- Sticky nav bar with backdrop-blur that stays pinned while scrolling
- Active-tab underline — green underline marks the current page (Dashboard / History / Settings)
- Pulsing update dot — animated green dot next to the update chip when a new release is available
Stats & Health
- Compact health strip — single-line
N connected / N disconnected / N pending / Last syncreplaces the old full-width card - Hero Grab Rate card — large
text-4xlpercentage spanning 2 grid columns with Healthy/Warn/Critical badge - Per-app color bars — Radarr (orange), Sonarr (blue), Lidarr (green) horizontal bars inside the hero card
- Conditional stat tiles — Movies, Episodes, and Albums tiles only render when their respective app has enabled instances
App Cards
- Unified connection pill — single pill shape for Connected / Unreachable / Waiting states
- Schedule row — Last Run and Next Run timestamps in a dedicated row below the header
- Pass pills — compact
pass 2badge replaces the old(2nd pass)text - Hover elevation — cards transition to elevated background and shadow on hover
- Danger stripes — diagonal red stripes on unreachable instance cards with a red Retry button
- Live dot — pulsing green dot in the connection pill during htmx polling
- 3-column grid — services grid switches to 3 columns at
xl:breakpoint (≥1280px)
Application Log
- Terminal aesthetic — Geist Mono rows with column-aligned timestamp, level, source, and message
- TAILING indicator — always-visible label with pulsing green dot confirming live polling
- Level styling — ERROR rows get red tint + red left border; DEBUG rows dimmed
- Source tags — colored
[Radarr]/[Sonarr]/[Lidarr]tags in each row - Expandable terminal pane — click to promote the log to a fixed bottom-pinned pane with scanline effect
Recent Activity Rail
- Sticky sidebar — new right-side rail on
xl:viewports that stays in place while the dashboard scrolls - Vertical timeline — colored dots (green/amber/blue/gray/red) connected by a vertical line
- Rich entries — per-app badge, title, outcome pill with icon, queue type, relative timestamp
- LIVE indicator — header shows live status and app filter; footer links to full History page
- Replaces search log — the old inline search log section is removed; rail serves wide screens, History page serves narrow screens
🛡️ Deep Code Review (26 fixes)
Three rounds of comprehensive review covering the entire codebase:
- PaginatedResponse resilience —
extra="ignore"prevents upstream API field additions from crashing search cycles - Concurrency —
save_settingsandadd_instancewrapped insearch_lock; client teardown deferred outside lock - Security headers —
X-Frame-Options,X-Content-Type-Options,Referrer-Policyon all responses - Event loop — blocking
_atomic_toml_writeandsave_statecalls offloaded torun_in_executor - Lidarr pagination —
get_grab_historynow fetches all pages viaget_paginated - Dockerfile — non-root fallback user added
- Input validation —
search_textcapped to 200 chars;TRUSTED_PROXY_IPS=*warning at startup
📦 Dependency Fix
⚠️ Breaking Change (since v2.4.x)
The default port changed from 8080 → 8484 in v2.5.x to avoid conflicts with Profilarr. If you're upgrading from v2.4.x or earlier, update your docker-compose port mapping and bookmarks.
Full Changelog: v2.7.0...v2.5