github thejuran/triggarr v2.5
Triggarr v2.5 — Dashboard UI Refresh

latest release: v2.7.1
5 days ago

🎨 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-motion to flatten all transitions
  • Geist Mono typography — monospace surfaces (log, timestamps, indicators) use Geist Mono from Google Fonts
  • Elevation token — new --color-triggarr-card-elevated for hover states on interactive cards
  • Wider layout — main content container widened from max-w-5xl to max-w-7xl to 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 sync replaces the old full-width card
  • Hero Grab Rate card — large text-4xl percentage 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 2 badge 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 resilienceextra="ignore" prevents upstream API field additions from crashing search cycles
  • Concurrencysave_settings and add_instance wrapped in search_lock; client teardown deferred outside lock
  • Security headersX-Frame-Options, X-Content-Type-Options, Referrer-Policy on all responses
  • Event loop — blocking _atomic_toml_write and save_state calls offloaded to run_in_executor
  • Lidarr paginationget_grab_history now fetches all pages via get_paginated
  • Dockerfile — non-root fallback user added
  • Input validationsearch_text capped to 200 chars; TRUSTED_PROXY_IPS=* warning at startup

📦 Dependency Fix

  • Pin pytest>=9.0.3 to resolve tmpdir handling vulnerability (Dependabot alerts #5, #6)

⚠️ 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

Don't miss a new triggarr release

NewReleases is sending notifications on new releases.