Changelog
| English | Português | Español |
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.8.0] - 2026-10-23
Added
- AI model downloads (
hf://,ollama://):kget hf://org/repo[@rev][/path]downloads a Hugging Face model, dataset (hf://datasets/…) or space (hf://spaces/…), andhuggingface.co/…/resolve|blob|tree/…URLs work too. Filter files with--include/--excludeglobs, pick a branch, tag or commit with--revision, and use--hf-cacheto write into the standard hub cache sotransformersreuses the files. LFS files are verified against their SHA-256. The token is read fromHF_TOKEN,HUGGING_FACE_HUB_TOKEN, thehf auth logintoken file, or the keychain (hf://token@huggingface.co).kget ollama://llama3.2:3bpulls a model into the Ollama models directory (OLLAMA_MODELS), soollama runfinds it, and verifies every blob digest. With-O <dir>it saves plain files instead. Both download-jfiles at a time with the turbo engine, and an interrupted download skips the files that are already complete. - Background daemon and queue:
kget daemon(--foreground,status,stop) runs a local download service with a persistent queue (jobs.db): unfinished jobs resume after a restart. Manage it withkget queue add|list|status|cancel|pause|resume|rm|watch, or send a single download withkget <url> --via-daemon. Clients talk newline-delimited JSON-RPC 2.0 over a Unix socket (loopback TCP with a token on Windows). Configure it in the newdaemonsection ofconfig.json. - MCP server for AI agents (
kget mcp): Claude Code and other MCP clients can download, check progress, pause, resume, cancel, search the history, verify checksums and read the config (9 tools). Register it withclaude mcp add kget -- kget mcp. Writes are confined to--root(default: the daemon download directory). It uses a running daemon when there is one (--no-daemon,--start-daemon). - Terminal UI (
kget tui): full-screen queue, detail and history views. Add URLs, pause/resume, cancel, retry, remove, open files and search or filter the history from the keyboard. It uses the daemon when one is running (--daemonstarts one,--localruns downloads in-process). - Browser extension (
browser-extension/): a Manifest V3 extension for Chrome, Chromium, Edge, Brave and Firefox. It adds a “Download with KGet” context menu, a popup with live progress, optional interception of browser downloads and opt-in cookies.kget native-host install|uninstall [--browser …] [--extension-id …]registers the native-messaging bridge to the daemon. - Smart rules, tags and duplicates: rules in
config.jsonsort downloads into folders ({category},{domain},{ext},{protocol},{date:%Y-%m}), add tags and set connections, speed limit, extraction or a required checksum. Rules can match on domain, regex, glob, extension, category, MIME type, size or protocol, and the first match wins. Optional built-in category folders are available. Manage rules with--rules list|test|add|remove|enable|disableand apply them with--organize/--no-organize.--rules suggestproposes rules from your history; with--ai, it asks Claude and sends only aggregated counts, after you confirm.--tagrecords tags in the history.--duplicates skip|ask|download|linkdecides what happens when a URL was already downloaded.--dedupereplaces identical content with a hard link. - Saved passwords in the system keychain: macOS Keychain, Windows Credential Manager or Secret Service on
Linux/BSD (the default-on
keychainfeature, pure Rust). FTP, SFTP (password and key passphrase), WebDAV and proxy passwords are looked up when the URL has a user but no password. KGet prompts on a terminal and offers to save the password.--save-credentialssaves it without asking. Manage passwords with--credentials list|status|add|delete(also a REPLcredentialscommand).KGET_KEYCHAIN=offdisables it. - History search:
--historyfilters by--status,--domain,--type,--protocol,--since/--until(7d,12h,today, dates),--searchand--tag. It sorts with--sort newest|oldest|largest|smallest|name|fastest, pages with--history-limit/--history-offsetand prints JSON with--json(JSON Lines with--jsonl). The REPLhistorycommand takes the same filters. Entries now record protocol, duration, average speed, checksum result and tags. - Torrent file selection and seeding:
--list-filesprints the numbered contents of a magnet link or.torrentfile.--select 1,3-5and--select-glob "*.mkv"download only part of it.--seed-ratio 1.5and--seed-time 2hkeep seeding afterwards (defaults:torrent.seed_ratio/torrent.seed_time_secs). Swarm stats (peers, seeders, speeds, ratio, trackers) arrive astorrent_statsevents and appear in the TUI, egui GUI and macOS app. Selection, file listing and seeding time need the native client (torrent-native); Transmission supports selection and the seed ratio. - HTTP/2, HTTP/3 and parallel mirrors:
--http-version auto|1.1|2|3(oroptimization.http_version) for turbo downloads.autonegotiates HTTP/2 through ALPN. HTTP/3 is experimental and needs a build with thehttp3feature andRUSTFLAGS="--cfg reqwest_unstable". Metalink downloads fetch chunks from every mirror at once and drop mirrors that fail. - JSONL events (still
"v":1):phase(verifyingwithalgorithm, orextracting),rule,duplicateandtorrent_stats.filesentries carryselectedwhen a selection is given. - Library:
jobs::JobManager(queue with bounded concurrency, pause/resume, per-subscriberJobEvents),runner::{DownloadJob, RunContext, Reporter, run_job},queue::{HistoryQuery, HistoryStore, HistorySort},credentials,hf,ollama,fetch,rules,dedupe,daemon::client::DaemonClient,http::HttpVersion,AdvancedDownloader::{set_mirrors, set_http_version}, builder.include(),.exclude(),.revision(),.hf_cache()and.parallel_files(), andconfig::set_config_dir_override.JsonEvent/JobEventalso implementDeserialize. - macOS app: reads the history through
kget --history --json, shows an “extracting” state and the checksum algorithm fromphaseevents, and shows a torrent swarm summary. - Interactive mode (
kget -i) now covers the CLI: every download flag (--checksum,--checksum-url,--extract,-c,--no-clobber,-H,--retries,--timeout,--at,-j, forced protocols) plus per-download-l/-pthat are not saved. New commands:batch,info,retry,open,reveal,checksum,verify,extract,doctor,cd/pwd,set(session defaults),history N|failed|completed|search|clear,config path|reset,version,help <topic>. Tab completion, history saved across sessions, several URLs per line, and Ctrl+C stops the running download (keeping the.part) instead of being ignored.
Changed
- New turbo engine: range requests now run as tokio tasks with async reqwest instead of a rayon pool of
blocking clients. An idle connection splits the range that would finish last (work stealing, down to 512 KiB),
and HTTP/2 multiplexes the ranges over a few connections. The
.kgetresume format is unchanged. - History is stored in SQLite (
history.db, WAL, multi-process safe) instead ofhistory.json, and it keeps the last 10,000 entries.--historygained a Size column. - One shared download path (
kget::runner) for the CLI, batch mode, the REPL, the egui GUI, the daemon and MCP. Saved credentials, phase events and history details (duration, speed) work the same in every frontend. --save-configstores the proxy password in the system keychain. It is still never written toconfig.json.- On a terminal, KGet asks before downloading a URL again if the earlier file is still there (choose with
--duplicates). Non-interactive runs download again, as before. - SIGTERM and SIGHUP stop CLI downloads cleanly like Ctrl+C: partial data is kept for resume.
tokiois now a core dependency. Theasyncfeature only gates the async builder helpers.- Default features are now
keychainandtui.
Fixed
- Resuming a simple download after the remote file changed could splice old and new bytes. KGet now saves the
validators in
<file>.kget, sendsIf-Rangeand restarts when the file changed. - A simple download resuming a turbo
.partnow trusts only the completed prefix. - Write errors (disk full, quota, file too large) were retried with a desynchronised offset. Downloads now fail
at once and keep the partial file for
-c. - A corrupt or inconsistent
.kgetstate (overlapping or out-of-order chunks) is rejected instead of being used. - When a server answers a chunk’s range request with
200or416, KGet now tries another mirror or restarts the download as a single stream instead of failing. - Resuming (
-c) against a server that ignoresRangeand resends the whole file crashed debug builds and broke the speed limit in release builds. sanitize_filenamecould leave trailing dots or spaces after truncating (. . a).- The checksum-file parser panicked on lines like
) (and accepted non-hex hashes. - A failed or cancelled download saved with
-O fileis recorded under that name, so it can be resumed.
Security
- Archive extraction now happens in a sibling staging directory and rejects all symbolic links before publishing files, preventing an extracted archive from redirecting a later download outside its allowed directory.
- FTP URLs reject CR/LF in decoded credentials and paths before they reach the FTP command layer.
ProxyConfignever serializes the proxy password and redacts it inDebugoutput. Passwords never appear inconfig.json, the history, logs or JSONL events.- Daemon: the Unix socket has mode
0600in a0700directory. TCP mode is loopback-only with a 256-bit token in an owner-only file. Requests are capped at 1 MiB, and headers and URLs are validated. Outputs stay inside the download directory (no.., symlink escapes or nested names) unlessdaemon.allow_outside_download_diris set. Secrets are redacted from responses anddaemon.log. - MCP: every write, and every file read by
verify_checksum, is confined to--root. - Native host: it checks the calling extension against
allowed_origins.json, forwards file names only, and stripsCookie/Authorization/Proxy-Authorizationunless cookies are opted in. It accepts only http(s), ftp(s) and magnet links, andopenrefuses executables. - Hugging Face tokens are never logged and are dropped on redirects to another host.
Developer
- Cargo workspace with
crates/kget-ffi: UniFFI 0.32 bindings (Swift, Kotlin) overJobManager(KgetEngine, event listener).scripts/gen-bindings.sh,scripts/build-xcframework.shandscripts/swift-smoke-test.shbuild and test them.default-members = ["."]keeps plaincargocommands on theKgetpackage. - New test suites:
job_manager_tests,history_tests,robustness_tests,fuzz_regressions,model_tests,model_env_tests,smart_rules_tests,daemon_tests,mcp_tests,native_host_tests,bench_turbo(ignored benchmark),kget-ffiengine tests and the extension’snode --testsuite. fuzz/: a cargo-fuzz crate with 12 targets overkget::fuzz_api. CI gained a fuzz smoke job and a macOS FFI job (bindings plus a Swift smoke test).- Test overrides:
KGET_HF_ENDPOINT,KGET_OLLAMA_REGISTRY,KGET_KEYCHAIN=mock,KGET_RUNTIME_DIR,KGET_DAEMON_TRANSPORT=tcp,KGET_NATIVE_HOST_DIR,KGET_ANTHROPIC_BASE_URL.
Upgrade notes
- History: the first run imports
history.jsonintohistory.dband keeps the old file ashistory.json.bak. An unreadable database is moved tohistory.db.corrupt. Olderkgetbinaries keep readinghistory.json, so they do not see new entries. The macOS app falls back tohistory.jsonwith an older binary. - Config: new optional fields, all with defaults, so existing files load unchanged:
rules_enabled(false),builtin_rules(true),organize_dir,rules,daemon.{download_dir, allow_outside_download_dir, max_concurrent},optimization.http_versionandtorrent.{seed_ratio, seed_time_secs}. - Library (possibly breaking):
http::ClientOptionshas a new public fieldhttp_version, so add..Default::default()to struct literals. Exhaustive matches need new arms:Protocol::{HuggingFace, Ollama},JsonEvent::{Phase, Rule, Duplicate, TorrentStats}andWorkerToGuiMessage::TorrentStats.FileEntryhas a newselectedfield.app::JobIdis now a re-export ofjobs::JobId(stillu64). - Feature flags:
keychainandtuiare on by default (--no-default-featuresbuilds without them).http3is experimental and needsRUSTFLAGS="--cfg reqwest_unstable".asyncnow only enablesdownload_async()/download_all_async(). - JSONL consumers: the protocol is still
"v":1. Ignore event types and fields you do not know.
[1.7.1] - 2026-10-18
Fixed
- Turbo mode could silently produce corrupted files: resuming an interrupted parallel download
(including Cancel → Retry in the macOS app and automatic retries in
kget::builder) treated the preallocated file as complete, and chunks cut short by the server were accepted as complete. Downloads now use<file>.part+ a<file>.kgetresume state validated against the server (size,ETag,Last-Modified), every chunk must be complete, and retries continue from the exact offset. Connections are no longer capped by the number of CPU cores. - CLI flags were permanently written to
config.json(--proxy,--proxy-pass,-l,--no-cache, torrent flags). They now apply only to the current run; use--save-configto persist them (proxy passwords are never saved). If you used-l/--proxybefore, runkget --save-configwithout them or deleteconfig.json. - HTTP proxies did not apply to HTTPS downloads; SOCKS5 proxies did not work; invalid proxies were silently ignored.
All HTTP clients now share one builder (
kget::http). - macOS app could not find yt-dlp installed via Homebrew when launched from the Dock/Finder.
- macOS app marked finished video downloads as failed and showed no progress for yt-dlp downloads.
- yt-dlp could hang when it wrote a lot of warnings (stderr pipe was never drained); its error message is now shown.
Audio-only downloads use
-x --audio-format m4a. --sha256was ignored in quiet/library mode and when the server did not support range requests. The ISO verification prompt only appears on a terminal.- Simple downloads no longer leave a truncated file with the final name; bodies shorter than
Content-Lengthare resumed withRange; HTTP 429/5xx honourRetry-After; a 404 page is never saved as the file. - Brotli responses were transparently decompressed, altering the saved file.
cargo test,examples/lib_usage.rsand 10 doctests did not compile.- Running the test suite modified the user’s real configuration (
KGET_CONFIG_DIRis now honoured). - History could be wiped or lose entries with concurrent downloads; credentials in URLs are no longer stored.
- An old or partial
config.jsonno longer prevents KGet from starting (missing fields use defaults, a corrupt file is backed up toconfig.json.bak);config.jsonis written atomically with0600permissions. - FTP/SFTP/WebDAV/Metalink/torrent URLs are detected from the scheme without flags; percent-encoded paths and
credentials are decoded; FTP works without
SIZE, has timeouts and resumes; SFTP has timeouts, usessftp.key_path, supports/~/paths and records new host keys inknown_hosts. - Metalink 3.x manifests are now parsed; SHA-512/MD5 hashes and
<size>are verified;~is expanded; a failed mirror no longer leaves partial data for the next one. - Batch mode: bounded concurrency (
-j), unique file names, and every flag/protocol is honoured. kget::builderno longer retries 404/403 (retry_on_statusis used), and average speed is computed correctly.- JSONL output is no longer mixed with plain-text lines and is throttled (~5 progress events per second).
- Native torrent client honours
--torrent-port,--no-dht, can be cancelled, and its ETA is correct. Without a native backend, a torrent opened in the system client is reported ashanded_off, not “completed”. - Transmission: no more 30-minute limit (stall detection instead), the web UI opens only with
KGET_TRANSMISSION_OPEN_WEB=1. - egui GUI: simultaneous downloads no longer share progress or cancellation.
- Interactive mode:
~is expanded, quoted paths with spaces work, a pasted URL starts a download. - Filenames with
..inside (e.g.v1..2.tar.gz) are accepted; server-provided names are sanitized instead of rejected;%20in URL file names is decoded. -H "Name:value"(without a space) works;--atuses the system time zone on every OS (including Windows) and DST.- The Windows CLI release binary has a normal console again.
- macOS: Share Extension no longer truncates URLs containing
&;webdav://is accepted; Apple Silicon Homebrewkgetis found; data races in the download manager fixed; output is parsed line by line; a finished URL can be downloaded again.
Added
-c/--continue,--no-clobber,--retries,--timeout,-j/--jobs,--batch -(stdin),--save-config,--doctor.--checksum <alg>:<hex>and--checksum-url <url>; checksum files that contain only the hash.KGET_YTDLP_PATH,ytdlp_pathinconfig.json, and a “yt-dlp path” field + Diagnostics panel in the macOS settings.- Pause/Resume in the macOS app (Ctrl+C semantics: the partial download is kept).
- Versioned JSONL event protocol (
"v":1:started,progress,status,files,file_progress,verified,saved,completed,error) for all protocols; the macOS app now uses it. .torrentfiles (local paths and URLs) with the native client; the macOS app opens.torrentfiles.- Library:
kget::protocol::detect,download_to_path,OverwritePolicy,DownloadOptions::{resume, overwrite, retries, timeout_secs, cancel, progress_callback},KgetError::Http,JsonEvent,Throttle,utils::{sanitize_filename, expand_tilde},torrent::download_torrent, per-job IDs inapp::DownloadCommand. - GitHub Actions CI (Linux, macOS, Windows) and a release workflow that builds all binaries, publishes to crates.io and updates the Homebrew tap.
Removed / Deprecated
- Unused cache/compression code paths in
Optimizer(deprecated no-ops);--no-cacheis hidden. - Unused dependencies (
ftp,console,futures,flate2,lz4,brotli,opener);tokiois only compiled forasync/torrent features.
[1.7.0] - 2026-05-24
Added
- Batch download (
--batch urls.txt): download multiple files in parallel from a plain-text file — one URL per line, lines starting with#are skipped as comments. All URLs run concurrently via OS threads.--outputis treated as the destination directory. Per-URL[OK]/[FAIL]status printed; summary at the end. - History tab in macOS app: new “History” sidebar item reads the persistent
history.jsonproduced by the Rust CLI. Shows all-time downloads with date, file size, and status badge. Hover a row to reveal a re-download button that re-queues the URL and switches to the “All Downloads” view. - Drag-and-drop URL into the macOS window: drag any HTTP/HTTPS/FTP/magnet link from Safari, Chrome, or any other app and drop it onto the KGet window. A translucent blue overlay appears while hovering; on drop the URL lands in the input bar ready to start.
- Clipboard monitor in macOS app: the app silently watches the clipboard every 1.5 s. When a new HTTP, HTTPS, FTP, SFTP, or magnet URL is detected, a dismissable banner slides in below the URL bar with a one-click “Download” button. The banner is suppressed if the URL is already in the current download list.
- Custom HTTP headers (
-H "Name: Value"): pass one or more-Hflags to inject arbitrary request headers into both simple and turbo (advanced) downloads. Multiple headers can be stacked. Works in single-URL, batch, and interactive modes. - Speed sparkline in macOS app: each active download row now shows a 44×16 pt miniature real-time speed graph that accumulates the last 30 speed readings. Built with SwiftUI
Path+ gradient fill via the newSparklineViewcomponent. - Auto-extract archives:
kget --extractautomatically runsunzip,tar, or7zon the downloaded file when the extension is.zip,.tar.gz,.tgz,.tar.bz2,.tar.xz, or.7z. Controllable via the new “Auto-extract archives” toggle in the macOS Settings → Downloads tab. - Download scheduling (
--at "HH:MM"): defer a CLI download to a specific local wall-clock time. The process sleeps until the target minute is reached, then starts the download. Works with single-URL, advanced, and batch modes. - yt-dlp integration (
--ytdlp, auto-detected): ifyt-dlp(oryoutube-dl) is installed, URLs from YouTube, Vimeo, Twitch, TikTok, Instagram, Bilibili, and 10+ other platforms are automatically routed through it. Quality preset selectable via--quality best|1080p|720p|480p|360p|audio. macOS app detects video URLs and adds a global default quality picker in Settings → Downloads. - WebDAV support (
webdav://,webdavs://): newWebDavDownloaderadapter insrc/webdav/mod.rsconvertswebdav://→http://andwebdavs://→https://, extracts embedded credentials (webdav://user:pass@host/path), and injects an HTTP BasicAuthorizationheader. Detected automatically from URL scheme; explicit--webdavflag also available. Compatible with Synology, Nextcloud, Nextcloud, Apache WebDAV, and any RFC 4918 server. - Share Extension (
Share > KGet): the macOS Share Extension (macos-app/ShareExtension/) is now complete and functional.ShareViewControllerencodes the shared URL askget://download?url=<encoded>and opens the main app viaNSWorkspace.KGetApp.swiftparses the new format and starts the download. The extension is compiled and embedded intoKGet.app/Contents/PlugIns/KGetShareExtension.appexbybuild-native-macos.sh. - Public library API overhaul (
src/builder.rs,src/error.rs,src/events.rs,src/checksum.rs):- Builder pattern —
kget::builder(url)andkget::batch([...])entry points replace positional args. Fluent methods:.output(),.connections(),.speed_limit(),.proxy(),.proxy_auth(),.sha256/sha512/sha1/md5/blake3(),.verify_from(),.header(),.retry(),.range(),.quiet(). - Typed errors —
KgetErrorenum (Network,Io,ChecksumMismatch,Protocol,Cancelled,NotFound,SidecarError,Other) withFromimpls forreqwest::Error,std::io::Error, andBox<dyn Error>. - Event channel —
.spawn()returns(JoinHandle, Receiver<DownloadEvent>)withProgress { percent, speed_bps, eta_secs },Status,Completed,Errorvariants. - Download metrics —
DownloadResultstruct returned by.download()withpath,bytes_downloaded,avg_speed_bps,duration,connections_used,checksums. - In-memory download —
.download_to_bytes() -> Vec<u8>and.download_to_reader() -> impl Read(no filesystem writes). - HTTP range —
.range(start, end)sendsRange: bytes=start-end; works with in-memory and on-disk paths. - Sidecar checksum verification —
.verify_from(url)downloads and parses GNU (<hash> <file>) and BSD (SHA256 (file) = hash) sidecar files, auto-selects algorithm by hash length. - Multi-algorithm checksums — SHA-256, SHA-512, SHA-1 (via
sha1crate), MD5 (viamd-5crate), BLAKE3 (viablake3crate).ChecksumAlgorithmenum +compute_checksum()insrc/checksum.rs. - Configurable retry —
RetryConfig { max_attempts, backoff: Backoff::Exponential { base_ms, max_ms }, retry_on_status }. Permanent errors (Cancelled,NotFound,ChecksumMismatch) never retry. - Batch with concurrency control —
BatchBuilder::concurrency(n)uses a Rayon thread pool; returnsVec<BatchResult>(one per URL). - Async API —
DownloadBuilder::download_async()andBatchBuilder::download_all_async()behind--features async. Both usetokio::task::spawn_blockingso they never block the executor.
- Builder pattern —
Fixed
AdvancedDownloader::new()panicked on HTTP client build failure — changed return type fromSelftoResult<Self, …>so the error propagates instead of crashing.- Parallel throttle was per-thread — with N connections and a 1 MB/s limit, actual throughput was N×1 MB/s. Replaced per-thread busy-wait with a global
Arc<Mutex<TokenBucket>>shared across all rayon workers; aggregate rate is now bounded correctly. file.set_len(total_size)happened before confirming range support — if the server returned 200 instead of 206, the file was preallocated and then overwritten by a full-stream download producing a corrupted result. Preallocation now only occurs whensupports_rangeis confirmed.- ISO integrity prompt read from stdin in library/automation context —
AdvancedDownloadernow has aResumePolicyfield (Ask/AlwaysResume/AlwaysRestart). Library callers setAlwaysResumeto avoid blocking.Ask(default) preserves the existing interactive behavior. - Wrong ISO MIME type —
"application/x-iso9001"(ISO 9001 quality standard) corrected to"application/x-iso9660-image". verify_file_sha256printed to stdout unconditionally — allprintln!calls removed; messages are now sent only via the optional callback.- Simple downloader retried on 404/403/410 — permanent 4xx errors now fail immediately; only transient 5xx responses and connection errors are retried.
validate_filenamewas insufficient — now also rejects: null bytes (\0), path traversal sequences (..), filenames longer than 255 bytes, and Windows reserved device names (CON, PRN, AUX, NUL, COM1–COM9, LPT1–LPT9) — case-insensitive, with or without extension.sftp/mod.rs:CheckResult::Failuresilently continued — the libssh2 internal error case now returns a hard error and aborts the connection instead of bypassing host-key verification.
Added (continued)
- Homebrew tap (
brew install kget):Formula/kget.rbadded to the repository. Install withbrew tap davimf721/kget && brew install kget. Optional features selectable at install time:--with-gui(egui graphical interface) and--with-torrent(native BitTorrent client).release.shautomatically patches the formula SHA256 after each tag push. - egui GUI — missing features parity with macOS app:
- Speed sparkline per active download (44×16pt, last 30 speed readings, gradient fill).
- Clipboard monitor — polls every 1.5 s; shows dismissable banner with one-click download when a new downloadable URL is detected.
- Drag-and-drop URL — detects
hovered_filesfor visual overlay; reads URL from dropped bytes (browser link drags) or from.url/.weblocshortcut files. - History tab in sidebar — loads
history.jsonfrom disk; shows all-time entries with date, size, status, error, re-download and Copy URL buttons. - WebDAV URL validation —
webdav://andwebdavs://now accepted byvalidate_input(). - Updated protocol chips in empty state — HTTP, FTP, WebDAV, Torrent, yt-dlp.
Changed
- macOS SwiftUI app — complete redesign:
NavigationSplitViewlayout with collapsible sidebar for filter navigation (All / Active / Completed / Failed with live count badges); clean URL input bar with inline Turbo toggle; simplified 3px thin progress bar with shimmer animation replacing the busy multi-segment bar; download rows with status dot, type badges (Turbo / ISO / Torrent), and compact action icons;CleanProgressBarcomponent used throughout;TypeBadgecomponent for download type labels; empty state with protocol chips; material-backed window background. - egui GUI (Linux/Windows) — complete redesign: Apple-inspired system-adaptive color palette (light:
#F2F2F7background, white cards / dark: pure black,#1C1C1Ecards); left sidebar (180px) with Library navigation and per-category count badges; light/dark toggle button in sidebar; URL input card with Apple-style↓icon, inline Turbo/Verify toggles; 3px thin progress bar with shimmer; download cards with status dot, type badges, clean action buttons; proper card shadows; status bar with live stats. - egui theme is now system-adaptive: reads OS dark/light preference at startup; manual override button in sidebar.
[1.6.3] - 2026-05-21
Added
- Metalink support (
.meta4/.metalink):kget --metalink file.meta4(or any URL/path ending in.meta4/.metalink) parses the RFC 5854 manifest, tries mirrors in priority order, and verifies SHA-256 after download. Works in both CLI (--metalink) and interactive mode (download --metalink). Auto-detected by file extension — no flag needed for local files. - Persistent download history: every CLI and interactive download is now recorded to
history.jsonin the OS config dir. View withkget --history; clear withkget --history-clear(or--history-clear completed). Interactive mode gainshistory,history clear, andhistory clear completedcommands.
Security
- SFTP: SSH host key verification against
~/.ssh/known_hosts— connections now check the server key and hard-error on mismatches (possible MITM), emitting assh-keygen -Rhint. Unknown hosts emit a warning but continue (analogous to OpenSSHStrictHostKeyChecking=accept-new).
Fixed
- macOS native app now shows the correct version after every build.
build-native-macos.shnow updates the sourceInfo.plistfromCargo.tomlbefore compiling, soBundle.mainalways reads the right version at runtime. Fallback strings inContentViewandSettingsViewchanged from hardcoded"1.6.3"to"unknown"so they never silently show a stale version. Optimizer::get_peer_limit()returned bytes/second as peer count. When a speed limit (e.g. 1 MB/s = 1048576) was set, the method returned that number as the torrent peer limit. Fixed to always return 50.- User-Agent was hardcoded as
KGet/1.0. Both the simple and advanced HTTP downloaders now sendKGet/1.6.3(viaenv!("CARGO_PKG_VERSION")), matching the actual release version.
Added
Content-Dispositionfilename support. When a server provides aContent-Disposition: attachment; filename=…header (plain or RFC 5987filename*=form), KGet uses that name for the saved file instead of the URL path segment. Useful for redirected URLs or APIs that serve files under generic paths.
[1.6.3] - 2026-05-10
Added
- Experimental JSONL CLI events:
--jsonlemits machine-readablestarted,progress,status,completed, anderrorevents for agents, scripts, and future frontends. - GUI filtering: macOS and the Rust GUI now support status filters for all, active, completed, and failed/cancelled downloads.
- More download actions: macOS and the Rust GUI now expose quick actions for Copy URL, Open File, Open Folder, and Copy SHA256 when a checksum is available.
- Expected SHA256 in the Rust GUI: the Linux/Windows GUI can pass an expected SHA256 hash into the download worker.
Changed
- macOS settings now affect real behavior: advanced mode by default, completion notifications, and speed limit settings are persisted and applied to new downloads.
- Version display cleanup: macOS app and extension metadata now use 1.6.3, and visible version labels read from bundle metadata instead of hardcoded strings.
- Speed limits now throttle HTTP downloads: simple and advanced HTTP downloads honor the configured byte-per-second limit.
Fixed
- Advanced download metadata fallback: when
HEADfails or omitsContent-Length, KGet now probes withRange: bytes=0-0before giving up. - Resume progress accuracy: advanced downloads now initialize progress from the existing partial file size instead of visually restarting from zero.
- JSONL mode no longer mixes advanced human progress lines into machine output.
[1.6.2] - 2026-04-28
Fixed
- SFTP downloads were completely non-functional. The previous implementation passed the full
sftp://…URL string directly toTcpStream::connectand used it as the remote file path, causing an immediate connection error on every SFTP call. The module is now fully rewritten:- URL is parsed to extract
host,port,username, andremote_pathcorrectly. - Authentication tries in priority order: password embedded in the URL → running SSH agent → default key files (
~/.ssh/id_ed25519,~/.ssh/id_rsa,~/.ssh/id_ecdsa). - File is streamed in 32 KB chunks with a real-time progress bar.
- Clear, actionable error messages at every failure point.
- URL is parsed to extract
- FTP anonymous login failed when the URL contained no username.
url.username()from theurlcrate returns an empty string""(notNone) when the URL has no user segment. Passing""toftp.login()caused anonymous FTP servers to reject the connection. The downloader now falls back to"anonymous"in that case.
Added
- Interactive mode is now fully implemented. Previously
kget --interactiveopened a REPL that only printed"Would download: …"without performing any actual download. The mode is now feature-complete:- Unicode block-font ASCII art banner on entry.
rustylineline editor with persistent command history.download [flags] <url>— dispatches to the correct downloader based on flags:- Default: simple HTTP/HTTPS with retry and progress bar.
-a/--advanced/--turbo:AdvancedDownloader(parallel byte-range, resumable).--ftp: FTP downloader with anonymous fallback.--sftp: SFTP downloader with multi-method SSH auth.--torrentor auto-detectedmagnet:?prefix: native torrent engine.-o <path>,-q(quiet),--sha256 <hash>flags supported.
config [show | set <key> <value>]: reads and persists settings (connections,speed-limit,compression,cache).clear,version,help/?commands;get,dlas aliases fordownload.- Errors are printed and the REPL continues — a failed download never crashes the session.
Changed
- Mutex lock error handling in
AdvancedDownloader: all.unwrap()calls onMutex::lock()replaced with.expect("…")and descriptive messages, making panics easier to diagnose if a lock is ever poisoned. Optimizerpublic API cleanup: removed#[allow(dead_code)]from the public methodscompress,get_cached_file, andcache_file— these are valid library API surface and the suppression was masking legitimate lint signal.
[1.6.1] - 2026-04-27
Added
- macOS app now validates magnet links before creating a download card.
- Completed downloads include Open File and Open Folder actions.
- macOS app context menu on download cards: Copy URL, Open Folder, Restart, and Remove.
- Keyboard shortcuts in the macOS app:
Cmd+V,Cmd+L,Esc, andDelete. - Expected SHA256 verification through CLI
--sha256 <hash>and libraryDownloadOptions::expected_sha256. - Public
verify_file_sha256helper for library users. - Native completion and failure notifications for the Rust GUI on Linux and Windows through
notify-rust.
Changed
- Duplicate URL or magnet submissions now focus the existing macOS download card instead of adding another card.
- Advanced downloads respect optimizer connection limits and reject invalid byte-range responses.
- Library documentation was refreshed in English, Portuguese, and Spanish for the current API.
Fixed
- Invalid magnet links are rejected before starting the torrent backend.
- SHA256 mismatch now fails the download instead of only printing the calculated hash.
[1.6.0] - 2026-03-02
Added
- Native macOS App (SwiftUI): Completely redesigned native macOS application with deep system integration.
- URL scheme handlers (
kget://,magnet:) - File associations (
.torrentfiles) - Menu bar integration with quick actions
- macOS Services menu support
- Native notifications
- Drag-and-drop DMG installer with visual guide (boxes, arrow, instruction text)
- URL scheme handlers (
- Improved Cross-Platform GUI: Major visual overhaul for the egui-based GUI (Linux/Windows).
- Download list with multiple concurrent downloads tracking
- TURBO badge for parallel downloads mode
- ISO badge for ISO files with automatic integrity verification
- Multi-segment progress bar showing parallel connections (C1, C2, C3, C4)
- Verification progress bar with purple theme and shield animation
- Connections indicator (⚡ 4x) for turbo mode
- Real-time speed and ETA display
- Empty state with protocol icons
- One-line URL input with integrated controls
- Compact layout with truncated filenames and URLs
- Proper button sizing and alignment
- Visual Improvements:
- Enhanced dark theme with better contrast
- Animated shimmer effects on progress bars
- Status-colored badges and icons
- Improved typography and spacing
- DMG installer background with dark theme, rounded boxes, chevron arrow, and instruction text
- Native Torrent Client (librqbit): Built-in BitTorrent support - no external apps needed!
- Magnet link downloads work directly in the GUI
- DHT peer discovery, parallel piece downloading
- Real-time progress with speed and ETA
- Expandable file list showing individual file progress (macOS app)
- Green TORRENT badge in download list
- Refactored GUI (Linux/Windows): Complete visual overhaul
- Clean, modern dark theme with consistent color palette
- Responsive layout that adapts to window size
- Smart truncation for long filenames and paths
- Inline folder selector with visual indicator
- Turbo mode and SHA256 verification toggles
- Shimmer animation on progress bars
- Retry button for failed downloads
- Status bar with active/completed counts
- Cross-Platform Build Script:
build-cross.shfor compiling Linux and Windows binaries from macOS - Automated Test Suite: 108+ tests covering torrents, CLI, config, and downloads
- New
tests/torrent_tests.rswith 42 torrent-specific tests run-tests.shscript for full test execution
- New
Changed
- GUI feature now includes torrent-native: Building with
--features guiautomatically enables native torrent support - Progress calculation: Fixed weighted progress for multi-file torrents
- Code quality: Refactored
gui.rsfrom 975 to 780 lines following Clean Code principles - Dependencies: Updated reqwest to 0.13.2 with hickory-dns
Fixed
- Torrent downloads opening external app instead of downloading in GUI
- Progress bar “spasming” during downloads - now only increases
- DHT persistence lock conflict with
disable_dht_persistence: true - Layout overflow issues with long URLs and filenames
Technical
- Uses
librqbit8.1.1 for native BitTorrent protocol - Session management with
Arc<Session>for proper cleanup - JSON output format for torrent file lists and progress
[1.5.4] - 2026-02-27
Added
- macOS App Bundle: Native
.appbundle for macOS users with easy drag-and-drop installation. - Easier version flag: Use
kget -vorkget --versionto display version (changed from-V). - Comprehensive test suite: Added 65+ tests covering unit tests, CLI integration tests, and mock server tests.
- Unit tests for
utils,config,download,optimizer,progress, and URL parsing. - CLI tests verifying all command-line flags and options.
- Mock server tests using
wiremockfor HTTP download simulation without real network requests.
- Unit tests for
- Testing infrastructure: Added
wiremock,assert_cmd,predicates, andtokio-testas dev-dependencies.
Changed
- Code cleanup: Resolved all 25 compiler warnings for a cleaner build output.
- Removed duplicate SFTP stub: Consolidated SFTP implementation by removing unused
ftp/sftp.rsfile that conflicted withsftp/mod.rs. - Public API improvements: Exported
get_filename_from_url_or_default,resolve_output_path, andprintfunctions from library root.
Fixed
- Removed unused imports across multiple modules (
BufWriter,Path,Read,Write,Url,Session,Sftp, etc.). - Fixed unnecessary
mutdeclarations indownload_whole(),download_chunks_parallel(), anddownload_worker(). - Prefixed intentionally unused function parameters with
_(output_dir,quiet,proxy,optimizerin torrent module). - Added
#[allow(dead_code)]annotations for fields and structs reserved for future use (TransmissionSettings,optimizerfield in downloaders).
[1.5.3] - 2025-12-23
Added
- Torrent backend selection: magnet links can now be handled by different backends.
- Default torrent behavior (no extra features): if the URL is a
magnet:?link, KGet opens it using the system’s default BitTorrent client (automatic detection via OS handler). - Optional Transmission RPC backend: build with
--features torrent-transmissionand setKGET_TORRENT_BACKEND=transmissionto download via Transmission RPC. - Transmission settings helper: centralized settings for host/port/paths and optional auth (env-compatible).
Changed
- GUI footer: app version is displayed in the bottom-right corner.
- GUI window sizing: improved default/min window sizing for a better first launch experience.
Fixed
- Build fixes and feature-gating improvements for optional components (torrent backends / GUI split).
[1.5.2] - 2025-12-19
Added
- ISO Smart Handling: Automatic detection of
.isofiles via URL and MIME type. - Corruption Prevention: ISO files now bypass decompression/optimization layers to ensure binary 1:1 integrity.
- Integrity Verification: Added optional SHA256 checksum calculation at the end of ISO downloads.
- Windows Dual Mode: The application now runs without a console window when launched via Explorer, but automatically attaches to the terminal when run via CLI.
Fixed
- Memory & Disk Optimization: Refactored
AdvancedDownloaderto use streaming writes withBufWriter, drastically reducing RAM usage and preventing 100% disk active time issues. - Verification Prompt: Fixed bug where integrity check was running automatically in advanced mode; it now correctly asks the user for confirmation.
- UI/UX: Cleaned up terminal output during parallel downloads for a smoother progress bar experience.
- GUI Icon: Fixed issue with loading the application window icon.
- Fixed Rust compiler error
E0382regardingMimetype ownership indownload.rs. - Improved parallel chunk writing safety for binary-heavy files.
[1.5.1] - 2025-12-18
Added
- Optional
guiCargo feature to make GUI dependencies opt-in; compile with--features guito enable GUI support. - Top-level convenience functions:
kget::download(...)andkget::advanced_download(...)for easier library usage. create_progress_bar_factory(...)exported to let consumers createindicatifprogress bars.examples/lib_usage.rsexample demonstrating library usage.- Docker development instructions and
docker-composeintegration to simplify building, testing and contributing.
Changed
- Updated README and
LIB.mdwith library usage instructions and examples. CONTRIBUTING.mdand translations updated with Docker contributor workflow.- GUI code split:
gui_typesmodule added so CLI builds without GUI feature.
Fixed / Misc
- Minor documentation fixes and translation updates (PT-BR/ES).
[1.5.0] - 2025-05-26
Added
- New public Rust crate: KGet can now be used as a library in your own Rust projects, click here to see more.
- Improved GUI: larger fonts, better layout, and more intuitive controls.
- Clipboard integration for easy pasting of URLs.
- Download button and cancel button now always visible and functional in the GUI.
- Interactive mode: Run
kget --interactivefor a REPL-like experience with commands such asdownload <url> [output],help, andexit.
Changed
- Project renamed from “KelpsGet” to “KGet” for simplicity and consistency.
- Versioning scheme updated from 0.1.4 to 1.5.0 to allow for more frequent minor updates and clearer release tracking.
- Features list moved from README to CHANGELOG for easier maintenance and to keep the README concise.
Removed
- Redundant or overly detailed features section from the README (now see CHANGELOG for all features).
[0.1.4] - 2025-05-22
Added
- Graphical User Interface (GUI) for easier downloads.
- FTP download support.
- SFTP download support (password and key-based authentication).
- Torrent download support via magnet links (integrates with Transmission daemon).
- Detailed instructions for Transmission daemon setup in README.
Changed
- Refined output path determination to align comportamento with
wget. - Ensured
final_pathis always absolute to prevent “No such file or directory” errors in CWD. - Updated README in English, Portuguese, and Spanish to reflect all new features and setup instructions.
Fixed
- Resolved “No such file or directory” error when downloading without
-Oby ensuring absolute paths. - Corrected
validate_filenameto only check the base filename, not the full path. - Addressed potential issues with
map_errinmain.rsfor torrent and HTTP downloads.
[0.1.3] - 2025-03-11
Added
- Advanced download mode with parallel chunks and resume capability
- Automatic compression support (gzip, brotli, lz4)
- Intelligent caching system for faster repeated downloads
- Speed limiting and connection control
- Multi-language documentation support
Changed
- Improved error handling and user feedback
- Enhanced progress bar with more detailed information
- Optimized memory usage for large file downloads
- Updated proxy configuration system
Fixed
- Fixed proxy authentication issues
- Resolved cache directory creation problems
- Fixed compression level handling
- Corrected file path handling on Windows
Security
- Added secure proxy connection handling
- Improved URL validation
- Enhanced file name sanitization
- Added space checking before downloads
[0.1.2] - 2025-03-10
Added
- Proxy support (HTTP, HTTPS, SOCKS5)
- Proxy authentication
- Custom output file naming
- MIME type detection
Changed
- Improved download speed calculation
- Enhanced progress bar display
- Better error messages
- Updated documentation
Fixed
- Fixed connection timeout issues
- Resolved file permission problems
- Corrected URL parsing
- Fixed progress bar display on Windows
[0.1.1] - 2025-03-09
Added
- Silent mode for script integration
- Basic progress bar
- File size display
- Download speed tracking
Changed
- Improved error handling
- Enhanced command-line interface
- Better file handling
- Updated installation instructions
Fixed
- Fixed path handling issues
- Resolved permission problems
- Corrected progress display
- Fixed file overwrite behavior
[0.1.0] - 2025-03-08
Added
- Initial release
- Basic file download functionality
- Command-line interface
- Basic error handling
- Cross-platform support