-
v0.7.0
StableAll checks were successfulreleased this
2026-07-07 15:47:16 +02:00 | 424 commits to main since this releaseChangelog
68c88d4Merge pull request 'Release v0.7.0' (#348) from release/v0.7.0 into main
ffc2e71Release v0.7.0
4222354Merge pull request 'feat(web): external-link icon on the Community nav button (BUNYIP-341)' (#347) from feat/BUNYIP-341-community-external-icon into main
880bf24feat(web): mark the Community nav link with an external-link icon (BUNYIP-341)
7729611Merge pull request 'feat(seed): embedded template library + import-by-name (PSA-57 part 1)' (#346) from feat/PSA-57-template-library into main
2183539feat(admin-web): first-run setup panel and empty-catalog prompt (PSA-57 part 2)
eb77d7efix(seed): declare owns on the minimal template and drop the orphan restricted app
5494c42Merge remote-tracking branch 'origin/main' into feat/PSA-57-template-library
c0c0ad4Merge pull request 'feat(seed): template-declared owns scope and password_env (PSA-56 part 1)' (#345) from feat/PSA-56-owns-scope-password-env into main
5c2384dfeat(seed): embedded template library + import-by-name (PSA-57 part 1)
355fcaffix(seed): reject empty/unset seed passwords and non-reserved owns.domains
a86a319feat(seed): reset scoped toowns+ retire bunyip-e2e-bootstrap to a template (PSA-56 part 2)
0cad1e8docs(seed): update the reserved-domain wording for theownsscope
3b97d6dfeat(seed): template-declaredownsscope andpassword_env(PSA-56 part 1)
2b581e8Merge pull request 'feat(seed): admin import/export API for seed data (PSA-52 part 1)' (#344) from feat/PSA-52-admin-import-export into main
624764bfix(seed): raise the import endpoint's payload cap above the web form limit
47b0a13feat(admin-web): seed data import/export page (PSA-52 part 2)
5ff29cdMerge pull request 'feat(seed): demo-msp template generator and committed template (PSA-51)' (#343) from feat/PSA-51-demo-seed-template into main
d926c6bfeat(seed): admin import/export API for seed data (PSA-52 part 1)
b0e451dfix(seed): keep demo admins off member tiers; note key-order determinism
d4589e3feat(seed): demo-msp template generator and committed template (PSA-51)
2540b81Merge pull request 'feat(seed): canonical seed-file schema, validation, and safety gates (PSA-50)' (#342) from feat/PSA-50-seed-import-foundation into main
e5b7211fix(seed): reject enum typos, require feedback author email, harden reset match
9dbfacbfeat(seed): DB loader andseedCLI for file-driven seed data
7e31d4ffeat(seed): canonical seed-file schema, validation, and safety gates
e52e779Merge pull request 'docs(e2e): document mail-sink secret format, de-personalize example (BUNYIP-272)' (#337) from docs/BUNYIP-272-e2e-mail-secret-format into main
f333c5fMerge branch 'main' into docs/BUNYIP-272-e2e-mail-secret-format
def173dMerge pull request 'feat(admin-web): rate-limit list view and reset action' (#341) from feat/BUNYIP-317-web-rate-limits into main
392a26bMerge branch 'main' into feat/BUNYIP-317-web-rate-limits
b1a16c1Merge pull request 'fix(web): stop Tailwind v4.3 container capping content below 1400px' (#340) from fix/BUNYIP-338-container-fills-viewport into main
2c75094fix(web): stop Tailwind v4.3 container capping content below 1400px
22fb567Merge pull request 'fix(web): show per-field registration errors and preserve inputs' (#339) from fix/BUNYIP-271-register-field-errors into main
b8806c8fix(web): show per-field registration errors and preserve inputs
b4de9afMerge branch 'main' into docs/BUNYIP-272-e2e-mail-secret-format
0b78723Merge pull request 'chore(scripts): dry-run-first staging test-account purge (BUNYIP-273)' (#336) from chore/BUNYIP-273-purge-test-accounts into main
5885130Merge branch 'main' into chore/BUNYIP-273-purge-test-accounts
c137c27Merge pull request 'fix(feedback): suppress admin notification and email for honeypot spam' (#338) from fix/BUNYIP-270-suppress-spam-feedback-admin-notification into main
3785315Merge branch 'main' into chore/BUNYIP-273-purge-test-accounts
e67c77efix(feedback): suppress admin notification and email for honeypot spam
7beea24docs(e2e): document the mail-sink secret format, de-personalize the example (BUNYIP-272)
c2ae942Merge pull request 'feat(web): add Bunyip favicon derived from hero art' (#335) from feat/BUNYIP-339-favicon into main
86cf01echore(scripts): add dry-run-first staging test-account purge (BUNYIP-273)
b545282fix(web): serve favicon.ico at the web root
9239431feat(web): add Bunyip favicon derived from hero art
bd18834Merge pull request 'fix(logging): attribute request logs to the external client IP' (#334) from fix/BUNYIP-328-log-external-client-ip into main
82f01bbfix(logging): attribute request logs to the external client IP
a003688Merge pull request 'fix(auth): normalize user emails to lowercase on write' (#333) from fix/BUNYIP-325-normalize-email-lowercase into main
314c5a0fix(auth): normalize user emails to lowercase on write
a28355dfeat(admin-web): rate-limit list view and reset action
01ea399Merge pull request 'feat(admin): reset an active rate limit for a user or key, audited' (#332) from feat/BUNYIP-316-admin-rate-limit-reset into main
a3a5050feat(admin): reset an active rate limit for a user or key, audited
b3b50fdMerge pull request 'feat(admin): list currently rate-limited entities, resolved to users' (#331) from feat/BUNYIP-315-admin-rate-limits-list into main
519789efeat(admin): list currently rate-limited entities, resolved to users
705b2daMerge pull request 'feat(admin-web): IP auto-bans list view and unban action' (#330) from feat/BUNYIP-320-web-ip-bans into main
cfed80efeat(admin-web): IP auto-bans list view and unban action
24e817bMerge pull request 'feat(admin): list active IP auto-bans and lift a ban, audited' (#329) from feat/BUNYIP-319-admin-ip-bans-api into main
7ed0905feat(admin): list active IP auto-bans and lift a ban, audited
f210303Merge pull request 'feat(auto-ban): add immediate unban and list_bans to AutoBanService' (#328) from feat/BUNYIP-318-autoban-unban-list into main
b2ffecbfeat(auto-ban): add immediate unban and list_bans to AutoBanService
a2bf39bMerge pull request 'fix(email): attach a Message-ID header to every outbound message' (#327) from fix/BUNYIP-334-message-id-header into main
846618cfix(email): attach a Message-ID header to every outbound message
1c70b22Merge pull request 'fix(startup): populate applications.webhook_url for mokosh from MOKOSH_WEBHOOK_URL' (#326) from fix/BUNYIP-336-mokosh-webhook-url-upsert into main
e3e797cfix(startup): populate applications.webhook_url for mokosh from MOKOSH_WEBHOOK_URL
8ec37c1Merge pull request 'fix(webhooks): sign outbound webhooks with a dedicated secret, not JWT_SECRET' (#324) from fix/BUNYIP-332-dedicated-webhook-signing-secret into main
9f02ec6ci: retrigger against rebased tip (post-BUNYIP-331 e2e fix)
055bcfbfix(webhooks): sign outbound webhooks with a dedicated secret, not JWT_SECRET
47d0ab0Merge pull request 'test(e2e): stop setInputValue hanging when BUNYIP-331 auto-submit detaches the input' (#325) from test/BUNYIP-331-setinputvalue-tolerate-detach into main
7ee4aa5Merge pull request 'feat(auth): permanently reserve soft-deleted emails against re-registration' (#320) from fix/BUNYIP-330-block-reregister-deleted-email into main
8e55dcetest(e2e): stop setInputValue hanging when BUNYIP-331 auto-submit detaches the input
ec861f5Merge pull request 'feat(2fa): auto-submit six-digit TOTP code fields (BUNYIP-331)' (#323) from feat/BUNYIP-331-2fa-autosubmit into main
ae82527test(e2e): avoid generating a near-expiry TOTP code in fillTotpStep
bd1634dfeat(2fa): auto-submit six-digit TOTP code fields
c09f312Merge pull request 'feat(admin): router-style in-app error log view' (#322) from feat/BUNYIP-327-admin-error-log-view into main
ec30ea0fix(api): log a rate-limit trip once per window, not per over-limit request
411abe6feat(admin): router-style in-app error log view (BUNYIP-327)
a7359daMerge pull request 'fix(web): route verification-resend feedback back to the originating page' (#321) from fix/BUNYIP-324-resend-verification-feedback into main
485a1earefactor(web): apply clamp_msg inside the shared banner helpers
3cbb3fbfix(web): route verification-resend feedback back to the page it came from
2073bf8test(e2e): fixme reregister-blocked while staging still runs pre-330 build
9a76556feat(auth): permanently reserve soft-deleted emails against re-registration
a22dd34Merge pull request 'fix(auth): logout clears cookies unconditionally, even when access_token is stale' (#319) from fix/BUNYIP-323-logout-clears-cookies-unconditionally into main
0b13c11Merge pull request 'fix(web): rotate at+jwt when /users/me reports a different role than the cookie's JWT' (#308) from fix/BUNYIP-308-rotate-jwt-on-role-mismatch into main
e5cb164fix(auth): logout clears cookies unconditionally, even when access_token is stale
567f443Merge pull request 'fix(web): show billing period end date instead of "N/A" on cancel control' (#318) from fix/BUNYIP-330 into main
4829c24fix(web): show billing period end date instead of "N/A" on cancel control
b9bea20Merge pull request 'docs(env): document BUNYIP_COMMUNITY_URL for deployers' (#316) from docs/BUNYIP-329-community-env-example into main
8e2f01edocs(env): document BUNYIP_COMMUNITY_URL in the .env examples
2098d3aMerge pull request 'feat(web): add authenticated Community (Let's Chat) button for members' (#315) from feat/BUNYIP-329-community-button into main
a8eadc8feat(web): move Community from a dashboard card to the left sidebar nav
1f1a292chore(compose): pass BUNYIP_COMMUNITY_URL through to bunyip-web
00eaf22style: elide needless lifetime on community_redirect_target
0de27d9feat(web): add Community button to the member dashboard
d14aa2afeat(web): add authenticated /community redirect into Let's Chat
d72c55cfeat(web): add BUNYIP_COMMUNITY_URL config for the Let's Chat instance
fa0e1d1Merge pull request 'feat(tiers): verify early-adopter/standard trials + add members-by-tier admin view' (#314) from feat/BUNYIP-291-membership-tiers into main
8a3af52style: satisfy rustfmt and clippy for the tier changes
373fd55refactor(membership): lock resubscribe-no-new-trial as a testable rule
283a36ffeat(admin-web): members-by-tier view with early-adopter occupancy
20af618feat(admin-api): add members-by-tier filter to the memberships endpoint
2dec578feat(membership): merge the two cancel buttons into one cancel control
8810c7dfeat(tiers): label the applied signup trial (early-adopter vs standard)
b2c52e9feat(domain): extract pure tier-selection and trial-days decisions
8414a2bMerge pull request 'fix(build): sync Cargo.lock to v0.6.0 so --locked image builds pass' (#313) from fix/bunyip-cargo-lock-0.6.0 into main
d479d23fix(build): sync Cargo.lock to workspace v0.6.0 so --locked image builds pass
0f9181bfix(web): rotate at+jwt when /users/me reports a different role than the cookie's JWTDownloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.6.0
StableSome checks failedreleased this
2026-07-01 18:49:22 +02:00 | 529 commits to main since this releaseChangelog
ae25ed1Merge pull request 'Release v0.6.0' (#310) from release/v0.6.0 into main
6d73e6aMerge branch 'main' into release/v0.6.0
f02c3c1Merge pull request 'feat(web): surface 429 rate limiting with standard retry wording' (#312) from feat/BUNYIP-314-surface-429-retry-wording into main
3d8aa06feat(web): surface 429 rate limiting with standard retry wording
75e84a0Merge branch 'main' into release/v0.6.0
a4516a6Merge pull request 'fix(auth): compute accurate retry_after for email resend limiters' (#311) from feat/BUNYIP-313-accurate-retry-after into main
3c02302fix(auth): compute accurate retry_after for email resend limiters
b93c5c3Merge branch 'main' into release/v0.6.0
1f026dbMerge pull request 'feat(email): log when an email is queued for delivery' (#309) from feat/BUNYIP-309-log-email-queued into main
0bfc9a6Release v0.6.0
899e102feat(email): log when an email is queued for delivery
368a686Merge pull request 'fix(ci): sniff-test bunyip-web/Cargo.toml for axum before publishing :latest' (#306) from fix/BUNYIP-299-build-web-axum-guard into main
bb12002fix(e2e): skip Playwright suite when hub soft-probe reports hub not-live on pull_request
728a7eafix(e2e): soften hub /healthz probe on pull_request so outage-fix PRs are not deadlocked
bf63945fix(ci): sniff-test bunyip-web/Cargo.toml for axum before publishing :latest
aea8facMerge pull request 'fix(auth): await welcome email inline so it lands before verify on signup' (#304) from fix/BUNYIP-296-welcome-before-verify into main
641f8b3Merge pull request 'feat(emails): rebrand onboarding + recovery emails to bunyip-web tokens' (#303) from feat/BUNYIP-288-email-rebrand into main
79a46d6Merge pull request 'ci: add migration-immutability guard for sqlx checksum drift' (#301) from feat/BUNYIP-293-migration-immutability-guard into main
64e8e1fMerge pull request 'chore(docs): consolidate markdown under docs/ + distill audits into changelog (PSA-48)' (#305) from chore/PSA-48-docs-sanitize into main
6d5d4b9chore(docs): consolidate markdown under docs/, distill audits + handoff into changelog
f9ca921fix(auth): await welcome email inline so it lands before verify on signup
a6503bcfeat(emails): rebrand onboarding + recovery emails to bunyip-web tokens
6b52270Merge pull request 'fix(web): defer login head scripts to stop the chromium credential-fill race (BUNYIP-294)' (#302) from fix/BUNYIP-294-defer-login-head-scripts into main
e824fecfix(web): defer login head scripts to stop the chromium credential-fill race
ee6b204ci: add migration-immutability guard for sqlx checksum drift
ac7b5b2Merge pull request 'fix(web): label download affordance by surface + center its dialog' (#300) from fix/BUNYIP-289-app-card-oci-label-and-dialog-center into main
c52e086fix(web): label download affordance by surface + center its dialog
5b08d55Merge pull request 'feat(justfile): add create-release-container for toolchain-less boxes' (#299) from feat/BUNYIP-292-create-release-container into main
ee1df09feat(justfile): add create-release-container for toolchain-less boxesDownloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.5.0
Stablereleased this
2026-06-30 16:20:01 +02:00 | 558 commits to main since this releaseChangelog
99087e7Merge pull request 'Release v0.5.0' (#298) from release/v0.5.0 into main
d96d288Release v0.5.0
70dde96Merge pull request 'fix(e2e): send Origin on /settings/profile POST so BUNYIP-259 CSRF middleware accepts it' (#296) from fix/BUNYIP-286-e2e-profile-csrf-origin into main
4ff6c73Merge pull request 'feat(web): per-field show/hide password toggle on signup form' (#294) from feat/BUNYIP-282-signup-password-toggle into main
57b99a9Merge pull request 'fix(web): re-evaluate signup submit gate when async breach check resolves' (#295) from fix/BUNYIP-283-signup-submit-gate-breach-async into main
5f080a9refactor(e2e): extract bunyip-web POST Origin header into lib/csrf helper
017e359Merge remote-tracking branch 'origin/main' into fix/BUNYIP-283-signup-submit-gate-breach-async
ed2fee7Merge remote-tracking branch 'origin/main' into feat/BUNYIP-282-signup-password-toggle
e5a68f8Merge pull request 'fix(e2e): send Origin on profile POST so CSRF middleware admits it' (#297) from fix/BUNYIP-284-e2e-profile-csrf-origin into main
6d6ed38fix(e2e): send Origin on profile POST so CSRF middleware admits it
0f76514fix(web): re-evaluate signup submit gate when async breach check resolves
fbc3c93feat(web): per-field show/hide password toggle on signup form
167a2f4Merge pull request 'fix(oidc): persist original auth_time on refresh family; re-intersect scope at rotation' (#287) from fix/BUNYIP-262-refresh-auth-time-scope into main
4fa6bbdMerge remote-tracking branch 'origin/main' into fix/BUNYIP-262-refresh-auth-time-scope
2404e98Merge pull request 'fix(e2e): harden magic-link mail wait with timeout headroom and one re-request' (#293) from fix/BUNYIP-279-e2e-magic-link-mail-wait-headroom into main
91d9a83Merge remote-tracking branch 'origin/main' into fix/BUNYIP-262-refresh-auth-time-scope
0858a3fMerge pull request 'fix(oidc): enforce allowed_grant_types + token_endpoint_auth_method at /oauth2/token' (#290) from fix/BUNYIP-254-token-endpoint-enforcement into main
2186519Merge pull request 'fix(web): Origin / Referer CSRF defense on every state-changing POST' (#291) from fix/BUNYIP-259-csrf-synchronizer-token into main
ef27991Merge pull request 'fix(oidc): thread real acr/amr through op_session creation + refresh family' (#288) from fix/BUNYIP-257-acr-amr-threading into main
29fc8ebMerge pull request 'fix(oidc): allowlist RP origins on CSP so Authorize completes (BUNYIP-244)' (#276) from feat/BUNYIP-244-csp-allowlist-origins into main
85f9595fix(e2e): harden magic-link mail wait with timeout headroom and one re-request
50978e6Merge remote-tracking branch 'origin/main' into fix/BUNYIP-257-acr-amr-threading
889733bMerge pull request 'fix(oidc): server-side intersect consent scopes; refuse to revive revoked entitlement rows' (#292) from fix/BUNYIP-261-consent-scope-smuggling into main
f660cbbMerge pull request 'fix(auth): login hardening cluster (pre-login op_session revoke, multi-keyed rate limit, 2FA cookie hygiene)' (#289) from fix/BUNYIP-255-login-hardening into main
1c6b8a6Merge pull request 'feat(auth): server-side HIBP backstop on register, password reset, and password change' (#282) from fix/BUNYIP-253-server-hibp-backstop into main
25b8254Merge pull request 'fix(e2e): retry password-reset confirm past the per-IP rate limit' (#286) from fix/BUNYIP-278-e2e-reset-confirm-rate-limit-retry into main
6cff735Merge pull request 'fix(oidc): per-IP rate limit on /oauth2/{authorize,token,userinfo,revoke}' (#281) from fix/BUNYIP-264-oauth-rate-limiters into main
7d26329Merge pull request 'fix(log): scrub PII + secret-adjacent data from auth + stripe log lines' (#280) from fix/BUNYIP-265-log-hygiene into main
355fab7Merge pull request 'fix(deploy): require OIDC signing-key vars; refuse to boot under a dev-* kid in prod' (#275) from fix/BUNYIP-258-drop-dev-signing-key-defaults into main
38a2295Merge pull request 'feat(web): app-wide service-unavailable banner when bunyip-api is down (BUNYIP-243)' (#278) from feat/BUNYIP-243-server-down-banner into main
1e77944fix(e2e): retry password-reset confirm past the per-IP rate limit
71831f9fix(oidc): server-side intersect consent scopes; refuse to revive revoked entitlement rows
25fe79cfix(web): Origin / Referer CSRF defense on every state-changing POST
5efe927fix(oidc): enforce allowed_grant_types + token_endpoint_auth_method at /oauth2/token
5533b0eMerge pull request 'fix(e2e): give hub-login setup backoff headroom for 2FA rate limit' (#285) from fix/BUNYIP-276-e2e-setup-2fa-backoff-headroom into main
b098dc7fix(auth): login hardening cluster (pre-login op_session revoke, multi-keyed rate limit, 2FA cookie hygiene)
2ad1d46Merge branch 'main' into feat/BUNYIP-243-server-down-banner
02907bafix(oidc): thread real acr/amr through op_session creation + refresh family
d55b601fix(oidc): persist original auth_time on refresh family; re-intersect scope at rotation
2fca2edMerge branch 'main' into feat/BUNYIP-244-csp-allowlist-origins
e46bfe9Merge pull request 'fix(auth): invalidate prior pending reset tokens when a new reset is requested' (#284) from fix/BUNYIP-256-cap-pending-reset-tokens into main
a784777Merge branch 'main' into feat/BUNYIP-244-csp-allowlist-origins
6f29641Merge pull request 'fix(auth): host-scope the OP session cookie by default; opt-in for cross-subdomain sharing' (#283) from fix/BUNYIP-266-host-only-op-session-cookie into main
cc9eb1efix(e2e): give hub-login setup backoff headroom for 2FA rate limit
f15ff02Merge pull request 'fix(oidc): scope /oauth2/logout post_logout_redirect_uri to the id_token_hint's client' (#279) from fix/BUNYIP-260-logout-id-token-hint-compliance into main
6fd9951Merge branch 'main' into feat/BUNYIP-244-csp-allowlist-origins
f2f51c2Merge branch 'main' into feat/BUNYIP-243-server-down-banner
63705b8Merge pull request 'fix(oidc): constant-time PKCE code_challenge compare; validate nbf on at+jwt verifier' (#274) from fix/BUNYIP-263-pkce-constant-time-nbf into main
be2a911ci: re-trigger checks (E2E staging flake, not a code change)
6c69b06chore(deps): bump dunite to pick up CspConfig (BUNYIP-244)
b774b14Merge branch 'main' into feat/BUNYIP-244-csp-allowlist-origins
e294507feat(web): app-wide service-unavailable banner when bunyip-api is down
97a7f2ffeat(auth): server-side HIBP backstop on register, password reset, and password change
791c6b4fix(oidc): per-IP rate limit on /oauth2/{authorize,token,userinfo,revoke}
5ff93fbMerge pull request 'fix(e2e): tolerate login rate limit and harden mail wait' (#277) from fix/BUNYIP-267-e2e-login-backoff-mail-hardening into main
171fa03fix(log): scrub PII + secret-adjacent data from auth + stripe log lines
3f44c35fix(oidc): scope /oauth2/logout post_logout_redirect_uri to the id_token_hint's client
7c5f280Merge pull request 'feat(oidc): pin at+jwt audience on the Resource-Server verifier path' (#273) from fix/BUNYIP-252-at-jwt-audience-binding into main
071b8d8fix(e2e): tolerate login rate limit and harden mail wait
6aa8ff5fix(auth): invalidate prior pending reset tokens when a new reset is requested
04feaf0fix(auth): host-scope the OP session cookie by default; opt-in for cross-subdomain sharing
a808fd5fix(oidc): allowlist RP origins on CSP so Authorize completes
611df32fix(deploy): require OIDC signing-key vars; refuse to boot under a dev-* kid in prod
13ee3c1fix(oidc): constant-time PKCE code_challenge compare; validate nbf on at+jwt verifier
9203617feat(oidc): pin at+jwt audience on the Resource-Server verifier path
d82cf99Merge pull request 'feat(auth): clarify breach-row label and polish the password strip' (#272) from feat/BUNYIP-240-inline-password-feedback into main
1652907feat(auth): clarify breach-row label and polish the password strip
bfa7512Merge pull request 'fix(web): allow the OIDC login redirect chain in form-action CSP' (#271) from fix/bunyip-csp-form-action-oidc into main
4eb5d8afix(web): allow the OIDC login redirect chain in form-action CSP
bc15cb9Merge pull request 'fix(e2e): harden hard_delete against non-cascade user FKs (BUNYIP-248)' (#270) from fix/bunyip-248-fk-hardening into main
e5a36c4fix(e2e): harden hard_delete against non-cascade user FKs (BUNYIP-248)
c133f44Merge pull request 'docs(e2e): Forgejo Actions secrets + variables reference (BUNYIP-247)' (#269) from docs/bunyip-247-forgejo-secrets-readme into main
92ec6a1Merge branch 'main' into docs/bunyip-247-forgejo-secrets-readme
0432bc4Merge pull request 'fix(e2e): hard-delete disposable accounts after each test (BUNYIP-246)' (#268) from fix/bunyip-246-e2e-account-hard-delete into main
4de5c4bdocs(e2e): authoritative Forgejo Actions secrets + variables reference
e15bc19docs: note hard_delete non-cascade FK limitation (review follow-up)
9c7a38cfix(e2e): hard-delete disposable accounts after each test + reaper
902db91Merge pull request 'fix(ci): disable provenance attestation in docker check to avoid manifest-tag collision' (#267) from fix/BUNYIP-241-disable-provenance-in-docker-check into main
f1cf1a8Merge pull request 'fix(deploy): require BUNYIP_API_IMAGE + BUNYIP_WEB_IMAGE, drop :latest fallback (BUNYIP-237)' (#266) from fix/BUNYIP-237-compose-fail-loud-on-missing-image into main
4cf36a4Merge pull request 'feat(auth): live per-rule password feedback + breach check on /register + /reset-password (BUNYIP-240)' (#265) from feat/BUNYIP-240-inline-password-feedback into main
3c4074eMerge pull request 'fix(ci): close shell-injection vector via head.ref in create-release.yml (BUNYIP-236)' (#263) from fix/BUNYIP-236-create-release-injection into main
d3882cefix(ci): disable provenance attestation in docker check to avoid manifest-tag collision
0e7ba70merge: resolve security.rs conflict with BUNYIP-235 (form-action for Stripe)
281d85bfix(ci): disable provenance attestation in docker check to avoid manifest-tag collision
f2bc132feat(auth): live per-rule password feedback + breach check on /register + /reset-password (BUNYIP-240)
872a7dcMerge pull request 'fix(csp): allow Stripe-hosted destinations in bunyip-web form-action (BUNYIP-235)' (#264) from fix/BUNYIP-235-bunyip-web-csp-stripe-form-action into main
0ca52f4fix(deploy): require BUNYIP_API_IMAGE + BUNYIP_WEB_IMAGE, drop :latest fallback (BUNYIP-237)
a26fc8cfix(csp): allow Stripe-hosted destinations in bunyip-web form-action (BUNYIP-235)
11332b8fix(ci): close shell-injection vector via head.ref in create-release.yml (BUNYIP-236)
fa0102aMerge pull request 'chore(oidc): trace consent grant/gate decisions to diagnose the first-time consent loop (BUNYIP-234)' (#262) from fix/BUNYIP-234-consent-loop-diagnostics into main
2a7f693chore(oidc): trace consent grant/gate decisions to diagnose the first-time consent loop (BUNYIP-234)
f11d774Merge pull request 'fix(launcher): close the cross-browser stale-JWT gap on the app launcher (BUNYIP-229)' (#256) from fix/BUNYIP-229-stale-jwt-cross-browser into main
f4b43c4Merge pull request 'docs(billing): mark the two open items resolved (decision-complete)' (#261) from docs/billing-m1-plan into main
b052cb2Merge branch 'main' into docs/billing-m1-plan
08cc91cMerge pull request 'Derive OCI publish mode from trigger for bunyip-api and bunyip-web' (#258) from fix/GOV-15-twin-trigger-publish-mode into main
fcde93dMerge branch 'main' into fix/GOV-15-twin-trigger-publish-mode
9a432adMerge pull request 'fix(web): add Content-Security-Policy header to bunyip-web responses (BUNYIP-232)' (#260) from fix/bunyip-232-web-csp-header into main
c03fff7Merge branch 'main' into fix/GOV-15-twin-trigger-publish-mode
d23d469fix(web): add Content-Security-Policy header to bunyip-web responses (BUNYIP-232)
72c871bMerge pull request 'fix(oidc): atomic code redemption, cap refresh TTL, drop dead client fields (BUNYIP-73)' (#252) from fix/bunyip-73-oidc-provider-hardening into main
601d411Merge remote-tracking branch 'origin/main' into fix/bunyip-73-oidc-provider-hardening
4d70d70Merge pull request 'chore(ci): clear stale builder image before docker check (BUNYIP-231)' (#259) from chore/checks-workflow-9c0ac500 into main
a6a6cf9Merge pull request 'Use the new illustrated Bunyip mascot on the landing hero' (#245) from feat/BUNYIP-216-landing-mascot into main
a271506Merge branch 'main' into feat/BUNYIP-216-landing-mascot
9fec28fMerge branch 'main' into fix/GOV-15-twin-trigger-publish-mode
7acffe6Merge pull request 'ci(check): build check-docker to cacheonly instead of exporting a tagged image' (#257) from chore/BUNYIP-227-check-docker-cacheonly into main
030e470Merge branch 'main' into chore/BUNYIP-227-check-docker-cacheonly
d141276chore(ci): clear stale builder image before docker check (BUNYIP-231)
b5bc5adfix(ci): derive OCI publish mode from trigger, not git describe
ec7e1a4Merge branch 'main' into feat/BUNYIP-216-landing-mascot
9c0ac50Merge pull request 'fix(2fa): widen recovery code entropy to 80 bits (BUNYIP-202)' (#244) from fix/bunyip-202-recovery-code-entropy into main
8e001eaMerge branch 'main' into fix/bunyip-202-recovery-code-entropy
6aff69aMerge pull request 'fix(oidc): parse loopback redirect_uri host instead of string-prefix (BUNYIP-106)' (#242) from fix/bunyip-106-loopback-redirect-uri-parse into main
023150cci(check): build check-docker to cacheonly, drop tagged image export
383b6aefix(launcher): close the cross-browser stale-JWT gap on the app launcher (BUNYIP-229)
2c06512Merge branch 'main' into fix/bunyip-106-loopback-redirect-uri-parse
4518568Merge pull request 'fix(oidc): make authorization code redemption atomic (BUNYIP-199)' (#238) from fix/bunyip-199-atomic-code-redemption into main
bb01200Merge branch 'main' into fix/bunyip-199-atomic-code-redemption
2947d0eMerge pull request 'fix(web): rotate JWT after tier-grant so the launcher unlocks without log-out (BUNYIP-226)' (#255) from fix/BUNYIP-226-rotate-jwt-after-tier-grant into main
c3975f1Merge pull request 'refactor(oci): de-duplicate registry admin check, sha256 fallback, dead re-exports (BUNYIP-81)' (#234) from chore/bunyip-81-oci-registry-dedup into main
442c67eMerge branch 'main' into chore/bunyip-81-oci-registry-dedup
f4b71d5fix(web): rotate JWT after tier-grant so the launcher unlocks without log-out (BUNYIP-226)
7d74272Merge pull request 'fix(billing): handle sibling Stripe subs on cancel + gate Welcome page on real status (BUNYIP-225)' (#254) from fix/BUNYIP-225-hardening-resub-cancel-race into main
32651acMerge pull request 'ci(oci): switch OCI build cache to type=gha + per-image scope (GOV-20, GOV-21)' (#240) from ci/GOV-20-bunyip-gha-build-cache into main
b1bb4c9Merge branch 'main' into ci/GOV-20-bunyip-gha-build-cache
a9a6dd0fix(billing): handle sibling Stripe subs on cancel + gate Welcome page on real status (BUNYIP-225)
b645a85Merge pull request 'fix(consent): render the OIDC consent page through the public auth shell (BUNYIP-223)' (#253) from fix/BUNYIP-223-consent-page-styled-shell into main
34184d7fix(consent): render the OIDC consent page through the public auth shell (BUNYIP-223)
dea159bMerge pull request 'feat(auth): grant initial trial only after BOTH email verified AND name saved (BUNYIP-221)' (#250) from feat/BUNYIP-221-trial-after-onboarding into main
a7ebf03fix(oidc): atomic code redemption, cap refresh TTL, drop dead client fields (BUNYIP-73)
442f4cdMerge pull request 'feat(billing): force card-only Stripe Checkout, disable Pay with Link (BUNYIP-208)' (#251) from feat/bunyip-208-checkout-card-only into main
834130cfeat(billing): force card-only Stripe Checkout, disable Pay with Link (BUNYIP-208)
746f5f3Merge pull request 'test(stripe): regression-guard webhook idempotency fence ordering (BUNYIP-210)' (#249) from test/bunyip-210-webhook-fence-regression into main
f3136bafeat(auth): grant initial trial only after BOTH email verified AND name saved (BUNYIP-221)
69f1127test(stripe): regression-guard webhook idempotency fence ordering (BUNYIP-210)
b74693eMerge pull request 'feat(billing): grant 30-day signup free trial via Stripe Checkout (BUNYIP-209)' (#248) from feat/bunyip-209-signup-trial-period into main
02243cefeat(billing): grant 30-day signup free trial via Stripe Checkout (BUNYIP-209)
a4b32a9Merge pull request 'fix(email): suppress login/reset tokens in disabled-email logs (BUNYIP-204)' (#247) from fix/bunyip-204-suppress-token-logging into main
6f2483bfix(email): suppress login/reset tokens in disabled-email logs (BUNYIP-204)
900a57bMerge pull request 'fix(stripe): fail closed when webhook secret is unset (BUNYIP-203)' (#246) from fix/bunyip-203-stripe-webhook-fail-closed into main
be6e61afix(stripe): fail closed when webhook secret is unset (BUNYIP-203)
5e5f125feat(landing): use the new illustrated mascot on the landing hero
9a82d78fix(2fa): widen recovery code entropy to 80 bits (BUNYIP-202)
1435c0eMerge pull request 'fix(2fa): per-account verify lockout and tighter TOTP skew (BUNYIP-201)' (#243) from fix/bunyip-201-2fa-per-account-lockout into main
14c46f0fix(2fa): per-account verify lockout and tighter TOTP skew (BUNYIP-201)
8267266fix(oidc): parse loopback redirect_uri host instead of string-prefix (BUNYIP-106)
51cf951Merge pull request 'fix(oidc): re-validate tenant assignment on refresh rotation (BUNYIP-200)' (#241) from fix/bunyip-200-revalidate-tenant-on-refresh-rotation into main
736cd77fix(oidc): re-validate tenant assignment on refresh rotation (BUNYIP-200)
d11e981Merge pull request 'fix(domain): count unverified holders in tier slot usage (BUNYIP-105)' (#239) from fix/bunyip-105-count-unverified-tier-slots into main
4145c35ci(oci): switch build cache to gha with per-image scope
87deecdfix(domain): count unverified holders in tier slot usage (BUNYIP-105)
e4a9e3efix(oidc): make authorization code redemption atomic (BUNYIP-199)
e8fe39dMerge pull request 'fix(stripe): lock the real checkout price from the Stripe API (BUNYIP-215)' (#237) from fix/bunyip-215-pricelock-line-items into main
8928490Merge pull request 'fix(config): decouple dotenv load from parsing so defaults test is deterministic (BUNYIP-102)' (#236) from fix/bunyip-102-config-dotenv-decouple into main
541c9adfix(stripe): lock the real checkout price from the Stripe API (BUNYIP-215)
57b41c9fix(config): decouple dotenv load from parsing so defaults test is deterministic (BUNYIP-102)
25c7d9eMerge pull request 'fix(web): add missing user-cog icon for Profile card (BUNYIP-171)' (#235) from fix/bunyip-171-profile-icon into main
c168d46fix(web): add missing user-cog icon for Profile card (BUNYIP-171)
0176e55refactor(oci): de-duplicate registry admin check, sha256 fallback, dead re-exports (BUNYIP-81)
cf57fdbMerge pull request 'fix(stripe): finalize webhook idempotency after handler runs (BUNYIP-210)' (#233) from fix/bunyip-210-webhook-idempotency-ordering into main
f25684eMerge pull request 'chore(infra): harden prod images, compose, CI, and dep hygiene (BUNYIP-80)' (#232) from chore/bunyip-80-harden-images-compose-ci into main
711fc54fix(stripe): finalize webhook idempotency after handler runs (BUNYIP-210)
649bf9bchore(infra): harden prod images, compose, CI, and dep hygiene (BUNYIP-80)
1bfb826Merge pull request 'feat(account): cascade account delete to connected apps (BUNYIP-211)' (#231) from feat/bunyip-211-cascade-account-delete into main
2589b1dfeat(account): cascade account delete to connected apps (BUNYIP-211)
e46b820Merge pull request 'fix(oidc): close open redirect, scope leak, client auth, dead code (BUNYIP-74)' (#230) from fix/bunyip-74-oidc-handlers into main
fba7df7fix(oidc): close open redirect, scope leak, client auth, dead code (BUNYIP-74)
8b14a24Merge pull request 'fix(web): collect TOTP code in disable-2FA form (BUNYIP-212)' (#229) from fix/bunyip-212-disable-2fa-totp-code into main
42d2621fix(web): collect TOTP code in disable-2FA form (BUNYIP-212)
81274e2Merge pull request 'feat(web): forced post-registration onboarding (BUNYIP-206)' (#228) from feat/bunyip-206-onboarding-page into main
5fa2780Merge pull request 'test(e2e): un-fixme subscribe + billing-portal behind a staging-Stripe gate (BUNYIP-151)' (#227) from feat/bunyip-151-billing-specs-stripe-gate into main
ebb001dfeat(web): forced post-registration onboarding (name + email verification)
83dece6test(e2e): un-fixme subscribe + billing-portal behind a staging-Stripe gate (BUNYIP-151)
8f3e3d7Merge pull request 'fix(e2e): verify the disposable account before change-email (BUNYIP-150)' (#226) from fix/bunyip-150-change-email-verify-first into main
c171761fix(e2e): verify the disposable account before change-email (BUNYIP-150)
c1100c5Merge pull request 'fix(e2e): exempt non-prod registration cap + force JMAP public origin (BUNYIP-150)' (#225) from fix/bunyip-150-register-nonprod-jmap-origin into main
5cb62c8fix(e2e): exempt non-prod registration cap + force JMAP public origin (BUNYIP-150)
e214f40Merge pull request 'test(e2e): mail-sink helper + un-fixme reset/magic-link/change-email (BUNYIP-150)' (#220) from feat/bunyip-150-e2e-mail-sink into main
4085b4ctest(e2e): use nate@a8n.run sink mailbox + guard destroy to exact subaddress (BUNYIP-150)
f1e26detest(e2e): read the mail sink via Stalwart JMAP instead of Mailpit (BUNYIP-150)
e95ce8dtest(e2e): mail-sink helper + un-fixme reset/magic-link/change-email (BUNYIP-150)
ada9875docs(billing): mark the two open items resolved (decision-complete)Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.4.1
Stablereleased this
2026-06-24 18:28:16 +02:00 | 740 commits to main since this releaseChangelog
c6e8a97Merge pull request 'Release v0.4.1' (#218) from release/v0.4.1 into main
34b7cbcRelease v0.4.1
123345eMerge pull request 'fix(oidc): reconcile lets-chat client per-environment (LC-448)' (#217) from fix/LC-448-letschat-oidc-env-reconcile into main
6355e6ffix(oidc): reconcile lets-chat client per-environment (LC-448)
f71fda0Merge pull request 'fix(web): use public api origin for browser-side SSE subscriber' (#216) from fix/BUNYIP-192-sse-public-origin into main
fad749cfix(web): use public api origin for browser-side SSE subscriber
952c939Merge pull request 'fix/BUNYIP-191-humanise-generic-internal-error' (#215) from fix/BUNYIP-191-humanise-generic-internal-error into main
26fa792fix(membership): map dunite generic internal-error to actionable copy (BUNYIP-191)Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.4.0
Stablereleased this
2026-06-24 10:53:56 +02:00 | 748 commits to main since this releaseChangelog
4101161Merge pull request 'Release v0.4.0' (#214) from release/v0.4.0 into main
9cb932eRelease v0.4.0
791147eMerge pull request 'feat(stripe): auto-bootstrap default product on first config save (BUNYIP-189)' (#212) from feat/BUNYIP-189-auto-bootstrap-product into main
4ad0524Merge pull request 'fix(membership): surface checkout errors as a flash banner (BUNYIP-187)' (#211) from fix/BUNYIP-187-surface-checkout-errors into main
a9cc08cMerge pull request 'fix/BUNYIP-188-cors-origin-comma-list' (#210) from fix/BUNYIP-188-cors-origin-comma-list into main
fa1cb5afeat(stripe): auto-bootstrap default product on first config save (BUNYIP-189)
46e90e6fix(membership): surface checkout errors as a flash banner (BUNYIP-187)
7415facchore: cargo fmt
ca54fb9fix(stripe): split CORS_ORIGIN on comma for success_url fallback (BUNYIP-188)
ad06e7aMerge pull request 'docs(stripe): document the app-tagged product/price checkout prerequisite (BUNYIP-175)' (#209) from docs/BUNYIP-175-tagged-product-step into main
8f69fc1docs(stripe): document the app-tagged product/price checkout prerequisite (BUNYIP-175)
1410ffaMerge pull request 'fix(dev): pass Stripe checkout redirect URLs to the api on dev-sso (BUNYIP-175)' (#208) from fix/BUNYIP-175-dev-sso-checkout-urls into main
ff970ccfix(dev): pass STRIPE_SUCCESS_URL + STRIPE_CANCEL_URL to api (BUNYIP-175)
44b9befMerge pull request 'fix(dev): pass Stripe test-mode keys to the api container (BUNYIP-175)' (#207) from fix/BUNYIP-175-compose-pass-stripe-keys into main
85052b1fix(dev): pass STRIPE_SECRET_KEY + STRIPE_WEBHOOK_SECRET to api (BUNYIP-175)
3f8a9ddMerge pull request 'docs(stripe): document test-mode subscription testing (BUNYIP-175)' (#206) from docs/BUNYIP-175-stripe-test-mode into main
b5c0ab7docs(stripe): document test-mode subscription testing (BUNYIP-175)
5bb6e28Merge pull request 'fix(web): 404 fallback returns a real 404, not a soft-404 200 (BUNYIP-186)' (#205) from fix/BUNYIP-186-not-found-404-status into main
ad81fa8fix(web): 404 fallback returns a real 404, not a soft-404 200
af0892bMerge pull request 'fix(e2e): hard + body-validate the hub /healthz probe (BUNYIP-185)' (#204) from fix/BUNYIP-185-hub-healthz-hard-probe into main
3d9acc6fix(e2e): hard + body-validate the hub /healthz probe (BUNYIP-185)
12012f3Merge pull request 'feat(e2e): /e2e-bootstrapped readiness endpoint + skip-when-unseeded gate (BUNYIP-163)' (#203) from feat/BUNYIP-163-e2e-bootstrapped-gate into main
b1475e1feat(e2e): /e2e-bootstrapped readiness endpoint + skip-when-unseeded gate
b1c8bffMerge pull request 'feat(web): add /healthz liveness endpoint for e2e + monitoring (BUNYIP-149)' (#202) from feat/BUNYIP-149-web-healthz into main
2432d8efeat(web): add /healthz liveness endpoint + wire it into the e2e gate
4c8216aMerge pull request 'feat(settings): paginate the sessions and trusted-device lists (BUNYIP-177)' (#200) from feat/BUNYIP-177-paginate-sessions-devices into main
bf49cbaMerge origin/main into feat/BUNYIP-177-paginate-sessions-devices
3fa1357Merge pull request 'test(e2e): accept both paginated and legacy session-list shapes' (#201) from fix/BUNYIP-183-sessions-e2e-shape-transition into main
96c1534fix(settings): widen pagination offset to i64 + un-garble the pager doc
61ee862test(e2e): accept both paginated and legacy session-list shapes
f6637ddfeat(settings): paginate the sessions and trusted-device lists
8472e29Merge pull request 'test(e2e): verify the /settings renderer fix by un-fixme'ing profile + sessions (BUNYIP-176)' (#198) from fix/BUNYIP-176-settings-ci-crash into main
ff0c04cfix(e2e): unwrap the success envelope in the sessions assertion
427084efix(e2e): assert profile + sessions via request-context, not a /settings render
9472ebdfix(e2e): block the FontAwesome kit on /settings (kills the headless renderer)
0c0b370test(e2e): un-fixme profile + sessions to verify the /settings renderer fix
5a811bcMerge pull request 'fix/BUNYIP-148-serial-project-ordering' (#197) from fix/BUNYIP-148-serial-project-ordering into main
2c0ad13chore(e2e): fixme profile + sessions until /settings renderer crash is rooted (BUNYIP-148)
9c56dcffix(e2e): --disable-gpu + --no-sandbox to stop the /settings renderer crash (BUNYIP-148)
6f7ba14fix(e2e): goto /settings with waitUntil:'commit' so the load-stage race fails diagnosably (BUNYIP-148)
9c0aa9ffix(e2e): serialise account-ui before api to stop the project-switch chromium relaunch (BUNYIP-148)
a865c7echore(e2e): TEMP pw:browser diagnostic to capture the /settings browser-process death reason
dadf184fix(e2e): run full chromium (channel: chromium), not headless-shell, for heavy pages
0407e4ffix(e2e): --disable-dev-shm-usage (browser crash on /settings) + DOM-set profile fields
34abe6fMerge pull request 'fix(e2e): fixme consent-screen + diagnose the /settings page-close (BUNYIP-148)' (#195) from fix/BUNYIP-148-account-ui-and-consent into main
d067214fix(e2e): fixme the consent-screen spec + diagnose the /settings page-close
8f6611eMerge pull request 'fix(e2e): set login fields via the DOM - Playwright fill() no-ops on the CI runner (BUNYIP-168)' (#194) from fix/BUNYIP-168-dom-set-login-fields into main
5266cd2fix(e2e): set login fields via the DOM (Playwright fill() no-ops on the CI runner)
c6196c8Merge pull request 'chore(e2e): log the login page the runner loads (BUNYIP-168 diag)' (#193) from chore/BUNYIP-168-log-runner-login-page into main
ba0ffdachore(e2e): log the login page the runner actually loads (BUNYIP-168 diag)
488be89Merge pull request 'chore(e2e): remove BUNYIP-167 diagnostics + make blockLiveReload work via addInitScript (BUNYIP-168)' (#192) from chore/BUNYIP-167-remove-temp-diagnostics into main
94ad872chore(e2e): remove BUNYIP-167 diagnostics + make blockLiveReload actually work
9dd6f38Merge pull request 'fix(e2e): block the SSE reload that wipes the login form (BUNYIP-168)' (#191) from fix/BUNYIP-168-block-sse-reload into main
2ee03b8fix(e2e): block the SSE reload that wipes the login form (the real root cause)
dcfc92bMerge pull request 'fix(e2e): robustly fill the login form - it was posting empty credentials (BUNYIP-168)' (#190) from fix/BUNYIP-168-login-fill-empty into main
f24fac8fix(e2e): robustly fill the login form (it was posting empty email+password)
19b1006Merge pull request 'chore(e2e): log the actual /login POST to pin the rejection (BUNYIP-167)' (#189) from chore/BUNYIP-167-login-wire-diagnostic into main
35e71dachore(e2e): log the actual /login POST (fields + headers + response)
fa25be3Merge pull request 'chore(e2e): fingerprint resolved-config diagnostic to dodge secret masking (BUNYIP-167)' (#188) from chore/BUNYIP-167-fingerprint-masked-inputs into main
2d09adachore(e2e): fingerprint the resolved-config diagnostic to dodge secret masking
ea165dcMerge pull request 'chore(e2e): log resolved suite inputs to diagnose login mismatch (BUNYIP-167)' (#187) from chore/BUNYIP-167-log-resolved-config into main
6128680chore(e2e): log resolved suite inputs to diagnose the login mismatch
2814049Merge pull request 'fix(e2e): trim bootstrap password before hashing (BUNYIP-166)' (#186) from fix/BUNYIP-166-bootstrap-trim-password into main
7c4ac02fix(e2e): trim the bootstrap password before hashing (whitespace login mismatch)Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.3.0
Stablereleased this
2026-06-22 19:54:27 +02:00 | 812 commits to main since this releaseChangelog
2944919Merge pull request 'Release v0.3.0' (#185) from release/v0.3.0 into main
ea039f7Release v0.3.0
876275bMerge pull request 'fix(e2e): surface bunyip login error + stop login-bearing retries (BUNYIP-165)' (#184) from fix/BUNYIP-165-login-error-surface-no-retry into main
50cf786fix(e2e): surface bunyip login error + stop login-bearing projects retrying
5a1c7caMerge pull request 'docs(e2e): step 4 reuse the mokosh-apps OIDC client (BUNYIP-148)' (#183) from docs/bunyip-148-runbook-oidc-client-reuse into main
f7aa167docs(e2e): step 4 - reuse the mokosh-apps OIDC client, not a bunyip-web one
136ad6bMerge pull request 'fix(e2e): bunyip-e2e-bootstrap ON CONFLICT match partial unique index (BUNYIP-161)' (#182) from fix/BUNYIP-161-bootstrap-partial-index-conflict into main
bf5dd18fix(e2e): match the partial unique index in bunyip-e2e-bootstrap upsert
437fabcMerge pull request 'docs(e2e): clarify Infisical password retrieval in the runbook (BUNYIP-148)' (#181) from docs/bunyip-148-e2e-infisical-password into main
42cb25ddocs(e2e): clarify the Infisical password retrieval in the runbook
af13138Merge pull request 'build(oci): ship bunyip-e2e-bootstrap in the bunyip-api runtime image (BUNYIP-156)' (#180) from feat/BUNYIP-156-ship-e2e-bootstrap-binary into main
c096587build(oci): ship bunyip-e2e-bootstrap in the bunyip-api runtime image
ab3daccMerge pull request 'feat(e2e): Playwright E2E suite for bunyip against deployed instances (BUNYIP-148)' (#179) from feat/BUNYIP-148-e2e-playwright-suite into main
689bb9edocs(e2e): add first-time setup runbook to dev-docs/e2e.md
b73a2d8fix(e2e): strip trailing slash on base URLs + tighten consent-form assertion
1370992feat(e2e): Playwright E2E suite for bunyip against deployed instances
0fcb0e0Merge pull request 'chore: Sync the checks and justfile recipes' (#178) from chore/sync-checks-justfile into main
f8a7890chore: Sync the checks and justfile recipes
54b5276Merge pull request 'fix(oidc): clear stale host-only op_session on silent-SSO set path (BUNYIP-146)' (#177) from fix/bunyip-146-op-session-cookie-domain into main
a83ca28test(oidc): pin path+secure equality in op_session_set dual-emit test (BUNYIP-146)
f3223a4fix(oidc): clear stale host-only op_session on silent-SSO set path (BUNYIP-146)
e7aceb2Merge pull request 'feat(events): SSE event bus + browser auto-reconciliation (BUNYIP-145)' (#176) from feat/bunyip-145-sse-event-bus into main
47d5fc9feat(events): SSE event bus + browser auto-reconciliation (BUNYIP-145)
0c808cdMerge pull request 'fix(admin): revoke refresh-tokens on claim-feeding mutations (BUNYIP-144)' (#175) from fix/bunyip-144-revoke-rt-on-claim-mutations into main
aae2c9cfix(admin): revoke refresh-tokens on claim-feeding mutations (BUNYIP-144)
7cfc27bMerge pull request 'feat(ci): cap native check.yml parallelism at nproc/2' (#174) from feat/GOV-10-native-check-nproc-cap into main
990d61afeat(ci): cap native check.yml parallelism at nproc/2
a2f7b4cMerge pull request 'fix(migrations): auto-reconcile BUNYIP-79 in-place-edited checksums at startup' (#173) from fix/bunyip-79-migration-checksum-reconcile into main
4b971c7fix(migrations): auto-reconcile BUNYIP-79 in-place-edited checksums at startup
61681bbMerge pull request 'chore: rename LICENSE.md to LICENSE (BUNYIP-143)' (#171) from chore/rename-license-file into main
9d0ec19chore: rename LICENSE.md to LICENSE
31cde4dMerge pull request 'feat(profile-B): OIDC profile+phone scopes, consent screen, claim emission (BUNYIP-140)' (#170) from feat/bunyip-140-oidc-profile-scopes into main
bf7a8fbfeat(profile-B): OIDC profile+phone scopes, consent screen, claim emission (BUNYIP-140)
9133dc9Merge pull request 'feat(profile-A): users.first_name/last_name/phone columns + Settings UI (BUNYIP-139)' (#169) from feat/bunyip-139-user-profile-fields into main
c9b86ebfeat(profile-A): users.first_name/last_name/phone columns + Settings UI (BUNYIP-139)
05c728fMerge pull request 'feat(oidc): register lets-chat-psa as confidential OIDC client (LC-22)' (#168) from feat/lc-22-register-lets-chat-oidc-client into main
c65e640feat(oidc): register lets-chat-psa as confidential OIDC client (LC-22)
0efcf6eMerge pull request 'fix(dev): create external network in ensure-env for clean clone' (#167) from fix/pre-commit-clean-clone into main
7f134ffMerge branch 'main' into fix/pre-commit-clean-clone
4172b80Merge pull request 'fix(admin): expose API-editable application fields and reorder in the edit/list UI' (#159) from fix/BUNYIP-121-application-edit-fields into main
907882efix(admin): expose API-editable application fields and reorder in the edit/list UI
d757a96fix(dev): create external network in ensure-env for clean clone
7339efeMerge pull request 'feat(auth): trusted devices to skip TOTP + sensitive-op re-prompt' (#166) from feat/bunyip-138-trusted-devices into main
2f1ba44feat(auth): trusted devices to skip TOTP + sensitive-op re-prompt
abf7d4dMerge pull request 'feat(auth): session hardening - panel, role-change revoke, admin TTL/idle' (#165) from feat/bunyip-137-session-hardening into main
8d1dd4afix(auth): clamp admin refresh deadline to the stricter window on rotation
c1f7892feat(auth): session hardening - panel, role-change revoke, admin TTL/idle
2f718afMerge pull request 'feat(web): add public /roadmap coming-soon page' (#164) from feat/bunyip-136-roadmap-page into main
bd4fbabfeat(web): add public /roadmap coming-soon page
6f6aef1Merge pull request 'fix(settings): wire up resend verification email control' (#161) from fix/BUNYIP-110-resend-verification-email into main
bbc4781Merge branch 'main' into fix/BUNYIP-110-resend-verification-email
22ee93cMerge pull request 'fix(admin): allow editing and resending a sent feedback response' (#160) from fix/BUNYIP-123-feedback-response-edit-resend into main
3fb428eMerge branch 'main' into fix/BUNYIP-123-feedback-response-edit-resend
023caa3Merge pull request 'fix(admin): make the Memberships surface editable with grant/revoke' (#158) from fix/BUNYIP-118-membership-edit-route into main
53d641fMerge branch 'main' into fix/BUNYIP-118-membership-edit-route
cd3f494Merge pull request 'feat(admin): add reactivation affordance + endpoint for suspended users' (#157) from feat/BUNYIP-120-admin-user-reactivate into main
c8e2416Merge branch 'main' into feat/BUNYIP-120-admin-user-reactivate
6cafb9bMerge pull request 'fix(api): drop permissive CORS allowed_origin_fn (origin reflection)' (#156) from fix/BUNYIP-124-cors-origin-reflection into main
0755becMerge branch 'main' into fix/BUNYIP-124-cors-origin-reflection
0d612eaMerge pull request 'feat(admin): edit email, force-verify, and clear 2FA on user detail' (#155) from feat/BUNYIP-119-admin-user-edit-email-2fa into main
e9b2914Merge branch 'main' into feat/BUNYIP-119-admin-user-edit-email-2fa
4d985a3Merge pull request 'fix(admin): validate tier-settings slots/trial input and surface save errors' (#154) from fix/BUNYIP-111-tier-settings-validation into main
868f603Merge branch 'main' into fix/BUNYIP-111-tier-settings-validation
4da02c7Merge pull request 'fix(web): Stripe key format, change-email/2FA edge, feedback-respond cap (BUNYIP-117)' (#163) from fix/web-edge-117-validation-and-error-surfacing into main
3246e38Merge pull request 'fix(web): edge validation hardening + tier Stripe IDs (BUNYIP-112/113/115/122)' (#162) from fix/web-validation-bundle into main
b4dcaa0fix(web): Stripe key format, change-email/2FA edge, feedback-respond cap (BUNYIP-117)
16b8591fix(web): edge validation hardening + tier Stripe IDs (BUNYIP-112/113/115/122)
1a32883fix(settings): wire up resend verification email control
c4d71c7fix(admin): allow editing and resending a sent feedback response
276f009fix(admin): make the Memberships surface editable with grant/revoke
acce4f9feat(admin): add reactivation affordance + endpoint for suspended users
ab3c397fix(api): drop permissive CORS allowed_origin_fn (origin reflection)
d63840cfeat(admin): edit email, force-verify, and clear 2FA on user detail
59c5b49fix(admin): validate tier-settings slots/trial input and surface save errors
19f4749Merge pull request 'fix(admin): reject unknown roles in the user-role change handler (BUNYIP-114)' (#153) from fix/BUNYIP-114-role-enum-validation into main
fb44e45fix(admin): reject unknown roles in the user-role change handler
f3f7746Merge pull request 'fix(settings): require a non-empty password to delete an account (BUNYIP-116)' (#152) from fix/BUNYIP-116-delete-account-require-password into main
28283ecfix(settings): require a non-empty password to delete an account
a8463f9Merge pull request 'fix(feedback): record originating page via ?from= on the feedback launcher (BUNYIP-104)' (#150) from fix/BUNYIP-104-feedback-from into main
ff2951aMerge branch 'main' into fix/BUNYIP-104-feedback-from
24adae8Merge pull request 'fix(admin): confirm before role change and application-group delete (BUNYIP-109)' (#149) from fix/BUNYIP-109-admin-confirm into main
31d0f46fix(feedback): record originating page via ?from= on the feedback launcher (BUNYIP-104)
a84d568fix(admin): confirm before role change and application-group delete (BUNYIP-109)
88648c1Merge pull request 'fix(dashboard): badge admins as Admin instead of No Membership (BUNYIP-108)' (#148) from fix/BUNYIP-108-membership-badge-admin into main
4e43b22Merge branch 'main' into fix/BUNYIP-108-membership-badge-admin
26f5c21fix(dashboard): badge admins as "Admin" instead of "No Membership" (BUNYIP-108)
93377ecMerge pull request 'fix(billing): compare Stripe webhook signature in constant time (BUNYIP-107)' (#147) from fix/BUNYIP-107-webhook-constant-time into main
c943316fix(billing): compare Stripe webhook signature in constant time (BUNYIP-107)
e79b02eMerge pull request 'feat(downloads): per-card download affordance, retire Downloads page [BUNYIP-100 2/2]' (#146) from feat/bunyip-100-unified-downloads into main
4f68ac3Merge remote-tracking branch 'origin/main' into feat/bunyip-100-unified-downloads
f1a1d21feat(downloads): per-card download affordance, retire Downloads page
6560b74Merge pull request 'feat(groups): application groups (data, admin, user grouping) [BUNYIP-100 1/2]' (#145) from feat/bunyip-100-application-groups into main
0c39e6aMerge branch 'main' into feat/bunyip-100-application-groups
90c982bMerge pull request 'chore: gitignore the local-only "For AI/" working dir' (#144) from chore/ignore-for-ai-dir into main
570f8daMerge branch 'main' into chore/ignore-for-ai-dir
5c17cd2Merge remote-tracking branch 'origin/main' into feat/bunyip-100-application-groups
ecc3912feat(groups): application groups (data, admin management, user grouping)
070aa73Merge pull request 'fix(bunyip-101): use post-9c082eb hashes (script had pre-edit values inverted)' (#143) from ops/bunyip-101-reconcile-migration-checksums into main
e6603efchore: gitignore the local-only "For AI/" working dir
ff396b8fix(bunyip-101): use post-9c082eb hashes (script had pre-edit values inverted)
e23b1d8Merge pull request 'feat(admin): show Hub/Binary/OCI surface tags on applications' (#142) from feat/bunyip-99-admin-surface-tags into main
51e812cMerge branch 'main' into feat/bunyip-99-admin-surface-tags
0ebd98bfeat(admin): show Hub/Binary/OCI surface tags on applications
d6ea0dcMerge pull request 'ops(bunyip-101): script to reconcile _sqlx_migrations after in-place edits' (#141) from ops/bunyip-101-reconcile-migration-checksums into main
0bece53ops(bunyip-101): script to reconcile _sqlx_migrations after in-place edits
ef60351Merge pull request 'chore: Sync .gitignore with other repos' (#140) from chore/gitignore into main
3d8802cMerge branch 'main' into chore/gitignore
3805e24chore: Sync .gitignore with other repos
b93b455Merge pull request 'feat(justfile): add dev-clean / dev-clean-all teardown recipes' (#139) from feat/dev-clean-recipes into main
469df5dfeat(justfile): add dev-clean / dev-clean-all teardown recipes
0818659Merge pull request 'fix(bunyip-domain): correct repository SQL binding, silent no-ops, and dead methods' (#136) from fix/bunyip-76 into main
8021d5dfix(bunyip-domain): correct repository SQL binding, silent no-ops, and dead methods
a48fd69Merge pull request 'fix(migrations): close data-integrity gaps and gate version collisions' (#135) from fix/bunyip-79 into main
69f657fMerge branch 'main' into fix/bunyip-79
e4c835fMerge pull request 'fix(web): handler correctness, dedup helpers, drop dead web types' (#133) from fix/bunyip-78 into main
fdaa024Merge branch 'main' into fix/bunyip-78
9c082ebfix(migrations): close data-integrity gaps and gate version collisions
415eea1Merge pull request 'chore: add pre-commit hook recipes' (#138) from chore/pre-commit-hooks into main
41f4170chore: add install-hooks and pre-commit just recipes
868c1f2Merge pull request 'chore: Add JetBrains .idea preferences' (#137) from chore/add-jetbrains-idea into main
e628821chore: Add JetBrains .idea preferences
e419930Merge pull request 'fix(feedback): raise hero pill contrast to WCAG AA' (#134) from fix/bunyip-97 into main
bc99793Merge branch 'main' into fix/bunyip-97
b2d7653Merge pull request 'fix(bunyip-api): handler correctness for webhooks, admin, auth, dedup' (#132) from fix/bunyip-77 into main
f8c22f2Merge branch 'main' into fix/bunyip-77
6709e70Merge pull request 'fix(admin-tier): count admin-granted lifetimes toward slot usage' (#131) from fix/bunyip-96 into main
4d4cbd1Merge branch 'main' into fix/bunyip-96
e37a93eMerge pull request 'fix(auth): harden middleware and auto-ban against IP spoofing and map growth' (#130) from fix/bunyip-72 into main
fe1542dfix(feedback): raise hero pill contrast to WCAG AA
7bee494fix(web): handler correctness, dedup helpers, drop dead web types
a077d4afix(bunyip-api): handler correctness for webhooks, admin, auth, dedup
836b478fix(admin-tier): count admin-granted lifetimes toward slot usage
54b01affix(auth): harden middleware and auto-ban against IP spoofing and map growth
7dd2151Merge pull request 'fix(auth): validate token issuer, drop 2FA email gate, unify email-change SQL' (#129) from fix/bunyip-75-token-issuer into main
da8552cfix(auth): validate token issuer, drop 2FA email gate, unify email-change SQL
32c4c39Merge pull request 'feat(oidc): /token mints configured tenant claim on at+jwt and id_token (BUNYIP-63)' (#128) from feat/bunyip-63-token-mint-emits-tenant-claim into main
3f785d3Merge pull request 'feat(oidc): /authorize tenant gate + picker (BUNYIP-62)' (#127) from feat/bunyip-62-authorize-tenant-gate-and-picker into main
1dfb600Merge pull request 'feat(oidc): add oauth_client_user_tenants assignments + admin API' (#126) from feat/bunyip-61-oauth-client-user-tenants into main
41a7648feat(oidc): /token mints configured tenant claim on at+jwt and id_token (BUNYIP-63)
2e4bf6cfeat(oidc): /authorize tenant gate + picker (BUNYIP-62)
f3969ecfeat(oidc): add oauth_client_user_tenants assignments + admin API
b4e0406Merge pull request 'fix(layout): cap visible toasts at 5 to bound the toast-root column' (#121) from fix/cap-toast-stack-at-5 into main
8ff1b79fix(layout): cap visible toasts at 5 to bound the toast-root column
a3aa9d1Merge pull request 'fix(admin-feedback): mask email on detail + no-email indicator + await reply email send' (#116) from fix/feedback-detail-mask-email-and-await-send into main
425a531fix(admin-feedback): mask email on detail + no-email indicator + await reply email send
e056efbMerge pull request 'feat(admin-feedback): per-row Archive action + Reply button discoverability' (#115) from feat/feedback-admin-archive-and-reply-button into main
f071797feat(admin-feedback): per-row Archive action + Reply button discoverability
4810e52Merge pull request 'feat(admin-feedback): spam filter + mark/unmark spam + delete + Close-into-Closed-tab' (#114) from feat/feedback-admin-ops-spam-and-delete into main
3818b2fMerge remote-tracking branch 'origin/main' into feat/feedback-admin-ops-spam-and-delete
d26756cMerge pull request 'fix(membership): collapse 'Lifetime x3' stutter on the lifetime card' (#113) from fix/lifetime-card-stutter into main
ef18d93feat(admin-feedback): spam filter + mark/unmark spam + delete + Close-into-Closed-tab
1dd72d0fix(membership): collapse 'Lifetime x3' stutter on the lifetime card
d2df1ecMerge pull request 'feat(feedback): magic-byte MIME validation + dim bomb cap + proxy hardening' (#112) from feat/feedback-attachment-security-hardening into main
9ab3655Merge pull request 'feat(feedback): attachments upload + admin thumbnails + BFF download proxy' (#111) from feat/feedback-attachments-upload-and-download into main
935f79bfeat(feedback): magic-byte MIME validation + dim bomb cap + proxy hardening
e703f99Merge pull request 'feat(webhook): Stripe event_id idempotency on receipt' (#110) from feat/stripe-webhook-idempotency into main
3009e98Merge pull request 'feat(audit): emit auth_refresh_reuse_detected on refresh-token replay' (#109) from feat/audit-refresh-reuse-event into main
577802eMerge pull request 'fix: harden three unwrap/expect panic surfaces in request paths' (#108) from fix/harden-unwrap-panic-surfaces into main
708abc0Merge pull request 'feat(feedback): admin detail subpage + respond + archive/restore' (#107) from feat/feedback-admin-detail-and-archive into main
dc84d33Merge pull request 'feat(feedback): thread page_path through form + display in admin row + CSV export' (#106) from feat/feedback-page-path-and-csv-export into main
d094513Merge pull request 'fix(layout): restore floating feedback launcher, drop top-bar icon' (#105) from fix/feedback-widget-restore-floating into main
b9ccc29Merge pull request 'fix(stripe): add request timeout to raw reqwest calls into Stripe API' (#104) from fix/stripe-client-timeout into main
007e86cfeat(webhook): Stripe event_id idempotency on receipt
112f7cefeat(audit): emit auth_refresh_reuse_detected on refresh-token replay
29939affix: harden three unwrap/expect panic surfaces in request paths
4406f1dfeat(feedback): attachments upload + admin thumbnails + BFF download proxy
00f2a45feat(feedback): admin detail subpage + respond + archive/restore
dc54130feat(feedback): thread page_path through form + display in admin row + CSV export
0655b6dfix(layout): restore floating feedback launcher, drop top-bar icon
5dea7f2fix(stripe): add request timeout to raw reqwest calls into Stripe API
68a6822Merge pull request 'docs: add 2026-06-06 platform audit to dev-docs/audits' (#103) from docs/add-platform-audit-2026-06-06 into main
2423431docs: add 2026-06-06 platform audit to dev-docs/audits
630e1dbMerge pull request 'fix(admin-feedback): show name + masked email on each row + toggle Reviewed' (#102) from fix/feedback-admin-row into main
70191f4fix(admin-feedback): show name + masked email on each row + toggle Reviewed
a8300a9Merge pull request 'fix(feedback): repeated tags decode + inline error instead of bare 422 page' (#101) from fix/feedback-form-tags-and-inline-error into main
2cb8b99fix(feedback): repeated tags decode + inline error instead of bare 422 page
8d34083Merge pull request 'feat(legal): single POLICY_LAST_UPDATED constant + refresh stale "January 2025"' (#100) from feat/bunyip-upgrade-07-legal-dates into main
7f21783Merge pull request 'feat(2fa): preserve QR + manual key when verification code is wrong' (#99) from feat/bunyip-upgrade-04-2fa-preserve into main
bade61fMerge pull request 'feat(settings): suppress browser autofill on email / delete-account forms' (#98) from feat/bunyip-upgrade-02-settings-hygiene into main
a118c02Merge pull request 'feat(membership): consolidate plan name + lifetime card shape + merge with billing' (#97) from feat/bunyip-upgrade-01-membership-plan into main
27031b5Merge pull request 'chore(ci): shrink check.yml disk footprint to avoid runner ENOSPC' (#96) from chore/check-ci-disk-footprint into main
e026576chore(ci): shrink check.yml disk footprint to avoid runner ENOSPC
d7288baMerge pull request 'feat(theme): make the high-contrast toggle visibly transform the page in light mode' (#95) from feat/bunyip-upgrade-08-high-contrast into main
6632cecMerge pull request 'feat(layout): dynamic top-bar title across dashboard / admin pages' (#94) from feat/bunyip-upgrade-03-topbar-title into main
0860504Merge pull request 'feat(layout): replace floating feedback launcher with a top-bar icon button' (#93) from feat/bunyip-upgrade-06-feedback-top-bar into main
3a0cd08Merge pull request 'feat(layout): app-wide toast system + Copy button confirmation' (#92) from feat/bunyip-upgrade-05-toast-system into main
2d45ba6feat(legal): single POLICY_LAST_UPDATED constant + refresh stale "January 2025"
ec77829feat(2fa): preserve QR + manual key when verification code is wrong
296ea05feat(settings): suppress browser autofill on email / delete-account forms
b6df86efeat(membership): consolidate plan name + lifetime card shape + merge with billing
d7ad944feat(theme): make the high-contrast toggle visibly transform the page in light mode
91a1396feat(layout): dynamic top-bar title across dashboard / admin pages
99921d3feat(layout): replace floating feedback launcher with a top-bar icon button
5d5babefeat(layout): app-wide toast system + Copy button confirmation
cccd66aMerge pull request 'fix(oidc): extract JwtService via app_data instead of web::Data param' (#91) from fix/oidc-silent-sso-via-access-token into main
782caa3fix(oidc): extract JwtService via app_data instead of web::Data param
e28ce7bMerge pull request 'fix(oidc): silent SSO also consumes refresh_token cookie on /authorize' (#90) from fix/oidc-silent-sso-via-access-token into main
6b29275fix(oidc): silent SSO also consumes refresh_token cookie on /authorize
2571300Merge pull request 'fix(oidc): silent SSO on /authorize via hub access_token cookie' (#89) from fix/oidc-silent-sso-via-access-token into main
ab463fdfix(oidc): silent SSO on /authorize via hub access_token cookie
9323932Merge pull request 'fix(web): enable reqwest stream feature for bunyip-web' (#88) from fix/bunyip-web-reqwest-stream into main
2a71b2afix(web): enable reqwest "stream" feature for bunyip-web
8423bbaMerge pull request 'fix(dev): set default-run so cargo run resolves to bunyip-api' (#87) from fix/bunyip-api-default-run into main
9caf17cfix(dev): set default-run so cargo run resolves to the bunyip-api server
a7747d3Merge pull request 'feat(oidc): mirror bunyip_role into the ID token (PMS-158)' (#86) from fix/bunyip-emit-role-claim into main
0e3e9aefeat(oidc): mirror bunyip_role into the ID token (PMS-158)
a17d670Merge pull request 'fix(web): relay rotated session cookie on admin redirects (BUNYIP-67)' (#85) from fix/bunyip-67-admin-redirect-cookies into main
9b9c328fix(web): relay rotated session cookie on admin redirects (BUNYIP-67)
30ebf1cMerge pull request 'feat(api): add bunyip-e2e-bootstrap test-account seeder (BUNYIP-52)' (#84) from feat/bunyip-52-e2e-bootstrap-binary into main
f9e51d6docs(api): note ENVIRONMENT-vs-DATABASE_URL residual risk on e2e guard (BUNYIP-52)
aad41defeat(api): add bunyip-e2e-bootstrap test-account seeder (BUNYIP-52)
42df032Merge pull request 'feat(web): wire the delete-application admin UI (BUNYIP-65)' (#83) from feat/bunyip-65-delete-applications into main
2514e92fix(web): relay rotated session cookie on delete-application redirect (BUNYIP-65)
2d34eb5feat(web): wire the delete-application admin UI (BUNYIP-65)
b5498dcMerge pull request 'fix(web): proxy binary downloads through the BFF (BUNYIP-64)' (#82) from fix/bunyip-64-download-asset-bff-proxy into main
20affa4fix(web): forward status + Content-Length on download proxy (BUNYIP-64)
1e0c3eafix(web): proxy binary downloads through the BFF (BUNYIP-64)
13e523bMerge pull request 'feat(oidc): emit bunyip_role claim in at+jwt for resource servers (BUNYIP-66)' (#81) from feat/bunyip-66-emit-bunyip-role-claim into main
bed0c47fix(oidc): default bunyip_role on deserialize for rolling-deploy compat (BUNYIP-66)
9a703a3feat(oidc): emit bunyip_role claim in at+jwt for resource servers (BUNYIP-66)
3e96796Merge pull request 'fix(oidc): clear stale op_session cookie on authorize when sid -> no row' (#80) from fix/stale-oidc-cookie-renders-404 into main
df379defix(oidc): clear stale op_session cookie on authorize when sid -> no row
561bea9Merge pull request 'BUNYIP-59: immutable release tags, Cargo.lock sync, tag-collision guard' (#79) from fix/bunyip-59-release-hygiene into main
881e1c1fix(release): immutable version tags, lockfile sync, tag-collision guardDownloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.2.1
Stablereleased this
2026-06-08 21:38:18 +02:00 | 1036 commits to main since this releaseChangelog
c1ed059Merge pull request 'Release v0.2.1' (#78) from release/v0.2.1 into main
0c2c1cbRelease v0.2.1
7fa0abaMerge pull request 'BUNYIP-58: force real bunyip-api rebuild, guard against oci-build stub leak' (#76) from fix/bunyip-58-oci-build-stub-leak into main
73d2cf7fix(oci-build): force real bunyip-api rebuild, guard against stub leak
da55b1eMerge pull request 'fix(oidc): register SPA clients from env-driven startup upsert (BUNYIP-57)' (#75) from fix/bunyip-57-env-driven-oidc-client-seed into main
c918f2efix(oidc): make post-logout URIs optional in SPA client upsert (BUNYIP-57)
8608d18fix(oidc): register SPA clients from env-driven startup upsert (BUNYIP-57)
518b9afMerge pull request 'fix(oidc): honor checked= flag on /login to break authorize redirect loop' (#74) from fix/oidc-login-redirect-loop-honor-checked into main
8d9e4defix(oidc): honor checked= flag on /login to break authorize loop
58a1e38Merge pull request 'fix(build): bump rust-builder-glibc to v1.0.1, drop bun workaround' (#73) from fix/bun-v1.0.1-drop-workaround into main
2b0f100fix(build): bump rust-builder-glibc to v1.0.1, drop bun workaround
ecf2b54Merge pull request 'chore: Sync .gitignore' (#72) from chore/sync-gitignore into main
dff36a0chore: Sync .gitignore
3f722bcMerge pull request 'fix(web): applications-page launcher points at /dashboard, not /' (#71) from fix/applications-launcher-points-at-dashboard into main
a7c2422fix(web): applications-page launcher points at /dashboard, not /
98ca4dcMerge pull request 'fix(auth): GET /v1/auth/logout 302s directly to url; /logout page lands on /' (#70) from fix/logout-honors-final-url into main
942b837fix(auth): GET /v1/auth/logout 302s directly to url; /logout page lands on /
b9a3f4cMerge pull request 'feat(auth): AuthenticatedUser accepts OIDC at+jwt alongside legacy HS256 (BUNYIP-55)' (#69) from feat/bunyip-55-authenticated-user-accept-atjwt into main
23c9abcfeat(auth): AuthenticatedUser accepts OIDC at+jwt alongside legacy HS256 (BUNYIP-55)
467ab5aMerge pull request 'fix(oidc): gate authorize on a server-validated OP session (BUNYIP-53)' (#67) from fix/bunyip-53-logout-terminates-op-session into main
005e017Merge pull request 'fix(web): make bun/bunx runnable by the host user in the dev image (BUNYIP-54)' (#68) from fix/bunyip-54-web-bun-permission into main
c992899fix(web): make bun/bunx runnable by the host user in the dev image
b4ab88dfix(oidc): gate authorize on a server-validated OP session
baf11fcMerge pull request 'feat(dev-sso): bunyip-api as the OIDC OP for hub and mokosh SPA' (#66) from feat/dev-sso-bunyip-as-op into main
ce45c85feat(dev-sso): make bunyip-api the OIDC OP for the hub and mokosh SPA
151be82Merge pull request 'feat(auth): GET /v1/auth/memberships synthetic single-tenant stub' (#65) from feat/auth-memberships-stub into main
ff79eb9feat(auth): GET /v1/auth/memberships synthetic single-tenant stub
9bfeee2Merge pull request 'feat(web): admin UI to edit and create application distribution config' (#64) from feat/bunyip-51-app-distribution-admin-ui into main
bd5a1bbfix(web): address review of application distribution admin UI
d52cff9feat(web): admin UI to edit and create application distribution config
5bd3046Merge pull request 'feat(admin): add revoke-lifetime-membership endpoint + UI' (#63) from feat/admin-user-management into main
e20979bfeat(admin): add revoke-lifetime-membership endpoint + UI
556f1c3Merge pull request 'fix(dev): escape literal paren in dev-sso print string' (#62) from fix/dev-sso-nushell-paren-escape into main
e963488fix(dev): escape literal paren in dev-sso print string
b5d0343Merge pull request 'fix(web): drop obsolete bun symlink workaround in dev Dockerfile' (#61) from fix/web-dockerfile-bun-base-image-update into main
c9da238fix(web): drop obsolete bun symlink workaround in dev Dockerfile
e7ec9c7Merge pull request 'feat/admin-user-management' (#60) from feat/admin-user-management into main
8f36030chore: remove stray mktemp file accidentally committed
b4377c2fix(admin): use axum 0.7 ':id' path-param syntax, not '{id}'
61c851dMerge pull request 'feat(admin): expand user management with detail page + new actions' (#59) from feat/admin-user-management into main
fff3968feat(admin): expand user management with detail page + new actions
e2d54b6Merge pull request 'fix(web): show forbidden/unauthenticated download errors distinctly (BUNYIP-49)' (#58) from fix/bunyip-49-downloads-forbidden-message into main
800261efix(web): handle 404 + add sign-in link on downloads error page (BUNYIP-49 review)
0d8726efix(web): show forbidden/unauthenticated download errors distinctly (BUNYIP-49)
bdca948Merge pull request 'feat: map DownloadCacheError via dunite ErrorClass in member-download handler (BUNYIP-48)' (#57) from feat/bunyip-48-download-errorclass into main
db252a7feat: map DownloadCacheError via dunite ErrorClass in the member-download handler (BUNYIP-48)
1f0b5e4Merge pull request 'feat: adopt dunite PSA-37 secret_env + PSA-42 acquire_concurrency_only; bump dunite dep' (#56) from feat/bunyip-47-adopt-dunite-psa37-42 into main
727ecb6refactor(oci): collapse always-Some concurrency guard to a plain UsageGuard (BUNYIP-47 review)
d9e299ffeat: adopt dunite PSA-37 secret_env + PSA-42 acquire_concurrency_only; bump dunite dep
36ef071Merge pull request 'fix(oci): daily pull limit counts logical pulls, not every manifest request (BUNYIP-43)' (#55) from fix/bunyip-43-oci-pull-count into main
63e1eb7fix(oci): address PR #55 review - extract should_meter + test, fix doc, note tradeoffs
53a7dfdfix(oci): daily pull limit counts logical pulls, not every manifest request (BUNYIP-43)
76989b9Merge pull request 'chore(compose): pass through distribution limit/TTL env vars (BUNYIP-42)' (#54) from chore/bunyip-42-compose-distribution-tunables into main
52a6a30chore(compose): pass through distribution limit/TTL env vars (BUNYIP-42)
4892c99Merge pull request 'fix(oci): blob cache total_size_bytes decode error broke LRU eviction (BUNYIP-41)' (#53) from fix/bunyip-41-oci-blob-eviction-pool into main
02dd8a8fix(download): same SUM-as-i64 decode bug in download cache; harden BUNYIP-41 test
a27f51dfix(oci): blob cache total_size_bytes decode error broke LRU eviction (BUNYIP-41)
a9df71fMerge pull request 'fix(oci): rate-limit failed token verifications, not successful pulls (BUNYIP-40)' (#52) from fix/bunyip-40-oci-token-rate-limit into main
eb7f399fix(oci): address PR #52 review - per-IP failure cap, dedup limit blocks
658e697fix(oci): rate-limit failed token verifications, not successful pulls (BUNYIP-40)
f3b4c42Merge pull request 'feat(entitlements): per-product access control with admin + Stripe grants (BUNYIP-39)' (#51) from feat/bunyip-39-per-product-entitlements into main
0ea20b1fix(entitlements): address PR #51 review findings
6d09f67feat(entitlements): per-product access control with admin + Stripe grants (BUNYIP-39)
be19611Merge pull request 'feat(deps): consume dunite PSA-36 (single-flight core + download Transport error class) (BUNYIP-44)' (#50) from feat/bunyip-44-dunite-psa-36 into main
d407788fix(download): map upstream NotFound to 404 and classify with an exhaustive match (PR #50 review)
8e4d08efeat(deps): consume dunite PSA-36 (single-flight core + download Transport error class)
dbe79c9Merge pull request 'fix(feedback): improve contrast of hero text (BUNYIP-45)' (#49) from fix/feedback-hero-bunyip-contrast into main
d85b113fix(feedback): raise contrast of hero "Bunyip" wordmark
ac3c796Merge pull request 'feat(applications): seed Drillmark as a hosted launcher tile' (#48) from feat/seed-drillmark-application into main
8b4797efeat(applications): seed Drillmark as a hosted launcher tile
efa868aMerge pull request 'fix(launcher): point app tiles at /dashboard so AuthGuard fires' (#47) from fix/launcher-tile-to-dashboard into main
cae06a4Merge pull request 'fix(cors): split CORS_ORIGIN comma-list into per-origin registrations' (#46) from fix/cors-allowed-origins-list into main
66e9934fix(cors): split CORS_ORIGIN comma-list into per-origin registrations
3eee826fix(launcher): point app tiles at /dashboard so AuthGuard fires
960e4ffMerge pull request 'fix(web): preserve ?redirect= through the 2FA hop' (#45) from fix/preserve-redirect-through-2fa into main
ff262cefix(web): preserve ?redirect= through the 2FA hop
c361409Merge pull request 'feat(applications): seed Mokosh as a hosted launcher tile' (#44) from feat/seed-mokosh-application into main
8fd483eMerge pull request 'fix(web): accept absolute OIDC issuer URLs in safe_redirect' (#43) from fix/bunyip-web-safe-redirect-allow-issuer into main
e7a2266feat(applications): seed Mokosh as a hosted launcher tile
e78b5cafix(web): accept absolute OIDC issuer URLs in safe_redirect
8569ee7Merge pull request 'fix(oidc): use single web_origin for login redirects, not the cors_origin list' (#42) from fix/bunyip-web-origin-for-oidc-login-redirect into main
b004bd2fix(oidc): use single web_origin for login redirects, not the cors_origin list
3e638f3Merge pull request 'feat(oidc): seed mokosh-apps + drillmark as public PKCE clients' (#41) from feat/bunyip-op-cutover into main
786ec10feat(oidc): seed mokosh-apps + drillmark as public PKCE clients
9f4e000Merge pull request 'feat(secrets): file-based production secrets via compose secrets (BUNYIP-38)' (#40) from feat/bunyip-38-file-based-secrets into main
6cfd663fix(secrets): address PR #40 review findings
ae84d2bfeat(secrets): file-based production secrets via compose secrets + {NAME}_FILE convention (BUNYIP-38)
2444718Merge pull request 'chore(toolchain): pin rust 1.94.1, fix clippy/fmt workspace-wide, deflake config tests (BUNYIP-36)' (#39) from chore/bunyip-36-rust-1.94-toolchain into main
75cf0f7fix(toolchain): address PR #39 review findings
ce68931chore(toolchain): pin rust 1.94.1, fix clippy/fmt workspace-wide, deflake config tests (BUNYIP-36)
bb21a68Merge pull request 'refactor(oci): consume dunite-oci shared limiter API and typed blob-cache errors (PSA-35)' (#38) from refactor/psa-35-dunite-oci-consumer into main
d8771c0refactor(oci): consume dunite-oci's shared limiter API and typed blob-cache errors (PSA-35)
498eaf1Merge pull request 'docs(dev-sso): distribution e2e smoke-test section (BUNYIP-35)' (#37) from docs/bunyip-35-e2e-smoke-tests into main
c94af88docs(dev-sso): rework smoke-test section per review; definitive cache proof
357f625docs(dev-sso): add distribution e2e smoke-test section from BUNYIP-35 run
b31736eMerge pull request 'feat(web): downloads page with OCI pull instructions and version listings (BUNYIP-34)' (#36) from feat/bunyip-34-downloads-oci-ux into main
9a13bcbMerge pull request 'fix(web-dev): web dev container crash-loops on bun permissions (BUNYIP-37)' (#35) from fix/bunyip-37-web-dev-bun into main
26fcec5fix(downloads): address PR #36 review findings
b69c8a4feat(web): downloads page with OCI pull instructions and version badges (BUNYIP-34)
b892859fix(web-dev): replace inaccessible bun symlink so dev container runs as host user (BUNYIP-37)
8a811baMerge pull request 'feat(catalog): seed Mokosh product catalog + one-call admin create + token audit (BUNYIP-33)' (#34) from feat/bunyip-33-catalog-entitlements into main
336a4dafix(catalog): address PR #34 review findings
eb96536feat(catalog): seed Mokosh product catalog + one-call admin create + token audit (BUNYIP-33)
5c43407Merge pull request 'feat(infra): distribution proxy in prod compose + dev-sso Traefik registry (BUNYIP-32)' (#33) from feat/bunyip-32-distribution-infra into main
a187680fix(infra): address code-review findings on the distribution infra PR
c11c4a7feat(infra): wire the distribution proxy into prod compose + dev-sso Traefik (BUNYIP-32)
18f6d64Merge pull request 'feat(oci): make registry verifiable against private Forgejo (BUNYIP-31)' (#27) from feat/bunyip-31-oci-private-forgejo into main
1de2587fix(oci): address code-review findings on the registry verification PR
824769bfix(oci): writable cache volumes + live verification results (BUNYIP-31 Phase B)
6ed7432Merge pull request 'revert(auth): restore Subscriber as default role on register' (#32) from revert/register-as-admin-staging into main
a7ccb73revert(auth): restore Subscriber as default role on register
59aee79Merge pull request 'fix(ci): pin Rust toolchain to 1.93.0' (#31) from fix/pin-rust-toolchain into main
1d78a84fix(ci): pin Rust toolchain to 1.93.0
234b6cfMerge pull request 'fix(web): silence dead_code + too_many_arguments lints' (#30) from fix/web-fmt into main
2c1912bfix(web): silence dead_code + too_many_arguments lints
43b5581Merge pull request 'style: cargo fmt --all (clears CI fmt-check failure)' (#29) from fix/web-fmt into main
a9d4117style: cargo fmt --all (clears CI fmt-check failure)
51bfdbeMerge pull request 'chore(auth): default new registrations to Admin role (staging only)' (#28) from chore/register-as-admin-staging into main
6a07c17chore(auth): default new registrations to Admin role (staging only)
9b2df2dfeat(oci): make registry verifiable against private Forgejo (BUNYIP-31)
403d9f8Merge pull request 'feat(download): consume dunite-download engine, drop hand-rolled code (BUNYIP-30)' (#26) from feat/bunyip-30-consume-dunite-download into main
2cc3fd7fix(download): address code-review findings on the dunite-download adoption
9b3cbe6chore: remove accidentally committed Claude session artifact, ignore .claude/
b85f53cfeat(download): consume dunite-download engine, drop hand-rolled code (BUNYIP-30)
97678a4Merge pull request 'docs(billing): sequenced M1 implementation plan on the locked decisions' (#25) from docs/billing-m1-plan into main
132ebfcdocs(billing): sequenced M1 implementation plan on the locked decisions
6cb33c7Merge pull request 'docs(billing): correct stale rebuild premise + add M1 billing gap matrix' (#24) from docs/billing-m1-audit into main
dd5accddocs(billing): correct stale rebuild premise + add M1 billing gap matrix
f33076fMerge pull request 'docs(dev-sso): add three-repo dev-sso runbook + design rationale' (#23) from docs/dev-sso-runbook into main
b31c85ddocs(dev-sso): add three-repo dev-sso runbook + design rationale
fde2743Merge pull request 'fix(ci): generate release notes from commits since previous tag' (#21) from fix/release-notes-since-prev-tag into main
4f863e1Merge branch 'main' into fix/release-notes-since-prev-tag
50131e9Merge pull request 'feat(dev): generate OIDC signing keys onjust devif missing' (#22) from feat/dev-ensure-oidc-keys into main
c7f6ae3fix(ci): generate release notes from commits since previous tag
7926e5bfeat(dev): generate OIDC signing keys onjust devif missing
87ffdcdMerge pull request 'fix(dev): export HOST_UID/HOST_GID (not UID/GID) for compose' (#20) from fix/dev-host-uid-mapping into main
ff6d817fix(dev): export HOST_UID/HOST_GID (not UID/GID) for compose
0244fddMerge pull request 'fix(dev-sso): mark the per-developer private network external' (#19) from fix/dev-sso-private-network-external into main
820516bfix(dev-sso): mark the per-developer private network external
0789192Merge pull request 'fix(dev-sso): route bunyip-web on nebula-secure via list-syntax labels' (#18) from fix/dev-sso-nebula-secure-list into main
61ebd28fix(dev-sso): route bunyip-web on nebula-secure via list-syntax labels
05df92bMerge pull request 'feat(dev-sso): make Traefik entrypoints overridable via TRAEFIK_ENTRYPOINTS' (#17) from feat/dev-sso-traefik-entrypoint-env into main
107f9acfeat(dev-sso): make Traefik entrypoints overridable via TRAEFIK_ENTRYPOINTS
c65075cMerge pull request 'feat: 100% a8n.tools parity - SSR frontend, dunite backend, governance conformance' (#16) from feat/bunyip-dunite-infra-boot into main
b51a15bfix(web): tolerate missing updated_at in API responses (register/login 'missing field')
4f5bfd3feat(web): restore the Bunyip mascot illustration in the hero
c1b6691feat(web): restore Bunyip styling + wording (reed/water theme, "Surfaces what matters")
7517a11fix(web): serve assets/styles.css (fix 404, broken styling)
c1e9a21chore: MIT license, secret-generating ensure-env, justfile groups, startup banners
2e5ee27feat: a8n.tools (menkent) parity - SSR frontend, governance conformance, domain rename
9ee7a3bfeat(infra): wire dev + prod stack for the actix backend on dunite
f09fa28fix(api): load .env at startup
26d07fdMerge pull request 'feat: scaffold bunyip-core/oci/oidc crates for the dunite rebuild' (#15) from feat/bunyip-api-on-dunite into main
a35b179chore(core): rebrand runtime config defaults from a8n to bunyip
2b69a97fix: drop bunyip-mocks workspace member and strip oidc client seeds
2aabd49chore: prune a8n migration seeds and retire the axum mock
6cd6d92feat(api): convert bunyip-api from axum mock to the actix binary on dunite
23fd194feat(oidc): port bunyip-oidc provider on dunite-oidc keys
ce60a06feat(oci): port bunyip-oci consuming the dunite-oci generic engine
d33be83build: consume dunite crates from the Forgejo git source
057ff50feat(core): fill bunyip-core domain layer on the dunite-core kernel
23ede7cfeat(scaffold): skeleton bunyip-core/oci/oidc crates for the dunite rebuild
0d7044cMerge pull request 'PSA audit (non-mock fixes) + prod mock-guard' (#14) from feat/m1-vas into main
dfa6fe8fix(web): derive_api_host returns same-origin host on apex topology
dc0e9d5feat(m1): Phase-5 audit fixes - OIDC nonce, log scrub, active-org, feedback routing, prod mock-guard
27f1987feat(m1): vas sprint - google oauth + wiring
bc9a734Merge pull request 'fix(login): omit client_id from password_login body when empty' (#13) from fix/login-skip-empty-client-id into main
ae197fbfix(login): omit client_id from password_login body when empty
1d9340cMerge pull request 'fix(release): publish binaries to psa-systems-private Generic Packages' (#12) from fix/release-binaries-to-generic-packages into main
637974efix(release): publish binaries to psa-systems-private Generic PackagesDownloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
v0.1.1
Stablereleased this
2026-05-28 20:38:32 +02:00 | 1206 commits to main since this release