• 2026.8.4 b3ae89979a

    2026.8.4
    All checks were successful
    / pr-review (push) Has been skipped
    / pr-review (release) Has been skipped
    / gitleaks (push) Successful in 24s
    / gitleaks (release) Successful in 16s
    / checks (push) Successful in 2m13s
    / publish (push) Has been skipped
    / publish-container (push) Has been skipped
    / checks (release) Successful in 2m4s
    / deploy-docs (release) Has been skipped
    / publish (release) Successful in 36s
    / publish-container (release) Successful in 3m1s
    / deploy-docs (push) Successful in 1m11s
    Stable

    marvin8 released this 2026-08-04 08:27:02 +00:00 | 0 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:B4Q+9pbWSIqGYTl3Ub/FPrBSqAVd2OkCR13hYRG5wek

    [2026.8.4] - 2026-08-04

    Commits

    • 🔀 Merge branch 'maint/issue-129-forge-migration-updates' 130818b
    • 📝 drop Docker Hub references — image only published to registry.marvin8.zone 728c172
    • 📝 refer to global AGENTS.md instead of CLAUDE.md 04fe262
    • ⬆️ bump pre-commit deps 025bc0f
    • 📝 point changelog commit links at forge.marvin8.zone e6c550b
    • ⬆️ bump deps 8f81fcc
    • 🚨 ignore PLR0917 in tests, matching existing PLR0913 ignore 477ff5f
    • 💄 point web UI source link at forge.marvin8.zone 27dea61
    • 📝 update docs, README badge, and project URLs to forge.marvin8.zone 9a47223
    • ⬆️ bump dev dependencies and align pre-commit hook revs dc3f163
    • 🔧 update OCI labels and justfile URLs to forge.marvin8.zone 61cefbb
    • 💚 point deploy-docs push and OCI annotations at forge.marvin8.zone 33705e9
    • 👷 run weekly checks on suanni runner 773a012
    Downloads
  • 2026.7.25 e0312aa9a1

    2026.7.25 Stable

    marvin8 released this 2026-07-25 03:03:36 +00:00 | 15 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:cyGOzvyFNw+A8J/LVjRif8v3KZLo8seQDVZbk/IhNhI

    [2026.7.25] - 2026-07-25

    • SQLite WAL mode, new indexes, and query optimizations eliminate login hangs during periodic scans and keep the scrubber responsive at high playback speeds.

    Commits

    • 🔀 Merge branch 'perf/issue-127-db-indexes-wal' 26784f5
    • 📝 Address review: targeted schema_version update, Release-Notes entry 342733e
    • 📝 Update docs URL to cang.marvin8.zone 1f73cfc
    • Enable WAL mode, add indexes, rewrite queries, serve images by ID 70c6ef1
    Downloads
  • 2026.7.24 b3f45955ef

    2026.7.24 Stable

    marvin8 released this 2026-07-23 23:21:24 +00:00 | 21 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:cyGOzvyFNw+A8J/LVjRif8v3KZLo8seQDVZbk/IhNhI

    [2026.7.24] - 2026-07-24

    • 💥 Breaking change: removed all video clip support. Cang is now a snapshot archiver.

    Commits

    • 🔀 Merge branch 'feat/issue-125-remove-video-support' 2ab42c6
    • 🔧 fix dependencies and ruff error on two methods b742bd2
    • 👌 format breaking change as bullet in release notes 792f986
    • 🚚 rename clips.py to days.py b54eaad
    • 📝 document manual cleanup of legacy clip files 8a1d255
    • 📝 update docs and metadata for snapshot archiver identity 53e631a
    • fix scrubber performance — remove interval recreation, optimize filmstrip 29e3dc3
    • 🔥 remove video clips from web UI 34048ec
    • 🔥 remove video clip support from adapters, config, storage, db, and migration f1657b2
    • 🔥 remove transcode pipeline and video file watching feb04f0
    • 🐛 Fix UV_VERSION grep escaping in publish-container job 130a44d
    • 💚 fix building and publishing container in ci f62e50f
    Downloads
  • 2026.7.23 7173cefbcf

    2026.7.23 Stable

    marvin8 released this 2026-07-22 21:27:10 +00:00 | 35 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:cyGOzvyFNw+A8J/LVjRif8v3KZLo8seQDVZbk/IhNhI

    [2026.7.23] - 2026-07-23

    • Container images are now published to registry.marvin8.zone/marvin8/cang instead of Docker Hub
    • Switched to calendar versioning

    Commits

    • ⬆️ bump deps 3202258
    • 🐛 fix container build 134570e
    • fix test that was checking version against a hardcoded value and bump deps 87c2a77
    • 🔀 Merge branch 'maint/issue-123-project-maintenance' 6fff510
    • 🔥 remove tools/check_gitmoji.py and its pre-commit hook ad08612
    • 👌 address review: prune zaojun args, reset-release-notes no push, fix uv_build, update Release-Notes a29b112
    • revert version number — keep calver scaffolding only 69e2e9a
    • 📝 mark all TODO.md items complete 24fd325
    • 🔖 switch to calver versioning (YYYY.MM.DD) bed67ba
    • 🐛 URL-encode camera names in event tile URLs, fix time bar labels 7dc73b6
    • 🔥 remove dead list_days and list_days_with_stats functions 8210135
    • 📄 document all source files, add per-file-ignores for tests 77d80e4
    • 🐳 make Containerfile self-contained, simplify justfile 0be6ce3
    • 💚 finish CI overhaul: setup-uv in all jobs, gitleaks checksums, publish-container cecac51
    • 💚 replace curl|sh with setup-uv, gitleaks checksums, add publish-container job 6ba3451
    • 🔧 add scaffolding files and config alignment 8c8c714
    • 📝 reset Release-Notes.md for next release fd46ca0
    Downloads
  • 0.10.1 a53bbf32a6

    0.10.1 Stable

    marvin8 released this 2026-07-16 08:02:41 +00:00 | 57 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:cyGOzvyFNw+A8J/LVjRif8v3KZLo8seQDVZbk/IhNhI

    [0.10.1] - 2026-07-16

    • Fixed a bug where snapshot processing could stop for cameras with frequent

    Commits

    • 🔀 Merge branch 'fix/issue-121-stale-dcache-after-prune' d3a2a91
    • 📝 Document timezone/NTP requirement for snapshot pruning and add release note d09719f
    • 🐛 Only prune snapshot date directories whose day has passed 8af7107
    • 🐛 Restrict snapshot-scan pruning to hour/minute leaf directories 477a87a
    • 📝 reset Release-Notes.md for next release 1735c38
    Downloads
  • 0.10.0 430fe4be0a

    0.10.0 Stable

    marvin8 released this 2026-07-16 03:23:58 +00:00 | 64 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:cyGOzvyFNw+A8J/LVjRif8v3KZLo8seQDVZbk/IhNhI

    [0.10.0] - 2026-07-16

    • Snapshot scrubber on the day-level snapshot page — a time slider, filmstrip, and play/pause controls for browsing large numbers of per-camera still images.

    Commits

    • 🔀 Merge branch 'feat/PI-snapshot-scrubber' eb7f067
    • 🐛 Restore start_time/end_time filtering in scrubber snapshot route a1b51ad
    • ♻️ Replace density dots with motion event markers on scrubber timeline ae3f94f
    • 🐛 Make density dots visible — larger 5px size, stronger color f909a7a
    • 📝 Add snapshot scrubber release notes and documentation da800ee
    • Add scrubber snapshot template with filmstrip and time slider 0e62acc
    • Add failing tests for scrubber snapshot UI acd131c
    • 🐛 URL-encode camera name in snapshot query strings 29d84b4
    Downloads
  • 0.9.0 8b53f470bd

    0.9.0 Stable

    marvin8 released this 2026-07-15 06:19:02 +00:00 | 74 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:cyGOzvyFNw+A8J/LVjRif8v3KZLo8seQDVZbk/IhNhI

    [0.9.0] - 2026-07-15

    • Live snapshot strip on the home page — shows the latest snapshot from each camera, auto-refreshing every 30 seconds. Two cameras fill the screen; max three per row. Cameras without snapshots show a placeholder.

    Commits

    • 🔀 Merge branch 'feat/issue-115-live-snapshot-strip' b6890bb
    • 📝 Document live snapshot strip in Release-Notes and web UI docs 728e48e
    • Final verification — all tests and linters pass f04e278
    • 💄 Integrate live snapshot strip on home page 969e9af
    • Add /live-snapshots fragment route and template 6cef735
    • Add /live/snapshots/{camera}/img route eb0049a
    • Add latest_snapshot_per_camera DB query d2a670d
    • 📝 reset Release-Notes.md for next release 9eed1fb
    Downloads
  • 0.8.0 bced59433d

    0.8.0 Stable

    marvin8 released this 2026-07-15 02:36:14 +00:00 | 84 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:cyGOzvyFNw+A8J/LVjRif8v3KZLo8seQDVZbk/IhNhI

    [0.8.0] - 2026-07-15

    • New camera setup guide covering recommended Dahua configuration for use with cang
    • Fixed: motion on two cameras at the same time now shows as two separate events instead of one mislabelled event
    • Processed recordings and snapshots now move out of the camera incoming folders into cang's own storage — anything still in an incoming folder is unprocessed; existing installations migrate automatically on first start
    • Fixed: clip videos — and in fact the whole output directory, including the database — were served without authentication; videos now go through an authenticated route

    Commits

    • 🔀 Merge branch 'feat/incoming-move-out' 7103df9
    • 🔧 move CLAUDE.md to AGENTS.md and symlink back to CLAUDE.md ccd827f
    • 📝 document storage layout, automatic migration, and removed config key 0983405
    • 🐛 guard migration unlinks with atomic copies and content verification 0ff0b1b
    • migrate existing storage layout on startup fa883bc
    • 🔒 serve clip videos through an authenticated route instead of a public mount 246131a
    • ♻️ drop filesystem snapshot-to-clip matching from adapters 3cac314
    • store clips under clips/ and resolve thumbnails from the snapshot table d76b5b7
    • 💥 always delete incoming sources after successful transcode 980c78c
    • move snapshots into canonical output tree on ingest a8f7298
    • add db helpers for storage migration and thumbnail updates 6dbaa9d
    • add storage path helpers and safe copy/prune primitives e178f36
    • 🔀 Merge branch 'fix/per-camera-events' c8c2bde
    • 📝 name marvin8 explicitly in AI-DECLARATION.md c4d78d6
    • 📝 add AI-DECLARATION.md declaring AI involvement levels f2c8bec
    • 📝 document per-camera event detection fix ba496c1
    • 🐛 detect motion events per camera instead of merging across cameras dac91d7
    • add group_events_per_camera for per-camera event grouping f574692
    • 🔀 Merge branch 'docs/camera-setup' e35d133
    • 📝 update Release-Notes for camera setup guide f6feaab
    • 📝 address WuMing review: clarify interval dropdown and admin error message 52f8921
    • 📝 add DH-IPC-HDW2849TM-S-IL to tested camera models 5c7ff60
    • 📝 add camera setup guide for Dahua cameras 135993c
    • 📝 reset Release-Notes.md for next release ea91b10
    Downloads
  • 0.7.0 eecfd13953

    0.7.0 Stable

    marvin8 released this 2026-07-11 09:02:13 +00:00 | 110 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:cyGOzvyFNw+A8J/LVjRif8v3KZLo8seQDVZbk/IhNhI

    [0.7.0] - 2026-07-11

    • Calendar home screen: two-month grid with per-day motion event and snapshot counts
    • Day-of-week added to single-day headings (e.g. Thursday · 2026-07-11)
    • Login form replaces HTTP Basic Auth for password-manager compatibility

    Commits

    • 🔀 Merge branch 'feat/calendar-home-dayofweek-login' a0e3fd0
    • 📝 update Release-Notes for calendar, day-of-week, login form 030031d
    • ✏️ fix 'pasword' typo in TODO item #6 ecffa94
    • ✏️ fix double 'a' typo in TODO item #4 f2ef868
    • 📝 update docs for calendar, login form, day-of-week; fix in_retention for future dates 4df08bb
    • replace HTTP Basic auth with cookie-based login form 03bfd85
    • add day-of-week to single-day headings a3bbad3
    • calendar home screen with two-month grid 00ec34b
    • 🔧 increase WuMing max_diff_lines to 3000 01cadd5
    • add list_motion_snapshots_for_range DB query 3db9cb4
    • 📝 reset Release-Notes.md for next release b7ebc5b
    Downloads
  • 0.6.0 a1e155612b

    0.6.0 Stable

    marvin8 released this 2026-07-09 05:20:23 +00:00 | 123 commits to main since this release

    Signed by marvin8
    SSH key fingerprint: SHA256:cyGOzvyFNw+A8J/LVjRif8v3KZLo8seQDVZbk/IhNhI

    [0.6.0] - 2026-07-09

    • Snapshot-first NVR redesign: events UI, tiered retention, improved JPG cleanup.
    • Documentation now also hosted at https://cang.marvin8.zone; old Codeberg Pages links redirect automatically.

    Commits

    • Merge branch 'feat/snapshot-first-nvr' 392a417
    • skip transcoding clips older than video_retention_days; delete source immediately 6150d78
    • batch snapshot inserts into a single transaction per camera scan 0d2f539
    • 🐛 fix day view layout and add event grid CSS so snapshot images scale correctly 10b065f
    • 🐛 configure root logger so cang.* messages are visible; suppress Ctrl-C traceback 7c80f23
    • 🔊 log startup progress per camera with counts 0f6e844
    • 🎨 enforce one-import-per-line via isort force-single-line; fix all imports f04a5d7
    • 🎨 split multi-name imports in lifespan.py per project style 3fe1b29
    • 📝 fix documentation URL in README 9cf4e6b
    • 📝 add post-merge TODO items from snapshot-first review 1f4b630
    • 📝 document retention_days config keys in docs/config.md 8d921b7
    • 📝 update Release-Notes for snapshot-first NVR redesign 1502339
    • 📝 remove development-paused notice from README cd502f8
    • redesign web UI — events grid primary, DB-backed snapshots, clips secondary 9bdc249
    • add group_into_events for motion snapshot event detection e022481
    • add snapshot ingestion and tiered retention cleanup to lifespan c35dd4c
    • add retention config fields; snapshot cleanup now owned by retention job 08167fc
    • add snapshots table (migration v3) and snapshot DB queries c733f1d
    • 🎨 split multi-name imports onto separate lines per project style 17992ee
    • add IncomingSnapshot dataclass and DahuaAdapter.scan_snapshots e5a6298
    • Merge branch 'feat/forgejo-migration' 0bbf47d
    • 📝 add grebedoc docs bullet to Release-Notes.md 4b8cd29
    • 📝 CLAUDE.md — reference template instead of repeating format f931c78
    • 📝 update CLAUDE.md — release notes process and format cca26ba
    • 👷 replace git-cliff with Release-Notes.md changelog generation 2f6ccd8
    • 📝 add grebedoc hosting and client-side redirect c6b6956
    • 👷 migrate CI from Woodpecker to Forgejo Actions 17190b8
    • 🔧 bump deps fba55fc
    Downloads