-
Release 2026.11.05-0
StableAll checks were successfulBuild and Deploy Production / build (push) Successful in 52sBuild and Deploy Staging / build (push) Successful in 53sTests / test (push) Successful in 2m1sBuild and Deploy Production / deploy (push) Successful in 30sBuild and Deploy Staging / deploy-appuio (push) Successful in 5sreleased this
2026-11-05 15:18:00 +00:00 | 0 commits to main since this releaseRelease 2026.11.05-0
New features
- Messages about maintenance, incidents and changes. Support and account staff can now send one message to exactly the organizations it concerns. The message arrives by e-mail and stays visible in the portal. There are three kinds: planned maintenance with a time window, incident with a severity and a status, and notice with plain text. A band under the top navigation points to current messages. A new Information page in each organization shows the full history of its messages and the timeline of each message.
Improvements
- Prices in the price preview now come from Odoo. The price preview on create, update and restore shows the price that Odoo will charge, with the customer pricelist and the sale order date. This also fixes a bug where organizations with EUR or USD saw CHF numbers with a EUR or USD label. When Odoo cannot return a price, the preview falls back to the catalog price and marks the amount as an estimate.
- An SLA tier can be switched off for new instances. Staff can switch off one SLA tier for one service. New instances can no longer select that tier. Existing instances keep their tier and their price.
Bugfixes
- Control plane status and Alertmanager work again after the Kubernetes upgrade. Every call to a control plane behind a SOCKS proxy failed, so the cluster status probe stopped. The Alertmanager proxy also reported both Alertmanagers as unreachable. Both are fixed.
Behind the scenes
- Feature flags: staff can switch a feature on or off in Django admin. The first flag controls the Odoo-sourced prices.
- The Ybug feedback widget is gone. It was not in use.
- Dependency updates, including Django 6.1.3, django-filter 26.2 and kubernetes 37.
Full release notes: https://docs.servala.com/release-notes/
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Release 2026.10.05-1
StableAll checks were successfulBuild and Deploy Production / build (push) Successful in 52sBuild and Deploy Staging / build (push) Successful in 49sTests / test (push) Successful in 2m6sBuild and Deploy Production / deploy (push) Successful in 32sBuild and Deploy Staging / deploy-appuio (push) Successful in 6sreleased this
2026-10-05 14:24:22 +00:00 | 112 commits to main since this releaseRelease 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Release 2026.10.05-0
StableSome checks failedBuild and Deploy Staging / build (push) Successful in 49sTests / test (push) Successful in 2m1sBuild and Deploy Production / build (push) Failing after 13sBuild and Deploy Production / deploy (push) Has been skippedBuild and Deploy Staging / deploy-appuio (push) Successful in 6sreleased this
2026-10-05 14:05:18 +00:00 | 115 commits to main since this releaseRelease 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Release 2026.09.28-0
StableAll checks were successfulBuild and Deploy Production / build (push) Successful in 55sBuild and Deploy Staging / build (push) Successful in 56sTests / test (push) Successful in 1m58sBuild and Deploy Production / deploy (push) Successful in 35sBuild and Deploy Staging / deploy-appuio (push) Successful in 8sreleased this
2026-09-28 13:42:32 +00:00 | 134 commits to main since this releaseRelease 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Release 2026.09.22-0
StableAll checks were successfulBuild and Deploy Production / build (push) Successful in 58sBuild and Deploy Staging / build (push) Successful in 54sTests / test (push) Successful in 1m49sBuild and Deploy Production / deploy (push) Successful in 42sBuild and Deploy Staging / deploy-appuio (push) Successful in 7sreleased this
2026-09-22 08:41:35 +00:00 | 183 commits to main since this releaseRelease 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
- Update dependency psycopg to >=3.3.6 (#681)
- Update dependency djlint to >=1.46.2 (#682)
- Lock file maintenance (#683)
- Update https://github.com/renovatebot/github-action action to v46.3.3 (#685)
- Update https://github.com/astral-sh/setup-uv action to v10.2.0 (#686)
upgrade notes
- One new database migration:
core.0070_controlplane_cluster_id. Runmigrateon deploy. - New optional setting
SERVALA_GRAFANA_URL(defaulthttp://grafana.servala.internal/). It builds the Grafana deep links. The links only work once aControlPlanehas itscluster_idset 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
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Release 2026.09.18-0
StableAll checks were successfulBuild and Deploy Production / build (push) Successful in 56sBuild and Deploy Staging / build (push) Successful in 57sTests / test (push) Successful in 1m40sBuild and Deploy Production / deploy (push) Successful in 32sBuild and Deploy Staging / deploy-appuio (push) Successful in 8sreleased this
2026-09-18 15:18:45 +00:00 | 206 commits to main since this releaseRelease 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
- Update dependency django-allauth to >=65.19.4 (#679)
- Update dependency urllib3 to >=2.8.0 (#677)
- Lock file maintenance (#672)
- Update dependency pyjwt to >=2.14.0 (#670)
- Update dependency sentry-sdk to >=2.69.2 (#676)
- Update dependency django-allauth to >=65.19.3 (#668)
- Update dependency coverage to >=7.16.1 (#671)
- Update https://github.com/renovatebot/github-action action to v46.3.1 (#669)
- Update https://github.com/astral-sh/setup-uv action to v10.1.0 (#667)
- Update dependency djlint to >=1.46.1 (#661)
- Update dependency sentry-sdk to >=2.69.1 (#662)
- Update dependency psycopg2-binary to >=2.9.13 (#663)
- Update dependency flake8-bugbear to v26 (#664)
Downloads
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
-
Release 2026.09.07-1
StableAll checks were successfulBuild and Deploy Production / build (push) Successful in 55sBuild and Deploy Staging / build (push) Successful in 52sBuild and Deploy Production / deploy (push) Successful in 28sTests / test (push) Successful in 1m25sBuild and Deploy Staging / deploy-appuio (push) Successful in 7sreleased this
2026-09-07 06:13:34 +00:00 | 282 commits to main since this releaseRelease 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
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
-
Release 2026.09.07-0
StableAll checks were successfulBuild and Deploy Production / build (push) Successful in 52sBuild and Deploy Staging / build (push) Successful in 50sTests / test (push) Successful in 1m22sBuild and Deploy Production / deploy (push) Successful in 31sBuild and Deploy Staging / deploy-appuio (push) Successful in 7sreleased this
2026-09-07 06:01:13 +00:00 | 284 commits to main since this releaseRelease 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
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
-
Release 2026.08.21-0
StableAll checks were successfulBuild and Deploy Production / build (push) Successful in 56sBuild and Deploy Staging / build (push) Successful in 57sTests / test (push) Successful in 1m21sBuild and Deploy Production / deploy (push) Successful in 33sBuild and Deploy Staging / deploy-appuio (push) Successful in 8sreleased this
2026-08-21 07:26:53 +00:00 | 329 commits to main since this releaseRelease 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
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download
-
Release 2026.08.20-1
StableAll checks were successfulBuild and Deploy Production / build (push) Successful in 1m2sBuild and Deploy Staging / build (push) Successful in 1m6sTests / test (push) Successful in 1m23sBuild and Deploy Production / deploy (push) Successful in 3m0sBuild and Deploy Staging / deploy-appuio (push) Successful in 8sreleased this
2026-08-20 14:18:27 +00:00 | 332 commits to main since this releaseRelease 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
-
Source code (ZIP)
1 download
-
Source code (TAR.GZ)
1 download