• v0.7.0 68c88d45a2

    v0.7.0
    All checks were successful
    E2E / Playwright against deployment (push) Successful in 45s
    Build Web image / Build and push Web image (push) Successful in 4m11s
    Check / fmt + clippy + build + tests (push) Successful in 7m37s
    Build API image / Build and push API image (push) Successful in 25m4s
    Stable

    nrupard released this 2026-07-07 15:47:16 +02:00 | 424 commits to main since this release

    Changelog

    68c88d4 Merge pull request 'Release v0.7.0' (#348) from release/v0.7.0 into main
    ffc2e71 Release v0.7.0
    4222354 Merge pull request 'feat(web): external-link icon on the Community nav button (BUNYIP-341)' (#347) from feat/BUNYIP-341-community-external-icon into main
    880bf24 feat(web): mark the Community nav link with an external-link icon (BUNYIP-341)
    7729611 Merge pull request 'feat(seed): embedded template library + import-by-name (PSA-57 part 1)' (#346) from feat/PSA-57-template-library into main
    2183539 feat(admin-web): first-run setup panel and empty-catalog prompt (PSA-57 part 2)
    eb77d7e fix(seed): declare owns on the minimal template and drop the orphan restricted app
    5494c42 Merge remote-tracking branch 'origin/main' into feat/PSA-57-template-library
    c0c0ad4 Merge 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
    5c2384d feat(seed): embedded template library + import-by-name (PSA-57 part 1)
    355fcaf fix(seed): reject empty/unset seed passwords and non-reserved owns.domains
    a86a319 feat(seed): reset scoped to owns + retire bunyip-e2e-bootstrap to a template (PSA-56 part 2)
    0cad1e8 docs(seed): update the reserved-domain wording for the owns scope
    3b97d6d feat(seed): template-declared owns scope and password_env (PSA-56 part 1)
    2b581e8 Merge 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
    624764b fix(seed): raise the import endpoint's payload cap above the web form limit
    47b0a13 feat(admin-web): seed data import/export page (PSA-52 part 2)
    5ff29cd Merge pull request 'feat(seed): demo-msp template generator and committed template (PSA-51)' (#343) from feat/PSA-51-demo-seed-template into main
    d926c6b feat(seed): admin import/export API for seed data (PSA-52 part 1)
    b0e451d fix(seed): keep demo admins off member tiers; note key-order determinism
    d4589e3 feat(seed): demo-msp template generator and committed template (PSA-51)
    2540b81 Merge pull request 'feat(seed): canonical seed-file schema, validation, and safety gates (PSA-50)' (#342) from feat/PSA-50-seed-import-foundation into main
    e5b7211 fix(seed): reject enum typos, require feedback author email, harden reset match
    9dbfacb feat(seed): DB loader and seed CLI for file-driven seed data
    7e31d4f feat(seed): canonical seed-file schema, validation, and safety gates
    e52e779 Merge 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
    f333c5f Merge branch 'main' into docs/BUNYIP-272-e2e-mail-secret-format
    def173d Merge pull request 'feat(admin-web): rate-limit list view and reset action' (#341) from feat/BUNYIP-317-web-rate-limits into main
    392a26b Merge branch 'main' into feat/BUNYIP-317-web-rate-limits
    b1a16c1 Merge pull request 'fix(web): stop Tailwind v4.3 container capping content below 1400px' (#340) from fix/BUNYIP-338-container-fills-viewport into main
    2c75094 fix(web): stop Tailwind v4.3 container capping content below 1400px
    22fb567 Merge pull request 'fix(web): show per-field registration errors and preserve inputs' (#339) from fix/BUNYIP-271-register-field-errors into main
    b8806c8 fix(web): show per-field registration errors and preserve inputs
    b4de9af Merge branch 'main' into docs/BUNYIP-272-e2e-mail-secret-format
    0b78723 Merge pull request 'chore(scripts): dry-run-first staging test-account purge (BUNYIP-273)' (#336) from chore/BUNYIP-273-purge-test-accounts into main
    5885130 Merge branch 'main' into chore/BUNYIP-273-purge-test-accounts
    c137c27 Merge pull request 'fix(feedback): suppress admin notification and email for honeypot spam' (#338) from fix/BUNYIP-270-suppress-spam-feedback-admin-notification into main
    3785315 Merge branch 'main' into chore/BUNYIP-273-purge-test-accounts
    e67c77e fix(feedback): suppress admin notification and email for honeypot spam
    7beea24 docs(e2e): document the mail-sink secret format, de-personalize the example (BUNYIP-272)
    c2ae942 Merge pull request 'feat(web): add Bunyip favicon derived from hero art' (#335) from feat/BUNYIP-339-favicon into main
    86cf01e chore(scripts): add dry-run-first staging test-account purge (BUNYIP-273)
    b545282 fix(web): serve favicon.ico at the web root
    9239431 feat(web): add Bunyip favicon derived from hero art
    bd18834 Merge pull request 'fix(logging): attribute request logs to the external client IP' (#334) from fix/BUNYIP-328-log-external-client-ip into main
    82f01bb fix(logging): attribute request logs to the external client IP
    a003688 Merge pull request 'fix(auth): normalize user emails to lowercase on write' (#333) from fix/BUNYIP-325-normalize-email-lowercase into main
    314c5a0 fix(auth): normalize user emails to lowercase on write
    a28355d feat(admin-web): rate-limit list view and reset action
    01ea399 Merge 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
    a3a5050 feat(admin): reset an active rate limit for a user or key, audited
    b3b50fd Merge pull request 'feat(admin): list currently rate-limited entities, resolved to users' (#331) from feat/BUNYIP-315-admin-rate-limits-list into main
    519789e feat(admin): list currently rate-limited entities, resolved to users
    705b2da Merge pull request 'feat(admin-web): IP auto-bans list view and unban action' (#330) from feat/BUNYIP-320-web-ip-bans into main
    cfed80e feat(admin-web): IP auto-bans list view and unban action
    24e817b Merge 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
    7ed0905 feat(admin): list active IP auto-bans and lift a ban, audited
    f210303 Merge pull request 'feat(auto-ban): add immediate unban and list_bans to AutoBanService' (#328) from feat/BUNYIP-318-autoban-unban-list into main
    b2ffecb feat(auto-ban): add immediate unban and list_bans to AutoBanService
    a2bf39b Merge pull request 'fix(email): attach a Message-ID header to every outbound message' (#327) from fix/BUNYIP-334-message-id-header into main
    846618c fix(email): attach a Message-ID header to every outbound message
    1c70b22 Merge 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
    e3e797c fix(startup): populate applications.webhook_url for mokosh from MOKOSH_WEBHOOK_URL
    8ec37c1 Merge 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
    9f02ec6 ci: retrigger against rebased tip (post-BUNYIP-331 e2e fix)
    055bcfb fix(webhooks): sign outbound webhooks with a dedicated secret, not JWT_SECRET
    47d0ab0 Merge 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
    7ee4aa5 Merge pull request 'feat(auth): permanently reserve soft-deleted emails against re-registration' (#320) from fix/BUNYIP-330-block-reregister-deleted-email into main
    8e55dce test(e2e): stop setInputValue hanging when BUNYIP-331 auto-submit detaches the input
    ec861f5 Merge pull request 'feat(2fa): auto-submit six-digit TOTP code fields (BUNYIP-331)' (#323) from feat/BUNYIP-331-2fa-autosubmit into main
    ae82527 test(e2e): avoid generating a near-expiry TOTP code in fillTotpStep
    bd1634d feat(2fa): auto-submit six-digit TOTP code fields
    c09f312 Merge pull request 'feat(admin): router-style in-app error log view' (#322) from feat/BUNYIP-327-admin-error-log-view into main
    ec30ea0 fix(api): log a rate-limit trip once per window, not per over-limit request
    411abe6 feat(admin): router-style in-app error log view (BUNYIP-327)
    a7359da Merge pull request 'fix(web): route verification-resend feedback back to the originating page' (#321) from fix/BUNYIP-324-resend-verification-feedback into main
    485a1ea refactor(web): apply clamp_msg inside the shared banner helpers
    3cbb3fb fix(web): route verification-resend feedback back to the page it came from
    2073bf8 test(e2e): fixme reregister-blocked while staging still runs pre-330 build
    9a76556 feat(auth): permanently reserve soft-deleted emails against re-registration
    a22dd34 Merge 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
    0b13c11 Merge 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
    e5cb164 fix(auth): logout clears cookies unconditionally, even when access_token is stale
    567f443 Merge pull request 'fix(web): show billing period end date instead of "N/A" on cancel control' (#318) from fix/BUNYIP-330 into main
    4829c24 fix(web): show billing period end date instead of "N/A" on cancel control
    b9bea20 Merge pull request 'docs(env): document BUNYIP_COMMUNITY_URL for deployers' (#316) from docs/BUNYIP-329-community-env-example into main
    8e2f01e docs(env): document BUNYIP_COMMUNITY_URL in the .env examples
    2098d3a Merge pull request 'feat(web): add authenticated Community (Let's Chat) button for members' (#315) from feat/BUNYIP-329-community-button into main
    a8eadc8 feat(web): move Community from a dashboard card to the left sidebar nav
    1f1a292 chore(compose): pass BUNYIP_COMMUNITY_URL through to bunyip-web
    00eaf22 style: elide needless lifetime on community_redirect_target
    0de27d9 feat(web): add Community button to the member dashboard
    d14aa2a feat(web): add authenticated /community redirect into Let's Chat
    d72c55c feat(web): add BUNYIP_COMMUNITY_URL config for the Let's Chat instance
    fa0e1d1 Merge pull request 'feat(tiers): verify early-adopter/standard trials + add members-by-tier admin view' (#314) from feat/BUNYIP-291-membership-tiers into main
    8a3af52 style: satisfy rustfmt and clippy for the tier changes
    373fd55 refactor(membership): lock resubscribe-no-new-trial as a testable rule
    283a36f feat(admin-web): members-by-tier view with early-adopter occupancy
    20af618 feat(admin-api): add members-by-tier filter to the memberships endpoint
    2dec578 feat(membership): merge the two cancel buttons into one cancel control
    8810c7d feat(tiers): label the applied signup trial (early-adopter vs standard)
    b2c52e9 feat(domain): extract pure tier-selection and trial-days decisions
    8414a2b Merge 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
    d479d23 fix(build): sync Cargo.lock to workspace v0.6.0 so --locked image builds pass
    0f9181b fix(web): rotate at+jwt when /users/me reports a different role than the cookie's JWT

    Downloads
  • v0.6.0 ae25ed10da

    v0.6.0
    Some checks failed
    E2E / Playwright against deployment (push) Successful in 26s
    Build API image / Build and push API image (push) Failing after 26s
    Build Web image / Build and push Web image (push) Failing after 27s
    Check / fmt + clippy + build + tests (push) Successful in 3m45s
    Stable

    nrupard released this 2026-07-01 18:49:22 +02:00 | 529 commits to main since this release

    Changelog

    ae25ed1 Merge pull request 'Release v0.6.0' (#310) from release/v0.6.0 into main
    6d73e6a Merge branch 'main' into release/v0.6.0
    f02c3c1 Merge pull request 'feat(web): surface 429 rate limiting with standard retry wording' (#312) from feat/BUNYIP-314-surface-429-retry-wording into main
    3d8aa06 feat(web): surface 429 rate limiting with standard retry wording
    75e84a0 Merge branch 'main' into release/v0.6.0
    a4516a6 Merge pull request 'fix(auth): compute accurate retry_after for email resend limiters' (#311) from feat/BUNYIP-313-accurate-retry-after into main
    3c02302 fix(auth): compute accurate retry_after for email resend limiters
    b93c5c3 Merge branch 'main' into release/v0.6.0
    1f026db Merge pull request 'feat(email): log when an email is queued for delivery' (#309) from feat/BUNYIP-309-log-email-queued into main
    0bfc9a6 Release v0.6.0
    899e102 feat(email): log when an email is queued for delivery
    368a686 Merge 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
    bb12002 fix(e2e): skip Playwright suite when hub soft-probe reports hub not-live on pull_request
    728a7ea fix(e2e): soften hub /healthz probe on pull_request so outage-fix PRs are not deadlocked
    bf63945 fix(ci): sniff-test bunyip-web/Cargo.toml for axum before publishing :latest
    aea8fac Merge 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
    641f8b3 Merge pull request 'feat(emails): rebrand onboarding + recovery emails to bunyip-web tokens' (#303) from feat/BUNYIP-288-email-rebrand into main
    79a46d6 Merge pull request 'ci: add migration-immutability guard for sqlx checksum drift' (#301) from feat/BUNYIP-293-migration-immutability-guard into main
    64e8e1f Merge pull request 'chore(docs): consolidate markdown under docs/ + distill audits into changelog (PSA-48)' (#305) from chore/PSA-48-docs-sanitize into main
    6d5d4b9 chore(docs): consolidate markdown under docs/, distill audits + handoff into changelog
    f9ca921 fix(auth): await welcome email inline so it lands before verify on signup
    a6503bc feat(emails): rebrand onboarding + recovery emails to bunyip-web tokens
    6b52270 Merge 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
    e824fec fix(web): defer login head scripts to stop the chromium credential-fill race
    ee6b204 ci: add migration-immutability guard for sqlx checksum drift
    ac7b5b2 Merge 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
    c52e086 fix(web): label download affordance by surface + center its dialog
    5b08d55 Merge pull request 'feat(justfile): add create-release-container for toolchain-less boxes' (#299) from feat/BUNYIP-292-create-release-container into main
    ee1df09 feat(justfile): add create-release-container for toolchain-less boxes

    Downloads
  • v0.5.0 8fa29c8c6b

    v0.5.0
    All checks were successful
    Build Web image / Build and push Web image (push) Successful in 33s
    Build API image / Build and push API image (push) Successful in 30m1s
    Stable

    nrupard released this 2026-06-30 16:20:01 +02:00 | 558 commits to main since this release

    Changelog

    99087e7 Merge pull request 'Release v0.5.0' (#298) from release/v0.5.0 into main
    d96d288 Release v0.5.0
    70dde96 Merge 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
    4ff6c73 Merge pull request 'feat(web): per-field show/hide password toggle on signup form' (#294) from feat/BUNYIP-282-signup-password-toggle into main
    57b99a9 Merge 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
    5f080a9 refactor(e2e): extract bunyip-web POST Origin header into lib/csrf helper
    017e359 Merge remote-tracking branch 'origin/main' into fix/BUNYIP-283-signup-submit-gate-breach-async
    ed2fee7 Merge remote-tracking branch 'origin/main' into feat/BUNYIP-282-signup-password-toggle
    e5a68f8 Merge 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
    6d6ed38 fix(e2e): send Origin on profile POST so CSRF middleware admits it
    0f76514 fix(web): re-evaluate signup submit gate when async breach check resolves
    fbc3c93 feat(web): per-field show/hide password toggle on signup form
    167a2f4 Merge 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
    4fa6bbd Merge remote-tracking branch 'origin/main' into fix/BUNYIP-262-refresh-auth-time-scope
    2404e98 Merge 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
    91d9a83 Merge remote-tracking branch 'origin/main' into fix/BUNYIP-262-refresh-auth-time-scope
    0858a3f Merge 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
    2186519 Merge pull request 'fix(web): Origin / Referer CSRF defense on every state-changing POST' (#291) from fix/BUNYIP-259-csrf-synchronizer-token into main
    ef27991 Merge pull request 'fix(oidc): thread real acr/amr through op_session creation + refresh family' (#288) from fix/BUNYIP-257-acr-amr-threading into main
    29fc8eb Merge pull request 'fix(oidc): allowlist RP origins on CSP so Authorize completes (BUNYIP-244)' (#276) from feat/BUNYIP-244-csp-allowlist-origins into main
    85f9595 fix(e2e): harden magic-link mail wait with timeout headroom and one re-request
    50978e6 Merge remote-tracking branch 'origin/main' into fix/BUNYIP-257-acr-amr-threading
    889733b Merge 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
    f660cbb Merge 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
    1c6b8a6 Merge 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
    25b8254 Merge 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
    6cff735 Merge pull request 'fix(oidc): per-IP rate limit on /oauth2/{authorize,token,userinfo,revoke}' (#281) from fix/BUNYIP-264-oauth-rate-limiters into main
    7d26329 Merge pull request 'fix(log): scrub PII + secret-adjacent data from auth + stripe log lines' (#280) from fix/BUNYIP-265-log-hygiene into main
    355fab7 Merge 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
    38a2295 Merge 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
    1e77944 fix(e2e): retry password-reset confirm past the per-IP rate limit
    71831f9 fix(oidc): server-side intersect consent scopes; refuse to revive revoked entitlement rows
    25fe79c fix(web): Origin / Referer CSRF defense on every state-changing POST
    5efe927 fix(oidc): enforce allowed_grant_types + token_endpoint_auth_method at /oauth2/token
    5533b0e Merge 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
    b098dc7 fix(auth): login hardening cluster (pre-login op_session revoke, multi-keyed rate limit, 2FA cookie hygiene)
    2ad1d46 Merge branch 'main' into feat/BUNYIP-243-server-down-banner
    02907ba fix(oidc): thread real acr/amr through op_session creation + refresh family
    d55b601 fix(oidc): persist original auth_time on refresh family; re-intersect scope at rotation
    2fca2ed Merge branch 'main' into feat/BUNYIP-244-csp-allowlist-origins
    e46bfe9 Merge 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
    a784777 Merge branch 'main' into feat/BUNYIP-244-csp-allowlist-origins
    6f29641 Merge 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
    cc9eb1e fix(e2e): give hub-login setup backoff headroom for 2FA rate limit
    f15ff02 Merge 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
    6fd9951 Merge branch 'main' into feat/BUNYIP-244-csp-allowlist-origins
    f2f51c2 Merge branch 'main' into feat/BUNYIP-243-server-down-banner
    63705b8 Merge 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
    be2a911 ci: re-trigger checks (E2E staging flake, not a code change)
    6c69b06 chore(deps): bump dunite to pick up CspConfig (BUNYIP-244)
    b774b14 Merge branch 'main' into feat/BUNYIP-244-csp-allowlist-origins
    e294507 feat(web): app-wide service-unavailable banner when bunyip-api is down
    97a7f2f feat(auth): server-side HIBP backstop on register, password reset, and password change
    791c6b4 fix(oidc): per-IP rate limit on /oauth2/{authorize,token,userinfo,revoke}
    5ff93fb Merge pull request 'fix(e2e): tolerate login rate limit and harden mail wait' (#277) from fix/BUNYIP-267-e2e-login-backoff-mail-hardening into main
    171fa03 fix(log): scrub PII + secret-adjacent data from auth + stripe log lines
    3f44c35 fix(oidc): scope /oauth2/logout post_logout_redirect_uri to the id_token_hint's client
    7c5f280 Merge 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
    071b8d8 fix(e2e): tolerate login rate limit and harden mail wait
    6aa8ff5 fix(auth): invalidate prior pending reset tokens when a new reset is requested
    04feaf0 fix(auth): host-scope the OP session cookie by default; opt-in for cross-subdomain sharing
    a808fd5 fix(oidc): allowlist RP origins on CSP so Authorize completes
    611df32 fix(deploy): require OIDC signing-key vars; refuse to boot under a dev-* kid in prod
    13ee3c1 fix(oidc): constant-time PKCE code_challenge compare; validate nbf on at+jwt verifier
    9203617 feat(oidc): pin at+jwt audience on the Resource-Server verifier path
    d82cf99 Merge pull request 'feat(auth): clarify breach-row label and polish the password strip' (#272) from feat/BUNYIP-240-inline-password-feedback into main
    1652907 feat(auth): clarify breach-row label and polish the password strip
    bfa7512 Merge pull request 'fix(web): allow the OIDC login redirect chain in form-action CSP' (#271) from fix/bunyip-csp-form-action-oidc into main
    4eb5d8a fix(web): allow the OIDC login redirect chain in form-action CSP
    bc15cb9 Merge pull request 'fix(e2e): harden hard_delete against non-cascade user FKs (BUNYIP-248)' (#270) from fix/bunyip-248-fk-hardening into main
    e5a36c4 fix(e2e): harden hard_delete against non-cascade user FKs (BUNYIP-248)
    c133f44 Merge pull request 'docs(e2e): Forgejo Actions secrets + variables reference (BUNYIP-247)' (#269) from docs/bunyip-247-forgejo-secrets-readme into main
    92ec6a1 Merge branch 'main' into docs/bunyip-247-forgejo-secrets-readme
    0432bc4 Merge pull request 'fix(e2e): hard-delete disposable accounts after each test (BUNYIP-246)' (#268) from fix/bunyip-246-e2e-account-hard-delete into main
    4de5c4b docs(e2e): authoritative Forgejo Actions secrets + variables reference
    e15bc19 docs: note hard_delete non-cascade FK limitation (review follow-up)
    9c7a38c fix(e2e): hard-delete disposable accounts after each test + reaper
    902db91 Merge 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
    f1cf1a8 Merge 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
    4cf36a4 Merge 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
    3c4074e Merge 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
    d3882ce fix(ci): disable provenance attestation in docker check to avoid manifest-tag collision
    0e7ba70 merge: resolve security.rs conflict with BUNYIP-235 (form-action for Stripe)
    281d85b fix(ci): disable provenance attestation in docker check to avoid manifest-tag collision
    f2bc132 feat(auth): live per-rule password feedback + breach check on /register + /reset-password (BUNYIP-240)
    872a7dc Merge 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
    0ca52f4 fix(deploy): require BUNYIP_API_IMAGE + BUNYIP_WEB_IMAGE, drop :latest fallback (BUNYIP-237)
    a26fc8c fix(csp): allow Stripe-hosted destinations in bunyip-web form-action (BUNYIP-235)
    11332b8 fix(ci): close shell-injection vector via head.ref in create-release.yml (BUNYIP-236)
    fa0102a Merge 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
    2a7f693 chore(oidc): trace consent grant/gate decisions to diagnose the first-time consent loop (BUNYIP-234)
    f11d774 Merge 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
    f4b43c4 Merge pull request 'docs(billing): mark the two open items resolved (decision-complete)' (#261) from docs/billing-m1-plan into main
    b052cb2 Merge branch 'main' into docs/billing-m1-plan
    08cc91c Merge 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
    fcde93d Merge branch 'main' into fix/GOV-15-twin-trigger-publish-mode
    9a432ad Merge 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
    c03fff7 Merge branch 'main' into fix/GOV-15-twin-trigger-publish-mode
    d23d469 fix(web): add Content-Security-Policy header to bunyip-web responses (BUNYIP-232)
    72c871b Merge 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
    601d411 Merge remote-tracking branch 'origin/main' into fix/bunyip-73-oidc-provider-hardening
    4d70d70 Merge pull request 'chore(ci): clear stale builder image before docker check (BUNYIP-231)' (#259) from chore/checks-workflow-9c0ac500 into main
    a6a6cf9 Merge pull request 'Use the new illustrated Bunyip mascot on the landing hero' (#245) from feat/BUNYIP-216-landing-mascot into main
    a271506 Merge branch 'main' into feat/BUNYIP-216-landing-mascot
    9fec28f Merge branch 'main' into fix/GOV-15-twin-trigger-publish-mode
    7acffe6 Merge 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
    030e470 Merge branch 'main' into chore/BUNYIP-227-check-docker-cacheonly
    d141276 chore(ci): clear stale builder image before docker check (BUNYIP-231)
    b5bc5ad fix(ci): derive OCI publish mode from trigger, not git describe
    ec7e1a4 Merge branch 'main' into feat/BUNYIP-216-landing-mascot
    9c0ac50 Merge pull request 'fix(2fa): widen recovery code entropy to 80 bits (BUNYIP-202)' (#244) from fix/bunyip-202-recovery-code-entropy into main
    8e001ea Merge branch 'main' into fix/bunyip-202-recovery-code-entropy
    6aff69a Merge 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
    023150c ci(check): build check-docker to cacheonly, drop tagged image export
    383b6ae fix(launcher): close the cross-browser stale-JWT gap on the app launcher (BUNYIP-229)
    2c06512 Merge branch 'main' into fix/bunyip-106-loopback-redirect-uri-parse
    4518568 Merge pull request 'fix(oidc): make authorization code redemption atomic (BUNYIP-199)' (#238) from fix/bunyip-199-atomic-code-redemption into main
    bb01200 Merge branch 'main' into fix/bunyip-199-atomic-code-redemption
    2947d0e Merge 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
    c3975f1 Merge 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
    442c67e Merge branch 'main' into chore/bunyip-81-oci-registry-dedup
    f4b71d5 fix(web): rotate JWT after tier-grant so the launcher unlocks without log-out (BUNYIP-226)
    7d74272 Merge 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
    32651ac Merge 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
    b1bb4c9 Merge branch 'main' into ci/GOV-20-bunyip-gha-build-cache
    a9a6dd0 fix(billing): handle sibling Stripe subs on cancel + gate Welcome page on real status (BUNYIP-225)
    b645a85 Merge 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
    34184d7 fix(consent): render the OIDC consent page through the public auth shell (BUNYIP-223)
    dea159b Merge 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
    a7ebf03 fix(oidc): atomic code redemption, cap refresh TTL, drop dead client fields (BUNYIP-73)
    442f4cd Merge 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
    834130c feat(billing): force card-only Stripe Checkout, disable Pay with Link (BUNYIP-208)
    746f5f3 Merge pull request 'test(stripe): regression-guard webhook idempotency fence ordering (BUNYIP-210)' (#249) from test/bunyip-210-webhook-fence-regression into main
    f3136ba feat(auth): grant initial trial only after BOTH email verified AND name saved (BUNYIP-221)
    69f1127 test(stripe): regression-guard webhook idempotency fence ordering (BUNYIP-210)
    b74693e Merge 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
    02243ce feat(billing): grant 30-day signup free trial via Stripe Checkout (BUNYIP-209)
    a4b32a9 Merge pull request 'fix(email): suppress login/reset tokens in disabled-email logs (BUNYIP-204)' (#247) from fix/bunyip-204-suppress-token-logging into main
    6f2483b fix(email): suppress login/reset tokens in disabled-email logs (BUNYIP-204)
    900a57b Merge pull request 'fix(stripe): fail closed when webhook secret is unset (BUNYIP-203)' (#246) from fix/bunyip-203-stripe-webhook-fail-closed into main
    be6e61a fix(stripe): fail closed when webhook secret is unset (BUNYIP-203)
    5e5f125 feat(landing): use the new illustrated mascot on the landing hero
    9a82d78 fix(2fa): widen recovery code entropy to 80 bits (BUNYIP-202)
    1435c0e Merge 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
    14c46f0 fix(2fa): per-account verify lockout and tighter TOTP skew (BUNYIP-201)
    8267266 fix(oidc): parse loopback redirect_uri host instead of string-prefix (BUNYIP-106)
    51cf951 Merge 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
    736cd77 fix(oidc): re-validate tenant assignment on refresh rotation (BUNYIP-200)
    d11e981 Merge pull request 'fix(domain): count unverified holders in tier slot usage (BUNYIP-105)' (#239) from fix/bunyip-105-count-unverified-tier-slots into main
    4145c35 ci(oci): switch build cache to gha with per-image scope
    87deecd fix(domain): count unverified holders in tier slot usage (BUNYIP-105)
    e4a9e3e fix(oidc): make authorization code redemption atomic (BUNYIP-199)
    e8fe39d Merge 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
    8928490 Merge 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
    541c9ad fix(stripe): lock the real checkout price from the Stripe API (BUNYIP-215)
    57b41c9 fix(config): decouple dotenv load from parsing so defaults test is deterministic (BUNYIP-102)
    25c7d9e Merge pull request 'fix(web): add missing user-cog icon for Profile card (BUNYIP-171)' (#235) from fix/bunyip-171-profile-icon into main
    c168d46 fix(web): add missing user-cog icon for Profile card (BUNYIP-171)
    0176e55 refactor(oci): de-duplicate registry admin check, sha256 fallback, dead re-exports (BUNYIP-81)
    cf57fdb Merge pull request 'fix(stripe): finalize webhook idempotency after handler runs (BUNYIP-210)' (#233) from fix/bunyip-210-webhook-idempotency-ordering into main
    f25684e Merge 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
    711fc54 fix(stripe): finalize webhook idempotency after handler runs (BUNYIP-210)
    649bf9b chore(infra): harden prod images, compose, CI, and dep hygiene (BUNYIP-80)
    1bfb826 Merge pull request 'feat(account): cascade account delete to connected apps (BUNYIP-211)' (#231) from feat/bunyip-211-cascade-account-delete into main
    2589b1d feat(account): cascade account delete to connected apps (BUNYIP-211)
    e46b820 Merge pull request 'fix(oidc): close open redirect, scope leak, client auth, dead code (BUNYIP-74)' (#230) from fix/bunyip-74-oidc-handlers into main
    fba7df7 fix(oidc): close open redirect, scope leak, client auth, dead code (BUNYIP-74)
    8b14a24 Merge pull request 'fix(web): collect TOTP code in disable-2FA form (BUNYIP-212)' (#229) from fix/bunyip-212-disable-2fa-totp-code into main
    42d2621 fix(web): collect TOTP code in disable-2FA form (BUNYIP-212)
    81274e2 Merge pull request 'feat(web): forced post-registration onboarding (BUNYIP-206)' (#228) from feat/bunyip-206-onboarding-page into main
    5fa2780 Merge 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
    ebb001d feat(web): forced post-registration onboarding (name + email verification)
    83dece6 test(e2e): un-fixme subscribe + billing-portal behind a staging-Stripe gate (BUNYIP-151)
    8f3e3d7 Merge pull request 'fix(e2e): verify the disposable account before change-email (BUNYIP-150)' (#226) from fix/bunyip-150-change-email-verify-first into main
    c171761 fix(e2e): verify the disposable account before change-email (BUNYIP-150)
    c1100c5 Merge 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
    5cb62c8 fix(e2e): exempt non-prod registration cap + force JMAP public origin (BUNYIP-150)
    e214f40 Merge 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
    4085b4c test(e2e): use nate@a8n.run sink mailbox + guard destroy to exact subaddress (BUNYIP-150)
    f1e26de test(e2e): read the mail sink via Stalwart JMAP instead of Mailpit (BUNYIP-150)
    e95ce8d test(e2e): mail-sink helper + un-fixme reset/magic-link/change-email (BUNYIP-150)
    ada9875 docs(billing): mark the two open items resolved (decision-complete)

    Downloads
  • v0.4.1 664b1f9854

    v0.4.1
    Some checks failed
    Build API image / Build and push API image (push) Failing after 32s
    Build Web image / Build and push Web image (push) Successful in 38s
    Stable

    nrupard released this 2026-06-24 18:28:16 +02:00 | 740 commits to main since this release

    Changelog

    c6e8a97 Merge pull request 'Release v0.4.1' (#218) from release/v0.4.1 into main
    34b7cbc Release v0.4.1
    123345e Merge pull request 'fix(oidc): reconcile lets-chat client per-environment (LC-448)' (#217) from fix/LC-448-letschat-oidc-env-reconcile into main
    6355e6f fix(oidc): reconcile lets-chat client per-environment (LC-448)
    f71fda0 Merge pull request 'fix(web): use public api origin for browser-side SSE subscriber' (#216) from fix/BUNYIP-192-sse-public-origin into main
    fad749c fix(web): use public api origin for browser-side SSE subscriber
    952c939 Merge pull request 'fix/BUNYIP-191-humanise-generic-internal-error' (#215) from fix/BUNYIP-191-humanise-generic-internal-error into main
    26fa792 fix(membership): map dunite generic internal-error to actionable copy (BUNYIP-191)

    Downloads
  • v0.4.0 15731b8152

    v0.4.0
    Some checks failed
    Build API image / Build and push API image (push) Failing after 41s
    Build Web image / Build and push Web image (push) Successful in 4m7s
    Stable

    nrupard released this 2026-06-24 10:53:56 +02:00 | 748 commits to main since this release

    Changelog

    4101161 Merge pull request 'Release v0.4.0' (#214) from release/v0.4.0 into main
    9cb932e Release v0.4.0
    791147e Merge pull request 'feat(stripe): auto-bootstrap default product on first config save (BUNYIP-189)' (#212) from feat/BUNYIP-189-auto-bootstrap-product into main
    4ad0524 Merge pull request 'fix(membership): surface checkout errors as a flash banner (BUNYIP-187)' (#211) from fix/BUNYIP-187-surface-checkout-errors into main
    a9cc08c Merge pull request 'fix/BUNYIP-188-cors-origin-comma-list' (#210) from fix/BUNYIP-188-cors-origin-comma-list into main
    fa1cb5a feat(stripe): auto-bootstrap default product on first config save (BUNYIP-189)
    46e90e6 fix(membership): surface checkout errors as a flash banner (BUNYIP-187)
    7415fac chore: cargo fmt
    ca54fb9 fix(stripe): split CORS_ORIGIN on comma for success_url fallback (BUNYIP-188)
    ad06e7a Merge pull request 'docs(stripe): document the app-tagged product/price checkout prerequisite (BUNYIP-175)' (#209) from docs/BUNYIP-175-tagged-product-step into main
    8f69fc1 docs(stripe): document the app-tagged product/price checkout prerequisite (BUNYIP-175)
    1410ffa Merge 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
    ff970cc fix(dev): pass STRIPE_SUCCESS_URL + STRIPE_CANCEL_URL to api (BUNYIP-175)
    44b9bef Merge 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
    85052b1 fix(dev): pass STRIPE_SECRET_KEY + STRIPE_WEBHOOK_SECRET to api (BUNYIP-175)
    3f8a9dd Merge pull request 'docs(stripe): document test-mode subscription testing (BUNYIP-175)' (#206) from docs/BUNYIP-175-stripe-test-mode into main
    b5c0ab7 docs(stripe): document test-mode subscription testing (BUNYIP-175)
    5bb6e28 Merge 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
    ad81fa8 fix(web): 404 fallback returns a real 404, not a soft-404 200
    af0892b Merge pull request 'fix(e2e): hard + body-validate the hub /healthz probe (BUNYIP-185)' (#204) from fix/BUNYIP-185-hub-healthz-hard-probe into main
    3d9acc6 fix(e2e): hard + body-validate the hub /healthz probe (BUNYIP-185)
    12012f3 Merge pull request 'feat(e2e): /e2e-bootstrapped readiness endpoint + skip-when-unseeded gate (BUNYIP-163)' (#203) from feat/BUNYIP-163-e2e-bootstrapped-gate into main
    b1475e1 feat(e2e): /e2e-bootstrapped readiness endpoint + skip-when-unseeded gate
    b1c8bff Merge pull request 'feat(web): add /healthz liveness endpoint for e2e + monitoring (BUNYIP-149)' (#202) from feat/BUNYIP-149-web-healthz into main
    2432d8e feat(web): add /healthz liveness endpoint + wire it into the e2e gate
    4c8216a Merge pull request 'feat(settings): paginate the sessions and trusted-device lists (BUNYIP-177)' (#200) from feat/BUNYIP-177-paginate-sessions-devices into main
    bf49cba Merge origin/main into feat/BUNYIP-177-paginate-sessions-devices
    3fa1357 Merge pull request 'test(e2e): accept both paginated and legacy session-list shapes' (#201) from fix/BUNYIP-183-sessions-e2e-shape-transition into main
    96c1534 fix(settings): widen pagination offset to i64 + un-garble the pager doc
    61ee862 test(e2e): accept both paginated and legacy session-list shapes
    f6637dd feat(settings): paginate the sessions and trusted-device lists
    8472e29 Merge 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
    ff0c04c fix(e2e): unwrap the success envelope in the sessions assertion
    427084e fix(e2e): assert profile + sessions via request-context, not a /settings render
    9472ebd fix(e2e): block the FontAwesome kit on /settings (kills the headless renderer)
    0c0b370 test(e2e): un-fixme profile + sessions to verify the /settings renderer fix
    5a811bc Merge pull request 'fix/BUNYIP-148-serial-project-ordering' (#197) from fix/BUNYIP-148-serial-project-ordering into main
    2c0ad13 chore(e2e): fixme profile + sessions until /settings renderer crash is rooted (BUNYIP-148)
    9c56dcf fix(e2e): --disable-gpu + --no-sandbox to stop the /settings renderer crash (BUNYIP-148)
    6f7ba14 fix(e2e): goto /settings with waitUntil:'commit' so the load-stage race fails diagnosably (BUNYIP-148)
    9c0aa9f fix(e2e): serialise account-ui before api to stop the project-switch chromium relaunch (BUNYIP-148)
    a865c7e chore(e2e): TEMP pw:browser diagnostic to capture the /settings browser-process death reason
    dadf184 fix(e2e): run full chromium (channel: chromium), not headless-shell, for heavy pages
    0407e4f fix(e2e): --disable-dev-shm-usage (browser crash on /settings) + DOM-set profile fields
    34abe6f Merge 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
    d067214 fix(e2e): fixme the consent-screen spec + diagnose the /settings page-close
    8f6611e Merge 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
    5266cd2 fix(e2e): set login fields via the DOM (Playwright fill() no-ops on the CI runner)
    c6196c8 Merge 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
    ba0ffda chore(e2e): log the login page the runner actually loads (BUNYIP-168 diag)
    488be89 Merge 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
    94ad872 chore(e2e): remove BUNYIP-167 diagnostics + make blockLiveReload actually work
    9dd6f38 Merge 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
    2ee03b8 fix(e2e): block the SSE reload that wipes the login form (the real root cause)
    dcfc92b Merge 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
    f24fac8 fix(e2e): robustly fill the login form (it was posting empty email+password)
    19b1006 Merge 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
    35e71da chore(e2e): log the actual /login POST (fields + headers + response)
    fa25be3 Merge pull request 'chore(e2e): fingerprint resolved-config diagnostic to dodge secret masking (BUNYIP-167)' (#188) from chore/BUNYIP-167-fingerprint-masked-inputs into main
    2d09ada chore(e2e): fingerprint the resolved-config diagnostic to dodge secret masking
    ea165dc Merge pull request 'chore(e2e): log resolved suite inputs to diagnose login mismatch (BUNYIP-167)' (#187) from chore/BUNYIP-167-log-resolved-config into main
    6128680 chore(e2e): log resolved suite inputs to diagnose the login mismatch
    2814049 Merge pull request 'fix(e2e): trim bootstrap password before hashing (BUNYIP-166)' (#186) from fix/BUNYIP-166-bootstrap-trim-password into main
    7c4ac02 fix(e2e): trim the bootstrap password before hashing (whitespace login mismatch)

    Downloads
  • v0.3.0 40b163128c

    v0.3.0
    All checks were successful
    Build Web image / Build and push Web image (push) Successful in 54s
    Build API image / Build and push API image (push) Successful in 13m52s
    Stable

    nrupard released this 2026-06-22 19:54:27 +02:00 | 812 commits to main since this release

    Changelog

    2944919 Merge pull request 'Release v0.3.0' (#185) from release/v0.3.0 into main
    ea039f7 Release v0.3.0
    876275b Merge 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
    50cf786 fix(e2e): surface bunyip login error + stop login-bearing projects retrying
    5a1c7ca Merge 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
    f7aa167 docs(e2e): step 4 - reuse the mokosh-apps OIDC client, not a bunyip-web one
    136ad6b Merge 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
    bf5dd18 fix(e2e): match the partial unique index in bunyip-e2e-bootstrap upsert
    437fabc Merge pull request 'docs(e2e): clarify Infisical password retrieval in the runbook (BUNYIP-148)' (#181) from docs/bunyip-148-e2e-infisical-password into main
    42cb25d docs(e2e): clarify the Infisical password retrieval in the runbook
    af13138 Merge 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
    c096587 build(oci): ship bunyip-e2e-bootstrap in the bunyip-api runtime image
    ab3dacc Merge pull request 'feat(e2e): Playwright E2E suite for bunyip against deployed instances (BUNYIP-148)' (#179) from feat/BUNYIP-148-e2e-playwright-suite into main
    689bb9e docs(e2e): add first-time setup runbook to dev-docs/e2e.md
    b73a2d8 fix(e2e): strip trailing slash on base URLs + tighten consent-form assertion
    1370992 feat(e2e): Playwright E2E suite for bunyip against deployed instances
    0fcb0e0 Merge pull request 'chore: Sync the checks and justfile recipes' (#178) from chore/sync-checks-justfile into main
    f8a7890 chore: Sync the checks and justfile recipes
    54b5276 Merge 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
    a83ca28 test(oidc): pin path+secure equality in op_session_set dual-emit test (BUNYIP-146)
    f3223a4 fix(oidc): clear stale host-only op_session on silent-SSO set path (BUNYIP-146)
    e7aceb2 Merge pull request 'feat(events): SSE event bus + browser auto-reconciliation (BUNYIP-145)' (#176) from feat/bunyip-145-sse-event-bus into main
    47d5fc9 feat(events): SSE event bus + browser auto-reconciliation (BUNYIP-145)
    0c808cd Merge 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
    aae2c9c fix(admin): revoke refresh-tokens on claim-feeding mutations (BUNYIP-144)
    7cfc27b Merge pull request 'feat(ci): cap native check.yml parallelism at nproc/2' (#174) from feat/GOV-10-native-check-nproc-cap into main
    990d61a feat(ci): cap native check.yml parallelism at nproc/2
    a2f7b4c Merge pull request 'fix(migrations): auto-reconcile BUNYIP-79 in-place-edited checksums at startup' (#173) from fix/bunyip-79-migration-checksum-reconcile into main
    4b971c7 fix(migrations): auto-reconcile BUNYIP-79 in-place-edited checksums at startup
    61681bb Merge pull request 'chore: rename LICENSE.md to LICENSE (BUNYIP-143)' (#171) from chore/rename-license-file into main
    9d0ec19 chore: rename LICENSE.md to LICENSE
    31cde4d Merge 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
    bf7a8fb feat(profile-B): OIDC profile+phone scopes, consent screen, claim emission (BUNYIP-140)
    9133dc9 Merge 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
    c9b86eb feat(profile-A): users.first_name/last_name/phone columns + Settings UI (BUNYIP-139)
    05c728f Merge 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
    c65e640 feat(oidc): register lets-chat-psa as confidential OIDC client (LC-22)
    0efcf6e Merge pull request 'fix(dev): create external network in ensure-env for clean clone' (#167) from fix/pre-commit-clean-clone into main
    7f134ff Merge branch 'main' into fix/pre-commit-clean-clone
    4172b80 Merge 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
    907882e fix(admin): expose API-editable application fields and reorder in the edit/list UI
    d757a96 fix(dev): create external network in ensure-env for clean clone
    7339efe Merge pull request 'feat(auth): trusted devices to skip TOTP + sensitive-op re-prompt' (#166) from feat/bunyip-138-trusted-devices into main
    2f1ba44 feat(auth): trusted devices to skip TOTP + sensitive-op re-prompt
    abf7d4d Merge pull request 'feat(auth): session hardening - panel, role-change revoke, admin TTL/idle' (#165) from feat/bunyip-137-session-hardening into main
    8d1dd4a fix(auth): clamp admin refresh deadline to the stricter window on rotation
    c1f7892 feat(auth): session hardening - panel, role-change revoke, admin TTL/idle
    2f718af Merge pull request 'feat(web): add public /roadmap coming-soon page' (#164) from feat/bunyip-136-roadmap-page into main
    bd4fbab feat(web): add public /roadmap coming-soon page
    6f6aef1 Merge pull request 'fix(settings): wire up resend verification email control' (#161) from fix/BUNYIP-110-resend-verification-email into main
    bbc4781 Merge branch 'main' into fix/BUNYIP-110-resend-verification-email
    22ee93c Merge pull request 'fix(admin): allow editing and resending a sent feedback response' (#160) from fix/BUNYIP-123-feedback-response-edit-resend into main
    3fb428e Merge branch 'main' into fix/BUNYIP-123-feedback-response-edit-resend
    023caa3 Merge pull request 'fix(admin): make the Memberships surface editable with grant/revoke' (#158) from fix/BUNYIP-118-membership-edit-route into main
    53d641f Merge branch 'main' into fix/BUNYIP-118-membership-edit-route
    cd3f494 Merge pull request 'feat(admin): add reactivation affordance + endpoint for suspended users' (#157) from feat/BUNYIP-120-admin-user-reactivate into main
    c8e2416 Merge branch 'main' into feat/BUNYIP-120-admin-user-reactivate
    6cafb9b Merge pull request 'fix(api): drop permissive CORS allowed_origin_fn (origin reflection)' (#156) from fix/BUNYIP-124-cors-origin-reflection into main
    0755bec Merge branch 'main' into fix/BUNYIP-124-cors-origin-reflection
    0d612ea Merge 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
    e9b2914 Merge branch 'main' into feat/BUNYIP-119-admin-user-edit-email-2fa
    4d985a3 Merge pull request 'fix(admin): validate tier-settings slots/trial input and surface save errors' (#154) from fix/BUNYIP-111-tier-settings-validation into main
    868f603 Merge branch 'main' into fix/BUNYIP-111-tier-settings-validation
    4da02c7 Merge 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
    3246e38 Merge pull request 'fix(web): edge validation hardening + tier Stripe IDs (BUNYIP-112/113/115/122)' (#162) from fix/web-validation-bundle into main
    b4dcaa0 fix(web): Stripe key format, change-email/2FA edge, feedback-respond cap (BUNYIP-117)
    16b8591 fix(web): edge validation hardening + tier Stripe IDs (BUNYIP-112/113/115/122)
    1a32883 fix(settings): wire up resend verification email control
    c4d71c7 fix(admin): allow editing and resending a sent feedback response
    276f009 fix(admin): make the Memberships surface editable with grant/revoke
    acce4f9 feat(admin): add reactivation affordance + endpoint for suspended users
    ab3c397 fix(api): drop permissive CORS allowed_origin_fn (origin reflection)
    d63840c feat(admin): edit email, force-verify, and clear 2FA on user detail
    59c5b49 fix(admin): validate tier-settings slots/trial input and surface save errors
    19f4749 Merge 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
    fb44e45 fix(admin): reject unknown roles in the user-role change handler
    f3f7746 Merge 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
    28283ec fix(settings): require a non-empty password to delete an account
    a8463f9 Merge pull request 'fix(feedback): record originating page via ?from= on the feedback launcher (BUNYIP-104)' (#150) from fix/BUNYIP-104-feedback-from into main
    ff2951a Merge branch 'main' into fix/BUNYIP-104-feedback-from
    24adae8 Merge pull request 'fix(admin): confirm before role change and application-group delete (BUNYIP-109)' (#149) from fix/BUNYIP-109-admin-confirm into main
    31d0f46 fix(feedback): record originating page via ?from= on the feedback launcher (BUNYIP-104)
    a84d568 fix(admin): confirm before role change and application-group delete (BUNYIP-109)
    88648c1 Merge pull request 'fix(dashboard): badge admins as Admin instead of No Membership (BUNYIP-108)' (#148) from fix/BUNYIP-108-membership-badge-admin into main
    4e43b22 Merge branch 'main' into fix/BUNYIP-108-membership-badge-admin
    26f5c21 fix(dashboard): badge admins as "Admin" instead of "No Membership" (BUNYIP-108)
    93377ec Merge pull request 'fix(billing): compare Stripe webhook signature in constant time (BUNYIP-107)' (#147) from fix/BUNYIP-107-webhook-constant-time into main
    c943316 fix(billing): compare Stripe webhook signature in constant time (BUNYIP-107)
    e79b02e Merge pull request 'feat(downloads): per-card download affordance, retire Downloads page [BUNYIP-100 2/2]' (#146) from feat/bunyip-100-unified-downloads into main
    4f68ac3 Merge remote-tracking branch 'origin/main' into feat/bunyip-100-unified-downloads
    f1a1d21 feat(downloads): per-card download affordance, retire Downloads page
    6560b74 Merge pull request 'feat(groups): application groups (data, admin, user grouping) [BUNYIP-100 1/2]' (#145) from feat/bunyip-100-application-groups into main
    0c39e6a Merge branch 'main' into feat/bunyip-100-application-groups
    90c982b Merge pull request 'chore: gitignore the local-only "For AI/" working dir' (#144) from chore/ignore-for-ai-dir into main
    570f8da Merge branch 'main' into chore/ignore-for-ai-dir
    5c17cd2 Merge remote-tracking branch 'origin/main' into feat/bunyip-100-application-groups
    ecc3912 feat(groups): application groups (data, admin management, user grouping)
    070aa73 Merge 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
    e6603ef chore: gitignore the local-only "For AI/" working dir
    ff396b8 fix(bunyip-101): use post-9c082eb hashes (script had pre-edit values inverted)
    e23b1d8 Merge pull request 'feat(admin): show Hub/Binary/OCI surface tags on applications' (#142) from feat/bunyip-99-admin-surface-tags into main
    51e812c Merge branch 'main' into feat/bunyip-99-admin-surface-tags
    0ebd98b feat(admin): show Hub/Binary/OCI surface tags on applications
    d6ea0dc Merge pull request 'ops(bunyip-101): script to reconcile _sqlx_migrations after in-place edits' (#141) from ops/bunyip-101-reconcile-migration-checksums into main
    0bece53 ops(bunyip-101): script to reconcile _sqlx_migrations after in-place edits
    ef60351 Merge pull request 'chore: Sync .gitignore with other repos' (#140) from chore/gitignore into main
    3d8802c Merge branch 'main' into chore/gitignore
    3805e24 chore: Sync .gitignore with other repos
    b93b455 Merge pull request 'feat(justfile): add dev-clean / dev-clean-all teardown recipes' (#139) from feat/dev-clean-recipes into main
    469df5d feat(justfile): add dev-clean / dev-clean-all teardown recipes
    0818659 Merge pull request 'fix(bunyip-domain): correct repository SQL binding, silent no-ops, and dead methods' (#136) from fix/bunyip-76 into main
    8021d5d fix(bunyip-domain): correct repository SQL binding, silent no-ops, and dead methods
    a48fd69 Merge pull request 'fix(migrations): close data-integrity gaps and gate version collisions' (#135) from fix/bunyip-79 into main
    69f657f Merge branch 'main' into fix/bunyip-79
    e4c835f Merge pull request 'fix(web): handler correctness, dedup helpers, drop dead web types' (#133) from fix/bunyip-78 into main
    fdaa024 Merge branch 'main' into fix/bunyip-78
    9c082eb fix(migrations): close data-integrity gaps and gate version collisions
    415eea1 Merge pull request 'chore: add pre-commit hook recipes' (#138) from chore/pre-commit-hooks into main
    41f4170 chore: add install-hooks and pre-commit just recipes
    868c1f2 Merge pull request 'chore: Add JetBrains .idea preferences' (#137) from chore/add-jetbrains-idea into main
    e628821 chore: Add JetBrains .idea preferences
    e419930 Merge pull request 'fix(feedback): raise hero pill contrast to WCAG AA' (#134) from fix/bunyip-97 into main
    bc99793 Merge branch 'main' into fix/bunyip-97
    b2d7653 Merge pull request 'fix(bunyip-api): handler correctness for webhooks, admin, auth, dedup' (#132) from fix/bunyip-77 into main
    f8c22f2 Merge branch 'main' into fix/bunyip-77
    6709e70 Merge pull request 'fix(admin-tier): count admin-granted lifetimes toward slot usage' (#131) from fix/bunyip-96 into main
    4d4cbd1 Merge branch 'main' into fix/bunyip-96
    e37a93e Merge pull request 'fix(auth): harden middleware and auto-ban against IP spoofing and map growth' (#130) from fix/bunyip-72 into main
    fe1542d fix(feedback): raise hero pill contrast to WCAG AA
    7bee494 fix(web): handler correctness, dedup helpers, drop dead web types
    a077d4a fix(bunyip-api): handler correctness for webhooks, admin, auth, dedup
    836b478 fix(admin-tier): count admin-granted lifetimes toward slot usage
    54b01af fix(auth): harden middleware and auto-ban against IP spoofing and map growth
    7dd2151 Merge pull request 'fix(auth): validate token issuer, drop 2FA email gate, unify email-change SQL' (#129) from fix/bunyip-75-token-issuer into main
    da8552c fix(auth): validate token issuer, drop 2FA email gate, unify email-change SQL
    32c4c39 Merge 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
    3f785d3 Merge pull request 'feat(oidc): /authorize tenant gate + picker (BUNYIP-62)' (#127) from feat/bunyip-62-authorize-tenant-gate-and-picker into main
    1dfb600 Merge pull request 'feat(oidc): add oauth_client_user_tenants assignments + admin API' (#126) from feat/bunyip-61-oauth-client-user-tenants into main
    41a7648 feat(oidc): /token mints configured tenant claim on at+jwt and id_token (BUNYIP-63)
    2e4bf6c feat(oidc): /authorize tenant gate + picker (BUNYIP-62)
    f3969ec feat(oidc): add oauth_client_user_tenants assignments + admin API
    b4e0406 Merge 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
    8ff1b79 fix(layout): cap visible toasts at 5 to bound the toast-root column
    a3aa9d1 Merge 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
    425a531 fix(admin-feedback): mask email on detail + no-email indicator + await reply email send
    e056efb Merge pull request 'feat(admin-feedback): per-row Archive action + Reply button discoverability' (#115) from feat/feedback-admin-archive-and-reply-button into main
    f071797 feat(admin-feedback): per-row Archive action + Reply button discoverability
    4810e52 Merge 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
    3818b2f Merge remote-tracking branch 'origin/main' into feat/feedback-admin-ops-spam-and-delete
    d26756c Merge pull request 'fix(membership): collapse 'Lifetime x3' stutter on the lifetime card' (#113) from fix/lifetime-card-stutter into main
    ef18d93 feat(admin-feedback): spam filter + mark/unmark spam + delete + Close-into-Closed-tab
    1dd72d0 fix(membership): collapse 'Lifetime x3' stutter on the lifetime card
    d2df1ec Merge pull request 'feat(feedback): magic-byte MIME validation + dim bomb cap + proxy hardening' (#112) from feat/feedback-attachment-security-hardening into main
    9ab3655 Merge pull request 'feat(feedback): attachments upload + admin thumbnails + BFF download proxy' (#111) from feat/feedback-attachments-upload-and-download into main
    935f79b feat(feedback): magic-byte MIME validation + dim bomb cap + proxy hardening
    e703f99 Merge pull request 'feat(webhook): Stripe event_id idempotency on receipt' (#110) from feat/stripe-webhook-idempotency into main
    3009e98 Merge pull request 'feat(audit): emit auth_refresh_reuse_detected on refresh-token replay' (#109) from feat/audit-refresh-reuse-event into main
    577802e Merge pull request 'fix: harden three unwrap/expect panic surfaces in request paths' (#108) from fix/harden-unwrap-panic-surfaces into main
    708abc0 Merge pull request 'feat(feedback): admin detail subpage + respond + archive/restore' (#107) from feat/feedback-admin-detail-and-archive into main
    dc84d33 Merge 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
    d094513 Merge pull request 'fix(layout): restore floating feedback launcher, drop top-bar icon' (#105) from fix/feedback-widget-restore-floating into main
    b9ccc29 Merge pull request 'fix(stripe): add request timeout to raw reqwest calls into Stripe API' (#104) from fix/stripe-client-timeout into main
    007e86c feat(webhook): Stripe event_id idempotency on receipt
    112f7ce feat(audit): emit auth_refresh_reuse_detected on refresh-token replay
    29939af fix: harden three unwrap/expect panic surfaces in request paths
    4406f1d feat(feedback): attachments upload + admin thumbnails + BFF download proxy
    00f2a45 feat(feedback): admin detail subpage + respond + archive/restore
    dc54130 feat(feedback): thread page_path through form + display in admin row + CSV export
    0655b6d fix(layout): restore floating feedback launcher, drop top-bar icon
    5dea7f2 fix(stripe): add request timeout to raw reqwest calls into Stripe API
    68a6822 Merge pull request 'docs: add 2026-06-06 platform audit to dev-docs/audits' (#103) from docs/add-platform-audit-2026-06-06 into main
    2423431 docs: add 2026-06-06 platform audit to dev-docs/audits
    630e1db Merge pull request 'fix(admin-feedback): show name + masked email on each row + toggle Reviewed' (#102) from fix/feedback-admin-row into main
    70191f4 fix(admin-feedback): show name + masked email on each row + toggle Reviewed
    a8300a9 Merge 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
    2cb8b99 fix(feedback): repeated tags decode + inline error instead of bare 422 page
    8d34083 Merge pull request 'feat(legal): single POLICY_LAST_UPDATED constant + refresh stale "January 2025"' (#100) from feat/bunyip-upgrade-07-legal-dates into main
    7f21783 Merge pull request 'feat(2fa): preserve QR + manual key when verification code is wrong' (#99) from feat/bunyip-upgrade-04-2fa-preserve into main
    bade61f Merge pull request 'feat(settings): suppress browser autofill on email / delete-account forms' (#98) from feat/bunyip-upgrade-02-settings-hygiene into main
    a118c02 Merge pull request 'feat(membership): consolidate plan name + lifetime card shape + merge with billing' (#97) from feat/bunyip-upgrade-01-membership-plan into main
    27031b5 Merge pull request 'chore(ci): shrink check.yml disk footprint to avoid runner ENOSPC' (#96) from chore/check-ci-disk-footprint into main
    e026576 chore(ci): shrink check.yml disk footprint to avoid runner ENOSPC
    d7288ba Merge 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
    6632cec Merge pull request 'feat(layout): dynamic top-bar title across dashboard / admin pages' (#94) from feat/bunyip-upgrade-03-topbar-title into main
    0860504 Merge 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
    3a0cd08 Merge pull request 'feat(layout): app-wide toast system + Copy button confirmation' (#92) from feat/bunyip-upgrade-05-toast-system into main
    2d45ba6 feat(legal): single POLICY_LAST_UPDATED constant + refresh stale "January 2025"
    ec77829 feat(2fa): preserve QR + manual key when verification code is wrong
    296ea05 feat(settings): suppress browser autofill on email / delete-account forms
    b6df86e feat(membership): consolidate plan name + lifetime card shape + merge with billing
    d7ad944 feat(theme): make the high-contrast toggle visibly transform the page in light mode
    91a1396 feat(layout): dynamic top-bar title across dashboard / admin pages
    99921d3 feat(layout): replace floating feedback launcher with a top-bar icon button
    5d5babe feat(layout): app-wide toast system + Copy button confirmation
    cccd66a Merge 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
    782caa3 fix(oidc): extract JwtService via app_data instead of web::Data param
    e28ce7b Merge pull request 'fix(oidc): silent SSO also consumes refresh_token cookie on /authorize' (#90) from fix/oidc-silent-sso-via-access-token into main
    6b29275 fix(oidc): silent SSO also consumes refresh_token cookie on /authorize
    2571300 Merge pull request 'fix(oidc): silent SSO on /authorize via hub access_token cookie' (#89) from fix/oidc-silent-sso-via-access-token into main
    ab463fd fix(oidc): silent SSO on /authorize via hub access_token cookie
    9323932 Merge pull request 'fix(web): enable reqwest stream feature for bunyip-web' (#88) from fix/bunyip-web-reqwest-stream into main
    2a71b2a fix(web): enable reqwest "stream" feature for bunyip-web
    8423bba Merge pull request 'fix(dev): set default-run so cargo run resolves to bunyip-api' (#87) from fix/bunyip-api-default-run into main
    9caf17c fix(dev): set default-run so cargo run resolves to the bunyip-api server
    a7747d3 Merge pull request 'feat(oidc): mirror bunyip_role into the ID token (PMS-158)' (#86) from fix/bunyip-emit-role-claim into main
    0e3e9ae feat(oidc): mirror bunyip_role into the ID token (PMS-158)
    a17d670 Merge pull request 'fix(web): relay rotated session cookie on admin redirects (BUNYIP-67)' (#85) from fix/bunyip-67-admin-redirect-cookies into main
    9b9c328 fix(web): relay rotated session cookie on admin redirects (BUNYIP-67)
    30ebf1c Merge pull request 'feat(api): add bunyip-e2e-bootstrap test-account seeder (BUNYIP-52)' (#84) from feat/bunyip-52-e2e-bootstrap-binary into main
    f9e51d6 docs(api): note ENVIRONMENT-vs-DATABASE_URL residual risk on e2e guard (BUNYIP-52)
    aad41de feat(api): add bunyip-e2e-bootstrap test-account seeder (BUNYIP-52)
    42df032 Merge pull request 'feat(web): wire the delete-application admin UI (BUNYIP-65)' (#83) from feat/bunyip-65-delete-applications into main
    2514e92 fix(web): relay rotated session cookie on delete-application redirect (BUNYIP-65)
    2d34eb5 feat(web): wire the delete-application admin UI (BUNYIP-65)
    b5498dc Merge pull request 'fix(web): proxy binary downloads through the BFF (BUNYIP-64)' (#82) from fix/bunyip-64-download-asset-bff-proxy into main
    20affa4 fix(web): forward status + Content-Length on download proxy (BUNYIP-64)
    1e0c3ea fix(web): proxy binary downloads through the BFF (BUNYIP-64)
    13e523b Merge 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
    bed0c47 fix(oidc): default bunyip_role on deserialize for rolling-deploy compat (BUNYIP-66)
    9a703a3 feat(oidc): emit bunyip_role claim in at+jwt for resource servers (BUNYIP-66)
    3e96796 Merge 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
    df379de fix(oidc): clear stale op_session cookie on authorize when sid -> no row
    561bea9 Merge pull request 'BUNYIP-59: immutable release tags, Cargo.lock sync, tag-collision guard' (#79) from fix/bunyip-59-release-hygiene into main
    881e1c1 fix(release): immutable version tags, lockfile sync, tag-collision guard

    Downloads
  • v0.2.1 974ebfa396

    v0.2.1
    All checks were successful
    Build Web image / Build and push Web image (push) Successful in 48s
    Build API image / Build and push API image (push) Successful in 15m23s
    Stable

    nrupard released this 2026-06-08 21:38:18 +02:00 | 1036 commits to main since this release

    Changelog

    c1ed059 Merge pull request 'Release v0.2.1' (#78) from release/v0.2.1 into main
    0c2c1cb Release v0.2.1
    7fa0aba Merge 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
    73d2cf7 fix(oci-build): force real bunyip-api rebuild, guard against stub leak
    da55b1e Merge 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
    c918f2e fix(oidc): make post-logout URIs optional in SPA client upsert (BUNYIP-57)
    8608d18 fix(oidc): register SPA clients from env-driven startup upsert (BUNYIP-57)
    518b9af Merge 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
    8d9e4de fix(oidc): honor checked= flag on /login to break authorize loop
    58a1e38 Merge 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
    2b0f100 fix(build): bump rust-builder-glibc to v1.0.1, drop bun workaround
    ecf2b54 Merge pull request 'chore: Sync .gitignore' (#72) from chore/sync-gitignore into main
    dff36a0 chore: Sync .gitignore
    3f722bc Merge pull request 'fix(web): applications-page launcher points at /dashboard, not /' (#71) from fix/applications-launcher-points-at-dashboard into main
    a7c2422 fix(web): applications-page launcher points at /dashboard, not /
    98ca4dc Merge 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
    942b837 fix(auth): GET /v1/auth/logout 302s directly to url; /logout page lands on /
    b9a3f4c Merge 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
    23c9abc feat(auth): AuthenticatedUser accepts OIDC at+jwt alongside legacy HS256 (BUNYIP-55)
    467ab5a Merge 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
    005e017 Merge 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
    c992899 fix(web): make bun/bunx runnable by the host user in the dev image
    b4ab88d fix(oidc): gate authorize on a server-validated OP session
    baf11fc Merge 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
    ce45c85 feat(dev-sso): make bunyip-api the OIDC OP for the hub and mokosh SPA
    151be82 Merge pull request 'feat(auth): GET /v1/auth/memberships synthetic single-tenant stub' (#65) from feat/auth-memberships-stub into main
    ff79eb9 feat(auth): GET /v1/auth/memberships synthetic single-tenant stub
    9bfeee2 Merge pull request 'feat(web): admin UI to edit and create application distribution config' (#64) from feat/bunyip-51-app-distribution-admin-ui into main
    bd5a1bb fix(web): address review of application distribution admin UI
    d52cff9 feat(web): admin UI to edit and create application distribution config
    5bd3046 Merge pull request 'feat(admin): add revoke-lifetime-membership endpoint + UI' (#63) from feat/admin-user-management into main
    e20979b feat(admin): add revoke-lifetime-membership endpoint + UI
    556f1c3 Merge pull request 'fix(dev): escape literal paren in dev-sso print string' (#62) from fix/dev-sso-nushell-paren-escape into main
    e963488 fix(dev): escape literal paren in dev-sso print string
    b5d0343 Merge pull request 'fix(web): drop obsolete bun symlink workaround in dev Dockerfile' (#61) from fix/web-dockerfile-bun-base-image-update into main
    c9da238 fix(web): drop obsolete bun symlink workaround in dev Dockerfile
    e7ec9c7 Merge pull request 'feat/admin-user-management' (#60) from feat/admin-user-management into main
    8f36030 chore: remove stray mktemp file accidentally committed
    b4377c2 fix(admin): use axum 0.7 ':id' path-param syntax, not '{id}'
    61c851d Merge pull request 'feat(admin): expand user management with detail page + new actions' (#59) from feat/admin-user-management into main
    fff3968 feat(admin): expand user management with detail page + new actions
    e2d54b6 Merge pull request 'fix(web): show forbidden/unauthenticated download errors distinctly (BUNYIP-49)' (#58) from fix/bunyip-49-downloads-forbidden-message into main
    800261e fix(web): handle 404 + add sign-in link on downloads error page (BUNYIP-49 review)
    0d8726e fix(web): show forbidden/unauthenticated download errors distinctly (BUNYIP-49)
    bdca948 Merge pull request 'feat: map DownloadCacheError via dunite ErrorClass in member-download handler (BUNYIP-48)' (#57) from feat/bunyip-48-download-errorclass into main
    db252a7 feat: map DownloadCacheError via dunite ErrorClass in the member-download handler (BUNYIP-48)
    1f0b5e4 Merge 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
    727ecb6 refactor(oci): collapse always-Some concurrency guard to a plain UsageGuard (BUNYIP-47 review)
    d9e299f feat: adopt dunite PSA-37 secret_env + PSA-42 acquire_concurrency_only; bump dunite dep
    36ef071 Merge 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
    63e1eb7 fix(oci): address PR #55 review - extract should_meter + test, fix doc, note tradeoffs
    53a7dfd fix(oci): daily pull limit counts logical pulls, not every manifest request (BUNYIP-43)
    76989b9 Merge pull request 'chore(compose): pass through distribution limit/TTL env vars (BUNYIP-42)' (#54) from chore/bunyip-42-compose-distribution-tunables into main
    52a6a30 chore(compose): pass through distribution limit/TTL env vars (BUNYIP-42)
    4892c99 Merge 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
    02dd8a8 fix(download): same SUM-as-i64 decode bug in download cache; harden BUNYIP-41 test
    a27f51d fix(oci): blob cache total_size_bytes decode error broke LRU eviction (BUNYIP-41)
    a9df71f Merge 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
    eb7f399 fix(oci): address PR #52 review - per-IP failure cap, dedup limit blocks
    658e697 fix(oci): rate-limit failed token verifications, not successful pulls (BUNYIP-40)
    f3b4c42 Merge pull request 'feat(entitlements): per-product access control with admin + Stripe grants (BUNYIP-39)' (#51) from feat/bunyip-39-per-product-entitlements into main
    0ea20b1 fix(entitlements): address PR #51 review findings
    6d09f67 feat(entitlements): per-product access control with admin + Stripe grants (BUNYIP-39)
    be19611 Merge 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
    d407788 fix(download): map upstream NotFound to 404 and classify with an exhaustive match (PR #50 review)
    8e4d08e feat(deps): consume dunite PSA-36 (single-flight core + download Transport error class)
    dbe79c9 Merge pull request 'fix(feedback): improve contrast of hero text (BUNYIP-45)' (#49) from fix/feedback-hero-bunyip-contrast into main
    d85b113 fix(feedback): raise contrast of hero "Bunyip" wordmark
    ac3c796 Merge pull request 'feat(applications): seed Drillmark as a hosted launcher tile' (#48) from feat/seed-drillmark-application into main
    8b4797e feat(applications): seed Drillmark as a hosted launcher tile
    efa868a Merge pull request 'fix(launcher): point app tiles at /dashboard so AuthGuard fires' (#47) from fix/launcher-tile-to-dashboard into main
    cae06a4 Merge pull request 'fix(cors): split CORS_ORIGIN comma-list into per-origin registrations' (#46) from fix/cors-allowed-origins-list into main
    66e9934 fix(cors): split CORS_ORIGIN comma-list into per-origin registrations
    3eee826 fix(launcher): point app tiles at /dashboard so AuthGuard fires
    960e4ff Merge pull request 'fix(web): preserve ?redirect= through the 2FA hop' (#45) from fix/preserve-redirect-through-2fa into main
    ff262ce fix(web): preserve ?redirect= through the 2FA hop
    c361409 Merge pull request 'feat(applications): seed Mokosh as a hosted launcher tile' (#44) from feat/seed-mokosh-application into main
    8fd483e Merge pull request 'fix(web): accept absolute OIDC issuer URLs in safe_redirect' (#43) from fix/bunyip-web-safe-redirect-allow-issuer into main
    e7a2266 feat(applications): seed Mokosh as a hosted launcher tile
    e78b5ca fix(web): accept absolute OIDC issuer URLs in safe_redirect
    8569ee7 Merge 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
    b004bd2 fix(oidc): use single web_origin for login redirects, not the cors_origin list
    3e638f3 Merge pull request 'feat(oidc): seed mokosh-apps + drillmark as public PKCE clients' (#41) from feat/bunyip-op-cutover into main
    786ec10 feat(oidc): seed mokosh-apps + drillmark as public PKCE clients
    9f4e000 Merge pull request 'feat(secrets): file-based production secrets via compose secrets (BUNYIP-38)' (#40) from feat/bunyip-38-file-based-secrets into main
    6cfd663 fix(secrets): address PR #40 review findings
    ae84d2b feat(secrets): file-based production secrets via compose secrets + {NAME}_FILE convention (BUNYIP-38)
    2444718 Merge 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
    75cf0f7 fix(toolchain): address PR #39 review findings
    ce68931 chore(toolchain): pin rust 1.94.1, fix clippy/fmt workspace-wide, deflake config tests (BUNYIP-36)
    bb21a68 Merge 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
    d8771c0 refactor(oci): consume dunite-oci's shared limiter API and typed blob-cache errors (PSA-35)
    498eaf1 Merge pull request 'docs(dev-sso): distribution e2e smoke-test section (BUNYIP-35)' (#37) from docs/bunyip-35-e2e-smoke-tests into main
    c94af88 docs(dev-sso): rework smoke-test section per review; definitive cache proof
    357f625 docs(dev-sso): add distribution e2e smoke-test section from BUNYIP-35 run
    b31736e Merge 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
    9a13bcb Merge 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
    26fcec5 fix(downloads): address PR #36 review findings
    b69c8a4 feat(web): downloads page with OCI pull instructions and version badges (BUNYIP-34)
    b892859 fix(web-dev): replace inaccessible bun symlink so dev container runs as host user (BUNYIP-37)
    8a811ba Merge 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
    336a4da fix(catalog): address PR #34 review findings
    eb96536 feat(catalog): seed Mokosh product catalog + one-call admin create + token audit (BUNYIP-33)
    5c43407 Merge pull request 'feat(infra): distribution proxy in prod compose + dev-sso Traefik registry (BUNYIP-32)' (#33) from feat/bunyip-32-distribution-infra into main
    a187680 fix(infra): address code-review findings on the distribution infra PR
    c11c4a7 feat(infra): wire the distribution proxy into prod compose + dev-sso Traefik (BUNYIP-32)
    18f6d64 Merge pull request 'feat(oci): make registry verifiable against private Forgejo (BUNYIP-31)' (#27) from feat/bunyip-31-oci-private-forgejo into main
    1de2587 fix(oci): address code-review findings on the registry verification PR
    824769b fix(oci): writable cache volumes + live verification results (BUNYIP-31 Phase B)
    6ed7432 Merge pull request 'revert(auth): restore Subscriber as default role on register' (#32) from revert/register-as-admin-staging into main
    a7ccb73 revert(auth): restore Subscriber as default role on register
    59aee79 Merge pull request 'fix(ci): pin Rust toolchain to 1.93.0' (#31) from fix/pin-rust-toolchain into main
    1d78a84 fix(ci): pin Rust toolchain to 1.93.0
    234b6cf Merge pull request 'fix(web): silence dead_code + too_many_arguments lints' (#30) from fix/web-fmt into main
    2c1912b fix(web): silence dead_code + too_many_arguments lints
    43b5581 Merge pull request 'style: cargo fmt --all (clears CI fmt-check failure)' (#29) from fix/web-fmt into main
    a9d4117 style: cargo fmt --all (clears CI fmt-check failure)
    51bfdbe Merge pull request 'chore(auth): default new registrations to Admin role (staging only)' (#28) from chore/register-as-admin-staging into main
    6a07c17 chore(auth): default new registrations to Admin role (staging only)
    9b2df2d feat(oci): make registry verifiable against private Forgejo (BUNYIP-31)
    403d9f8 Merge pull request 'feat(download): consume dunite-download engine, drop hand-rolled code (BUNYIP-30)' (#26) from feat/bunyip-30-consume-dunite-download into main
    2cc3fd7 fix(download): address code-review findings on the dunite-download adoption
    9b3cbe6 chore: remove accidentally committed Claude session artifact, ignore .claude/
    b85f53c feat(download): consume dunite-download engine, drop hand-rolled code (BUNYIP-30)
    97678a4 Merge pull request 'docs(billing): sequenced M1 implementation plan on the locked decisions' (#25) from docs/billing-m1-plan into main
    132ebfc docs(billing): sequenced M1 implementation plan on the locked decisions
    6cb33c7 Merge pull request 'docs(billing): correct stale rebuild premise + add M1 billing gap matrix' (#24) from docs/billing-m1-audit into main
    dd5accd docs(billing): correct stale rebuild premise + add M1 billing gap matrix
    f33076f Merge pull request 'docs(dev-sso): add three-repo dev-sso runbook + design rationale' (#23) from docs/dev-sso-runbook into main
    b31c85d docs(dev-sso): add three-repo dev-sso runbook + design rationale
    fde2743 Merge pull request 'fix(ci): generate release notes from commits since previous tag' (#21) from fix/release-notes-since-prev-tag into main
    4f863e1 Merge branch 'main' into fix/release-notes-since-prev-tag
    50131e9 Merge pull request 'feat(dev): generate OIDC signing keys on just dev if missing' (#22) from feat/dev-ensure-oidc-keys into main
    c7f6ae3 fix(ci): generate release notes from commits since previous tag
    7926e5b feat(dev): generate OIDC signing keys on just dev if missing
    87ffdcd Merge pull request 'fix(dev): export HOST_UID/HOST_GID (not UID/GID) for compose' (#20) from fix/dev-host-uid-mapping into main
    ff6d817 fix(dev): export HOST_UID/HOST_GID (not UID/GID) for compose
    0244fdd Merge pull request 'fix(dev-sso): mark the per-developer private network external' (#19) from fix/dev-sso-private-network-external into main
    820516b fix(dev-sso): mark the per-developer private network external
    0789192 Merge 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
    61ebd28 fix(dev-sso): route bunyip-web on nebula-secure via list-syntax labels
    05df92b Merge pull request 'feat(dev-sso): make Traefik entrypoints overridable via TRAEFIK_ENTRYPOINTS' (#17) from feat/dev-sso-traefik-entrypoint-env into main
    107f9ac feat(dev-sso): make Traefik entrypoints overridable via TRAEFIK_ENTRYPOINTS
    c65075c Merge pull request 'feat: 100% a8n.tools parity - SSR frontend, dunite backend, governance conformance' (#16) from feat/bunyip-dunite-infra-boot into main
    b51a15b fix(web): tolerate missing updated_at in API responses (register/login 'missing field')
    4f5bfd3 feat(web): restore the Bunyip mascot illustration in the hero
    c1b6691 feat(web): restore Bunyip styling + wording (reed/water theme, "Surfaces what matters")
    7517a11 fix(web): serve assets/styles.css (fix 404, broken styling)
    c1e9a21 chore: MIT license, secret-generating ensure-env, justfile groups, startup banners
    2e5ee27 feat: a8n.tools (menkent) parity - SSR frontend, governance conformance, domain rename
    9ee7a3b feat(infra): wire dev + prod stack for the actix backend on dunite
    f09fa28 fix(api): load .env at startup
    26d07fd Merge pull request 'feat: scaffold bunyip-core/oci/oidc crates for the dunite rebuild' (#15) from feat/bunyip-api-on-dunite into main
    a35b179 chore(core): rebrand runtime config defaults from a8n to bunyip
    2b69a97 fix: drop bunyip-mocks workspace member and strip oidc client seeds
    2aabd49 chore: prune a8n migration seeds and retire the axum mock
    6cd6d92 feat(api): convert bunyip-api from axum mock to the actix binary on dunite
    23fd194 feat(oidc): port bunyip-oidc provider on dunite-oidc keys
    ce60a06 feat(oci): port bunyip-oci consuming the dunite-oci generic engine
    d33be83 build: consume dunite crates from the Forgejo git source
    057ff50 feat(core): fill bunyip-core domain layer on the dunite-core kernel
    23ede7c feat(scaffold): skeleton bunyip-core/oci/oidc crates for the dunite rebuild
    0d7044c Merge pull request 'PSA audit (non-mock fixes) + prod mock-guard' (#14) from feat/m1-vas into main
    dfa6fe8 fix(web): derive_api_host returns same-origin host on apex topology
    dc0e9d5 feat(m1): Phase-5 audit fixes - OIDC nonce, log scrub, active-org, feedback routing, prod mock-guard
    27f1987 feat(m1): vas sprint - google oauth + wiring
    bc9a734 Merge pull request 'fix(login): omit client_id from password_login body when empty' (#13) from fix/login-skip-empty-client-id into main
    ae197fb fix(login): omit client_id from password_login body when empty
    1d9340c Merge pull request 'fix(release): publish binaries to psa-systems-private Generic Packages' (#12) from fix/release-binaries-to-generic-packages into main
    637974e fix(release): publish binaries to psa-systems-private Generic Packages

    Downloads
  • v0.1.1 2630bf8e4c

    v0.1.1
    All checks were successful
    build / Lint and type-check (push) Successful in 1m25s
    build / Build and push OCI images (push) Successful in 5m31s
    Stable

    nrupard released this 2026-05-28 20:38:32 +02:00 | 1206 commits to main since this release