Native macOS torrent client. SwiftUI on top of a Rust core. Apple Silicon only.
Built as a replacement for WebTorrent Desktop — no Electron, no Node, native everything.
- Add torrents via magnet URI,
.torrentfile, drag-and-drop, or paste - Card-based torrent list with inline file picker and progress
- Duplicate magnet detection (no accidental re-adds)
- Pause / resume / remove (with optional file deletion)
- Per-file selection (skip files you don't want)
- Resumes torrents on app launch
- Session-wide bandwidth limits (live-updatable)
- Customizable download folder
- macOS default handler for
magnet:links and.torrentfiles - Completion notifications + action/chime sound effects (toggleable)
SwiftUI app ──UniFFI──> Rust core
├── librqbit (TCP/uTP/HTTP/UDP trackers, DHT,
│ piece picker, disk I/O, streaming
│ HTTP API)
└── neotorrent-core/{tracker,peer,wire,extension,
engine} (WSS tracker + WebRTC peer transport
+ BT wire protocol + ut_metadata — built from
scratch, currently parallel to librqbit)
crates/neotorrent-core— engine, librqbit wrapper, custom WebRTC stackcrates/neotorrent-ffi— UniFFI exports (NeoTorrentSession,parseMagnet, …)apps/NeoTorrent— SwiftUI app (XcodeGen-managed project)
The WebRTC modules (peer.rs, tracker.rs, wire.rs, extension.rs,
engine.rs) are end-to-end working against real WebTorrent peers but not yet
wired into the librqbit-backed download path. They're kept in tree for a future
hybrid client that also speaks WebRTC.
Build, layout, tests, and release workflow are documented in CONTRIBUTING.md.
Heavily inspired by WebTorrent Desktop — same drag-a-magnet-and-go UX, but rebuilt as a native macOS app. Goals that drove the rewrite:
- Drop Electron/Node — ship a single Apple-Silicon binary instead of a 200 MB Chromium bundle
- Use the modern Rust BitTorrent stack (
librqbit) for the wire protocol - Keep WebTorrent-flavored WebRTC peer support on the roadmap (the
neotorrent-corecrates already speak it end-to-end against real WebTorrent peers)
Made with ❤️ by @lodev09