Risuko

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

ProtocolDescription
HTTP/HTTPSMulti-threaded range-based downloads with connection pooling
BitTorrentMagnet links, .torrent files, v1 + v2 (BEP 52) hybrid, dual-stack DHT, LSD, MSE/PE encryption, UPnP port mapping, seeding control
ED2KeDonkey2000 network protocol
M3U8/HLSHTTP Live Streaming segment downloads (with AES-128-CBC decrypt)
FTP/SFTPFile Transfer Protocol with TLS support; SFTP host keys pinned via TOFU
YouTubeBundled yt-dlp child process with progress integration
ADC / DCadc(s)://, dchub://, nmdc:// — Advanced Direct Connect + legacy NMDC
Gnutellagnutella:// / gnet:// — 0.6 handshake + GWebCache bootstrap
Gnutella2 (G2)g2:// — SHA-1 URN download via Gnutella's HTTP peer endpoint
giFTgift:// — IPC bridge to a locally-running giftd daemon
RSSAutomatic 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"]);

Next Steps

On this page