49 Commits
Author SHA1 Message Date
DennisandGitHub bf36076924 chore: update nix package 1.3.0 -> 1.3.1 (#66) 2026-07-07 17:32:41 -04:00
bairon.dev efbd8c996a chore: bump version to 1.3.1 v1.3.1 2026-07-07 14:47:46 -04:00
bairon.dev 661f90f78d feat: make search streaming fluid and the ? cheatsheet responsive 2026-07-07 14:29:41 -04:00
DennisandGitHub d2126ca8ee chore: update nix package 1.2.0 -> 1.3.0 (#63) 2026-07-07 10:58:43 -04:00
bairon.dev 885ac37c9b docs: switch star history chart to sealed token urls 2026-07-07 02:13:34 -04:00
bairon.dev 3302f46762 feat: polish prompt ux and fix z hiding sources without seeder data
- new PromptHints action row shared by the folder and trackers prompts
- download-to prompt shows the torrent name and size, enter reads "download"
- export torrent rebound from T to s and centralized in the store
- footer trimmed to essentials, d/D and z detail live in the ? sheet
- z keeps FitGirl and SubsPlease rows: their feeds carry no seeder data,
  a new per-source reportsHealth flag marks seeders: 0 as unknown, not dead
- version 1.3.0
v1.3.0
2026-07-07 01:55:04 -04:00
Abu Hossain FoysalandGitHub 26a4f0f910 fix: resolve clipboard write on exit for wrapped nix binaries (#57) 2026-07-06 23:33:31 -04:00
blokandGitHub c63187ecc1 feat: export torrent files (#62) 2026-07-06 23:28:39 -04:00
Felix-AyushandGitHub 61d62893c8 feat: hide zero-seeder results with z key (#49) 2026-07-06 23:25:57 -04:00
TechNapoleonandGitHub 28565a88dd feat: pick a folder per download with D (#54)
The o key sets one global download folder, so routing a single result
somewhere else (a movie to the NAS, a game to the big drive) meant
changing the setting and changing it back. D on a result now opens a
"download to" prompt for just that item; d stays a one-keypress
download to the default.

The queue already stores a dir per item, so resume, re-seed and
download-again honor the choice with no new plumbing. The prompt
reuses FolderPrompt (new title prop), pre-fills with the last D folder
this session so batches cost one typed path, and nothing new is
persisted. The ? sheet gains d/D entries (d was missing entirely) and
the README now mentions both o and D, which it never documented.

One behavior fix rides along because D exposed it: queue.add() used to
ignore the requested dir when re-adding a failed item, so redirecting
a failed download (the disk-full case D exists for) silently retried
into the old folder. add() now adopts the requested dir on failed
retry, dropping resume progress only when the folder actually changed;
covered in queue.add.test.ts with the engine mocked. The f retry key
goes through queue.retry() and keeps the item's own folder, unchanged.
D on an already-active item says "Already in queue" instead of
claiming a folder that wouldn't be used.
2026-07-05 14:57:32 -04:00
6c4289ea10 feat: open a download's folder with e (#51)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-05 10:07:26 -04:00
Felix-AyushandGitHub 8673f744f7 feat: sort search results by date added (#48) 2026-07-05 10:07:09 -04:00
@aaronjmarsandGitHub 87880d25a4 fix(ui): sanitize terminal escape sequences in result detail view (#44)
The detail pane renders `infoHash` and `magnet` verbatim, whereas the
result name is passed through `cleanText()`. A malicious or hijacked
indexer can embed control bytes — e.g. an OSC-52 clipboard-write
sequence — in a magnet or info hash; those bytes are then written to the
terminal when the user opens that result's detail pane.

Add `stripControl()` (removes C0/C1 controls and DEL) and apply it to
both fields at render. Unlike `cleanText()`, it preserves the exact
remaining characters — no whitespace folding, NFC, or "Untitled"
fallback — which is correct for identifiers and URLs.
2026-07-05 10:00:10 -04:00
ManakandGitHub 75af643083 fix: disable NAT-PMP on macOS to prevent EADDRINUSE crash on port 5350 (#45)
macOS mDNSResponder permanently occupies UDP port 5350, which is the
NAT-PMP client port that webtorrent binds when initializing its NAT
traversal. The bind fails asynchronously with EADDRINUSE, and since
the PMP client is a raw EventEmitter with no error listener, it
surfaces as an uncaughtException that kills the app the moment a
download starts.

NAT-PMP can never succeed on macOS because the port is permanently
taken, so disable it on darwin only and let UPnP handle NAT traversal
instead. Other platforms are unaffected.

Closes #22
2026-07-05 09:59:53 -04:00
DennisandGitHub b8f88728db chore: update nix package 1.1.1 -> 1.2.0 (#41) 2026-07-02 21:04:16 -04:00
bairon.dev dd5f1bc5cf feat: paginate the fitgirl feed three pages deep for fuller browse and search v1.2.0 2026-07-02 02:44:52 -04:00
bairon.dev ba45f11c40 fix: compact huge seed:leech counts so results rows stop wrapping, bump to 1.2.0 2026-07-02 02:32:03 -04:00
bairon.dev dbe543b433 fix: drop SolidTorrents so games stop showing under TV (#33) 2026-07-02 01:01:51 -04:00
bairon.dev bf2daceb49 feat: accept a bare infohash (#32) 2026-07-02 00:22:12 -04:00
ManishandGitHub f3880f15fe feat: let users add their own trackers via the t key (#31) 2026-07-01 14:01:49 -04:00
bairon.dev 7748c41cf7 chore: keep hjkl out of the footer, document it in the ? overlay 2026-07-01 02:39:41 -04:00
Avinash GundimedaandGitHub 6ba3e4292b feat: add hjkl navigation alongside the arrow keys (#29)
Layer vim-style h/j/k/l onto the existing arrow navigation across the sidebar, results, downloads, and seeding. Arrows unchanged.
2026-07-01 02:36:45 -04:00
Anand HegdeandGitHub 1b53ef3094 fix: leave a row of slack below the results panel (#30)
Move the results panel height into a tested resultsPanelOuter helper so the view stays one row short of the overflow:hidden body, matching Downloads and Seeding. Fixes #21.
2026-07-01 02:36:28 -04:00
yaninniandGitHub 17a06fa37a fix: make postbuild cross-platform so the CLI builds on Windows (#18)
The postbuild step was using cp and chmod, which only work on Unix. On Windows npm run build would run tsup successfully but then fail at the cp command, leaving dist/cli.cjs missing. Since the package.json bin field points there, npx torlnk would just say the command isn't recognized.I replaced the shell one-liner with scripts/postbuild.mjs

Small Node script that copies cli-entry.cjs to dist/cli.cjs and marks it executable. chmod is a no-op on Windows but still does the right thing for the published package, so the output is identical across Windows, macOS, and Linux.
2026-06-30 16:35:01 -04:00
DennisandGitHub 61bbb4b219 chore: add nix flake for Linux
* nix: init 1.0.0-unstable rev 6902733

* nix: add install instructions

* nix: update 1.0.0 -> 1.1.1
2026-06-30 16:23:25 -04:00
Anand HegdeandGitHub 3c5b5597d9 feat: extract upload date for 1337x results
Parse the "Date uploaded" field from 1337x detail pages into TorrentResult.added, matching the other sources. Reuses the detail-page fetch already done for the magnet, so no extra requests are made.
2026-06-30 11:07:35 -04:00
Anand HegdeandGitHub 81f449ffda fix: show sort param during search phase
Keep the active sort note on the status line while results stream in, so it no longer disappears mid-search and snaps back only once sources finish.
2026-06-30 11:07:18 -04:00
bairon.dev 7fa049ae9d fix: seeders-first default, compact footer, and folder-editor input isolation
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.
2026-06-30 00:14:05 -04:00
bairon.dev cc881aefc4 Merge branch 'sort-results' into merge/sort-and-folder 2026-06-29 23:45:40 -04:00
yaninni c114c32d05 feat: change the download folder from the UI
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.
2026-06-30 02:04:59 +02:00
samoht9277 05236fe8e5 feat: add 's' key to sort results by size, seeders, or source 2026-06-29 19:40:15 -03:00
bairon.dev 9cd996178a chore: switch funding to github sponsors 2026-06-29 15:49:13 -04:00
bairon.dev 01715b7172 docs: open the readme with the torrent pain point 2026-06-29 14:20:20 -04:00
bairon.dev 5c0d1dee37 chore: bump version to 1.1.0 2026-06-29 14:12:42 -04:00
bairon.dev 96162598c6 docs: add contributor guide and PR template 2026-06-29 14:09:28 -04:00
bairon.dev 400b86a292 chore: add Buy Me a Coffee funding link 2026-06-29 13:58:23 -04:00
bairon.dev 9069ba5e9c Merge pull request #4: navigate panes with the arrow keys
# Conflicts:
#	package-lock.json
2026-06-29 13:40:04 -04:00
bairon.dev ca3ceda1b7 Merge pull request #6: add 'Copy magnet' via the y key 2026-06-29 13:40:03 -04:00
bairon.dev 9eaa63afc7 Merge pull request #5: show a clear error when Node.js is too old 2026-06-29 13:40:03 -04:00
Francesco Pira e255e202d1 feat: added 'Copy magnet' option via 'y' key 2026-06-29 18:55:14 +02:00
LeBaronDeCharlus cda377a420 fix: show clear error when Node.js is too old instead of a parse crash 2026-06-29 14:36:41 +02:00
Oskar Krawczyk 6acbac462e Added navigating panes by arrows 2026-06-29 11:22:02 +02:00
bairon.dev 69027331b2 chore: publish as torlnk on npm, keep torlink as the brand
The npm name and command become torlnk (npx torlnk) to clear npm's
"too similar to comlink" guard, mirroring the sndcli/soundcli split. torlink
stays the brand everywhere it matters: the logo wordmark, app and terminal
title, version string, the data and downloads folder (APP_NAME), and the repo.
Updates the cli usage lines, readme install commands, and the user-agent
package url to match.
2026-06-27 18:04:28 -04:00
bairon.dev 21fd77002b fix: clarify c removes from the list, never your files
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.
2026-06-27 17:47:35 -04:00
bairon.dev 3616c9305c docs: lead the readme with the in-app flow, drop cli commands from the intro
torlink is a TUI, so Get started now keeps just the single npx torlink launch
and frames searching, pasting a magnet, browsing, and the ? cheatsheet as
in-app keypresses, instead of opening with magnet/torrent args and a global
install.
2026-06-27 17:28:06 -04:00
bairon.dev 14b4a5ede6 feat: seed downloads by default (opt-out) with robust resume and clean quit
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.
2026-06-27 17:02:22 -04:00
bairon.dev 8a9886be9c feat: wordmark + progress-bar sheen, dark-violet svg base, readme refinements 2026-06-27 12:42:38 -04:00
bairon.dev ea12f2f134 docs: refine readme examples and phrasing 2026-06-27 02:39:41 -04:00
bairon.dev 60d7a9a755 feat: terminal-native torrent discovery TUI
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.
2026-06-27 02:03:19 -04:00