• 2026.9.26.1 56ef7dea56

    2026.9.26.1
    All checks were successful
    / pr-review (push) Has been skipped
    / gitleaks (push) Successful in 15s
    / pr-review (release) Has been skipped
    / gitleaks (release) Successful in 28s
    / checks (push) Successful in 2m14s
    / publish-container (push) Has been skipped
    / deploy-docs (push) Has been skipped
    / checks (release) Successful in 2m39s
    / container (release) Has been skipped
    / container (push) Successful in 1m33s
    / publish-container (release) Successful in 2m57s
    / deploy-docs (release) Successful in 1m4s
    Stable

    marvin8 released this 2026-09-26 03:08:15 +00:00 | 149 commits to main since this release

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

    [2026.9.26.1] - 2026-09-26

    Commits

    • 🔀 Merge branch 'fix/calendar-release-transition' 0c670af
    • 🐛 Make the release recipe work from the legacy 0.4.0 version 8a59c9a
    • 🔀 Merge branch 'feat/reader-tweaks-and-docs' fdae0a1
    • 📝 Name Yunjin in the README tagline 0d45b2f
    • 🔧 Address WuMing review waves on PR #51 a5538ad
    • 🔥 Remove stale Roadmap.md a2ab8dd
    • 📝 Refresh AGENTS.md to match current CI and layout 4a46279
    • 📝 Rewrite README for the current project 94b2e04
    • 🐛 Point the footer at the forge and link versioned docs fb5ea54
    • 👷 Publish versioned docs to the pages branch 7728996
    • 📖 Add MkDocs documentation site 359c812
    • ✨ Remember the hide-read preference in a cookie 61de2b2
    • 💄 Show only the group title on reader cards 57b976a
    • 🔀 Merge branch 'feat/issue-40-container-packaging' 7bcb138
    • 🔧 Cap worker interval digits and default dev labels 516500b
    • 🐛 Run worker init in the background so it stays signal-killable 8778a04
    • 🐛 Address WuMing review waves 4/5 on PR #46 74d4a27
    • ✨ Include extract-media in the worker loop fd7f836
    • 🔧 Rename docker- files to container- for podman setups 4fc421d
    • 🐛 Harden worker entrypoint signal and init handling 4103731
    • 🔁 Re-trigger CI after zhuiri checks-job flake c0fdf6d
    • 🔧 Address WuMing review wave on PR #46 a1cecd9
    • 👷 Build container image in CI 6c0a114
    • 👷 Add container image with web and worker entrypoints 1a73a70
    • 🔀 Merge branch 'feat/issue-37-feed-discovery' 5edc936
    • 🐛 Sanitize rendered discovery errors and scope test logger state f2da211
    • 🐛 Handle feed link type variants and protocol-relative site URLs c9209a0
    • 🐛 Strip control characters from feed discovery error logs 7084583
    • ✨ Add feed discovery to the add-feed page a2d8dc1
    • ✨ Discover feeds from a site homepage 3a7e682
    • 🔀 Merge branch 'feat/issue-42-ui-ux-improvements' 3fe2259
    • 🐛 Keep original media URLs in the rail; Guardian signs its query strings 971a9e3
    • ✅ Build rail test media explicitly instead of deleting fixture rows d4f275b
    • ✨ Ask the LLM for multi-paragraph aggregate overviews 13da9da
    • ✨ Dedupe photo variants in the aggregate media rail e78bc61
    • 🩹 Guard aggregate summary split and strengthen tests 1a00541
    • 🔁 Re-trigger CI after zhuiri checkout flake 841c75f
    • ♻️ Rework aggregate view: sharp title, full overview, media rail 83bc39c
    • 🎨 Show ISO-8601 updated dates on reader cards a17bbd2
    • 🎨 Put nav links inline with the app title and add 云锦 4148092
    • 🔀 Merge branch 'feat/weekly-checks-action' 03aebf3
    • 👷 Run weekly checks on suanni 597ec58
    • 🔧 Add workflow name and least-privilege permissions 0e40ff7
    • 👷 Add weekly dependency and advisory checks 5f3c9f8
    • 🔀 Merge branch 'feat/issue-38-fetcher-resilience' a384214
    • ✅ Address review: scheme-redirect test, log sanitization, stable date 0b995c1
    • ⚡ Refresh feeds concurrently with bounded parallelism 95e866f
    • ✨ Support conditional GET for feed polls b7e9f80
    • ✨ Add per-host politeness gate a4e9181
    • ✨ Add retry with backoff via tenacity 4285428
    • ♻️ Convert feed fetch pipeline to asyncio 34e54d4
    • ⬆️ Bump dependencies 748d257
    • 🔀 Merge branch 'feat/issue-33-featured-image' b5980fd
    • 🐛 Retry blocked article fetches with the extractor identity bca5355
    • 🐛 Send browser headers and reject error pages in article fetches 37ba95d
    • 🐛 Resolve the media directory absolutely when serving 7d4759b
    • 🔒 Guard featured media assignment and sanitize ingest logs 676f6e2
    • ✨ Serve the featured image on reader cards 4878e82
    • ✨ Choose and download the featured image at ingest 4aae169
    • ✨ Add featured image candidate selection service 3f29fb2
    • 🔀 Merge branch 'fix/issue-34-refresh-robustness' e471b34
    • 🔀 Merge branch 'feat/issue-23-full-text' dbf5046
    • ⏪ Group on feed teasers instead of full text 10b3a49
    • 🐛 Degrade gracefully when the LLM invents aggregate ids 906f4ce
    • 🐛 Rewind full-text columns in the legacy-migration fixture 8af76f9
    • ✅ Tighten full-text test assertions 25e1e41
    • ✨ Render stored full text on the article page 5cafd64
    • ✨ Feed article full text to LLM aggregation and summaries 0cbda4a
    • ✨ Store article full text during feed ingestion a5a9d41
    • ➕ Add trafilatura, mistune and nh3 ceb153c
    • 🔀 Merge branch 'feat/issue-20-ignore-rules' dd1b0e1
    • 🔥 Remove unread-aggregate helper superseded by the list query aad5458
    • 🐛 Ignore empty ignore rules in matches_any_rule 23e5770
    • 🐛 Next-unread walk no longer revisits the current group b8043b5
    • ✨ Filter ignored aggregates from the reader and next-unread navigation 8aa0203
    • ✨ Add ignore rules setting with settings-page editor 826371a
    • ✨ Add ignore rules service 5c2ba14
    • 🔀 Merge branch 'feat/issue-22-wider-card-images' 2c0e562
    • ✨ Add card image width display setting 2c5156a
    • ✨ Widen card images via an --aggregate-image-width variable 4ea8d5e
    • 🔀 Merge branch 'feat/issue-21-image-persistence' 0a3d8f8
    • 🔒 Re-validate media redirects, harden Content-Length, filter image media 849e162
    • 🔒 Guard media downloads: URL validation, SVG exclusion, streaming size cap 9d82ec2
    • 🐛 Extract media from feed entry summaries and content fa98e83
    • ✨ Serve stored media from the reader ba13d81
    • ✨ Download article media to local storage bf2cab7
    • ✨ Add local file storage columns to media 1923a60
    • ✅ Add missing test for get_next_aggregate_with_unread 9a3fa36
    • 🔀 Merge branch 'feat/issue-5-keyboard-shortcuts' 857002c
    • ✨ Add g shortcut to open next unread group 3050d53
    • 🐛 Unread route redirects to index; Enter/Space activate focused controls 038cd18
    • ✨ Extend reader shortcuts to groups with unread toggle deff23c
    • 🔒 Restrict shortcut navigation to http/https URLs 0d12a82
    • ✨ Add setting to mark groups read when viewed 6400026
    • ✨ Add FreshRSS-style keyboard shortcuts 45c3310
    • 🔀 Merge branch 'feat/issue-8-display-settings-dark-mode' 1328fec
    • 🙈 Ignore the generated secret key file 9838f7e
    • 🐛 Tag and accent badges use on-accent text colour 8abedec
    • 🐛 Sweep hardcoded colours into theme variables for dark mode 7df4ecf
    • 🐛 Seed default user on web startup for user-keyed writes 48617e2
    • 🔧 Address WuMing review: settings robustness fixes b38705a
    • 🐛 Run database migrations on web app startup 47d1027
    • 🔒 Create secret key atomically with 0600, cover save_settings rollback 4c5805a
    • 🔒 Create secret key file with owner-only permissions 79e2d22
    • 🔒 Harden display settings: secret key, CSS breakout guard, atomic saves a442180
    • ✨ Add display settings: font family, base font size, custom CSS 9d9be10
    • ✨ Add user-settable theme: system, light, or dark 9e48d93
    • ✨ Add per-user settings key/value store ec34850
    • 🔀 Merge branch 'feat/issue-19-aggregate-article-ordering' 0b8ef10
    • ✅ Add deterministic tie-breaker and discriminating ordering tests c4ae5a1
    • ✨ Order aggregate articles newest-first e8df818
    • 🔀 Merge remote-tracking branch 'origin/feat/issue-18-read-unread' f0f30cc
    • ✅ Type mark-aggregate-read return, lock hide_read card links 217f412
    • 🐛 Preserve hide_read filter when marking aggregate as read 33b7873
    • ✨ Add mark-group-read and hide-read toggle to reader 3bfcb47
    • 🔀 Merge branch 'feat/issue-2-feed-user-agent' cdc5e00
    • ✨ Follow feed redirects manually, re-validating each hop through the SSRF guard bd78da3
    • ✅ Assert guard execution in allow-path tests, mock DNS in fetch tests a6674a5
    • ✨ Block SSRF-unsafe feed URLs (schemes, private/loopback/link-local hosts) 4b26273
    • 🐛 Address WuMing review: whitespace UA fallback, independent test literal, monkeypatch 224f2b6
    • 🐛 Treat empty YUNJIN_HTTP_USER_AGENT as unset 15952f7
    • ✅ Lock User-Agent default assertion and isolate env in test f9b1172
    • 🐛 Send browser-like User-Agent when fetching RSS feeds f669f0c
    • 🔀 Merge branch 'feat/issue-10-httpx2-migration' 7201df4
    • 📝 Update dependency summary in Roadmap.md c07eef8
    • ♻️ Migrate HTTP client from httpx to httpx2 99731f0
    • 🔀 Merge branch 'feat/issue-9-justfile' 3e8b960
    • fix: replace remaining cang references with yunjin in bumpversion config a2dd5de
    • fix: add transitive dependency constraints to resolve pysentry findings a9f7e8f
    • chore: remove per-release RELEASE_NOTES_*.md files (single Release-Notes.md from now on) c26fe8f
    • wrench: Adopt Marvin8 platform tooling improvements 37ac527
    • 📝 Polish pre-commit, justfile, noxfile, and pylock 451a2ae
    • wrench: Add calver parse/serialize to bumpversion config a850615
    • memo: Add justfile with release recipe 21a67b0
    • wrench: Replace uv-ship with bump-my-version in pyproject.toml d0971ef
    • 🔀 Merge branch 'feat/issue-1-llm-aggregation' 819d86a
    • 🚨 Fix ruff violations in test file and wsgi.py 71c49de
    • 📝 Improve aggregation prompt: group by individual news story not broad topic e6226d5
    • ✨ Replace embedding/DBSCAN aggregation with LLM-based pipeline 424e589
    • 🔀 Merge branch 'feat/issue-7-forgejo-actions-ci' cb10edb
    • 📝 Migrate to gitleaks git subcommand, clarify CI docs 5e08d4a
    • 🔧 Allowlist detect-secrets baseline from gitleaks scan b2f56de
    • 🐛 Fix gitleaks job scanning /tmp instead of repo, split install step d873323
    • 📝 Address WuMing review: clarify CI docs, add reader row-builder test 250fe3f
    • 👷 Add Forgejo Actions CI with checks, gitleaks, and WuMing review 3aaf400
    • 🔧 Add noxfile.py with ty, ruff, complexipy, and pytest sessions 5cac5f2
    • ♻️ Refactor reader index to fix type and complexity errors d730532
    • 🔀 Merge branch 'docs/issue-3-add-agents-md' fcc3f79
    • 📝 CHANGELOG.md is generated by the justfile release recipe e135123
    • 📝 Address review: httpx2 convention, just releases, global release-notes steps d9801f9
    • 📝 Replace LLM_SYSTEM_PROMPT.md with project AGENTS.md 2892ab8
    • Docs: Officially abandoning this project. Also commiting latest local work. c68b09b
    • Feat: Various improvements around tag extraction, getting full text of news if available in feed, adjust aggregation defaults. 007b778
    Downloads