Introduction
Risuko is a Rust-powered multi-protocol download engine with a desktop app, CLI, and Node.js API.
Risuko (Ri-su-ko) is a high-performance download engine written in Rust. It supports HTTP/HTTPS, BitTorrent (v1 + v2), ED2K, M3U8/HLS, FTP/SFTP, YouTube (via yt-dlp), the legacy P2P stacks (ADC / Direct Connect, Gnutella, G2, giFT), and RSS feeds.
The name means squirrel in Japanese, an energetic little creature that rapidly gathers and caches away every treasure it finds.
You can use Risuko in three ways:
- Desktop App — A cross-platform GUI built with Tauri and Vue.js
- CLI — A standalone command-line tool with full feature parity
- Node.js API — Native bindings via napi-rs for embedding in your applications
Supported Protocols
| Protocol | Description |
|---|---|
| HTTP/HTTPS | Multi-threaded range-based downloads with connection pooling |
| BitTorrent | Magnet links, .torrent files, v1 + v2 (BEP 52) hybrid, dual-stack DHT, LSD, MSE/PE encryption, UPnP port mapping, seeding control |
| ED2K | eDonkey2000 network protocol |
| M3U8/HLS | HTTP Live Streaming segment downloads (with AES-128-CBC decrypt) |
| FTP/SFTP | File Transfer Protocol with TLS support; SFTP host keys pinned via TOFU |
| YouTube | Bundled yt-dlp child process with progress integration |
| ADC / DC | adc(s)://, dchub://, nmdc:// — Advanced Direct Connect + legacy NMDC |
| Gnutella | gnutella:// / gnet:// — 0.6 handshake + GWebCache bootstrap |
| Gnutella2 (G2) | g2:// — SHA-1 URN download via Gnutella's HTTP peer endpoint |
| giFT | gift:// — IPC bridge to a locally-running giftd daemon |
| RSS | Automatic feed subscription and download |
Cloud Upload Sinks
The desktop app can mirror every finished download to a remote destination. Supported backends: WebDAV, S3 (and compatible), SFTP, and FTP/FTPS. See the Cloud Upload Sinks guide for routing rules and post-upload actions.
Quick Example
CLI
# Download a file with 16 threads
risuko download https://example.com/large-file.zip -t 16
# Download a torrent
risuko download magnet:?xt=urn:btih:abc123...Node.js
import { startEngine, addUri, onEvent } from "@risuko/risuko-js";
await startEngine();
onEvent((event, gid) => {
console.log(`[${event}] ${gid}`);
});
const gid = await addUri(["https://example.com/file.zip"]);