Restore the seeders-desc default ordering that the new sort feature dropped,
so the healthiest torrents stay on top until `s` is pressed. Trim the
contextual footer (terse labels, folder key in the `?` overlay only) so the
added sort and folder keys never wrap it past one line. Gate the
download-folder editor on its own `editingFolder` flag instead of the shared
capture state, fixing the leak where `?`, `q`, and `m` fired through while
typing a path.
Add an `o` key that opens an inline prompt to set the download folder,
shown in the `?` cheatsheet and the sidebar footer. Reuses Panel +
TextField and the captureMode/effective-region mechanism the help
overlay already uses, so section keymaps stay quiet while typing a path.
No new Store field (editingFolder is local App state, like showHelp).
expandHome resolves a leading ~/ and ~\ so a path pasted from another
OS still works; the folder is created with fs.mkdir(recursive) and the
change fails soft, keeping the old folder if it cannot be created. The
setting only feeds new downloads (queue.add reads it at add-time), so
in-progress downloads and existing seeds keep their own dir and are
never interrupted or relocated.
Reword the c help labels (Downloads "Cancel or remove from list", Seeding
"Remove from list", dropping the Downloads cross-reference) and add a help
note that downloaded files always stay on disk, so cancel and remove never
read as deleting your media. Also trims the over-specific c sentence from the
readme and refreshes the npm description and keywords.
Finished downloads now keep seeding automatically and you opt out per item with
p, reusing the live torrent instead of tearing it down. Resume and restore seed
from the .torrent metadata captured at download time, so they verify the local
file immediately rather than depending on re-fetching metadata from the swarm.
Quitting now flushes queue, history, and seeds synchronously and exits
immediately, fixing the hang when quitting while seeding or with a paused seed.
Paused seeds persist their state and stay paused across restarts. Hide the
hardware cursor on the splash, and clarify that c removes a finished item the
same way in Downloads and Seeding.
Tests are isolated from the real data dir via a TORLINK_STATE_DIR override plus
vitest config, so runs never touch user data. Adds scripts/verify-seeding.ts
(npm run verify:seeding), an offline-deterministic harness proving seed, pause,
and resume transfer real bytes.
Curated, multi-source torrent search and download from the terminal:
concurrent search across built-in sources with streamed, source-tagged
results; a download-only webtorrent engine with true pause/resume and
restart recovery; magnet paste; and a calm Ink + React TUI. No indexer
server, no setup.