Releases: bodaay/HuggingFaceModelDownloader
v3.0.4
What's Changed in v3.0.4
Bug-fix release tackling eight open issues reported against v3.0.3. Focused on download correctness, webui responsiveness, storage flexibility, and analyzer coverage for new quant formats. Every fix ships with regression tests; go test -race ./... is now fully green across every package.
Bug Fixes
-
Resumable downloads actually resume now (#70) —
downloadSingleand eachdownloadMultipartpart goroutine now open.partfiles withO_RDWR|O_CREATE(no truncate), stat the existing size, and issueRange: bytes=pos-endrequests from that offset. Interrupted downloads resume correctly on rerun, and within-process retries after a flaky-connection cut no longer lose bytes. Previously every Ctrl+C silently re-fetched from zero and single-file downloads literally had no resume code path at all. -
Unsloth Dynamic quant variants correctly labeled (#72) — the GGUF quant regex now supports
Q{2..8}_K_XL/_XXLsuffixes andIQ1_S/IQ1_M. Previously on repos likeunsloth/Qwen3-30B-A3B-GGUFthe regex silently collapsed sixUD-Q*_K_XLfiles intoQ2_K..Q8_Klabels that collided with the real plain-K quants, and missed the two IQ1 files entirely. All 25 GGUF files in that repo now label correctly. Added quality/description map entries forQ2_K_L,Q2..8_K_XL,IQ1_S/M,IQ2_M,IQ3_XXS. -
Multimodal GGUF repos auto-bundle the vision encoder (#76) —
analyzeGGUFnow partitions.gguffiles into LLM quants vsmmprojvision encoders. Avision_encoderSelectableItem is emitted as Recommended by default, so the recommended CLI command for a multimodal repo becomes e.g.-F q4_k_m,mmproj-f16forunsloth/gemma-3-4b-it-GGUF. Downloading a single quant now pulls in the matching projector automatically, matching LM Studio's behavior. -
Progress no longer oscillates on slow/flaky connections (#75) — the multipart progress ticker now stops cleanly before assembly via an explicit done channel + WaitGroup, and an explicit final full-size reading is emitted after all parts complete. Root cause: the ticker kept stating part files while assembly was deleting them, emitting
downloaded=0events that made the UI appear stuck at 2.4% ↔ 2.5% for hours on slow links. Combined with the #70 fix above, flaky downloads of multi-GB files now converge cleanly. -
Pause no longer claims the file is 100% done — fixed a regression in the #75 tail path where
downloadMultiparton cancellation would fall past itserrChdrain (cancelled goroutines return silently viasleepCtxwithout pushing errors) and emit a bogusdownloaded == totalevent followed by assembly over an incomplete part set — corrupting the final file and deleting the very partial bytes the next resume was supposed to continue from. Now bails out withctx.Err()immediately after the ticker shutdown. Regression test inTestDownloadMultipart_CancelMidStreamDoesNotClaim100. -
Web UI no longer floods the browser with updates (#62) — two-layer fix:
- Server-side 250ms per-job WebSocket broadcast coalescer in front of
BroadcastJob. Progress events arriving inside the window collapse to a single flush of the latest state; terminal status changes (completed/failed/cancelled/paused) bypass the gate so pause/cancel transitions still feel instant. - Frontend
renderJobsno longer doescontainer.innerHTML = jobs.map(...).join('')on every tick. Per-job DOM elements are cached and updated in place — progress bar width and stats text change, but the card node, the action buttons, and their event listeners stay stable. Hover states persist and Pause/Cancel buttons are clickable during an active download.
- Server-side 250ms per-job WebSocket broadcast coalescer in front of
-
Dismissed jobs stay dismissed across refresh (#68) — new
POST /api/jobs/{id}/dismissendpoint permanently removes a terminal-state job from the manager. FrontenddismissJobnow calls the server before removing from local state, so page reloads and WebSocket reconnects don't repopulate it. Attempts to dismiss queued or running jobs return 409. The primary per-file-deletion ask in the same issue is tracked separately. -
JobManagerreturns snapshots — data race fixed —CreateJob,GetJob,ListJobs, and the internal WebSocket broadcast path all now return/forward clonedJobsnapshots via a newcloneJobLockedhelper. Previously the HTTP JSON encoder and the WS broadcaster would readJobfields whilerunJobwas mutating them on a separate goroutine.go test -race ./...is now fully green across every package for the first time.
Features
-
--local-dir <path>CLI flag (#71, #73) — new flag mirroringhuggingface-cli download --local-dir. Downloads real files into the chosen directory instead of the HF cache's blobs+symlinks layout. Right choice for feeding weights to llama.cpp / ollama, Windows users without Developer Mode, and NFS/SMB/USB transfers. Equivalent to the existing--legacy -o <path>form — both spellings are permanent and interchangeable, and--legacyis no longer marked for removal. -
Installer defaults to
~/.local/bin— no more sudo prompt (#69) — the one-linerbash <(curl -sSL https://g.bodaay.io/hfd) installnow picks a user-local install path in this order:~/.local/binif already inPATH~/binif already inPATH/usr/local/binif writable- Fallback to
~/.local/binwith a printedexport PATH=line
Explicit targets likeinstall /usr/local/binstill work and still usesudowhere needed. Root users still get/usr/local/binby default.
Documentation
- README now has a prominent Storage Modes section documenting both HF-cache-default and flat-file
--local-dirmodes as first-class, permanent options with when-to-use-which guidance. docs/CLI.mdanddocs/V3_FEATURES.mdupdated to reflect the un-deprecated--legacy/--outputflags and the new--local-dirspelling.
Test Infrastructure
TestAPI_Healthno longer pins to a stale hardcoded version string.TestJobManager_CreateJobno longer races itsTempDircleanup against in-flightrunJobgoroutines — newJobManager.WaitAll(timeout)lets the test block on actual goroutine exit before cleanup runs.
Full Changelog: v3.0.3...v3.0.4
v3.0.3
What's Changed in v3.0.3
Features
- add GitHub Actions for releases and Docker, update to v3.0.0 (
b1cf225) - add revision picker for multi-branch repos and improve web UI (
183603c) - add modern web UI with analyze, cache browser, and authentication (Phase 3.9) (
2bdad97) - add detailed Transformers model analysis (Phase 3.3) (
1170f50) - add smart downloader analyzer for HuggingFace repositories (
9c2b5c6) - add list, info, and mirror commands (
0253046) - implement HuggingFace cache structure and manifest support (
e2bd0c8)
Bug Fixes
- load cache-dir from config file for all commands (
5d7960f) - gracefully skip symlinks on Windows (downloads still work) (
179e80b) - use correct HuggingFace repo name in examples (TheBloke/Mistral-7B-Instruct-v0.2-GGUF) (
5a8ac93) - use 'install' command instead of -i flag to avoid conflict with CLI's -i (interactive) (
0d0b5c9) - don't save binary to current directory unless -i flag is used (
154f542) - update Dockerfile to Go 1.24 for go.mod compatibility (
673445d) - align release workflow with installer script, reorder Quick Start (
29db31b) - WebSocket message handling for Jobs page (
c16f3c0) - use HuggingFace cache structure for web downloads (v3 mode) (
fb4bcb3) - minor improvements to cache structure and rebuild (
d71b6ee)
Documentation
- update installer commands (-i → install, -w → serve) (
959f368) - add GitHub Actions status badges, update Go version to 1.24 (
91ee5a2) - add v3.0.0 release notes (
bcc6648) - add web UI auth example to Quick Start (
63ccc14) - remove unverifiable speed claims from README (
0bf2bd7) - overhaul README for v3 with screenshots and feature highlights (
d821b1d)
Other Changes
- removed duplicate mirror sync (
55370ee)
Full Changelog: v2.3.4-final...v3.0.3
v3.0.1 - Bug Fixes
Bug Fixes
- Windows Support: Gracefully skip symlinks on Windows (downloads still work, friendly view skipped)
- Installer Script: Changed
-itoinstallcommand to avoid conflict with CLI's-i(interactive mode) - Example Repos: Fixed incorrect model names in documentation (
TheBloke/Mistral-7B-GGUF→TheBloke/Mistral-7B-Instruct-v0.2-GGUF) - Dockerfile: Updated to Go 1.24 for compatibility with go.mod
Documentation
- Added Windows note about symlink limitations
- Updated README with correct
installandservecommands - Added GitHub Actions status badges
Full Changelog: v3.0.0...v3.0.1
v3.0.0 - The HuggingFace-Native Release
Release Notes - v3.0.0
Release Date: January 2026
The HuggingFace-Native Release
Highlights
Version 3.0.0 is a major release that brings full HuggingFace CLI compatibility. Your downloads are now stored in the standard HuggingFace cache structure, making them instantly accessible to Transformers, Diffusers, and any other HuggingFace-based tools.
New Features
HuggingFace Cache Structure (Default)
Downloads now go directly to ~/.cache/huggingface/hub/ - the same location used by huggingface_hub, Transformers, and other HuggingFace tools.
# Download a model - it's immediately available to Transformers
hfdownloader download microsoft/DialoGPT-medium
# Use it directly in Python - no copying needed!
from transformers import AutoModel
model = AutoModel.from_pretrained("microsoft/DialoGPT-medium")Dual-Layer Storage
Get the best of both worlds:
- HuggingFace cache: Content-addressable blobs for deduplication
- Human-readable symlinks: Easy file browsing at
~/.cache/huggingface/hub/models--{owner}--{repo}/snapshots/{revision}/
Multi-Revision Support
Download specific branches, tags, or commits:
# Download a specific branch
hfdownloader download TheBloke/Mistral-7B-GGUF --revision main
# Download a specific tag
hfdownloader download owner/repo --revision v1.0.0Model Analysis
Understand models before downloading with the new analyze command:
hfdownloader analyze microsoft/DialoGPT-mediumShows:
- Model architecture and framework
- File types and sizes
- Quantization formats available
- Recommended filters for your use case
Enhanced Web UI
- Revision picker - Select branches/tags from a dropdown
- Model analysis - Analyze before downloading
- Cache browser - Explore your local HuggingFace cache
- Authentication - Secure your web server with
--auth-userand--auth-pass
Web Authentication
Secure your web server when exposing to networks:
hfdownloader serve --auth-user admin --auth-pass secretLegacy Mode
Still need the old flat directory structure? Use --legacy:
hfdownloader download TheBloke/Mistral-7B-GGUF --legacy -o ./modelsDocker
Docker images are now automatically published to GitHub Container Registry:
# Pull the image
docker pull ghcr.io/bodaay/huggingfacemodeldownloader:3.0.0
# Run with HuggingFace cache mount
docker run --rm -p 8080:8080 \
-v ~/.cache/huggingface:/home/hfdownloader/.cache/huggingface \
ghcr.io/bodaay/huggingfacemodeldownloader:3.0.0 serveQuick Start
# Analyze a model (no download)
bash <(curl -sSL https://g.bodaay.io/hfd) analyze TheBloke/Mistral-7B-GGUF
# Download Q4_K_M quantization only
bash <(curl -sSL https://g.bodaay.io/hfd) download TheBloke/Mistral-7B-GGUF:q4_k_m
# Start web UI with authentication
bash <(curl -sSL https://g.bodaay.io/hfd) serve --auth-user admin --auth-pass secret
# Install permanently
bash <(curl -sSL https://g.bodaay.io/hfd) -iMigration from V2
V3 uses a different storage structure by default. Your V2 downloads remain intact.
Option 1: Keep using legacy mode for existing workflows
hfdownloader download owner/repo --legacy -o ./modelsOption 2: Re-download to HuggingFace cache (recommended)
# New downloads go to ~/.cache/huggingface/hub/ by default
hfdownloader download owner/repoBreaking Changes
- Default storage location changed: Downloads now go to
~/.cache/huggingface/hub/instead of./Models/ - Directory structure changed: Uses HuggingFace blob/symlink structure instead of flat files
-oflag behavior changed: In V3 mode, setsHF_HOME; in legacy mode, sets direct output path
Full Changelog
New Features
- HuggingFace cache structure as default storage
analyzecommand for model inspection--revisionflag for multi-branch downloads- Web UI revision picker
- Web UI cache browser
- Web UI authentication (
--auth-user,--auth-pass) - GitHub Actions for automated releases
- GitHub Container Registry for Docker images
Improvements
- Dual-layer storage (blobs + symlinks)
- Better progress display
- Improved error messages
Legacy Support
--legacyflag for V2-style flat directory structure- Existing V2 workflows continue to work
Full Changelog: v2.3.3...v3.0.0
Release 2.3.4
Updated Build script and binaries to avoid false positive virues detection for windows builds
Release 2.3.3
🐛 Bug Fixes
Fixed: TUI/Web UI showing incorrect total file size
- Issue: Total download size would start at 8GB, then jump to 35GB, then 214GB during download
- Cause:
plan_itemevents were emitted incrementally during download loop, not upfront - Fix: All
plan_itemevents are now emitted immediately after scanning, before downloads start
Fixed: Settings not taking effect in Web UI
- Issue: Changing settings (connections, max-active, retries, etc.) had no effect on downloads
- Cause: Settings were hardcoded in multiple places;
servecommand was missing flags - Fix:
- Added
MultipartThreshold,Verify,Retriesfields to server Config - Added
--multipart-threshold,--verify,--retriesflags toservecommand - Web UI now fetches settings from server on page load (authoritative source)
- Added
Fixed: Plan API missing Excludes and Endpoint
- Issue: Preview/plan requests didn't respect exclude patterns or custom endpoint
- Fix: Added
Excludes,AppendFilterSubdirto job andEndpointto settings in plan handler
Release 2.3.1
Release Notes - v2.3.1
Release Date: December 31, 2025
🎉 Community Features
This release incorporates contributions and suggestions from the community:
✨ New Features
🚫 Exclude Patterns (--exclude, -E)
Exclude specific files from downloads. Thanks to @jeroenkroese (#41)!
# Exclude markdown and ONNX files
hfdownloader download TheBloke/Mistral-7B-GGUF -E .md,onnx
# Exclude full precision models
hfdownloader download owner/repo -E fp16,fp32🌍 Custom Endpoint (--endpoint)
Use HuggingFace mirrors or enterprise endpoints. Thanks to @windtail (#38)!
# Use China mirror
hfdownloader download owner/repo --endpoint https://hf-mirror.com
# Use enterprise endpoint
hfdownloader serve --endpoint https://your-enterprise.com/hf🐳 Docker Support
Run hfdownloader in containers. Thanks to @cdeving (#50)!
# Build Docker image
docker build -t hfdownloader .
# Run CLI in container
docker run --rm -v ./models:/data hfdownloader download TheBloke/Mistral-7B-GGUF -o /data
# Run web server in container
docker run --rm -p 8080:8080 -v ./models:/data hfdownloader serve --models-dir /data/Models📋 Changes
- Added
--exclude/-Eflag to CLI download command - Added
--endpointflag to both download and serve commands - Added
Excludesfield to Job struct - Added
Endpointfield to Settings struct - Created
Dockerfilewith multi-stage build - Updated API to support
excludesin download requests - Updated settings endpoint to include custom endpoint config
- Web UI: Added "Exclude" input field to Model and Dataset download forms
- Web UI: Updated version display to v2.3.1
🙏 Acknowledgments
Special thanks to the community members whose PRs inspired these features:
| Contributor | PR | Feature |
|---|---|---|
| @jeroenkroese | #41 | Exclude file patterns |
| @windtail | #38 | Custom HuggingFace endpoint |
| @cdeving | #50 | Docker support |
Also thanks to the community for bug reports and PRs that helped identify issues in v2.3.0:
- URL escaping fix (related to #60)
- TUI speed improvements (related to #59)
- API 400 fixes (related to #58)
Release Notes - v2.3.0
Release Date: December 31, 2025
🎉 Highlights
This is a major release introducing a brand new Web UI, complete project restructuring, and numerous bug fixes. The project has been reorganized into a clean, modular architecture following Go best practices.
✨ New Features
🌐 Web Interface
- Beautiful Terminal-Noir themed Web UI for managing downloads
- Real-time progress updates via WebSocket
- Separate pages for downloading Models and Datasets
- Per-file progress bars with live status updates
- Settings management (connections, retries, verification mode)
- Job deduplication - prevents duplicate downloads of the same repo
🚀 One-Liner Web Mode
Start the web UI instantly with:
bash <(curl -sSL https://g.bodaay.io/hfd) -wAutomatically opens your browser to http://localhost:8080
🔧 New CLI Commands
hfdownloader serve- Start the web serverhfdownloader version- Show version informationhfdownloader config- Manage configuration
📦 Reusable Go Package
The downloader is now available as an importable package:
import "github.com/bodaay/HuggingFaceModelDownloader/pkg/hfdownloader"🐛 Bug Fixes
Fixed: "error: tree API failed: 400 Bad Request"
- Repository paths with slashes (e.g.,
Qwen/Qwen3-0.6B) were being incorrectly URL-escaped - Now correctly handles repo IDs without double-escaping the slash
Fixed: TUI Speed/ETA Display Jumping Around
- Implemented Exponential Moving Average (EMA) for smooth speed calculations
- Added minimum time interval (50ms) before recalculating speed
- Both per-file and overall speeds are now stable and readable
Fixed: TUI Total File Size Fluctuating
- File totals no longer get overwritten with incorrect values during progress updates
- Now only updates total if a valid value is provided
Fixed: Downloads Appearing Stuck
- Removed blocking HEAD requests during repository scanning
- Large repos (90+ files) now start downloading within seconds instead of minutes
- Assumed LFS files support range requests (they always do on HuggingFace)
Fixed: Web UI Progress Not Updating
- Added
progressReaderwrapper for real-time progress during single-file downloads - Progress events now use correct
Downloadedfield (cumulative bytes) - UI throttled to 10fps to prevent DOM thrashing
🏗️ Architecture Changes
Project Structure
The codebase has been completely reorganized:
├── cmd/hfdownloader/ # CLI entry point
├── internal/
│ ├── cli/ # CLI commands (Cobra)
│ ├── server/ # Web server & API
│ ├── tui/ # Terminal UI
│ └── assets/ # Embedded web assets
├── pkg/hfdownloader/ # Reusable download library
└── scripts/ # Installation scripts
Security Improvements
- Output path is server-controlled - Cannot be changed via API or Web UI
- Separate directories for models (
./Models/) and datasets (./Datasets/) - Token is never logged or exposed in API responses
Testing
- Comprehensive unit tests for
JobManager, API handlers, and WebSocket - Integration tests for end-to-end download flows
- Test coverage for job deduplication and cancellation
📊 Performance Improvements
| Improvement | Before | After |
|---|---|---|
| Large repo scan (90+ files) | 5+ minutes | ~2 seconds |
| Progress update frequency | 1 second | 200ms |
| Speed display stability | Jumpy/erratic | Smooth (EMA) |
| Web UI responsiveness | Laggy | Throttled 10fps |
🔄 Breaking Changes
- Main package moved from
hfdownloader/topkg/hfdownloader/ - CLI now uses Cobra commands instead of flags-only
main.goreplaced withcmd/hfdownloader/main.go- Old
makefilereplaced withbuild.sh
📥 Installation
One-Liner (Recommended)
# Install to /usr/local/bin
bash <(curl -sSL https://g.bodaay.io/hfd) -i
# Start Web UI
bash <(curl -sSL https://g.bodaay.io/hfd) -w
# Download a model directly
bash <(curl -sSL https://g.bodaay.io/hfd) download TheBloke/Mistral-7B-GGUFFrom Source
git clone https://github.com/bodaay/HuggingFaceModelDownloader
cd HuggingFaceModelDownloader
go build -o hfdownloader ./cmd/hfdownloader📋 Full Changelog
New Files:
cmd/hfdownloader/main.go- New CLI entry pointinternal/server/*- Complete web server implementationinternal/assets/*- Embedded web UI (HTML/CSS/JS)pkg/hfdownloader/*- Modular download librarybuild.sh- Cross-platform build script
Modified:
scripts/gist_gethfd.sh- Added-wflag for web modeREADME.md- Updated documentation with web UI infogo.mod- Added new dependencies (Cobra, Gorilla WebSocket)
Removed:
hfdownloader/- Moved topkg/hfdownloader/main.go- Replaced bycmd/hfdownloader/main.gomakefile- Replaced bybuild.sh
Release 2.3.0
Release Notes - v2.3.0
Release Date: December 31, 2024
🎉 Highlights
This is a major release introducing a brand new Web UI, complete project restructuring, and numerous bug fixes. The project has been reorganized into a clean, modular architecture following Go best practices.
✨ New Features
🌐 Web Interface
- Beautiful Terminal-Noir themed Web UI for managing downloads
- Real-time progress updates via WebSocket
- Separate pages for downloading Models and Datasets
- Per-file progress bars with live status updates
- Settings management (connections, retries, verification mode)
- Job deduplication - prevents duplicate downloads of the same repo
🚀 One-Liner Web Mode
Start the web UI instantly with:
bash <(curl -sSL https://g.bodaay.io/hfd) -wAutomatically opens your browser to http://localhost:8080
🔧 New CLI Commands
hfdownloader serve- Start the web serverhfdownloader version- Show version informationhfdownloader config- Manage configuration
📦 Reusable Go Package
The downloader is now available as an importable package:
import "github.com/bodaay/HuggingFaceModelDownloader/pkg/hfdownloader"🐛 Bug Fixes
Fixed: "error: tree API failed: 400 Bad Request"
- Repository paths with slashes (e.g.,
Qwen/Qwen3-0.6B) were being incorrectly URL-escaped - Now correctly handles repo IDs without double-escaping the slash
Fixed: TUI Speed/ETA Display Jumping Around
- Implemented Exponential Moving Average (EMA) for smooth speed calculations
- Added minimum time interval (50ms) before recalculating speed
- Both per-file and overall speeds are now stable and readable
Fixed: TUI Total File Size Fluctuating
- File totals no longer get overwritten with incorrect values during progress updates
- Now only updates total if a valid value is provided
Fixed: Downloads Appearing Stuck
- Removed blocking HEAD requests during repository scanning
- Large repos (90+ files) now start downloading within seconds instead of minutes
- Assumed LFS files support range requests (they always do on HuggingFace)
Fixed: Web UI Progress Not Updating
- Added
progressReaderwrapper for real-time progress during single-file downloads - Progress events now use correct
Downloadedfield (cumulative bytes) - UI throttled to 10fps to prevent DOM thrashing
🏗️ Architecture Changes
Project Structure
The codebase has been completely reorganized:
├── cmd/hfdownloader/ # CLI entry point
├── internal/
│ ├── cli/ # CLI commands (Cobra)
│ ├── server/ # Web server & API
│ ├── tui/ # Terminal UI
│ └── assets/ # Embedded web assets
├── pkg/hfdownloader/ # Reusable download library
└── scripts/ # Installation scripts
Security Improvements
- Output path is server-controlled - Cannot be changed via API or Web UI
- Separate directories for models (
./Models/) and datasets (./Datasets/) - Token is never logged or exposed in API responses
Testing
- Comprehensive unit tests for
JobManager, API handlers, and WebSocket - Integration tests for end-to-end download flows
- Test coverage for job deduplication and cancellation
📊 Performance Improvements
| Improvement | Before | After |
|---|---|---|
| Large repo scan (90+ files) | 5+ minutes | ~2 seconds |
| Progress update frequency | 1 second | 200ms |
| Speed display stability | Jumpy/erratic | Smooth (EMA) |
| Web UI responsiveness | Laggy | Throttled 10fps |
🔄 Breaking Changes
- Main package moved from
hfdownloader/topkg/hfdownloader/ - CLI now uses Cobra commands instead of flags-only
main.goreplaced withcmd/hfdownloader/main.go- Old
makefilereplaced withbuild.sh
📥 Installation
One-Liner (Recommended)
# Install to /usr/local/bin
bash <(curl -sSL https://g.bodaay.io/hfd) -i
# Start Web UI
bash <(curl -sSL https://g.bodaay.io/hfd) -w
# Download a model directly
bash <(curl -sSL https://g.bodaay.io/hfd) download TheBloke/Mistral-7B-GGUFFrom Source
git clone https://github.com/bodaay/HuggingFaceModelDownloader
cd HuggingFaceModelDownloader
go build -o hfdownloader ./cmd/hfdownloader🙏 Acknowledgments
Thanks to the community for bug reports and PRs that helped identify issues:
- URL escaping fix (related to #60)
- TUI speed improvements (related to #59)
- API 400 fixes (related to #58)
📋 Full Changelog
New Files:
cmd/hfdownloader/main.go- New CLI entry pointinternal/server/*- Complete web server implementationinternal/assets/*- Embedded web UI (HTML/CSS/JS)pkg/hfdownloader/*- Modular download librarybuild.sh- Cross-platform build script
Modified:
scripts/gist_gethfd.sh- Added-wflag for web modeREADME.md- Updated documentation with web UI infogo.mod- Added new dependencies (Cobra, Gorilla WebSocket)
Removed:
hfdownloader/- Moved topkg/hfdownloader/main.go- Replaced bycmd/hfdownloader/main.gomakefile- Replaced bybuild.sh
Release 2.0.0
Cleaner mental model (one download command, sensible defaults).
Filesystem‑only resume—reliable and transparent; no “state” files to corrupt.
JSON events and a TUI that looks great everywhere.
Strong cancellation story for real‑world, long‑running downloads.
Release 1.4.2
Forced cgo_enabled=0