-
v2026.05.08.3 Stable
released this
2026-05-08 22:08:27 -04:00 | 978 commits to main since this releaseFlutter admin parity slice — closes the operator-actionable subset of the admin surface on mobile and simplifies the home AppBar.
Flutter (admin slice)
Three new fullscreen routes under
/admin:- Requests — list of pending Lidarr requests with Approve / Reject. Joins requester
user_id→ username client-side viaadminUsersProvider. - Quarantine —
ExpansionTileper aggregated track row (collapsed: track + report-count + top reason; expanded: per-user reports). Three-dot menu with Resolve / Delete file / Delete via Lidarr; both deletes route through aTypedConfirmSheetrequiring typed "DELETE". - Users — Users + Invites in one scroll. User edit sheet exposes admin / auto-approve toggles, admin-supplied password reset, typed-confirm delete. Invites section shows token (monospace, copy button), optional note, redeemed badge; "Generate" opens a note-input dialog (server hardcodes 24h TTL).
Plus an
AdminLandingScreenwith three section cards driven byadminCountsProvider(parallel fan-out for at-a-glance counts).Flutter (nav restructure)
Home AppBar simplified from 5 icons to 3 primary + a kebab overflow:
- Primary icons: Home / Library / Search (current screen suppressed)
- Kebab: Playlists / Discover / Settings /
[Admin if isAdmin]
The new shared
MainAppBarActionswidget is adopted across all top-level screens for consistency. Admin entry is also discoverable via a Settings card (admin-only).Routing
buildRouterredirect closure now refuses any/admin/*path whenuser.isAdmin == false(serverRequireAdminmiddleware remains the authority — this is UX).Operator notes
- After upgrading the APK, admins will see a new "Admin" entry in the kebab menu and a card at the bottom of Settings.
- Non-admins see no UI changes besides the simpler AppBar.
- The next slice (TBD) will address the bootstrap-invite-token gap noticed during the last deploy: when a bootstrap admin already exists from
MINSTREL_AUTH_ADMIN_USERNAME, fresh self-registration via/registerfalls through to the invite-only mode and fails because no invite-generation UI is reachable. Now that admins can generate invites in the new Users screen, the operator workaround is "log in as bootstrap admin → generate invite → register with token", but a smoother default belongs in a follow-up.
Downloads
- Requests — list of pending Lidarr requests with Approve / Reject. Joins requester