risuko — session
risuko --version
Eleven protocols. One engine.
Rust-powered download engine — desktop app, CLI, and Node.js library sharing one queue. From plain HTTPS to BEP 52 hybrid torrents to a giFT IPC bridge.
risuko download https://data.example.org/ml/dataset.tar.zst -t 16
Queued a1f8d166 — no engine found, starting headless
risuko download "magnet:?xt=urn:btih:9f86d081884c7d65"
Queued b7c22e01 — metadata from DHT (42 nodes)
risuko download https://vod.example.net/lecture-04/master.m3u8
Queued c93aa4f0 — playlist parsed: 630 segments, AES-128
✓All jobs complete — 16.4 GB in 06:12 (avg 45.1 MB/s)
Demo: risuko downloading over HTTP, BitTorrent, and HLS simultaneously.
Supported protocols
risuko protocols --list
webhttps://HTTP/HTTPSmulti-threaded range downloads, connection pooling
youtubeYouTubebundled yt-dlp child process, progress integration
rssRSSfeed subscription with automatic download
swarmmagnet:BitTorrentv1 + v2 hybrid (BEP 52), dual-stack DHT, LSD, MSE/PE, UPnP, seeding control
ed2k://ED2KeDonkey2000 network protocol
adcs://ADC/DCadc(s)://, dchub://, nmdc:// — ADC + legacy NMDC
gnet://Gnutella0.6 handshake, GWebCache bootstrap
g2://Gnutella2SHA-1 URN via Gnutella's HTTP peer endpoint
gift://giFTIPC bridge to a locally-running giftd daemon
stream.m3u8M3U8/HLSsegment downloads, AES-128-CBC decryption
transfersftp://FTP/SFTPTLS support, SFTP host keys pinned via TOFU
11 protocols · one queue · one engine
Benchmarks compared with Motrix
risuko bench --vs motrix
binary size90% smaller
memory70% less
peak cpu71% less
mem leakszero
# baseline: original project Motrix
Install
cat INSTALL
# Desktop — macOS (Windows/Linux below)
brew install --cask yuemiyuki/risuko/risuko-app.dmg / .msi / .AppImage# CLI
npm install -g @risuko/cliinstall guide# Node.js
npm install @risuko/risuko-jsAPI referenceCode examples
tail -n 4 examples/cli.sh
risuko download https://example.com/file.iso -t 16
risuko download "magnet:?xt=urn:btih:abc123..." --seed-ratio 1.0
risuko status --json
risuko pause a1b2c3d4 && risuko resume a1b2c3d4
head -n 6 examples/quick.ts
import { startEngine, addUri, tellStatus } from "@risuko/risuko-js";
await startEngine();
const gid = await addUri(["https://example.com/file.zip"], { split: "16" });
const status = await tellStatus(gid);
console.log(`${status.completedLength}/${status.totalLength}`);
risuko docs