v34.1
rowboatlabs/rowboatv34.1Jun 26, 2026by pierre-b
AI Summary
A maintenance release that fixes critical bugs related to SMTP authentication, notification center unsubscribe functionality, root account initialization, and email template rendering.
Key Highlights
- SMTP integrations now support `AUTH LOGIN` for Azure Communication Services.
- Notification center unsubscribe functionality restored.
- Root account no longer crashes the console on first login.
- mj-button inner padding rendering fixed for Gmail compatibility.
Full Release Notes
- **Fix**: Workspace SMTP integrations now connect to servers that advertise only `AUTH LOGIN` (such as Azure Communication Services) — the raw SMTP sender hardcoded `AUTH PLAIN` and was rejected with a 504 before credentials were ever checked. It now reads the AUTH mechanisms advertised in EHLO and uses LOGIN when PLAIN isn't offered, preferring PLAIN when both are available (#368). - **Fix**: Unsubscribing from the notification center works again. The widget's "Unsubscribe" action and per-list toggle (and the console) now post to a dedicated `/unsubscribe` endpoint, while `/unsubscribe-oneclick` is reserved for the RFC 8058 mail-client one-click carried in the `List-Unsubscribe` header (it still accepts the legacy JSON body as a backward-compatible shim). When v34.0 made `/unsubscribe-oneclick` strictly RFC 8058 for the Gmail/Yahoo one-click fix, the notification center's JSON request was rejected with `400 "Invalid request"` and contacts stayed subscribed (#371). - **Fix**: A freshly installed root account no longer crashes the console on first login. Before any workspace existed, `user.me` returned `"workspaces": null` instead of `[]` for the `ROOT_EMAIL` user — the root path returns the workspace list straight from the database, which is a nil slice when empty — and the console crashed with `Cannot read properties of null (reading 'length')` instead of redirecting to workspace creation. The repository now returns an empty (non-nil) slice so the API always serializes `[]`, and the console normalizes a null `workspaces` to an empty array as a safeguard (#367). - **Fix**: An `mj-button` (or `mj-social`) whose inner padding was edited in the visual editor no longer vanishes in Gmail — the inner-padding object was compiled into the CSS as a Go map literal (`padding:map[bottom:0px top:0px]`) that strict clients reject; it now compiles to a valid CSS shorthand, and the editor no longer stores padding as an object (#369).