v1.20.0 - Offline Mode, Enterprise Controls & Several Instances #1508
rathlinus
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
1.20.0 (2026-11-03)
1.20.0 can keep recent mail on the device, so mail can be read, sorted and written without a connection and goes out once the server answers again. Mail comes in from mbox, Outlook PST, EML and ZIP files and goes out as mbox or ZIP, and proofreading plugins underline mistakes while you write. With the AI Assistant plugin 2.2 the assistant reads attachments and whole conversations, takes actions such as answering invitations or filing many messages at once, works with Files and sits next to every app. Admins can turn on phishing reports, classification labels, device policies such as no downloads or printing, announcements, company calendars and out-of-office templates. Bulwark can run as several instances that share one Valkey or Redis store, with Kubernetes manifests, Prometheus metrics, OpenTelemetry traces and error reporting. Every page shows its shape in your theme while the app loads instead of a blank screen, and attachments show as a bar of tiles under the message header. Vietnamese is a new language.
Thank you for your donations:
One-time
Monthly
Changes
X-Powered-By: bulwarkmail.orgFeatures
REDIS_URLpoints them at one Redis-protocol store (Valkey, Redis, KeyDB, Dragonfly). Every replica sees the same admin config, policy, plugins, themes, branding, synced settings, plugin credentials, sign-in limits, pairing and hand-off codes, admin sessions and audit log, and an admin change reaches every replica within seconds. No replica needs a shared volume, and config can still come from read-only mounted files. WithoutREDIS_URLnothing changes ([Feature]: Multiple Replica Support #1066, thanks @supu2)REDIS_URLon its old volume;SHARED_STORE_EXPORT=1writes everything back into the data folders./api/readyanswers 503 while an instance is starting or can't reach the store, and the admin Overview shows which storage is in use and how many instances checked in during the last minute ([Feature]: Multiple Replica Support #1066)deploy/kubernetesrun three replicas with one Valkey store, with an overlay for config kept in git. CI deploys them to a kind cluster and checks shared sessions, config spread and zero failed requests during a rolling restart ([Feature]: Multiple Replica Support #1066)ERROR_REPORTING_DSN. Message text, addresses, URLs, file names and tokens are removed before anything is sent. Bulwark Lite reads it fromerrorReportingin policy.json/api/metrics, on withMETRICS_TOKEN: requests, sign-ins, calls to Stalwart and other services, browser errors, memory and event-loop lag./api/health/liveand/api/health/readyserve liveness and readiness probes, and the Docker image has a health checkOTEL_EXPORTER_OTLP_ENDPOINTis set, with the trace context passed on to StalwartBULWARK_TELEMETRY_ERRORS)LOG_FORMAT=jsoncovers themOAUTH_RESOURCEsends an RFC 8707 resource indicator with OAuth sign-ins ([Feature]: Send an RFC 8707 resource parameter with the OAuth authorization request #1461, thanks @sorontoo)api.ui.openEmailopens a message in the reader (feat(plugins): api.ui.openEmail opens a message in the reader #1466), star and after-send hooks name the mail's account (feat(plugins): star and after-send hooks name the mail's account #1467), and input in a plugin frame counts as activity for the idle sign-out (feat(plugins): input in a plugin frame counts as activity for the idle sign-out #1456) (thanks @HOLOEYE-JZ)contacts:read(feat: expose contact birthday calendar and events in plugin calendar api #1479, thanks @tobiasge)composer.getSnapshotandcomposer.readAttachmentread the draft withcompose:read, andreplaceBodytakes anexpectedRevision(feat: add composer snapshots and conditional edits #1443). Composer toolbar actions show in quick reply (feat: offer composer plugin actions in quick reply #1445), and plugins can show progress toasts (feat: expose frame-scoped plugin progress toasts #1442) (thanks @yontani)api.composer.registerCheckerwith the newcompose:checkpermission lets a plugin check what users write and have Bulwark draw its suggestions; a checker that only checks when asked needscompose:read([Feature]: Proofreading for mail composer #1397)app-side-panel, permissionui:side-panel) that knows the open event, contact, selected files or settings page. Its button sits at the end of each view's toolbar, where Mail has it, and on phones a plugin dialog fills the space above the keyboardemail.getAttachmentTextreads the text of PDF, Word, Excel, PowerPoint, OpenDocument, text, CSV, HTML, calendar and contact attachments, andemail.getAttachmentImagehands over a picture made smaller in the app, without tracking pixels.email.getThreadreads a conversation, the reader panel gets the messages ticked in the list, inline images carry their Content-ID and alt text, andemail.searchtakes apositioncalendar.respondanswers an invitation the way the reader's banner does (new permissioncalendar:respond),filters.listandfilters.createadd rules the way Settings > Filters does,email.batcharchives, moves, marks or tags up to 200 messages at once, andapp.setSettingschanges appearance, reading, composing, notification, calendar and accessibility settings through the settings pages (new permissionsettings:change). Settings the organisation set stay as they are, and each change comes with an undoapi.filesfinds, reads and attaches files, saves attachments to Files, creates text and Markdown files and folders, and moves and renames, in the user's own drive only. Replacing a file keeps the old version in the Files trash. There is no call to delete or share a fileoptionalPermissionsin a plugin's manifest lists permissions an older Bulwark doesn't know; Bulwark grants the ones it knows and installs the plugin without the rest.api.host.featuressays which of the new calls are thereFixes
.unreadable-<time>instead of being overwritten ([Feature]: Multiple Replica Support #1066)ADMIN_PASSWORDand no admin.json the server starts instead of retrying to save the password forever ([Feature]: Multiple Replica Support #1066)?v=) in the stored config; going back below 1.20.0 needs the logos and icons uploaded againHOSTNAME=127.0.0.1behind a reverse proxy, redirects no longer send the browser to localhost over HTTPS ([Bug]: When Bulwark is running on HTTP and is proxied by a reverse proxy it tries to redirect itself to HTTPS #1487, thanks @npXXX)This discussion was created from the release v1.20.0 - Offline Mode, Enterprise Controls & Several Instances.
All reactions