• 2026.10.05-1 9e7697a6ed

    Release 2026.10.05-1
    All checks were successful
    Build and Deploy Production / build (push) Successful in 52s
    Build and Deploy Staging / build (push) Successful in 49s
    Tests / test (push) Successful in 2m6s
    Build and Deploy Production / deploy (push) Successful in 32s
    Build and Deploy Staging / deploy-appuio (push) Successful in 6s
    Stable

    tobru released this 2026-10-05 14:24:22 +00:00 | 108 commits to main since this release

    Release 2026.10.05-1

    • bump version 2026.10.05-0 -> 2026.10.05-1
    • remove unused hack files
    • modernize ci pipeline for latest forgejo features
    Downloads
  • 2026.10.05-0 725fc24fbf

    Release 2026.10.05-0
    Some checks failed
    Build and Deploy Staging / build (push) Successful in 49s
    Tests / test (push) Successful in 2m1s
    Build and Deploy Production / build (push) Failing after 13s
    Build and Deploy Production / deploy (push) Has been skipped
    Build and Deploy Staging / deploy-appuio (push) Successful in 6s
    Stable

    tobru released this 2026-10-05 14:05:18 +00:00 | 111 commits to main since this release

    Release 2026.10.05-0

    • bump version 2026.09.28-0 -> 2026.10.05-0
    • Merge pull request 'feat(alerts): link alerts to docs.servala.com runbooks' (#717) from feat/alert-runbook-links into main
    • feat(alerts): link alerts to docs.servala.com runbooks
    • Merge pull request 'fix(deps): update dependency django-allauth to >=65.19.7' (#709) from renovate/django-allauth-65.x into main
    • Merge pull request 'chore(deps): update dependency djlint to >=1.46.4' (#710) from renovate/djlint-1.x into main
    • Merge pull request 'chore(deps): update dependency flake8-bugbear to >=26.9.30' (#711) from renovate/flake8-bugbear-26.x into main
    • Merge pull request 'fix(deps): update dependency cryptography to >=50.0.2' (#714) from renovate/cryptography-50.x into main
    • Merge pull request 'chore(deps): update https://github.com/renovatebot/github-action action to v46.3.6' (#708) from renovate/https-github.com-renovatebot-github-action-46.x into main
    • chore(deps): update https://github.com/renovatebot/github-action action to v46.3.7
    • fix(deps): update dependency django-allauth to >=65.19.7
    • fix(deps): update dependency cryptography to >=50.0.2
    • chore(deps): update dependency flake8-bugbear to >=26.9.30
    • chore(deps): update dependency djlint to >=1.46.4
    • Merge pull request 'chore(deps): update dependency djlint to >=1.46.3' (#706) from renovate/djlint-1.x into main
    • Merge pull request 'chore(deps): update dependency isort to >=9.0.2' (#707) from renovate/isort-9.x into main
    • Merge pull request 'Refresh CRD schema without restart' (#705) from feat/crd-schema-refresh into main
    • chore(deps): update dependency isort to >=9.0.2
    • chore(deps): update dependency djlint to >=1.46.3
    • feat(crd): refresh CRD schema without restart
    Downloads
  • 2026.09.28-0 bf1921c57d

    Release 2026.09.28-0
    All checks were successful
    Build and Deploy Production / build (push) Successful in 55s
    Build and Deploy Staging / build (push) Successful in 56s
    Tests / test (push) Successful in 1m58s
    Build and Deploy Production / deploy (push) Successful in 35s
    Build and Deploy Staging / deploy-appuio (push) Successful in 8s
    Stable

    tobru released this 2026-09-28 13:42:32 +00:00 | 130 commits to main since this release

    Release 2026.09.28-0

    Highlights

    Alerts on the service instance page (#690)

    • A new "Alerts" card on the instance detail page lists every alert rule that watches the instance. It shows the alert name, severity, summary, and how long a condition must last before the alert fires.
    • Firing alerts appear at the top with a banner, and the card opens automatically.
    • Organization admins can mute a firing alert for 1 hour, 4 hours, 24 hours, or 7 days, with an optional reason. They can also unmute it again.
    • Alerts that Servala support muted show as "Muted by support". Customers cannot unmute them.
    • Every mute and unmute is recorded in the audit log.

    Invoice detail page (#697)

    • Each invoice now has its own page inside the portal. It shows the header, all invoice lines, taxes, and totals.
    • You can download the invoice PDF directly through the portal. You no longer need to go to the Odoo portal.
    • The invoice list has a new dashboard header and groups invoices into sections. It links to the new detail page.
    • Invoice lines link to the service instance they bill for.
    • The tax label now matches the label printed on the Odoo invoice.
    • The "Pay" button still opens the Odoo portal for open invoices.

    Stricter input validation (#693)

    • The portal now rejects service configuration values that could inject extra configuration lines into the running service.
    • Existing configuration values keep working. The check only applies to values that you add or change.

    Other changes

    • Service forms support a new "email" field type. It fills in the user's e-mail address by default.
    Downloads
  • 2026.09.22-0 be73a5e4b6

    Release 2026.09.22-0
    All checks were successful
    Build and Deploy Production / build (push) Successful in 58s
    Build and Deploy Staging / build (push) Successful in 54s
    Tests / test (push) Successful in 1m49s
    Build and Deploy Production / deploy (push) Successful in 42s
    Build and Deploy Staging / deploy-appuio (push) Successful in 7s
    Stable

    tobru released this 2026-09-22 08:41:35 +00:00 | 179 commits to main since this release

    Release 2026.09.22-0

    features

    • Show the Alertmanager state of a control plane in the staff views (#684)
    • Show the worker capacity of a control plane in the staff views (#687)
    • Link into Grafana from the control plane views (#688)
    • Publish the portal instance URL as a claim annotation, so alerts can link back into the portal (#666)

    dependencies

    upgrade notes

    • One new database migration: core.0070_controlplane_cluster_id. Run migrate on deploy.
    • New optional setting SERVALA_GRAFANA_URL (default http://grafana.servala.internal/). It builds the Grafana deep links. The links only work once a ControlPlane has its cluster_id set by staff.
    • New optional setting SERVALA_PORTAL_BASE_URL (default empty). Without it the portal does not write the instance URL annotation on claims.
    Downloads
  • 2026.09.18-0 420701bb27

    Release 2026.09.18-0
    All checks were successful
    Build and Deploy Production / build (push) Successful in 56s
    Build and Deploy Staging / build (push) Successful in 57s
    Tests / test (push) Successful in 1m40s
    Build and Deploy Production / deploy (push) Successful in 32s
    Build and Deploy Staging / deploy-appuio (push) Successful in 8s
    Stable

    tobru released this 2026-09-18 15:18:45 +00:00 | 202 commits to main since this release

    Release 2026.09.18-0

    features

    • Self-service restore of a backup into a new instance, configurable per service definition and gated behind the organization admin role (#678)
    • Staff can view and set the Odoo trial window on an organization, including a fix button for a drifted window (#665)
    • Plausible funnel goals and storage-free attribution, with UTM names matched case-insensitively against Odoo (#673)
    • Pending-approval tickets now carry the billing data that was submitted (#680)

    UI/UX

    • Archived organizations are flagged on the staff detail page (#665)
    • The tenant-view link moved above the card on the staff instance detail page (#665)

    bug

    • Storage stays billed while an instance is paused, so unpausing restores the pre-pause volume count (#660)
    • Odoo is written only after Postgres has committed, which prevents orphaned Odoo records when a request fails (#521)
    • Odoo trouble no longer fails a request or flags legacy rows (#521)
    • Line breaks now survive the trip to the Odoo helpdesk

    internal

    • Odoo is mocked throughout the test suite and real calls are forbidden (#665)
    • Trial-end POST tests no longer expire with the calendar (#674)
    • Renovate rebases dependency PRs when they fall behind main (#675)
    • New hack/check-odoo-permissions.py script to verify Odoo access rights

    dependencies

    Downloads
  • 2026.09.07-1 d8ce4fa671

    Release 2026.09.07-1
    All checks were successful
    Build and Deploy Production / build (push) Successful in 55s
    Build and Deploy Staging / build (push) Successful in 52s
    Build and Deploy Production / deploy (push) Successful in 28s
    Tests / test (push) Successful in 1m25s
    Build and Deploy Staging / deploy-appuio (push) Successful in 7s
    Stable

    tobru released this 2026-09-07 06:13:34 +00:00 | 278 commits to main since this release

    Release 2026.09.07-1

    • bump version 2026.09.07-0 -> 2026.09.07-1
    • fix: skip audit stamps for organizations that no longer exist
    Downloads
  • 2026.09.07-0 f06725b6c1

    Release 2026.09.07-0
    All checks were successful
    Build and Deploy Production / build (push) Successful in 52s
    Build and Deploy Staging / build (push) Successful in 50s
    Tests / test (push) Successful in 1m22s
    Build and Deploy Production / deploy (push) Successful in 31s
    Build and Deploy Staging / deploy-appuio (push) Successful in 7s
    Stable

    tobru released this 2026-09-07 06:01:13 +00:00 | 280 commits to main since this release

    Release 2026.09.07-0

    • bump version 2026.08.21-0 -> 2026.09.07-0
    • Merge pull request 'fix(deps): update dependency django-allauth to >=65.19.2' (#656) from renovate/django-allauth-65.x into main
    • fix(deps): update dependency django-allauth to >=65.19.2
    • Merge pull request 'fix(deps): update dependency django to v6.1.1' (#655) from renovate/django-6.x into main
    • Merge pull request 'fix(deps): update dependency psycopg to >=3.3.5' (#657) from renovate/psycopg-3.x into main
    • Merge pull request 'chore(deps): update https://github.com/renovatebot/github-action action to v46.2.6' (#658) from renovate/https-github.com-renovatebot-github-action-46.x into main
    • Merge pull request 'chore(deps): update dependency djlint to >=1.45.2' (#659) from renovate/djlint-1.x into main
    • chore(deps): update https://github.com/renovatebot/github-action action to v46.2.6
    • Merge pull request 'chore(deps): update https://github.com/renovatebot/github-action action to v46.2.5' (#654) from renovate/https-github.com-renovatebot-github-action-46.x into main
    • chore(deps): update dependency djlint to >=1.45.2
    • fix(deps): update dependency django to v6.1.1
    • chore(deps): update https://github.com/renovatebot/github-action action to v46.2.5
    • beta banner is gone for good
    • Merge pull request 'chore(deps): lock file maintenance' (#644) from renovate/lock-file-maintenance into main
    • Merge pull request 'fix(deps): update dependency sentry-sdk to >=2.68.1' (#645) from renovate/sentry-sdk-2.x into main
    • Merge pull request 'fix(deps): update dependency cryptography to >=50.0.1' (#647) from renovate/cryptography-50.x into main
    • Merge pull request 'chore(deps): update dependency isort to v9' (#648) from renovate/isort-9.x into main
    • Merge pull request 'chore(deps): update dependency coverage to >=7.16.0' (#650) from renovate/coverage-7.x into main
    • Merge pull request 'Audit Log Frontend per Organization' (#651) from audit-log-frontend into main
    • fix: make the audit log swallows and its ordering hold up
    • feat: note on the audit log that names are resolved at read time
    • feat: record CR spec changes in the audit log
    • docs: plan for recording CR spec changes in the audit log
    • fix: name the service on every instance event
    • feat: name the service and link the instance in audit log sentences
    • fix: audit log actor attribution and active category tab
    • feat: audit pause, limit profile and validity period changes
    • fix: address audit log review findings
    • feat: organization audit log page
    • feat: stamp audit log entries onto organizations
    • docs: organization audit log design and implementation plan
    • fix: validate storage and replica bounds in create form and price preview
    • configure allowed s3 endpoints for backup reveal
    • Merge pull request 'Backup Content Access and Download' (#649) from backup-access into main
    • feat: direct backup bucket access with credential reveal
    • docs: backup download implementation plan
    • docs: backup content access and download design
    • fix(deps): update dependency psycopg to >=3.3.5
    • chore(deps): update dependency coverage to >=7.16.0
    • chore(deps): update dependency isort to v9
    • fix(deps): update dependency cryptography to >=50.0.1
    • fix(deps): update dependency sentry-sdk to >=2.68.1
    • Merge pull request 'chore(deps): update https://github.com/renovatebot/github-action action to v46.2.3' (#643) from renovate/https-github.com-renovatebot-github-action-46.x into main
    • chore(deps): update https://github.com/renovatebot/github-action action to v46.2.4
    • chore(deps): lock file maintenance
    Downloads
  • 2026.08.21-0 4c50dbb0a4

    Release 2026.08.21-0
    All checks were successful
    Build and Deploy Production / build (push) Successful in 56s
    Build and Deploy Staging / build (push) Successful in 57s
    Tests / test (push) Successful in 1m21s
    Build and Deploy Production / deploy (push) Successful in 33s
    Build and Deploy Staging / deploy-appuio (push) Successful in 8s
    Stable

    tobru released this 2026-08-21 07:26:53 +00:00 | 325 commits to main since this release

    Release 2026.08.21-0

    • bump version 2026.08.20-1 -> 2026.08.21-0
    • Merge pull request 'fix: treat preserve-unknown-fields as a free-form map' (#637) from fix/preserve-unknown-fields-paths into main
    • fix: treat preserve-unknown-fields as a free-form map
    Downloads
  • 2026.08.20-1 3d7b1f5dbf

    Release 2026.08.20-1
    All checks were successful
    Build and Deploy Production / build (push) Successful in 1m2s
    Build and Deploy Staging / build (push) Successful in 1m6s
    Tests / test (push) Successful in 1m23s
    Build and Deploy Production / deploy (push) Successful in 3m0s
    Build and Deploy Staging / deploy-appuio (push) Successful in 8s
    Stable

    tobru released this 2026-08-20 14:18:27 +00:00 | 328 commits to main since this release

    Release 2026.08.20-1

    • bump version 2026.08.20-0 -> 2026.08.20-1
    • fix: treat a blank backup field path as no path
    Downloads
  • 2026.08.20-0 aff7dc6e40

    Release 2026.08.20-0
    All checks were successful
    Build and Deploy Production / build (push) Successful in 1m7s
    Build and Deploy Staging / build (push) Successful in 1m4s
    Tests / test (push) Successful in 1m21s
    Build and Deploy Production / deploy (push) Successful in 3m13s
    Build and Deploy Staging / deploy-appuio (push) Successful in 8s
    Stable

    tobru released this 2026-08-20 13:57:21 +00:00 | 330 commits to main since this release

    Release 2026.08.20-0

    • bump version 2026.07.15-0 -> 2026.08.20-0
    • Merge pull request 'Backup Listing' (#631) from feat/backup-visibility into main
    • fix: make the row-2 columns actually share a height
    • style: give backup information a clearer presentation
    • docs: add a Codey backup_config example, drop a false empty state
    • fix: tidy the backup list presentation
    • fix: align dotted-path reads with the schema-aware resolver
    • docs: add backup visibility design and implementation plan
    • test: cover remaining backup branches
    • feat: show backup information on the instance detail page
    • feat: assemble backup data for the instance detail view
    • feat: read the configured backup policy from an instance spec
    • feat: read backup objects from Kubernetes
    • feat: expose backup_config in the ServiceDefinition admin
    • feat: add ServiceDefinition.backup_config
    • feat: add humanize_cron for backup schedule display
    • refactor: move get_nested into core.utils.data
    • Merge pull request 'fix: resolve CRD property names that contain dots' (#636) from fix/dotted-crd-property-keys into main
    • fix: harden CRD dotted path resolution
    • fix: resolve CRD property names that contain dots
    • Merge pull request 'chore(deps): update https://github.com/astral-sh/setup-uv action to v10' (#633) from renovate/https-github.com-astral-sh-setup-uv-10.x into main
    • Merge pull request 'chore(deps): update https://github.com/renovatebot/github-action action to v46.2.2' (#632) from renovate/https-github.com-renovatebot-github-action-46.x into main
    • chore(deps): update https://github.com/astral-sh/setup-uv action to v10
    • chore(deps): update https://github.com/renovatebot/github-action action to v46.2.2
    • fix duplicate Open button on instance detail page
    • fix all djlint findings and align formatter tooling
    • upgrade dependencies and improve some tests
    • Merge pull request 'chore(deps): update dependency coverage to >=7.15.4' (#620) from renovate/coverage-7.x into main
    • Merge pull request 'fix(deps): update dependency sentry-sdk to >=2.68.0' (#625) from renovate/sentry-sdk-2.x into main
    • Merge pull request 'fix(deps): update dependency django-scopes to >=2.1.0' (#629) from renovate/django-scopes-2.x into main
    • fix(deps): update dependency sentry-sdk to >=2.68.0
    • chore(deps): update dependency coverage to >=7.15.4
    • Merge pull request 'chore(deps): update https://github.com/renovatebot/github-action action to v46.1.20' (#627) from renovate/https-github.com-renovatebot-github-action-46.x into main
    • chore(deps): update https://github.com/renovatebot/github-action action to v46.1.21
    • fix(deps): update dependency django-scopes to >=2.1.0
    • Merge pull request 'chore(deps): update https://data.forgejo.org/actions/setup-node action to v7' (#626) from renovate/https-data.forgejo.org-actions-setup-node-7.x into main
    • support instances parameter in provisioning deep links
    • chore(deps): update https://data.forgejo.org/actions/setup-node action to v7
    • support majorversion field for catalog api
    Downloads