Full-featured download manager with segmented parallel downloads, pause/resume and persisted tasks, queueing, speed limits, scheduling; includes daemon REST API, remote control, and pluggable protocol/storage extensions.
English · 简体中文 · Español · 日本語 · Deutsch · Français
A fast, open-source download manager for every device you own.
macOS · Windows · Linux · Android · iOS · Web · Command line
A Kotlin Multiplatform library you can embed in your own application.
Download · Watch demo · Features · Getting started · For developers
Ketch splits every download across parallel connections, and shows each one as a live lane. It takes web links, FTP and WebDAV servers, torrents and magnet links in one place. Pair your laptop, phone and home server, and you can watch and control the downloads on all of them from any one of them.
Building your own app? Embed the same download engine that powers Ketch's apps, with parallel downloads, pause and resume, queues and speed limits. The Kotlin Multiplatform library is available on Maven Central. Start integrating Ketch →
[!WARNING] 🚧 Ketch is in active development and has not reached 1.0 yet. Expect rough edges, and please report what you find.
| Platform | Get it |
|---|---|
| macOS (Apple silicon, Intel) |
.dmg from the latest release
|
| Windows (x64, ARM64) |
.msi, or the portable .zip that runs without installing, from the latest release (about the portable app) |
| Linux (x64, ARM64) |
.deb from the latest release
|
| Android 8.0+ |
Google Play, or the .apk from the latest release
|
| iOS 15+ | Unsigned .ipa from the latest release, to sideload with AltStore, SideStore or Sideloadly (they sign it with your Apple ID); or build from source with Xcode (app/ios) |
| Web | ketch.linroid.com, to control Ketch running on another device |
| Browser extension | Chrome, Edge, Brave and other Chromium browsers: Chrome Web Store; Firefox: .zip from the extension's releases (how to install) |
| Command line and server | macOS, Linux and Windows: install script or the latest release |
| Docker | NAS and home servers on x64 and ARM64: ghcr.io/linroid/ketch (guide, with TrueNAS and fnOS) |
The desktop apps bring their own runtime, and the command line is a single native binary: neither
needs Java. Both update themselves from the releases here: the desktop app from Settings → About,
the command line with ketch update (how updates work).
name.ketch, so an unfinished file never looks complete.davs:// links), with
parallel connections, resume and Digest or Basic sign-in (details)..m3u8) and DASH (.mpd) — Save finite streams as one media file, in the quality
you choose (the best by default), with separate audio merged in and AES-128 HLS decrypted
(support and limits)..meta4, .metalink) — Download from every mirror a Metalink lists at once.
A mirror that fails or sends bad pieces is left out, and the file is checked against the
Metalink's hashes (details)..torrent files for your system, so a click in the browser or
the file manager lands in Ketch.ketch server, also as a Docker image,
runs the same engine with a REST API and the web app built in, and the apps find it on your
network.ketch add, list, pause, resume and watch control the downloads
of the Ketch app or a server from a terminal or a script; watch prints JSON lines
(CLI).ketch server or the desktop app (hooks).⌘K (Ctrl+K on Windows and Linux) opens the command
palette, and the shortcut sheet lists every key.ketch ai-discover (setup).ketch mcp lets AI assistants start, watch and manage the downloads of the
Ketch app or a server through the Model Context Protocol.⌘V, or Ctrl+V), drop a link or a .torrent file on the
window, or choose Add.Install the command line on macOS or Linux (on Windows, take the .zip from the
latest release):
curl -fsSL https://raw.githubusercontent.com/linroid/Ketch/main/install.sh | bashStart the server, with its REST API and web app on port 8642:
ketch serverOn its first run it creates an access token and prints it once. Add the server in the apps under
Devices → Add device with that token, or open http://<server address>:8642 in a browser. The
command line also downloads on its own:
ketch https://example.com/file.zipSet your own token, the port and other options in a config file; the CLI documentation lists every command.
On a NAS, or anywhere Docker runs, start the image instead. The Docker guide covers its settings and has steps for TrueNAS and fnOS:
docker run -d --name ketch --restart unless-stopped -e PUID=1000 -e PGID=1000 \
-v /srv/ketch:/config -v /srv/downloads:/downloads \
-p 8642:8642 -p 16881:16881 -p 16881:16881/udp ghcr.io/linroid/ketchEmbed Ketch in your application. Its Kotlin Multiplatform library gives you the same download
engine used by the Ketch apps, with your own UI and application logic. Add the modules you need
from Maven Central under com.linroid.ketch.
Run the engine inside your Android, iOS or JVM app with core and ktor; Node.js and WASI can
use core with a custom HTTP engine. Or use remote to control a Ketch server from Android,
iOS, the JVM or the browser through the same KetchApi.
// build.gradle.kts: implementation("com.linroid.ketch:core:<version>")
// implementation("com.linroid.ketch:ktor:<version>")
val ketch = Ketch(httpEngine = KtorHttpEngine())
ketch.start()
val task = ketch.download(
DownloadRequest(
url = "https://example.com/file.zip",
destination = Destination("/path/to/downloads/"), // a trailing slash means a folder
),
)
task.state.collect { println(it) }Contributions are welcome! Please open an issue to discuss your idea before submitting a PR. See the code style rules, testing rules and localization guide for development guidelines; translations come in by pull request.
Coding agents should start with AGENTS.md, the shared instructions for all agents
and editors. If your tool does not load it automatically, ask it to read AGENTS.md and its linked
rules before making changes. Keep shared instructions in these files; tool-specific entry points
should only reference them.
Apache-2.0
English · 简体中文 · Español · 日本語 · Deutsch · Français
A fast, open-source download manager for every device you own.
macOS · Windows · Linux · Android · iOS · Web · Command line
A Kotlin Multiplatform library you can embed in your own application.
Download · Watch demo · Features · Getting started · For developers
Ketch splits every download across parallel connections, and shows each one as a live lane. It takes web links, FTP and WebDAV servers, torrents and magnet links in one place. Pair your laptop, phone and home server, and you can watch and control the downloads on all of them from any one of them.
Building your own app? Embed the same download engine that powers Ketch's apps, with parallel downloads, pause and resume, queues and speed limits. The Kotlin Multiplatform library is available on Maven Central. Start integrating Ketch →
[!WARNING] 🚧 Ketch is in active development and has not reached 1.0 yet. Expect rough edges, and please report what you find.
| Platform | Get it |
|---|---|
| macOS (Apple silicon, Intel) |
.dmg from the latest release
|
| Windows (x64, ARM64) |
.msi, or the portable .zip that runs without installing, from the latest release (about the portable app) |
| Linux (x64, ARM64) |
.deb from the latest release
|
| Android 8.0+ |
Google Play, or the .apk from the latest release
|
| iOS 15+ | Unsigned .ipa from the latest release, to sideload with AltStore, SideStore or Sideloadly (they sign it with your Apple ID); or build from source with Xcode (app/ios) |
| Web | ketch.linroid.com, to control Ketch running on another device |
| Browser extension | Chrome, Edge, Brave and other Chromium browsers: Chrome Web Store; Firefox: .zip from the extension's releases (how to install) |
| Command line and server | macOS, Linux and Windows: install script or the latest release |
| Docker | NAS and home servers on x64 and ARM64: ghcr.io/linroid/ketch (guide, with TrueNAS and fnOS) |
The desktop apps bring their own runtime, and the command line is a single native binary: neither
needs Java. Both update themselves from the releases here: the desktop app from Settings → About,
the command line with ketch update (how updates work).
name.ketch, so an unfinished file never looks complete.davs:// links), with
parallel connections, resume and Digest or Basic sign-in (details)..m3u8) and DASH (.mpd) — Save finite streams as one media file, in the quality
you choose (the best by default), with separate audio merged in and AES-128 HLS decrypted
(support and limits)..meta4, .metalink) — Download from every mirror a Metalink lists at once.
A mirror that fails or sends bad pieces is left out, and the file is checked against the
Metalink's hashes (details)..torrent files for your system, so a click in the browser or
the file manager lands in Ketch.ketch server, also as a Docker image,
runs the same engine with a REST API and the web app built in, and the apps find it on your
network.ketch add, list, pause, resume and watch control the downloads
of the Ketch app or a server from a terminal or a script; watch prints JSON lines
(CLI).ketch server or the desktop app (hooks).⌘K (Ctrl+K on Windows and Linux) opens the command
palette, and the shortcut sheet lists every key.ketch ai-discover (setup).ketch mcp lets AI assistants start, watch and manage the downloads of the
Ketch app or a server through the Model Context Protocol.⌘V, or Ctrl+V), drop a link or a .torrent file on the
window, or choose Add.Install the command line on macOS or Linux (on Windows, take the .zip from the
latest release):
curl -fsSL https://raw.githubusercontent.com/linroid/Ketch/main/install.sh | bashStart the server, with its REST API and web app on port 8642:
ketch serverOn its first run it creates an access token and prints it once. Add the server in the apps under
Devices → Add device with that token, or open http://<server address>:8642 in a browser. The
command line also downloads on its own:
ketch https://example.com/file.zipSet your own token, the port and other options in a config file; the CLI documentation lists every command.
On a NAS, or anywhere Docker runs, start the image instead. The Docker guide covers its settings and has steps for TrueNAS and fnOS:
docker run -d --name ketch --restart unless-stopped -e PUID=1000 -e PGID=1000 \
-v /srv/ketch:/config -v /srv/downloads:/downloads \
-p 8642:8642 -p 16881:16881 -p 16881:16881/udp ghcr.io/linroid/ketchEmbed Ketch in your application. Its Kotlin Multiplatform library gives you the same download
engine used by the Ketch apps, with your own UI and application logic. Add the modules you need
from Maven Central under com.linroid.ketch.
Run the engine inside your Android, iOS or JVM app with core and ktor; Node.js and WASI can
use core with a custom HTTP engine. Or use remote to control a Ketch server from Android,
iOS, the JVM or the browser through the same KetchApi.
// build.gradle.kts: implementation("com.linroid.ketch:core:<version>")
// implementation("com.linroid.ketch:ktor:<version>")
val ketch = Ketch(httpEngine = KtorHttpEngine())
ketch.start()
val task = ketch.download(
DownloadRequest(
url = "https://example.com/file.zip",
destination = Destination("/path/to/downloads/"), // a trailing slash means a folder
),
)
task.state.collect { println(it) }Contributions are welcome! Please open an issue to discuss your idea before submitting a PR. See the code style rules, testing rules and localization guide for development guidelines; translations come in by pull request.
Coding agents should start with AGENTS.md, the shared instructions for all agents
and editors. If your tool does not load it automatically, ask it to read AGENTS.md and its linked
rules before making changes. Keep shared instructions in these files; tool-specific entry points
should only reference them.
Apache-2.0