• v0.8.0 fd2f6c39e8

    v0.8.0
    All checks were successful
    E2E / Playwright against deployment (push) Successful in 35s
    Build Web image / Build and push Web image (push) Successful in 54s
    Check / fmt + clippy + build + tests (push) Successful in 2m37s
    Build API image / Build and push API image (push) Successful in 10m9s
    Stable

    nrupard released this 2026-07-24 18:04:51 +02:00 | 308 commits to main since this release

    Changelog

    fd2f6c3 Merge pull request 'Release v0.8.0' (#394) from release/v0.8.0 into main
    79f5a85 Release v0.8.0
    5bcb5c3 Merge pull request 'fix(cleanup): resolve four bunyip review findings (BUNYIP-400)' (#392) from fix/BUNYIP-400-cleanup into main
    84a9a1e Merge pull request 'fix(admin): report real outcome of ten admin mutations (BUNYIP-398)' (#391) from fix/BUNYIP-398-admin-false-success into main
    c395aa4 Merge pull request 'fix(web): never trap an admin on the onboarding email-verification gate (BUNYIP-401)' (#393) from fix/BUNYIP-401-admin-never-trapped-on-unverified-email into main
    9b315cd style: wrap onboarding_needed signature to satisfy rustfmt (BUNYIP-401)
    8162bcd fix(web): never trap an admin on the onboarding email-verification gate (BUNYIP-401)
    3f2f7c7 fix(cleanup): resolve four bunyip review findings
    2e69f8d fix(admin): report real outcome of ten admin mutations
    22d2d1a Merge pull request 'docs(getting-started): drop the dead help.psa.systems row (PMS-661)' (#390) from fix/PMS-661-remove-dead-help-psa-systems into main
    ebdaace docs(getting-started): drop the dead help.psa.systems row (PMS-661)
    4dc90e7 Merge pull request 'fix(email): reword password-reset email + show request country (BUNYIP-397)' (#389) from fix/BUNYIP-397-reset-email-copy into main
    d66073d fix(email): reword password-reset email and show the request country (BUNYIP-397)
    5e93a4e Merge pull request 'feat(docs): Mokosh product quick-start for mokosh-server (PMS-662)' (#388) from feat/PMS-662-mokosh-quickstart into main
    737b151 feat(docs): seed a Mokosh product quick-start for mokosh-server (PMS-662)
    6fdef53 Merge pull request 'feat(docs): Mokosh local Compose + OCI login docs for mokosh-server (PMS-678)' (#387) from feat/PMS-678-mokosh-setup-docs into main
    4de3cc8 feat(docs): seed Mokosh setup docs (compose, registry login, split) for mokosh-server (PMS-678)
    5e6552d Merge pull request 'fix(web): OCI sign-in step is always required, not "only if private" (BUNYIP-393)' (#386) from fix/BUNYIP-393-oci-login-always-required into main
    3156dfc fix(web): drop the "only if private" qualifier from the OCI sign-in step (BUNYIP-393)
    baa6f37 Merge pull request 'fix(docs): make the public per-app docs read public, not entitlement-gated (BUNYIP-394)' (#385) from fix/BUNYIP-388-public-docs-not-entitlement-gated into main
    b6e1d92 feat(catalog): show restricted-but-documented apps as a docs-only locked card (BUNYIP-395)
    7f25f20 fix(docs): make the public per-app docs read public, not entitlement-gated (BUNYIP-394)
    66e5319 Merge pull request 'fix(web): docs admin route 404 + catalog link on wrong apps (BUNYIP-390)' (#384) from fix/BUNYIP-388-docs-admin-route-and-catalog-link into main
    7de67b6 feat(web): gate the catalog Documentation link on a has_docs flag (BUNYIP-391)
    11b4d6e fix(web): register admin docs routes + move catalog docs link to OCI apps (BUNYIP-390)
    c777d16 Merge pull request 'chore(oci-build): replace bunyip-api stub-cache hacks with cargo-chef (BUNYIP-389)' (#383) from chore/BUNYIP-389-cargo-chef-build into main
    8a66354 chore(oci-build): replace bunyip-api stub-cache hacks with cargo-chef (BUNYIP-389)
    8a78e72 Merge pull request 'feat(docs): per-application documentation, admin-authored + public (BUNYIP-388)' (#382) from feat/BUNYIP-388-application-docs into main
    e3032c5 fix(docs): gate per-app doc reads, audit doc writes, robust sort_order (BUNYIP-388)
    040603c fix(docs): friendlier empty state for an app with no docs (BUNYIP-388)
    6fe190b feat(docs): per-application documentation, admin-authored + public (BUNYIP-388)
    00b631e Merge pull request 'fix(web): make public /docs user-facing, drop internal dev runbooks (BUNYIP-387)' (#381) from fix/BUNYIP-387-user-facing-docs into main
    6c09fc7 fix(web): describe the account action instead of naming a button (BUNYIP-387)
    515d03b fix(web): make public /docs user-facing, drop internal dev runbooks
    5d79006 Merge pull request 'feat(oci): retain app version history so bumps do not lose old versions (BUNYIP-386)' (#380) from feat/BUNYIP-386-oci-version-history into main
    6cfc71d Merge pull request 'feat(web): serve top-level docs publicly at /docs (BUNYIP-385)' (#379) from feat/BUNYIP-385-docs-route into main
    e62f108 feat(download): retain + serve historical binary releases (BUNYIP-386)
    d1bdbf0 feat(oci): self-heal version history + fill digest on the serve path (BUNYIP-386)
    31b483c feat(oci): retain app version history so bumps do not lose old versions (BUNYIP-386)
    80b110e fix(web): strip raw HTML from rendered docs for defense-in-depth (BUNYIP-385)
    9247577 fix(web): use axum 0.7 colon route param for /docs/:slug (BUNYIP-385)
    78919d0 feat(web): serve top-level docs publicly at /docs (BUNYIP-385)
    eadfafd Merge pull request 'fix(web): close the SSE EventSource on pagehide (BUNYIP-380)' (#377) from fix/BUNYIP-380-sse-pagehide-close into main
    f1d2e4b Merge branch 'main' into fix/BUNYIP-380-sse-pagehide-close
    9d09fbe Merge pull request 'fix(e2e): register disposable accounts through the signup bot guard (BUNYIP-384)' (#378) from fix/BUNYIP-384-e2e-signup-guard into main
    c8877e6 fix(e2e): register disposable accounts through the signup bot guard (BUNYIP-384)
    411d01b fix(web): close the SSE EventSource on pagehide (BUNYIP-380)
    73f07d6 Merge pull request 'feat(auth): merge the 2FA trust-device control into sign-in remember-me (BUNYIP-382)' (#376) from feat/BUNYIP-382-merge-2fa-remember into main
    ec5903b Merge branch 'main' into feat/BUNYIP-382-merge-2fa-remember
    1e70872 Merge pull request 'feat(auth): uniform 30-min / 1-day (30-day-remember) session lifetimes (BUNYIP-381)' (#375) from feat/BUNYIP-381-token-lifetimes into main
    b4ce83e feat(auth): merge the 2FA trust-device control into sign-in remember-me (BUNYIP-382)
    5b78d6c feat(auth): uniform 30-min / 1-day (30-day-remember) session lifetimes, drop admin idle leash (BUNYIP-381)
    eb6a124 Merge pull request 'feat(auth): signup bot-guard foundation - honeypot + submit-timing (BUNYIP-377)' (#374) from feat/BUNYIP-377-signup-bot-prevention into main
    616e6f9 feat(web): wire the register form to the signup bot guard (BUNYIP-377)
    c65ce8d feat(auth): signup bot-guard foundation - honeypot + submit-timing (BUNYIP-377)
    f8dccb1 Merge pull request 'feat(auth): harden the login-approval gate (BUNYIP-375)' (#373) from feat/BUNYIP-375-approval-gate-hardening into main
    5f18691 feat(auth): harden the login-approval gate (BUNYIP-375)
    87039ec Merge pull request 'feat(auth): suspicious-login notify-and-approve gate (BUNYIP-373)' (#372) from feat/BUNYIP-373-suspicious-login-approval into main
    4be752a fix(auth): make the login-approval attempt cap and single-use race-free (BUNYIP-373)
    9256804 feat(auth): gate suspicious logins behind an emailed approval code (BUNYIP-373)
    e13fb92 Merge pull request 'fix(catalog): correct stale Mokosh app names and disable vervain-agent (BUNYIP-374)' (#371) from fix/BUNYIP-374-applications-catalog-names-vervain into main
    ac330a4 feat(auth): BUNYIP-373 foundation - schema, challenge token, config flag
    5a96743 Merge pull request 'feat(web): add a Docker Compose deploy option to app download instructions (BUNYIP-372)' (#370) from feat/BUNYIP-372-compose-download-instructions into main
    760905c fix(catalog): correct stale Mokosh app names and disable vervain-agent
    6edd143 feat(web): add a Docker Compose deploy option to app download instructions (BUNYIP-372)
    8466e47 Merge pull request 'feat(auth): alert users on a new-country login (BUNYIP-366)' (#369) from feat/BUNYIP-366-login-location-alerts into main
    bfed45e feat(auth): user-settable login-location opt-out, test alert decision
    1ed8542 feat(auth): alert users on a new-country login (BUNYIP-366)
    4226330 Merge pull request 'feat(applications): surface per-app release-notes link in the applications view (BUNYIP-343)' (#368) from feat/BUNYIP-343-application-release-notes into main
    3d21e04 feat(applications): surface per-app release-notes link in the applications view (BUNYIP-343)
    4ceefd3 Merge pull request 'feat(security): self-provision the bunyip_app NOBYPASSRLS role (BUNYIP-360)' (#365) from feat/BUNYIP-360-provision-app-role into main
    f351e7b Merge pull request 'feat(e2e): bunyip-e2e-bootstrap --enable-2fa enrolls a preset TOTP secret (BUNYIP-359)' (#367) from feat/BUNYIP-359-bootstrap-2fa into main
    20bc03b fix(e2e): refuse --enable-2fa under the all-zero dev TOTP key (BUNYIP-359 review)
    a84839c feat(e2e): bunyip-e2e-bootstrap --enable-2fa enrolls a preset TOTP secret (BUNYIP-359)
    b8275f2 Merge pull request 'feat(hub): step-by-step download/pull instructions in the OCI/Download modal (BUNYIP-358)' (#366) from feat/BUNYIP-358-download-instructions into main
    0f50ac3 feat(hub): step-by-step download/pull instructions in the OCI/Download modal (BUNYIP-358)
    2625fe8 feat(security): self-provision the bunyip_app NOBYPASSRLS role to activate per-user RLS (BUNYIP-360)
    13e8dd5 Merge pull request 'feat(security): route more self-service reads through begin_with_user (BUNYIP-344)' (#364) from feat/BUNYIP-344-route-remaining-selfservice-reads into main
    17d67b2 feat(security): route more self-service reads through begin_with_user (BUNYIP-344)
    1535a17 Merge pull request 'feat(security): per-user row level security on self-service tables (BUNYIP-344)' (#363) from feat/BUNYIP-344-rls-self-service-slice into main
    75b0d8f feat(security): per-user row level security on self-service tables (BUNYIP-344)
    7fe98c4 Merge pull request 'fix(api): resolve external client IP in tracing span and OIDC IP capture' (#362) from fix/BUNYIP-310-access-log-client-ip into main
    fcb0783 fix(api): resolve external client IP in tracing span and OIDC IP capture
    c5e1c56 Merge pull request 'feat(web): forward end-user client IP to bunyip-api' (#361) from feat/BUNYIP-311-web-forward-client-ip into main
    7d527a9 feat(web): forward end-user client IP to bunyip-api
    fe3dd22 Merge pull request 'docs(scaffold): update Postgres image ref to PG18' (#360) from chore/BUNYIP-349-docs-postgres-18 into main
    716aedc docs(scaffold): update Postgres image ref to PG18
    2c8c086 Merge pull request 'fix(oidc): use SHA-512 left-32 at_hash for EdDSA id_tokens' (#359) from fix/BUNYIP-352-at-hash-sha512-eddsa into main
    f8687e2 fix(oidc): use SHA-512 left-32 at_hash for EdDSA id_tokens
    0083c62 Merge pull request 'docs(backup): document MOKOSH_BACKUP_API_URL for teammates (BUNYIP-356)' (#358) from docs/BUNYIP-356-mokosh-backup-url-runbook into main
    994b5a2 docs(backup): document MOKOSH_BACKUP_API_URL for teammates (BUNYIP-356)
    18a5b0b Merge pull request 'feat(backup): wire the real Mokosh backup/restore client (BUNYIP-356)' (#357) from feat/BUNYIP-356-mokosh-backup-adapter into main
    3a92dfa feat(backup): wire the real Mokosh backup/restore client (BUNYIP-356)
    b3b96c5 Merge pull request 'feat(backup): account-level backup and restore behind the Backup add-on (BUNYIP-353)' (#356) from feat/BUNYIP-353-account-backup-restore into main
    c2a033a feat(backup): account-level backup and restore behind the Backup add-on (BUNYIP-353)
    93d81f3 Merge pull request 'feat(settings): regenerate 2FA recovery codes UI (BUNYIP-355 part 1)' (#355) from feat/BUNYIP-355-recovery-codes-ui into main
    f31f9a1 fix(2fa): revoke trusted devices and rate-limit on authenticator re-key confirm (BUNYIP-355)
    f39d1f5 feat(2fa): step-up-gated authenticator re-key with a staged pending secret (BUNYIP-355 part 2)
    e6cda1a feat(settings): regenerate 2FA recovery codes from the settings page (BUNYIP-355 part 1)
    1136345 Merge pull request 'feat(oidc): first-party consent skip + named third-party consent (BUNYIP-342 part 1)' (#354) from feat/BUNYIP-342-first-party-consent-skip into main
    e8cce8e fix(oidc-web): reject off-issuer consent continue_url (open redirect) (BUNYIP-342)
    84a2491 feat(oidc-web): named third-party consent screen and spec-compliant Deny (BUNYIP-342 part 2)
    fa9ee0c feat(oidc): skip consent for first-party clients, name the client for third-party (BUNYIP-342 part 1)
    3d77406 Merge pull request 'chore(compose): bump self-host Postgres to 18 (BUNYIP-350)' (#353) from chore/BUNYIP-350-postgres-18 into main
    65f9bfe chore(compose): bump dev Postgres 16 -> 18 for dev/prod parity (BUNYIP-350)
    d552171 chore(compose): bump self-host Postgres 16 -> 18 to match the deployed template (BUNYIP-350)
    0226b8c Merge pull request 'feat(admin): move Stripe checkout knobs into DB admin settings (BUNYIP-351)' (#352) from feat/BUNYIP-351-stripe-checkout-db-config into main
    6c735c9 Merge branch 'main' into feat/BUNYIP-351-stripe-checkout-db-config
    9d0364f Merge pull request 'feat(admin): move email/SMTP config into DB admin settings (BUNYIP-351)' (#351) from feat/BUNYIP-351-email-db-config into main
    9d5b6cd feat(admin): move Stripe checkout knobs into DB admin settings (BUNYIP-351)
    c622200 Merge remote-tracking branch 'origin/main' into feat/BUNYIP-351-email-db-config
    8f0999f feat(admin): move email/SMTP config into DB admin settings (BUNYIP-351)
    2cd43a5 Merge pull request 'feat(admin): move auto-ban config into DB admin settings (BUNYIP-351)' (#350) from feat/BUNYIP-351-auto-ban-db-config into main
    d0ce0c2 feat(admin): move auto-ban config into DB admin settings (BUNYIP-351)
    81305b0 Merge pull request 'feat(auth): bootstrap first admin from BOOTSTRAP_ADMIN_EMAIL (BUNYIP-290)' (#349) from feat/BUNYIP-290-bootstrap-admin-email into main
    4ff90cd feat(auth): bootstrap first admin from BOOTSTRAP_ADMIN_EMAIL (BUNYIP-290)

    Downloads