ABS returns items-in-progress once per in-progress podcast episode (same item id),
which rendered duplicate cards. Collapse to one card per library item.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The focus/scroll-lock effect depended on onClose (a new function each render), so it
re-ran on every keystroke and refocused the panel. Split focus-on-open from the Escape
listener so inputs in modals keep focus while typing.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a per-episode rename action (pencil, permission-gated) backed by
PATCH /api/podcasts/:id/episode/:episodeId; also add deleteEpisode API helper.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- PlayerBar no longer overlaps the sidebar on desktop (offsets by sidebar width),
so Settings/collapse stay reachable while playing.
- Sidebar collapse toggle moved onto the header logo icon; remove bottom button.
- Prod server: catch-all proxy so any non-SPA, non-asset request is forwarded to
ABS — only Shelfless needs to be exposed, ABS stays internal.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
React + Vite + TypeScript SPA covering the full ABS feature set (library
browsing, item detail, metadata/cover editing, podcasts, player with session
sync, admin: users/libraries/scanner/server settings). Dev uses a dynamic
CORS proxy; production is served by server/index.mjs (static + reverse proxy
to ABS_URL). Includes systemd unit and installer under deploy/.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>