Skip to content

Releases: jcrabapple/kageboard

v0.2.0 — Auto-refresh, binary packs, downloads

Choose a tag to compare

@jcrabapple jcrabapple released this 11 Aug 23:10

What's new

  • Refresh mirrors — re-render a mirror in place (kage clone --refresh) from the detail page, with live WebSocket progress
  • Scheduled auto-refresh — per-mirror daily/weekly schedules run by a background thread; outcomes persist across restarts
  • Advanced clone options — scope prefix, excluded paths (repeatable --exclude), keep media/PDFs, mobile readability, force re-clone
  • Pack to binary viewer — single-file executable archives alongside ZIM, with --incremental re-pack support
  • Download artifacts — packed ZIM/viewer files download straight from the detail page

Fixes

  • + New Clone button had its own Alpine x-data island since v0.1.0 and could never open the clone panel
  • Job ID collisions when two jobs started in the same second
  • GLM 5.2 code review pass: XSS hardening, WebSocket + jobs API auth, persistent session secret, bounded job registry, streaming file serving, scheduler restart reconciliation, and more (see 21a43e8)

Stats

102 tests passing. Full changelog: v0.1.1...v0.2.0

v0.1.1 — Security + hardening

Choose a tag to compare

@jcrabapple jcrabapple released this 11 Aug 02:09

Security & code-quality release

Security

  • Path traversal in mirror_browse and delete_mirror — resolved paths are now confined to the mirror/output directory (returns 403/404)
  • XSS in clone log — switched from Alpine x-html to x-text so mirrored page titles can't inject HTML
  • Extension credentials moved from chrome.storage.syncchrome.storage.local (no longer synced to Google's servers)
  • Constant-time credential comparison (hmac.compare_digest) in Basic Auth and login routes

Bugs

  • Missing MB unit label in size formatting
  • Page count pluralization (1 page vs 2 pages)
  • mirror_browse hardcoded text/html mimetype — now guesses from file extension (CSS/JS/images serve correctly in the iframe browser)
  • /api/jobs endpoints no longer leak subprocess stdout lines
  • Missing kage binary raises KageNotFoundError with install instructions instead of crashing the reader thread

Code quality

  • get_mirror is O(1) (direct path check, no full directory scan)
  • Thread-safe job dictionary access (_job_lock on all mutations/reads)
  • get_job_raw added for WebSocket streaming; API-facing get_job returns clean snapshots

Tests

24 → 49 tests. New coverage: parse_clone_output (8 cases), path traversal regression, mimetype, lines exclusion, constant-time auth, _build_mirror.

Docs

  • README screenshots (dashboard + mirror detail) added in v0.1.0 follow-up