feat: release-awareness — update banner + changelog page - #294
Conversation
There was a problem hiding this comment.
Important
Two things to address before merging: link URLs in the changelog renderer should be restricted to safe schemes, and the new release-check environment variables should be documented in services/api/.env.example.
Reviewed changes — adds a dismissible home-screen update banner and an Administration "What's New" changelog page, backed by new public /api/v1/version and /api/v1/releases endpoints that cache GitHub releases in Valkey.
- Add
VersionHandlerand public/api/v1/version+/api/v1/releasesroutes — queries GitHub releases for an upstream repo and optional fork, caches results, and performs lenient semver comparison for update detection. - Add
UpdateBannerto the home screen — conditionally rendered when an update is available and dismissible per release set vialocalStorage. - Add
/admin/changelogroute and page — lists recent releases with a minimal custom Markdown renderer. - Add
ReleaseConfigwith env-driven defaults —PACA_VERSION,RELEASE_UPSTREAM_REPO,RELEASE_FORK_REPO,RELEASE_CHECK_CACHE_TTL,RELEASE_CHECK_TIMEOUT. - Add i18n keys across all 9 locales for the banner, navigation, and changelog page.
ℹ️ No automated tests for VersionHandler
The new handler owns version parsing, cache read/write paths, and two GitHub-dependent public endpoints, but it ships without unit or handler tests. A few small tests for parseVersion/isNewer and the cache-miss/cache-hit branches would guard against regressions once release-check behavior becomes load-bearing.
Kimi K2 (free via Pullfrog for OSS) | 𝕏
|
Thanks for the awesome PR! 🙌 Could you please fix the CI failures and resolve the problems that pullfrog raised? If you're busy, just let me know—I'd be happy to jump in and help out to get this merged. Thanks again! |
|
I'm heading out on a trip early tomorrow morning and won't be back until the following Saturday! I'll have to look into it when I get back! |
|
Enjoy your trip! No worries at all. If you'd like me to finish this up, just say the word! |
cdfbfa6 to
eaec723
Compare
|
Thanks @pikann! 🙌 Addressed both points pullfrog raised:
Also fixed the lint failures (import ordering + array-index key) and re-committed under my GitHub account per your tip. CI should be green now — let me know if anything else is needed! |
Adds a 'new version available' banner on the home screen and an admin 'What's New' changelog page listing recent Paca releases from GitHub. - Backend: public GET /api/v1/version and /api/v1/releases, backed by a best-effort GitHub Releases client with Valkey caching. Config via ReleaseConfig (PACA_VERSION / RELEASE_UPSTREAM_REPO / RELEASE_FORK_REPO / cache TTL / timeout); all env-driven with safe defaults. - Frontend: UpdateBanner on home; changelog page under Administration (sidebar 'What's New'); version-api / changelog-api query hooks. - i18n: new keys (home.updateBanner, nav.changelog, admin.changelog) across all 9 locales. English stays the default. Everything is best-effort: if the GitHub API is unreachable the banner simply doesn't render and the page lists nothing. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
eaec723 to
5a1dd61
Compare
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes — the new commits address both prior review items: URL scheme validation in the changelog page's Markdown renderer, and documentation of the new release-check environment variables.
- Added
safeHrefURL validation to the changelog renderer — the custom Markdown parser now restricts rendered links tohttp:,https:, andmailto:schemes vianew URL()parsing; non-whitelisted URLs fall back to plain text. - Added release-check env vars to
services/api/.env.example—PACA_VERSION,RELEASE_UPSTREAM_REPO,RELEASE_FORK_REPO,RELEASE_CHECK_CACHE_TTL, andRELEASE_CHECK_TIMEOUTare now documented with inline comments.
DeepSeek Pro (free via Pullfrog for OSS) (Kimi K2 not used — the program covers this model; add its provider key to run your pick) | 𝕏
|
Good morning!
I'm back! I finished up here and followed your suggestion!
Thanks a lot.
Em seg., 20 de jul. de 2026 às 03:25, Hải Huỳnh ***@***.***>
escreveu:
… *pikann* left a comment (Paca-AI/paca#294)
<#294 (comment)>
Enjoy your trip! No worries at all. If you'd like me to finish this up,
just say the word!
Otherwise, if you handle it when you return, a quick tip: you might want
to commit using your GitHub account so you get officially listed as a
contributor. Have a wonderful time! ✨
—
Reply to this email directly, view it on GitHub
<#294?email_source=notifications&email_token=ANA4ZVVABE34KGG7IHSRBID5FW3ONA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTKMBRHEZTONRZHAZKM4TFMFZW63VGMF2XI2DPOKSWK5TFNZ2KYZTPN52GK4S7MNWGSY3L#issuecomment-5019376982>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ANA4ZVRVRG6UA7OPQXRCYBT5FW3ONAVCNFSNUABGKJSXA33TNF2G64TZHMYTCOBWHA2DENRSGI5US43TOVSTWNBZGIZTANBSG4ZDPILWAI>
.
You are receiving this because you authored the thread.Message ID:
***@***.***>
|
|
Hi @pikann! 👋 All set on my side:
pullfrog's latest pass reports "No new issues found." Ready for your review whenever you have a moment — thanks again for the guidance! 🙌 |
pikann
left a comment
There was a problem hiding this comment.
LGTM! Thank you for the contribution! 🚀

What
Adds two related, opt-in features around Paca releases:
Why
Self-hosters currently have no in-app way to know a new Paca version shipped, or what changed in it. This surfaces both without leaving the app.
Changes
GET /api/v1/versionandGET /api/v1/releases, backed by a best-effort GitHub Releases client with Valkey caching. NewReleaseConfig, env-driven with safe defaults:PACA_VERSION(defaultdev),RELEASE_UPSTREAM_REPO(defaultPaca-AI/paca),RELEASE_FORK_REPO(default empty), plus cache TTL and timeout.UpdateBanneron the home screen; a changelog page under Administration (sidebar item "What's New");version-api/changelog-apiquery hooks.home.updateBanner,nav.changelog,admin.changelog) across all 9 locales.Behavior / scope
PACA_VERSIONdefaults todev(unparseable), so the banner never shows on unversioned builds.Testing
go build ./...passes; frontendtsc -b --noEmitpasses.🤖 Generated with Claude Code