Secrets Everywhere, Mail Through Office 365
Release Notes
This release makes secrets work without a dedicated vault and places them alongside each tenant's data, adds Office 365 as an outbound mail provider, and routes data, workflow, monitoring, localization, deployment, and Studio traffic per tenant so requests always land on the right service domain. Studio also gains live build plans and a clearer agent chat, and the UILM Assistant browser extension gets a cleaner side panel.
Platform
-
Secrets without a vault — Secret values can now be stored in the platform's own SecretStore database instead of requiring Azure Key Vault. Store selection is inferred automatically: Key Vault when
KeyVault__KeyVaultUrlis configured, the database store otherwise (overridable viaSecrets__ValueStore). Environments with a vault keep using it and existing values stay readable; environments without one now get a working secret store instead of a startup failure. Metadata, audit, authorization, rotation, and soft-delete are unchanged. -
Tenant-scoped secret placement — The SecretStore now opens on the caller's own tenant database connection (three-connection placement), so a tenant provisioned onto a non-main cluster keeps its secrets alongside the data they unlock, resolved per access. Previously all secrets opened on a single main connection.
Mail
- Office 365 SMTP outbound mail — A new Office 365 outbound mail provider lets tenants send mail through Microsoft Exchange Online using OAuth client-credentials (Entra tenant id, client id, and mailbox address). The client secret is stored as a tenant-scoped secret in Blocks Secrets and only its reference is persisted. Delivery uses SASL XOAUTH2 over STARTTLS (port 587). Amazon SES and Zoho configurations are unchanged. Configuration lives in the platform and delivery runs in Workflow, shipped in two phases: routing/transport first, then token reuse and diagnostics.
Data
- Per-tenant operation routing — Data Gateway operations now route to the tenant's own database connection, and the browser SDK issues Data API calls against the current app (page) origin so requests land on the correct per-tenant service domain. Previously operations could resolve against a fixed host.
Workflow
- Notifications across placements — Workflow now reads logic notifications across both tenant and root database placements, so notifications resolve correctly regardless of where a tenant is provisioned. Workflow browser API calls also use the page origin.
Observability
- Resilient monitor schedules — Monitor schedules are now retained when root-database polling fails, instead of being dropped, and Monitor browser API calls use the page origin.
Localization
- Import & export fixes — Fixed a bug where the page could get stuck in a loading state after importing a file, and resolved an export issue. Localization tenant metadata is now kept scoped to each operation, and Localization browser API calls use the page origin.
Utilities
-
Billing correctness — A subscription renewal now charges the next period rather than re-charging the current one; a subscriber's card is filed under the subscriber, with billed overage supported and a carried Stripe balance tolerated; a checkout fails on a Stripe 4xx instead of retrying forever; and a Stripe customer is created on setup-mode checkout.
-
Storage isolation & hardening — Uploads now go into a real directory created on first use, directory ids are never shared across tenants, financial-document PDFs are readable only by the owning service, and caller-supplied values are scrubbed before they reach logs.
Deployment
- Per-origin Release API — Release browser API calls now use the page origin,
with client-side
globalThis.windowguards for non-browser contexts.
Studio
-
Live build plans — Studio's chat now shows a collapsible PlanDock that lists build-plan items with their completion status, streamed live over SSE with automatic reconnect. You can follow exactly what the build agent is doing, step by step, as it works.
-
Clearer agent actions — The chat action line now shows a command and its output together, with refined output previews and dedicated visuals for Deleted and Failed states in dark mode. Sensitive flags are redacted from execution summaries.
-
Dynamic allowed services — The list of services Studio integrates with is now driven by dynamic section values from the frontend runtime settings instead of a fixed list, so new services can be enabled through configuration.
-
Resilient sign-in — A dead Studio session now falls back to device login instead of failing outright.
-
Per-tenant routing — Studio routes tenant work through Blocks Genesis 4.2.2 and issues Studio API calls against the current app (page) origin, matching the platform-wide placement changes in this release.
Developer SDKs
-
Blocks Genesis (.NET) v4.2.2 — Third-party JWT authentication support: accept third-party tokens with proper context carriage and tenant trust, support uploaded certificates for third-party JWT providers, add a session id to claims, and default org id. Third-party tokens now require an explicit tenant context (
x-blocks-key, or atenant_idheader/query value) — the tenant is no longer taken from the token's own claim. This release also isolates tenant database connections. (v4.1.8 → v4.2.2.) -
genesis-os (React) v4.3.8 — Fixed a hook that treated a no-op impersonation as success.
CLI
- Office 365 mail (0.7.0) —
blocks mail config savenow provisions the Office 365 outbound provider (--provider 2) with--tenant-id,--client-id,--mailbox-address, and--client-secret. The secret is write-only — it is sent to Blocks Secrets and never stored or echoed back, so omitting it on an edit keeps the existing one. - 0.6.0 — Unbroke JSON payloads on Windows and made data-validation save an upsert.
Extension
The UILM Assistant browser extension gets a cleaner side panel:
-
Revamped Routes page — The Routes view has been redesigned for a clearer, easier-to-scan layout, so you can find and switch between routes without the clutter.
-
Responsive Card component — Cards now adapt to the side panel's width, keeping content readable and neatly aligned no matter how the panel is sized.
-
Security dependency updates — Underlying dependencies were updated to pull in the latest security fixes, keeping the extension safe to run.