Changelog
Every release is built and published from main; the version is picked from
the Conventional Commits since the
previous release. Downloads for each version are on its
GitHub release.
v1.3.0
Section titled “v1.3.0”Features
Section titled “Features”- Enhance app behavior to allow background watching and improve menu functionality (
6dad145) - home: Implement dynamic repeat interval for watch functionality with validation and update tests (
ac0a12e) - Enhance native app behavior with single instance support, custom macOS menu, and keyboard shortcuts; add tests for view switching and key handling (
dfd8d6d) - home: Enhance UI and functionality for media download, add tests (
bd0695d) - youtube: Optional yt-dlp backend with automatic fallback (
d0eaaca) - youtube: Resume interrupted streams across retries and runs (
92906b6) - downloader: Cap concurrent downloads per host and share 429/503 cooldowns (
78d21cf)
- gui: Pin @tsconfig/svelte to 5.0.8 to satisfy pnpm minimumReleaseAge (
70ea22a) - Update Node.js version in .nvmrc and package.json, upgrade jsdom and add @types/node (
01be922) - tsconfig: Remove baseUrl from tsconfig.json and update moduleResolution to bundler in tsconfig.node.json (
78f0076) - downloader: Fail when the first body read returns data and an error (
a867757)
Other changes (9)
- release: Manual release with automatic semver bump (
dea2369) - Migrate from Wails v2 to v3 and update dependencies (
f0a7f6c) - Update frontend package management from npm to pnpm (
40ebe63) - release: Sign and notarize the GUI when credentials are configured (
f919d98) - Cover app, downloadercore and notify logic (
5fb3c3f) - Opt-in live site checks with a nightly workflow (
ab8d7c1) - gui: Pin supported Node versions for the frontend (
bf5b38f) - Stop tracking personal tool configs and packaged extension (
dccbe03) - Document Turbo and Pixeldrain support in README (
954620e)
Full changelog: v1.2.0…v1.3.0
v1.2.0
Section titled “v1.2.0”Features
Section titled “Features”- Update Go version to 1.26.11 and add TypeScript version ignore for dependabot (
be7382e) - Update security scan tool version and improve file path validation (
cd9cee6) - Enhance downloader with archive support and metadata handling (
98c1d73) - Add scraper tab export binary file (
8d8ee88) - Enhance JSON output with total bytes and improve error handling (
29b7ef8) - gui: Add Wails desktop GUI sharing the session core with the TUI (
00c0b49) - session: Add frontend-neutral download-run state machine (
e6a4eb9) - config: Add Save (comment-preserving, atomic, 0600) and DefaultPath (
4523c78) - dashboard: Add triage, progress, filters, and summary (
4d8a9a3) - opencode: Update model references to glm-5.3-flash (
420acf5) - cmd: –cookies-from-browser imports Firefox cookies for supported sites (
05d4a7a) - dashboard: ETA, R retry-all-failed, / search jump (
63cdc1a) - cmd: Mixed-site batches run as sequential same-type groups (
7d7bcd6) - cmd: –watch re-runs the list on an interval (
6f78d5c) - cmd: –log-file run trace and distinct partial-failure exit code (
9dc4fab) - cmd: Scrape_delay paces album scrapes (–scrape-delay) (
4621e38) - parsers: Retry transient album fetches on pixeldrain and cyberdrop (
fcb6fd8) - turbo: Retry transient page fetches, stop on permanent statuses (
30380d5) - dashboard: In-TUI error panel (e) with bounded scrape error log (
4ebe81f) - bunker: Name JS-rendered albums instead of a generic no-links error (
d505576) - cmd: –print-urls prints item URLs without downloading (
14846d9) - cmd: Cap items per album (max_album_items, default 10000) (
1a4cd44) - downloader: Refuse HTML/executables masquerading as media (
e7101a5) - media: Split-archive volumes, more types, –allow-ext extras (
d1d87b0) - config: Checksums off by default, opt in with –checksums (
c992a96) - cmd: Pair retry items with their album folder (
87323f0) - cmd: Parse item/album pairs and map retries to album folders (
3e78bf0) - cmd: Write retry lists and failure summaries after every run (
cde56ea) - dashboard: Expose failed items for retry reporting (
75d530b) - cmd: Failure classification and retry-list writer (
82ec6cf) - bunker: Record the file page URL on parsed items (
4c81eaa) - model: Typed retryable HTTP status errors (
4f7a75c) - cmd: Apply the media filter in single, batch, and dry-run paths (
50f328f) - config: Add default-on –media-only flag and media_only config key (
e232eb3) - model: Add media/archive item classification and filter (
0c8b8ae) - extension: Add MV3 manifest and popup wiring (
91340ca) - extension: Add tab filtering and grouping logic (
e8afaae)
- linux: Allow receives on the test bus and bound every D-Bus exchange (
2f1144a) - security: Open and reveal files through native OS APIs instead of open/explorer/xdg-open (
012b5dd) - security: Send notifications through native APIs instead of composed commands (
41f7548) - security: Run ffmpeg in its work dir with fixed argument lists (
55f79e4) - security: Read Firefox cookies with a SQLite driver instead of shelling out to sqlite3 (
a052000) - security: Crypto/rand for jitter and CDN choice; saturating statfs math instead of G404/G115 suppressions (
15e2bc5) - security: Open files through os.Root instead of suppressing G304 (
1726419) - security: Always send imported cookies as Secure instead of suppressing G124 (
c414687) - ci: Bump Go to 1.26.9 for net/http vulns; annotate client-side cookie G124 findings (
8d32794) - opencode: Use the v2 config format (plugins/permissions/agents rule arrays) (
3e6c7d9) - youtube: Serialize kkdai client calls; its player cache is not goroutine-safe (
476ccc6) - netutil: Block NAT64 and 6to4 addresses that can wrap private IPv4 (
2d71683) - youtube: Mux scratch files live beside the output; ffmpeg runs quiet and without stdin (
fd6d0f1) - cmd: JSON mode writes the retry list in the output root like plain and TUI (
1c28e40) - cmd: Firefox cookie import reads a copy, skips expired cookies, finds Linux/Windows profiles (
6bd86ca) - goonbox: Retry album page fetches with backoff (
775fb4d) - filester: Lazy resolvers leave retries to the downloader instead of nesting them (
d155d96) - cmd,dashboard: The TUI exits non-zero when items or albums fail (
196f02a) - fileutil: Strip double quotes, DEL and C1 controls from filenames (
8ff17db) - cmd,youtube: Hold in-run warnings while the TUI owns the terminal (
c6b00e2) - cmd: –watch loads config once instead of reopening the log file every run (
d517cba) - security: Justify reviewed gosec findings so the CI scan passes (
9a21b3e) - netutil: Parse #HttpOnly_ cookie lines and honor host-only cookies (
08fee71) - cmd: Site subcommands scrape through –proxy; drop the dead per-site command files (
dfb8267) - downloader: Create the output directory and fail fast on local file errors (
476c9cb) - downloader,youtube: Rate limiting admits reads larger than the limiter burst (
5d9b523) - model: Include/exclude globs match the item title, not just the URL slug (
a12c89b) - cmd: Single-URL runs apply include/exclude/size filters and the album cap (
6dc913b) - dashboard: Linear refresh, stable scrolling, summary key gating, control-char stripping (
aa08cce) - dashboard: Preserve visible selection and settle on final results (
4a1eab5) - dashboard: Fit progress and transient sections to terminal (
a2b21a7) - dashboard: The item table fills the terminal height instead of capping at 15 rows (
13719f7) - downloader: Empty-body responses fail retryably; default concurrency 3 (
ac3f925) - Dry-run stays informational for empty scrapes; redact-proof empty-body scan; comment accuracy (
0e1268e) - netutil: Status errors carry redacted URLs only (
fab1cf3) - cmd,docs: Flag help and README match real flags; bare –audio-only means m4a (
062c861) - dashboard: Hide the ETA while queued items have unknown sizes (
a6bcd19) - cmd: A scrape that yields nothing exits non-zero instead of looking successful (
72eba08) - cmd: Release the signal watcher when a run ends; –watch no longer leaks handlers (
0ec0278) - disk: Disk-check stats the nearest existing ancestor and never no-ops silently (
41b5240) - downloader: Refuse padded HTML/executables after the copy and never resume them (
76219e6) - cmd: Redact PageURL queries in retry lists (
ad89bae) - filester: Retry transient token-response failures instead of failing permanently (
c268ad6) - netutil: Keep Netscape session cookies (expiry 0) (
4718582) - cmd: Firefox cookie import matches exact hosts and honors IsRelative=0 (
2ebf675) - bunker: Pin download/API host to the bunkr mirror family (
7a7fabf) - goonbox: Pagination never shrinks; under-reported last_page cannot drop the tail (
5fb2a01) - cmd: A failed group never stops the rest of a mixed batch (
381aff5) - fileutil: Strip bidi control characters from filenames (
f6ddf32) - Known small debts (trailing-dot extensions, duplicate notice, masked fixture, allowlist dots, filester detail) (
6005484) - turbo: Parse the embedded file list on client-rendered album pages (
dcb12ad) - parsers: Goonbox referer, filester cdn.cr allowlist, replayable retry entries (
a52187a) - cmd: Redact signed fallback URLs in retry lists (
0fe76ee) - downloader: Honor Retry-After, redact transport errors, refresh URLs on transient failures (
c9a66b2) - netutil: Longer retry budget and Retry-After support (
e9760ef) - bunker: Retry transient album pages and name the failing URL (
5589c24) - cmd: Read –input-file and piped stdin without positional args (
4aa0e30) - cmd: Preserve partial scrape results through the media filter (review fix) (
a6d978e) - extension: Keep blob URLs alive until downloads complete (review fix) (
a0ca4b0) - netutil,cyberdrop: Pin strict-allowlist redirects and block IPv6 special ranges (review fix) (
2418237) - fileutil: Reserve suffix headroom so long filenames download (review fix) (
d65dd16) - cmd: Show the real output default and load config once (nit) (
2036b22) - model: Match filter globs against the URL-decoded filename (nit) (
0f9162a) - model: Make PartialError.Error safe on the zero value (nit) (
32fa085) - turbo: Validate resolved sign URL like every other parser (nit) (
dfc9fbd) - downloader: Emit StatusFailed when the final rename fails (nit) (
e6c6ee2) - dashboard: Stop idle download ticker and never park cursor on headers (#11, #12) (
f721463) - disk: Clamp negative free-block counts and assert nonexistent-path error (#11) (
50395a9) - netutil: Block CGNAT, TEST-NETs, and reserved IP ranges (#10) (
5d70c30) - fileutil: Drop dead symlink recheck, set O_CLOEXEC on unix (#9) (
57019f1) - fileutil: Clamp filenames and guard Windows reserved names (#8) (
d5e602f) - netutil: Add strict host allowlist and pin filester/cyberdrop to known hosts (#7) (
9425e9e) - filester: Retry transient page fetch errors on pages > 1 (#6) (
ce34938) - goonbox: Keep pages fetched before an inconsistent last-page shrink (#5) (
8d58b30) - cmd: Notify only on actual completion and add failure notification (#4) (
46ecc7e) - fileutil: Treat unparseable checksum sidecars as absent (#3) (
99c4c9f) - bunker: Bound signing response decode and strip href query from file ID (#2) (
a7845cb) - netutil: Allow local/private proxy hosts on the dial path (#1) (
2eec202) - Update JSON structure for plugins and permissions in opencode configuration (
455a7ba) - Update model references to use correct naming convention (
9c23927) - Remove redundant model definition from build agent configuration (
88cdef9) - Bump go directive to 1.26.6 to resolve 4 stdlib vulnerabilities (
2e96be3) - RunJSON refuses symlinked album directories like every other output mode (
8112e67) - Config files inherit defaults for omitted keys (disk_check no longer silently disabled) (
c82b6f5) - An explicitly specified missing config file is an error, not silent defaults (
9c0b6e5) - SSRF allowlist entries match by hostname so port-less entries work as intended (
2742c7b) - Downloadercore.Begin rejects duplicate in-flight keys instead of clobbering them (
7b658a7) - Single YouTube videos in batch mode use their video ID as the album slug (
0451843) - Validate –concurrent between 1 and 256 instead of trusting arbitrary values (
1af1da0) - Cap filester folder pagination at 1000 pages against hostile data-total (
8c112bb) - Classify turbo sign failures so permanent errors aren’t retried with backoff (
b558ddc) - Goonbox pagination errors surface in PartialError instead of silently truncating albums (
a83a8f2) - Filester single-file URLs resolve lazily so 403 re-resolution gets a fresh token (
67d6584) - User-initiated cancellations no longer counted as download failures in JSON/batch paths (
5181de7) - RunBatchJSON refuses symlinked album directories like every other output mode (
3f3a214) - Reject size values at the 2^63 float64 boundary instead of overflowing negative (
8aac320) - Apply include/exclude/size filters in dry-run so previews match real runs (
7df34ba) - Write resume metadata via temp+rename so planted symlinks can’t redirect the write (
3dd57e4) - Turbo parser uses netutil.GetDoc (32MiB cap, HTTP status check) (
a38739a) - Advance batch scrape chain after symlinked album dir refusal (deadlock) (
acb0d03) - Keep extension in audio-only temp path so ffmpeg can infer muxer (
40678a2) - Add debug agent configuration for issue resolution (
170ca39) - Update agent models to glm-5.3-flash for consistency (
62adbe8)
Performance
Section titled “Performance”- turbo: Parse album HTML from the fetched bytes without a second copy (
daa2b50) - youtube: Fetch video and audio streams in parallel before muxing (
9d71b60) - dashboard: Count album header stats in one pass; skip a redundant row refresh (
587e462) - dashboard: Index appended states incrementally (nit) (
477b8a5)
Other changes (51)
- Update dependencies and improve YouTube helper functions (
92210b2) - Harden workflows (no persisted credentials, no release caches, env instead of template expansion, gh CLI for releases, timeouts, concurrency, Dependabot cooldown and npm) (
bfdc5fe) - dependabot: Update the root and gui Go modules together (
807330e) - RunView: Reorder imports for better readability (
0cdf059) - Document the desktop GUI and its TUI parity (
bfe3f80) - gui: Lint, test and build the GUI; attach native GUI builds to releases (
8f15282) - gui: Keep the dist embed placeholder across frontend builds (
85e559c) - app: Share BuildAlbums; record saved paths in the session (
374995f) - dashboard: Drive the TUI from the shared session state machine (
66066e1) - app: Extract frontend-neutral use cases from cmd into internal/app and internal/cookies (
b6aaff8) - model: Move Downloader, Album and FailedItem out of the dashboard (
675e186) - parser,netutil: Split large test files and share test helpers (
5011817) - downloader: Split downloader.go and its tests by responsibility (
17051a6) - youtube: Split youtube.go and its tests by responsibility (
2c9aa03) - cmd: Split root.go, plain.go and their tests by responsibility (
784a01e) - dashboard: Split dashboard.go and its tests by responsibility (
e3d2ad4) - styles: Assert the theme’s actual colors instead of a non-nil check (
52a8113) - downloader: Exercise the production client policy (SSRF guard, redirects, UA, cookies) (
6c4ad7a) - youtube: Drop the withRetry wrapper and its sleeping tests; retry uses an injectable sleeper (25s -> 1s) (
9102772) - Drop test-only struct aliases and wrappers, dedupe dashboard/youtube setup, remove unused params (
214d07d) - Fileutil.EnsureDir replaces six album-folder checks; batch loops share scrapeNext (
745fb56) - parser: Shared retrying fetch helpers; PathSlug strips fragments and replaces per-parser ID extractors (
348d5a0) - parser: One options constructor per scraper; build only the needed site’s scraper (
620ed5c) - model: Drop PermanentError; resolvers return NonRetryableError directly (
e64d8ac) - cmd: Reuse bunker.MirrorDomains for auto-detect; check the extension’s domain list (
92b0dbc) - model: Remove test-only FilterMediaItems (
37e619d) - bunker: Remove the unused baseURL field (
8a9f4b3) - deps: Bump golang.org/x/net to v0.60.0 (GO-2026-6603/6610/6611/6612/6617) (
7e07ccd) - opencode: Use documented config keys, ask before shell commands, pin the plugin (
ea73ccd) - Ignore personal URL lists and retry lists (
64d0c56) - release: Checksums.txt also covers the published .tar.gz archives (
feffd76) - Run staticcheck and extension tests, pin govulncheck; fix staticcheck findings (
9b24c4d) - Pin actions to commit SHAs, scope release write access, update actions via dependabot (
a9c1829) - Summary screen keys (
84d3bb5) - Dashboard keys (
688d996) - dashboard: Cover filter, failure and progress edge cases (
ce1c0d0) - Mixed-site batches (
4d3ca3d) - Fuzz targets for filenames, checksum sidecars, turbo extraction (
5f66f3a) - Document retry lists and failure summaries (
8e71142) - Document default media-only filtering (
e3fa96c) - extension: Add install and usage instructions (
dfda9f3) - extension: Declare no data collection and require Firefox 142 (
7c6c023) - Remove outdated code review document (
b742677) - disk: Annotate statfs conversion for gosec (follow-up to #11) (
21cc556) - notify: Assert AppleScript/argv composition instead of firing notifications (#11) (
44edbd9) - netutil: Prove cookies are sent over http (review item verified false) (
9aeadda) - deps: Bump the go-deps group with 3 updates (#3) (
3baba02) - deps: Bump github.com/PuerkitoBio/goquery in the go-deps group (#2) (
cfcbd4f) - Add Dependabot config to auto-bump Go and module versions (
e7c7053) - Audit low-severity cleanups (off-by-one, limiter bytes, dead fields, event metadata, warning visibility) (
d97c2a2) - S (
3cc9b63)
Full changelog: v1.1.0…v1.2.0
v1.1.0
Section titled “v1.1.0”Features
Section titled “Features”- Register turbo.cr in site detection, registry, and subcommand (
67228b6) - Add turbo.cr scraper (HTML album page + /api/sign resolver) (
3b1a3dc) - Register pixeldrain in site detection, registry, and subcommand (
fbea08b) - Add pixeldrain scraper (list + single file, JSON API) (
f51ab57)
- Replace animated spinner with static ‘↓’ marker on downloading rows (
76281be) - Add bunkr.ac to bunker domain list (
7627b39) - Add bunkr.pk to bunker domain list (
996da23) - Test creates album folder in temp dir, not ~/Downloads (
bf2dc52) - Support bunker single-file URLs (/f/ID, /file/ID) (
08a28ab) - Handle pixeldrain direct /api/file/ID and /file/ID URL formats (
d4132d0) - Handle empty album case in batch scraping without creating directory (
5231467) - Update header row rendering to ensure styled text appears in the correct column (
bce438a) - Refactor dashboard to remove sendFunc and implement refresh tick logic (
c9d735c)
Other changes (8)
- Go fmt -w; fix gosec G104 in turbo.cr (unchecked fmt.Sscanf) (
3d44743) - Tone down TUI colors to subdued palette (
0e1f7bf) - Revert “fix: replace animated spinner with static ‘↓’ marker on downloading rows” (
7ddd533) - Clarify pixeldrain 6GB limit is a speed throttle, not a hard cap (
ef27988) - Add turbo.cr parser tests (album, single file, sign, empty, extractID) (
cdeeb0d) - Document pixeldrain 6GB limit bypass (proxy rotation, Range resume) (
996f9ee) - Add pixeldrain to supported sites, usage examples, and site table (
c19e38f) - Add pixeldrain parser tests (list, single file, edge cases) (
2827a25)
Full changelog: v1.0.0…v1.1.0
v1.0.0
Section titled “v1.0.0”Features
Section titled “Features”- Add –disk-check and –notify flags with disk preflight and completion notification (
52a8052) - Add OS notification support (macOS osascript, Linux notify-send) (
95c0e80) - Add disk.FreeSpace and FormatBytes for disk-space preflight (
26c2e67) - Add –include/–exclude/–min-size/–max-size flags with scrapeFn and batch wiring (
e69df23) - Add Include/Exclude/MinSize/MaxSize config fields and ParseSize helper (
f891c41) - Add FilterItems with glob and size-based media item filtering (
9920284) - Add –quality and –audio-only flags with config, validation, and wiring (
f2cda17) - Add audio-only download path, mp3 transcode, and downloader quality wiring (
6b76e91) - Add quality cap and audio-only format selection to YouTube engine (
bdc756a) - Expand home path for cookie configuration and add test for tilde expansion (
54a6bef) - Wire cookies through runWithScraper, runBatch, and scraperRegistry (
3c239f3) - Pass cookies to downloader constructors (generic + YouTube) (
7b30004) - Add SetCookies and WithCookies constructors to scrapers, pass cookies through scraperRegistry (
6811446) - Add –cookies flag, Config.Cookies field, and cookie parsing in loadGlobalConfig (
da99586) - Add Netscape cookies parser and WithCookies helper to netutil (
eedf361)
- Replace unix-only O_NOFOLLOW with platform-abstracted fileutil.OpenFileNoFollow (
a6860ce) - Update agent models and permissions in opencode.json (
3ecb420) - Replace #nosec annotations with proper fixes — 0755→0750, bounds check, consolidated execNotify (
6587102) - Add gosec annotations for G115, G204, G301 false positives (
76e3cfb) - Update small_model and permissions structure in opencode.json (
d369314) - Treat network errors as retryable in filester resolveFileOnce (
a9674ff) - Make empty playlist test properly assert error (
e09371b) - Add deferred shutdown, propagate constructor error, ctx-aware sleeper, invalid completion shell (
9083d11) - Surface bunker signing failures; make resume-metadata cleanup non-fatal (
e3f74fc) - Capture download paths synchronously in runJSON too (
2688253) - Return final download paths from downloader (
9221edb) - Capture batch JSON paths synchronously (
015a418) - Ensure completed paths are recorded before batch JSON summary (
dd0cc1d) - Handle reviewed batch cancellation cases (
572f66a) - Support batch/TUI abort via cancellable scrape context (
e1972ba) - Treat cancelled items as interrupted not failed in plain mode; serialize batch stdout (
a68a2c8) - Replace substring-based cancellation check with typed CancelledError (
ece1029) - Preserve mp4 extension for dotted YouTube titles (
e2a1e68) - Add permission warnings for config/cookies, harden notify quoting, fix ffmpeg output path handling (
ce980d9) - Validate target URL when using proxy; reject https-to-http redirect downgrades (
0a7022d) - Refuse to follow symlinks when writing .part files and creating output directories (
a9e2b32) - Cover bounded download and parser read limits (
fa3c715) - Stop leaking signed URL in filester single-file paths; bound untrusted reads (
26c94ab) - Harden resume metadata file permissions and omit signed URL for resolver items (
ed26adc) - Redact signed URL query params from download error messages (
196ab45) - Gofmt alignment for iota cleanup (
ac7b1f7) - Make Sleeper cancellable with context, dedup remaining parser HTTP loops (
7c02032) - Remove redundant iota, update file perms to 0644/0755 (
1560947) - Add userAgent param to GetJSON, restore Bunker signing with 200-check (
01646ff) - Disk check for batch/dry-run modes, non-Unix stub error, and consistent notification (
9b67178) - Batch no-items message, rate-limit error prefix, consistent summary printing, and filterScraper test (
3229f74) - TestLoadGlobalConfigParseSizeValues now verifies config-file source (
af1c2ae) - Gofmt alignment for MinSizeBytes/MaxSizeBytes accessors (
2839869) - Use parenthetical format for FilterSummary.String() (
c9a35ff) - Default audio-only to m4a, add muxed-stream fallback, and include quality/audioOnly in events (
cf8013d) - Add nosec annotations for G304/G124 gosec warnings and gofmt alignment (
5f39994) - Remove double cookie application in auto-detect path and add unreachable comment for cookiejar.New panic (
866c180) - WithCookies per-domain cookie jar; expired cookie test uses int timestamp (
f37953e)
Performance
Section titled “Performance”- Parallelize goonbox pagination; overlap batch scrape with download (
75134ba) - Increase connection pool and copy buffer sizes (
49d1572) - Throttle TUI re-rendering with coalesced events and dirty tracking (
5199b0d) - Pipeline sha256 hashing into download via TeeReader (
03b4832) - Add Sleeper interface for test speedup, inject no-op sleeper in downloader/filster tests (
50777be)
Other changes (21)
- CI improvements, README corrections, gitignore patterns (
1a8eb2a) - Delete dead code (unused types, fields, functions) (
24ac829) - Extract shared orchestration helpers in plain.go and model (
9867c7d) - Extract newSiteCmd factory, dedup root.go downloader construction and dispatch (
95306d1) - Consolidate shared helpers (Sleeper, slug, home, bytes, status, ffmpeg) (
acbfbe3) - Extract PostJSON, GetDoc, and Retry helpers to netutil (
24ff5cb) - Extract shared downloaderCore for generic and YouTube downloaders (
8333eba) - Deflake timing-sensitive tests with injected sleepers and channel sync (
65c8d94) - Add parsePlaylist and downloadAndMux flow coverage (
896c8fd) - Add runBatch and runBatchPlain orchestration tests (
1ee7d6e) - Add SanitizeFilename and BackoffWithJitter test coverage (
c4dcbab) - Add task 3 implementation report (
5378ae2) - Remove BACKLOG.md as it is no longer needed (
59804ab) - Streamline agent configuration by consolidating roles and updating descriptions (
8931c2f) - Add GetJSON helper to netutil, simplify parser HTTP request loops (
4eac5e6) - Extract shared retry, backoff, and filename utilities to model/netutil/fileutil (
d7e2f68) - Add code-quality improvements spec (dedup, retry, test speed, iota, perms) (
599b671) - Streamline agent configuration by consolidating roles and updating descriptions (
869b64f) - Add disk preflight and completion notification spec (Chunk D part 2) (
26af63d) - Add album filtering spec (Chunk D part 1) (
1f0388b) - Add YouTube quality spec (Chunk C) (
26a4c1c)
Full changelog: v0.0.4…v1.0.0
v0.0.4
Section titled “v0.0.4”Features
Section titled “Features”- Remove outdated design documents for Chunk A foundation (
9a87e42) - Add version and shell completion subcommands (
04d7f53) - Add –proxy flag with config file override (
e5ea2b7) - Wire proxy URL into downloader constructors (
b5cb998) - Add proxy-aware HTTP client constructors to netutil (
2b12104) - Add Proxy field to Config struct (
8e467ec) - Enhance dashboard with error inspection and retry functionality (
39da90f) - Add JSON output support for downloading and batch processing, including CLI flags (
418f491) - Implement batch mode for scraping multiple album URLs with progress tracking (
075de82) - Lazy signed-URL resolution at download time + re-resolve on 403 (
d4412f4) - Add free_coder agent and free command for zero-cost coding tasks (
a548f5b)
- Route scraper API requests through proxy when configured (
3e14e46) - Fail fast on invalid proxy URLs instead of deferring error (
3e46a7b) - Classify permanent errors in youtube retries and bunker resolvers (
d5928bf) - fileutil: Reject checksum sidecars written for a different filename (
8e8b749) - fileutil: Reject checksum sidecars written for a different filename (
fb599e6) - cmd: Expand ~ in –output flag value (
ec47481) - Graceful shutdown — cancel in-flight downloads + close progress channel on quit (
21d7924) - bunker: Resolve protocol-relative hrefs correctly (
79e93c9) - filester: Don’t retry permanent errors (
80ce163) - cyberdrop: Resolve album files concurrently (
5831cdf) - goonbox: Cap pagination at a sane bound (
75de2ca) - goonbox: Skip unsafe items instead of aborting whole album (
55f330a) - opencode: Update small_model and agent models for improved functionality (
67b462b) - bunker: Build API request body with json.Marshal (
45601a4) - cmd: Plain output fallback when stdout is not a TTY (
042cd79) - opencode: Update agent descriptions for clarity and improved functionality (
e0d0b4d) - opencode: Update explore agent model to kimi-k2.7-code for improved functionality (
f48bb3e) - opencode: Update model for explore and reviewer agents to deepseek-v4-pro (
ac2a33a) - opencode: Update descriptions for agents to clarify usage and functionality (
28c5e98) - youtube: Reuse parsed video info instead of double fetch (
a88616b) - youtube: Copy audio when already AAC instead of re-encoding (
6c96552) - release: Update action-gh-release to version 3.0.2 (
637dbf6) - youtube: Include ffmpeg’s stderr in mux failure errors (
e854f8d) - youtube: Parse video IDs properly instead of substring-matching v= (
fedafb9) - youtube: Retry transient download failures with backoff (
60ea30b) - downloader: Keep a complete partial when the server replies 416 (
118c2e5) - downloader: Verify size against item.Size when response has no length (
d3f23f4) - youtube: Reject silently truncated streams instead of blessing them (
d30205a) - dashboard: Stop stale progress events from resurrecting terminal items (
484be63) - Update model path for Claude agent in opencode.json (
fa5379a) - Correct key from “agents” to “agent” in opencode.json (
5d15838) - Update model paths for agents in opencode.json (
eeafba3) - Correct model path for architect agent in opencode.json (
ccd85bf) - Update prompt to system in architect agent and modify permissions for explore and reviewer agents (
685c404)
Other changes (11)
- Update batch mode instructions for URL handling and output format (
4920d8d) - Enhance README with batch mode and script-friendly output details (
f9e3b53) - Fix gosec G104/G304 issues in cmd/plain.go and cmd/root.go (
32d5677) - Fix gofmt formatting in cmd/plain_test.go, cmd/root.go, internal/netutil/client.go (
eec92f2) - Initial plan (
dfe052a) - Document SSRF protection tradeoff when using proxy transport (
6580e3c) - Chunk A — proxy, completions, version implementation plan (
f42c386) - Chunk A — proxy support, shell completions, version command (
b7a15d1) - Add .opencodeignore to exclude dependencies, generated files, and binaries (
b80abd4) - Gofmt import grouping from previous commits (
fe8f6c7) - Add backlog of feature suggestions and code-quality improvements from code review (
4c03092)
Full changelog: v0.0.3…v0.0.4
v0.0.3
Section titled “v0.0.3”Features
Section titled “Features”- Add initial tui.json configuration with theme setting (
57e0318) - Add opencode configuration file with model and agent definitions (
10d1eb5) - YouTube playlist support + always auto-select highest quality (
d82c4fa) - Add –dry-run/-n mode to preview downloads (
3943e59) - Bandwidth throttling and checksum verification (
8e1ec6f) - Resume interrupted downloads via HTTP Range requests (
e20d3cf) - Wire Downloader.Cancel to a TUI keybinding (
ca33776) - Auto-detect site from URL, no subcommand required (
b1005a3) - Add Filester scraper support (
83b0173)
- Propagate cleanup errors and tighten file permissions (
96248f7) - Validate rate limits before configuring limiters (
0888aa7) - Choose default YouTube audio and reject mute output (
ee7b3e4) - Make config errors and CLI precedence explicit (
57cd28f) - Apply global transfer policies to YouTube (
494de22) - Time out stalled response headers (
bef8e5a) - Fail closed on checksum errors (
077e8b8) - Make queued downloads cancellable (
d74d6b8) - Block private-network parser and download targets (
dd5ecff) - Handle parser request construction errors (
09069f9) - Keep album paths inside the output directory (
e13cfc4) - Update opencode configuration by adding plugin section and correcting key name (
61f3302) - Update agent configurations for improved functionality and permissions (
d05ab51) - Surface incomplete album results (
00b89b5) - Validate remote identity before resuming downloads (
be2e7d6) - Update opencode configuration by removing fallbacks and adjusting agent structure (
e1139a0) - Isolate duplicate items and filename collisions (
96e3a15) - Honor persistent flags in explicit subcommands (
5ea4098) - Expand detectSite’s mirror domains, fix lookalike false-positive (
ca493d2) - Harden ffmpeg output path against flag-injection (
b3af0c0) - Add jitter to internal/downloader’s retry backoff (
dab5c68) - Spinner keeps animating forever after batch downloads finish (
74cd9bd) - Strengthen filester retry/backoff, still not detecting all files (
576e01d) - Filester pagination silently truncated large albums (
7c70836) - Address thorough code review findings (
87b7439) - Bump golang.org/x/text to patch GO-2026-5970 (
92f270f)
Performance
Section titled “Performance”- Enforce read stalls without per-chunk goroutines (
57ef0ab)
Other changes (11)
- Update actions/checkout and actions/setup-go to v7 (
856ce16) - Remove dead YouTube downloader wrapper (
392ea8e) - Align required Go version with go.mod (
d75b7ee) - Enforce gosec with reviewed exceptions (
22c8f47) - Update x/net past reported vulnerability (
cf50946) - Pin actions and publish release checksums (
9713027) - Remove redundant downloader fields (
2ae2857) - Real module path + CI workflow (
7ac4954) - Remove redundant tui command (
f2fb98e) - Remove dead code found via deadcode + staticcheck (
34fbab0) - Remove unnecessary comments from test files (
2a0c22b)
Full changelog: v0.0.2…v0.0.3
v0.0.2
Section titled “v0.0.2”- Completed downloads no longer stuck as ‘active’ for large albums (
cd9f7f0) - Double file extensions (.jpg.jpg) in downloaded files (
033d376) - Downloads no longer hang on stalled CDN connections (
105ba20)
Full changelog: v0.0.1…v0.0.2
v0.0.1
Section titled “v0.0.1”Features
Section titled “Features”- Skip already-downloaded files (
5095e89) - Add GoonBox scraper (
77abebf) - Albums download into subfolder, single files go to output dir (
a4f863b) - Reworked TUI with cohesive futuristic design (
f3c7f5e) - Drop GoFile support (
df55270) - TUI launches instantly with loading spinner while scraping (
d3fe06d) - Reworked TUI with accurate two-phase flow (
d011abc) - YouTube quality selector + video+audio muxing via ffmpeg (
21f4259) - TUI-only interface with auto-download (
4753d61) - TUI is now default + best quality YouTube format selection (
6efbd68) - Stunning TUI with animated banner, stats panel, spinners + best quality YouTube (
f6d93af) - Integrate kkdai/youtube library for real YouTube stream downloads (
26a0cd7) - Add CLI subcommands for all sites and TUI launcher (
b38fb3d) - Add terminal dashboard UI with live progress (
e16b0ea) - Add theming system for TUI (
bae2394) - Add CyberDrop and Bunker scrapers (
d49bdd6) - Implement gofile scraper and associated tests (
9e6d011) - Add YouTube scraper (
d824ec8) - Implement downloader and YouTube parser with configuration support (
f1debfb) - Add core data models and interfaces (
6f583eb)
- Album subfolder now actually created and used for downloads (
ac3951f) - Remove broken size, ETA, and overall progress indicators (
bae4075) - Overall progress uses item-count, size is cumulative, 500ms tick refresh (
2fca03c) - File size, overall progress, and ETA now work correctly (
6729020) - CyberDrop scraper rewritten for new API-based architecture (
47a921a) - GoFile scraper now creates guest account token before API calls (
0c35bc0) - Correct total file size and overall progress for unknown-size items (
ad65787) - Remove YouTube-only Note column from batch view, fix progress reset (
de92215) - Bunker scraper now correctly resolves file page download links (
1f6c256) - Bunker downloads now resolve signed CDN URLs via bunkr API (
0322820) - Bunker scraper now works with real bunkr.cr album pages (
47decee) - YouTube progress now tracks combined video+audio+mux as one total (
87ce88a) - YouTube progress callback now actually fires (
624ffc0) - YouTube downloads now show live progress in the TUI (
adc089c) - YouTube quality selector - single Enter, no spurious downloads (
a27f90f) - Progress indicators now report byte-level download progress (
c8d87ec) - Address all critical and important code review findings (
271d74f) - Remove duplicate package declarations across all Go files (
334837b) - Add missing package declarations in multiple files (
3bed9bc) - Add missing cobra/goquery/bubbletea deps and fix gofile mock test bug (
dfb33fb)
Performance
Section titled “Performance”- Parallelize Bunker file page fetching (46s → 6s) (
74ce563)
Other changes (7)
- Add GitHub Action for tagged releases (
e266064) - Refactor downloader to use context for cancellation and improve error handling (
86f54c3) - Update README for current features (
9e3dfab) - Remove outdated design and usage documentation for CLI scraper (
2cbbf52) - Update .gitignore for scraper binary, docs, and .superpowers (
2b4656e) - Add README and usage guide (
c8d53f1) - Initial scaffold (
2ca153f)
Full changelog: v0.0.1