
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.
A full-featured Kotlin Multiplatform download manager — run locally, remotely, or embedded in your app. Supports Android, iOS, Desktop, and Web.
[!WARNING] 🚧 Work in Progress — This project is under active development. APIs may change. Contributions and feedback are welcome!
✅ -- Works on Android, iOS, Desktop, and Web✅ -- Accelerate downloads by splitting files into multiple parallel connections✅ -- Distribute HTTP segments across multiple network interfaces
on JVM/Desktop and Android, configurable locally or remotely through KetchApi
(setup and limitations)✅ -- Pause and pick up where you left off, even after restarting your app✅ -- Manage multiple downloads with priorities and concurrency limits✅ -- Control bandwidth usage per task or globally✅ -- Schedule downloads for a specific time, after a delay, or based on conditions✅ -- Automatically retry failed downloads with smart backoff✅ -- Run as a background service with REST API and real-time events✅ -- Manage a remote server from any client (mobile, desktop, web, or CLI)✅ -- Swap out HTTP engines, storage backends, and download sources✅ -- Download from FTP servers with segmented parallel transfers and resume🔜 -- Multi-source downloads with mirrors, checksums, and chunk verification🔜 -- Download from WebDAV servers with resume support🔜 -- Download and merge HTTP Live Streaming videos🔜 -- Extract and download media from websites (like yt-dlp)🔜 -- Detect downloadable resources from web pages✅ -- Send downloads, links and magnet links
from Chrome, Edge, Firefox and other browsers to Ketch on this computer or a remote server🚧 -- Find download links from natural language queries using an
LLM agent you configure in the app (OpenAI, Anthropic, Gemini, Ollama)🔜 -- Expose Ketch capabilities as tools for AI agents via Model Context ProtocolAdd the SDK to your Kotlin Multiplatform project:
// build.gradle.kts
dependencies {
implementation("com.linroid.ketch:core:<latest-version>")
implementation("com.linroid.ketch:ktor:<latest-version>")
}Start downloading:
To distribute HTTP segments across Wi-Fi, Ethernet, or Android cellular networks, see multiple network interfaces.
val ketch = Ketch(
httpEngine = KtorHttpEngine(),
config = DownloadConfig(
maxConnectionsPerDownload = 4,
maxConcurrentDownloads = 3,
)
)
val task = ketch.download(
DownloadRequest(
url = "https://example.com/large-file.zip",
directory = "/path/to/downloads",
)
)
// Observe progress
task.state.collect { state ->
when (state) {
is DownloadState.Downloading -> {
val p = state.progress
println("${(p.percent * 100).toInt()}% ${p.bytesPerSecond / 1024} KB/s")
}
is DownloadState.Completed -> println("Done: ${state.filePath}")
is DownloadState.Failed -> println("Error: ${state.error}")
else -> {}
}
}See Installation for version catalog setup, optional modules (SQLite persistence, Kermit logging, remote client), and the full API reference.
Download the latest apps from GitHub Releases:
| Platform | Format |
|---|---|
| Android | .apk |
| macOS (x64, arm64) | .dmg |
| Linux (x64, arm64) | .deb |
| Windows (x64, arm64) | .msi |
| iOS | Build from source via Xcode |
| Browser extension (Chromium, Firefox) |
.zip (how to install) |
Install the native CLI to run Ketch as a daemon on your server:
curl -fsSL https://raw.githubusercontent.com/linroid/Ketch/main/install.sh | bashThen start the daemon:
# Start the server with REST API + web UI on port 8642
ketch server
# Download a file directly
ketch https://example.com/file.zip
# Use a TOML config file
ketch server --config /path/to/config.tomlSupported platforms: macOS (x64, arm64), Linux (x64, arm64), Windows (x64). See the CLI documentation for all commands, flags, and config file reference.
The browser extension hands downloads from Chrome, Edge, Brave, Opera, Firefox and other browsers to Ketch. It captures downloads you start, adds Download with Ketch to the context menu, and takes over magnet links. It can send to the Ketch app on this computer (turn on Settings → Remote access → Server) and to any number of remote servers.
TaskStore so pause/resume works across restartsContributions are welcome! Please open an issue to discuss your idea before submitting a PR. See the code style rules and testing rules for development guidelines.
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
Built with Claude Code by Anthropic.
A full-featured Kotlin Multiplatform download manager — run locally, remotely, or embedded in your app. Supports Android, iOS, Desktop, and Web.
[!WARNING] 🚧 Work in Progress — This project is under active development. APIs may change. Contributions and feedback are welcome!
✅ -- Works on Android, iOS, Desktop, and Web✅ -- Accelerate downloads by splitting files into multiple parallel connections✅ -- Distribute HTTP segments across multiple network interfaces
on JVM/Desktop and Android, configurable locally or remotely through KetchApi
(setup and limitations)✅ -- Pause and pick up where you left off, even after restarting your app✅ -- Manage multiple downloads with priorities and concurrency limits✅ -- Control bandwidth usage per task or globally✅ -- Schedule downloads for a specific time, after a delay, or based on conditions✅ -- Automatically retry failed downloads with smart backoff✅ -- Run as a background service with REST API and real-time events✅ -- Manage a remote server from any client (mobile, desktop, web, or CLI)✅ -- Swap out HTTP engines, storage backends, and download sources✅ -- Download from FTP servers with segmented parallel transfers and resume🔜 -- Multi-source downloads with mirrors, checksums, and chunk verification🔜 -- Download from WebDAV servers with resume support🔜 -- Download and merge HTTP Live Streaming videos🔜 -- Extract and download media from websites (like yt-dlp)🔜 -- Detect downloadable resources from web pages✅ -- Send downloads, links and magnet links
from Chrome, Edge, Firefox and other browsers to Ketch on this computer or a remote server🚧 -- Find download links from natural language queries using an
LLM agent you configure in the app (OpenAI, Anthropic, Gemini, Ollama)🔜 -- Expose Ketch capabilities as tools for AI agents via Model Context ProtocolAdd the SDK to your Kotlin Multiplatform project:
// build.gradle.kts
dependencies {
implementation("com.linroid.ketch:core:<latest-version>")
implementation("com.linroid.ketch:ktor:<latest-version>")
}Start downloading:
To distribute HTTP segments across Wi-Fi, Ethernet, or Android cellular networks, see multiple network interfaces.
val ketch = Ketch(
httpEngine = KtorHttpEngine(),
config = DownloadConfig(
maxConnectionsPerDownload = 4,
maxConcurrentDownloads = 3,
)
)
val task = ketch.download(
DownloadRequest(
url = "https://example.com/large-file.zip",
directory = "/path/to/downloads",
)
)
// Observe progress
task.state.collect { state ->
when (state) {
is DownloadState.Downloading -> {
val p = state.progress
println("${(p.percent * 100).toInt()}% ${p.bytesPerSecond / 1024} KB/s")
}
is DownloadState.Completed -> println("Done: ${state.filePath}")
is DownloadState.Failed -> println("Error: ${state.error}")
else -> {}
}
}See Installation for version catalog setup, optional modules (SQLite persistence, Kermit logging, remote client), and the full API reference.
Download the latest apps from GitHub Releases:
| Platform | Format |
|---|---|
| Android | .apk |
| macOS (x64, arm64) | .dmg |
| Linux (x64, arm64) | .deb |
| Windows (x64, arm64) | .msi |
| iOS | Build from source via Xcode |
| Browser extension (Chromium, Firefox) |
.zip (how to install) |
Install the native CLI to run Ketch as a daemon on your server:
curl -fsSL https://raw.githubusercontent.com/linroid/Ketch/main/install.sh | bashThen start the daemon:
# Start the server with REST API + web UI on port 8642
ketch server
# Download a file directly
ketch https://example.com/file.zip
# Use a TOML config file
ketch server --config /path/to/config.tomlSupported platforms: macOS (x64, arm64), Linux (x64, arm64), Windows (x64). See the CLI documentation for all commands, flags, and config file reference.
The browser extension hands downloads from Chrome, Edge, Brave, Opera, Firefox and other browsers to Ketch. It captures downloads you start, adds Download with Ketch to the context menu, and takes over magnet links. It can send to the Ketch app on this computer (turn on Settings → Remote access → Server) and to any number of remote servers.
TaskStore so pause/resume works across restartsContributions are welcome! Please open an issue to discuss your idea before submitting a PR. See the code style rules and testing rules for development guidelines.
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
Built with Claude Code by Anthropic.