f.date/f.ago assumed JS milliseconds, but the backend emits Unix epoch
seconds everywhere (created_at, feed lastUpdate, rule lastMatch, …), so
every real timestamp rendered as ~20607 days ago (now - ~1.78e9 ms).
Treat the formatter input as seconds. Search results show the indexer's
pubDate string directly rather than mis-parsing it.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Settings now has an Account card (current user/role + change password)
and, for admins, a Users card to add/delete users, reset passwords, and
toggle admin/user roles. Login captures the role; the Users section is
admin-only. api.js gains the account/user endpoints.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
So the daemon names the torrent after the feed article or search
result instead of the temp upload filename.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Article Add button now shows whenever the item has any source
(magnet, enclosure, or a plain <link>/Atom href), and the manual
download falls back to the link URL. Fixes missing + on feeds that
only provide a <link> to the torrent.
- The rule editor now shows a live "current matches" list that updates
as you type the filters / toggle regex / pick feeds, mirroring the
daemon's matcher, with grabbed items dimmed.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Per-article Add button now sends the article key and reflects the
grabbed state (✓ Added, disabled).
- Per-feed ⟳ repull plus a Refresh-all button.
- Per-rule ⏵ "Run now" that re-applies the rule to existing articles
and reports how many were added.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Wire the RSS and Search tabs to the new backend:
- RSS: add/remove feeds, per-article "Add" (download), and a full
auto-download rule editor (match/regex, must[-not]-contain, per-feed
scope, category, save path, paused) with edit/delete.
- Search: results now add via the server-side download endpoint
(magnet/.torrent); add a Torznab indexer manager (list/add/remove).
- api.js: feed/rule/indexer/download client methods.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The add-torrent save path now shows the selected category's default
location (its own save path, else the global default), greyed and
read-only. Clicking makes it editable; an overridden path then stays
put when the category changes. Resolves the "category default location
does nothing" issue by feeding the category's save path into the add.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add an "Edit category…" context-menu item and modal that renames a
category and/or changes its save path (Uncategorized: path only).
Filter empty-named categories out of the add/set-category dropdowns so
the stored Uncategorized save-path entry doesn't double the option.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The checkbox menu now uses position:fixed anchored under the button,
overlaying the rest of the dialog instead of expanding it. Closes on
outside click; repositions on scroll/resize.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the comma-separated tags input with a checkbox dropdown of
existing tags plus inline new-tag creation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add-torrent and set-category dropdowns default to Uncategorized so a
category is no longer forced; set-category preselects the current one.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Automation tab: settings form (define_settings) beside the editor,
stacking above it when narrow; script/settings save split.
- Set location modal: current location + reset checkbox.
- saveScriptSettings/setSavePath API wiring; plugins panel.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
readTorrentFile only returned parsed metadata for the preview, so a
file-based add sent no torrent content and the server rejected it. Include
the raw bytes as base64 ("data") alongside the preview fields so uploads
actually add.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Wire up controls that were rendered but inert, expose unused server
actions, and harden the live update path.
Controls now functional:
- File priority dropdowns (Content tab) now persist via new
setFilePriority server action
- Context menu: Set location, Limit download/upload rate, Set share
limit (wire setSavePath/setDownLimit/setUpLimit/setRatioLimit)
- Trackers sidebar filter actually filters (snapshot now carries
per-torrent trackerHosts)
Robustness:
- Grid updates cells in place when row order/columns are unchanged
(preserves text selection/scroll, no per-second listener re-bind)
- Boot retries until the server responds; SSE drops show a
"Reconnecting" banner; failed actions/add/delete surface a toast
- Prune selection/detail for torrents that disappear
- Drop Backspace-as-delete (kept Delete)
Cleanup:
- Remove pseudo DHT/PeX/LSD names from the real-tracker host pool in
mock data (they leaked into announce URLs and the sidebar)
- Remove dead detailTab import/export
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>