Skip to content

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.

Released November 12, 2026 · Downloads

  • 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

Released November 12, 2026 · Downloads

  • 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)
  • 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

Released August 8, 2026 · Downloads

  • 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

Released August 6, 2026 · Downloads

  • 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)
  • 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

Released August 5, 2026 · Downloads

  • 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

Released July 30, 2026 · Downloads

  • 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)
  • 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

Released July 11, 2026 · Downloads

  • 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

Released July 11, 2026 · Downloads

  • 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)
  • 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