Boundary is now in beta. This release closes out the Framework Quality programme (Phases 0–2) — a wide sweep of security hardening, new production-grade adapters, performance work, and architectural cleanup — and marks the point where the framework is ready to be run in earnest.
This is the largest release since the alpha line began. The highlights below group the change by theme; the full detail lives in the changelog.
Security hardening
Security was the primary driver of this release.
-
Authentication (
boundary-user): the JWT algorithm is now pinned and startup fails fast on a weak secret — aJWT_SECRETof at least 32 characters is required, with a separate CSRF secret. MFA TOTP secrets are encrypted at rest and backup codes are hashed. Sessions rotate on password and role change, defeating fixation and stale-privilege reuse. -
Access control: an IDOR on the user API routes (
/users,/users/:id) is closed — a caller can no longer read or modify another user by id. User-management web routes are mounted behind authz guards, and the web user-detail page is admin-only. -
Error hygiene (
boundary-platform): 5xx responses no longer leak exception internals, and the admin error flash no longer echoes raw exception messages. Security response headers and session-cookie attributes are hardened, backed by a dedicated authz negative-path suite (RBAC / IDOR / cross-tenant) plus brute-force lockout and session-fixation coverage. -
Jobs (
boundary-jobs): the Redis dequeue is now reliable — jobs are no longer lost when a worker crashes mid-dequeue. -
Docs site: patched a js-yaml DoS advisory (GHSA-h67p-54hq-rp68) and a brace-expansion advisory.
New: observability
A new boundary-observability library brings first-class metrics and tracing:
-
A Prometheus metrics adapter with a
GET /metricsscrape endpoint. -
A backend-agnostic tracing port (
ITracerplus thewith-spanmacro) with no-op and logging adapters. -
An OpenTelemetry OTLP exporter for both traces and metrics, with automatic per-request HTTP spans and per-job worker spans. One vendor-neutral OTLP/HTTP exporter feeds any OTel backend — SigNoz, Grafana Tempo, Jaeger, or Datadog-via-OTel.
HTTP request metrics (request count, error count, latency histogram) now emit through the real metrics emitter, so they reach any active provider.
New: storage, email, and durable jobs
-
boundary-storage: a Google Cloud Storage adapter with V4 signed URLs, a:boundary/storageIntegrant key dispatching:local/:s3/:gcs, and real HMAC-signed, expiring URLs for the local adapter. -
boundary-email: an in-memory email queue with bounded retry,:boundary/emailand:boundary/email-queueIntegrant keys, and user welcome mail routed through the email lib. -
boundary-jobs: a DB-backed job queue adapter — durable background jobs without Redis — with transactional outbox enqueue.
Deployment
A production Dockerfile, a worker run mode (no HTTP listener), and a production configuration guard make packaging and running Boundary services straightforward.
Performance
Every hot-path change was benchmarked with criterium before implementation.
-
Malli validators compiled once — validating with a raw schema re-parses it on every call (measured 8.6–9.9× overhead). All 121 static-schema call sites across 43 files now use validators compiled at namespace load; schema-as-argument callers get memoized compilation.
-
Logger dispatch — reflective logger interop on every request enter/leave replaced with protocol calls (~90× per call).
-
DB result conversion — snake→kebab key conversion moved into the next.jdbc builder-fn (converted once per result set, not per row); admin entity/table metadata cached in the long-lived schema repository, eliminating 2×N
information_schemaqueries per page. -
i18n —
resolve-markersnow shares structure and returns original nodes when nothing changed (82.4µs → 25.0µs on a 50-row table). -
N+1 writes batched in
boundary-audienceandboundary-user— a 50k-user membership save drops from ~100k statements to ~102. -
CSRF, correlation ids, JWT secret resolution, and the jobs heartbeat all took targeted fast-path fixes.
Architecture: FC/IS purity and cycle dissolution
-
FC/IS core purity: definition registries and process guards moved out of
core/into the shell —core/may no longer throw or hold mutable state, now enforced bycheck:fcis. -
Dependency cycles dissolved: the platform↔user cycle broken via app-layer wiring; shared Hiccup UI extracted into a new
boundary-shared-uilib (dissolving admin↔user); tenant HTTP middleware relocated out of platform; parallel search stacks merged intolibs/search. -
Honesty: 15 previously-undeclared deps declared; dead protocols and helpers removed; deploy publish order derived from a topological sort of the dependency graph.
Docs
A runnable in-repo example (examples/todo) with CI smoke, 7 new library READMEs, expanded module AGENTS.md guides, and relocated multi-tenancy usage docs. The getting-started and architecture guides were refreshed for beta.
Version alignment
All 30 libraries are bumped to v1.0.0-beta-1 to maintain lockstep versioning — including the two new libraries, boundary-observability and boundary-shared-ui.
Upgrade
Re-run the installer to pick up the latest release:
curl -fsSL https://get.boundary-app.org | bash
Consuming apps should note the intentional behaviour changes: a JWT_SECRET of at least 32 characters is now required at startup, and FC/IS core-purity is enforced by check:fcis. A documented downstream upgrade path for the Phase-2 refactors ships with this release.