
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✅ -- 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🚧 -- Peer-to-peer file sharing with .torrent files and magnet links🔜 -- 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🔜 -- Intercept and manage downloads directly from your browser🚧 -- Find download links from natural language queries using an LLM agent🔜 -- 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:
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 (arm64) | .dmg |
| Linux (x64, arm64) | .deb |
| Windows (x64, arm64) | .msi |
| iOS | Build from source via Xcode |
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 (arm64), Linux (x64, arm64), Windows (x64). See the CLI documentation for all commands, flags, and config file reference.
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 for formatting guidelines.
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✅ -- 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🚧 -- Peer-to-peer file sharing with .torrent files and magnet links🔜 -- 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🔜 -- Intercept and manage downloads directly from your browser🚧 -- Find download links from natural language queries using an LLM agent🔜 -- 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:
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 (arm64) | .dmg |
| Linux (x64, arm64) | .deb |
| Windows (x64, arm64) | .msi |
| iOS | Build from source via Xcode |
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 (arm64), Linux (x64, arm64), Windows (x64). See the CLI documentation for all commands, flags, and config file reference.
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 for formatting guidelines.
Apache-2.0
Built with Claude Code by Anthropic.