This release includes 2 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+4 more
Affected surfaces
ReleasePort's take
Light signalv1.7.0 patches critical regressions: storage panics on non-S3 uploads (v1.6.2), async-media-upload deadlocks. Introduces breaking change: MSC4225 erases legacy OTK keys on first read-write; operators must plan migration.
Why it matters: Fixes storage panics and auth deadlocks from v1.6.2; upgrade recommended. Legacy OTK schema migration auto-triggers on first read-write. Cache rebalance (auth_chain 4-15x) requires capacity planning. Migrate OpenTelemetry to OTLP.
Summary
AI summaryBroad release touches New Features & Enhancements, Bug Fixes, https://matrix-construct.github.io/tuwunel/development/compliance/msc.html, and e5f625d89.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Breaking | Medium |
Cache capacity modifier above default may require decreasing to avoid 25-50% memory cost. Cache capacity modifier above default may require decreasing to avoid 25-50% memory cost. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Breaking | Medium |
MSC4225 drops legacy onetimekeyid_onetimekeys column; existing OTKs erased on first read-write. MSC4225 drops legacy onetimekeyid_onetimekeys column; existing OTKs erased on first read-write. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Adds threaded read receipts and notifications across storage, federation, sync v3, and push gateway. Adds threaded read receipts and notifications across storage, federation, sync v3, and push gateway. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Adds MSC4222 state_after on /sync v3 via opt-in use_state_after=true query parameter. Adds MSC4222 state_after on /sync v3 via opt-in use_state_after=true query parameter. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
MSC4115 unsigned.membership on served events from encrypted rooms now included. MSC4115 unsigned.membership on served events from encrypted rooms now included. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Synapse-compatible shared-secret register endpoint at /_synapse/admin/v1/register added. Synapse-compatible shared-secret register endpoint at /_synapse/admin/v1/register added. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Refresh-token expiry with optional hard logout via refresh_token_ttl, idle_only, hard_logout keys. Refresh-token expiry with optional hard logout via refresh_token_ttl, idle_only, hard_logout keys. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Configurable extra OIDC authorization parameters enable silent-relogin gap closure with Logto, Element X. Configurable extra OIDC authorization parameters enable silent-relogin gap closure with Logto, Element X. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
MSC4452 preview_url capability is advertised on /capabilities endpoint. MSC4452 preview_url capability is advertised on /capabilities endpoint. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
MSC4466 propagate_to profile query parameter implemented; room fan-out now runs concurrently. MSC4466 propagate_to profile query parameter implemented; room fan-out now runs concurrently. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
MSC3283 m.set_displayname and m.set_avatar_url capabilities are advertised. MSC3283 m.set_displayname and m.set_avatar_url capabilities are advertised. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
MSC3814 fallback keys on dehydrated-device PUT are now stored. MSC3814 fallback keys on dehydrated-device PUT are now stored. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Feature | Medium |
Admin db memory-usage command now tabular with used / cap / util% and per-pool block-cache rows. Admin db memory-usage command now tabular with used / cap / util% and per-pool block-cache rows. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Feature | Medium |
Configuration items annotated in generated tuwunel-example.toml to indicate runtime-reloadable vs restart-required. Configuration items annotated in generated tuwunel-example.toml to indicate runtime-reloadable vs restart-required. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Dependency | Medium |
OpenTelemetry OTLP exporter replaces deprecated opentelemetry-jaeger crate; tokio-console re-enabled. OpenTelemetry OTLP exporter replaces deprecated opentelemetry-jaeger crate; tokio-console re-enabled. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Performance | Medium |
Receipts and presence EDU emission bounded below federation budget to prevent overload. Receipts and presence EDU emission bounded below federation budget to prevent overload. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Performance | Medium |
Optimization in /state and map-value storage; /state now propagates per-PDU read errors. Optimization in /state and map-value storage; /state now propagates per-PDU read errors. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Performance | Medium |
Per-cache defaults rebalanced: auth_chain up 15x to 1.5M, several caches up 4x to 400k entries. Per-cache defaults rebalanced: auth_chain up 15x to 1.5M, several caches up 4x to 400k entries. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Performance | Medium |
Rebalances per‑cache defaults: auth_chain capacity increased 15× to 1.5 M; several shorteventid/eventid caches increased 4× to 400 k entries. Rebalances per‑cache defaults: auth_chain capacity increased 15× to 1.5 M; several shorteventid/eventid caches increased 4× to 400 k entries. Source: granite4.1:30b@2026-05-21-audit Confidence: low |
— |
| Deprecation | Medium |
Migration upgrades legacy mediaid_user keys to composite layout. Migration upgrades legacy mediaid_user keys to composite layout. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
MSC2246 asynchronous media uploads self-deadlock on notifier mutex; acquisition order fixed. MSC2246 asynchronous media uploads self-deadlock on notifier mutex; acquisition order fixed. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
Sliding-sync cached list ranges now refresh on every explicit list update, not indefinitely stale. Sliding-sync cached list ranges now refresh on every explicit list update, not indefinitely stale. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
OAuth Dynamic Client Registration records bounded to fixed size to prevent unbounded growth. OAuth Dynamic Client Registration records bounded to fixed size to prevent unbounded growth. Source: llm_adapter@2026-05-21 Confidence: high |
— |
| Bugfix | Medium |
Now warns at startup when turn_uris set without TURN credentials to prevent silent empty creds. Now warns at startup when turn_uris set without TURN credentials to prevent silent empty creds. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
v1.6.2 regression on non-S3 storage panicked main thread on first upload; multipart now S3-only. v1.6.2 regression on non-S3 storage panicked main thread on first upload; multipart now S3-only. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
UIAA fallback acknowledgement rejected non-SSO flows; registration token+password flow now completes. UIAA fallback acknowledgement rejected non-SSO flows; registration token+password flow now completes. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
/threads and /backfill apply visibility filter before pagination; non-empty final page returns next_batch. /threads and /backfill apply visibility filter before pagination; non-empty final page returns next_batch. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
GitHub OIDC default base_path now aligns with their published discovery doc after issuer change. GitHub OIDC default base_path now aligns with their published discovery doc after issuer change. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
OAuth SSO grant params now win over operator-configured extras on key collision. OAuth SSO grant params now win over operator-configured extras on key collision. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Bugfix | Medium |
Membership now tolerates stale room state on self-leave; edge case handling improved. Membership now tolerates stale room state on self-leave; edge case handling improved. Source: llm_adapter@2026-05-21 Confidence: low |
— |
| Refactor | Medium |
KV codec's additive-tail invariant for trailing Option, &str, &[u8] fields now documented. KV codec's additive-tail invariant for trailing Option, &str, &[u8] fields now documented. Source: llm_adapter@2026-05-21 Confidence: low |
— |
Full changelog
Tuwunel 1.7.0
May 21, 2026
All servers raising their cache_capacity_modifier above default must consider decreasing it to deploy this release. The default of 1.0 is now generally recommended, and up to 2.0 for systems with four or less cores. Taking no action may cost 25% to 50% more memory (#123).
Nine additional MSCs have landed. Current status is kept up to date in our documentation.
New Features & Enhancements
-
Threaded read receipts and notifications (MSC3771, MSC3773) ship across storage, federation, sync v3, SSS v5, and the push gateway. Existing users may see a one-time jump in unread or badge counts that previously sat at the main-context-only total.
-
MSC4225 one-time-key upload-order issuance is implemented. Operator note: the legacy
onetimekeyid_onetimekeyscolumn is dropped on first read-write open and existing OTKs are erased; clients re-upload on their next /sync, with MSC2732 fallback keys (where present) covering the gap. The wipe is one-way; read-only and secondary replicas tolerate the missing column until the primary recreates it. -
MSC4222
state_afteron /sync v3 as an opt-in via?use_state_after=true. Clients that don't opt in are unaffected. -
MSC4115
unsigned.membershipon served events from encrypted rooms. Informational; clients that ignore the field are unaffected. -
Synapse-compatible shared-secret register endpoint at
/_synapse/admin/v1/register, raised by @iwalkalone69 in (#38). The admin module was also split into a directory of units. -
Refresh-token expiry with optional hard logout via three new keys:
refresh_token_ttl,refresh_token_idle_only, andrefresh_token_hard_logout. All default disabled. -
Configurable extra OIDC authorization parameters, courtesy of @Batmaev in (#450). Closes the silent-relogin gap with Logto and Element X when operators set
prompt = "login". Thank you! -
MSC4452
preview_urlcapability is advertised on /capabilities. -
MSC4466
propagate_toprofile query parameter is implemented; the room fan-out also runs concurrently. -
MSC3283
m.set_displaynameandm.set_avatar_urlcapabilities are advertised. -
MSC3814 fallback keys on dehydrated-device PUT are now stored.
-
OpenTelemetry OTLP exporter replaces the deprecated
opentelemetry-jaegercrate, closing (#85);tokio-consoleis re-enabled. -
Tip of the hat to @nyakokitsu, who reported in (#460) that
turn_urisset without TURN credentials produces empty creds silently. Tuwunel now warns at startup. -
Thanks to @dasha-uwu for simplifying
servers_route_via. -
Per-cache defaults were rebalanced from observed utilization in (#123):
auth_chainup 15x to 1.5M, several shorteventid/eventid caches 4x to 400k. Closes (#123) and (#423) opened by @scanash00; an earlier report by @alythemonk in (#262) on Oracle Linux OOM-via-PGTABLE is also addressed. Operators on<= 2 GiBhosts may want to clamp the cache modifiers in their toml to restore the previous baseline. -
Admin
db memory-usageis now tabular(used / cap / util%)with per-pool block-cache rows. -
Configuration items are annotated in the generated
tuwunel-example.tomlto indicate runtime-reloadable vs restart-required. -
The KV codec's additive-tail invariant for trailing
Option<_>,&str, and&[u8]fields is documented. -
A migration upgrades legacy
mediaid_userkeys to the composite layout. -
Thank you @NiklausHofer for the Gentoo Guru ebuild in "Getting Started" (#461).
-
Docs:
enable_loopback_candidatetroubleshooting motivated by @Lama-Thematique in (#451),ip_sourcefor reverse-proxy users, and an MSC table refresh (MSC3419 verified, MSC1957 n/a, rows for MSC4461 through MSC4474). Closes (#94) opened by @MrRinkana. -
Thanks to @winyadepla for the traefik MatrixRTC config in (#462) bringing parity with nginx and caddy. Also addresses (#69) opened by @GZEI.
-
CI gained a Complement job-summary script, a Playwright stage, and drift detection so a missed
tuwunel-example.tomlregeneration fails check and clippy.
Bug Fixes
-
A v1.6.2 regression on non-S3 storage backends panicked the main thread on first upload. Reported by @Sommerwiesel in (#452); multipart is now gated on S3 only. Sincere apologies for the disruption.
-
@BVollmerhaus graciously reported in (#454) that MSC2246 asynchronous media uploads could self-deadlock on the notifier mutex; the acquisition order is fixed. Thank you!
-
Thanks to @digikar99, who reported in (#459) that the UIAA fallback acknowledgement rejected non-SSO flows; the registration token + password flow completes cleanly.
-
Sliding-sync cached list ranges refresh on every explicit list update, shipped by @lhjt in (#455); previously a scrolled-to range was ignored indefinitely. Thank you!
-
/threads and /backfill apply the visibility filter before pagination
take, so a final non-empty page still returnsnext_batch. -
GitHub OIDC default
base_pathnow aligns with their published discovery doc after they quietly changed the issuer (eb51c70ca, 6552f8668). -
OAuth Dynamic Client Registration records are bounded to a fixed size. Thanks @CEbbinghaus! (e5f625d89).
-
OAuth SSO grant params win over operator-configured extras on key collision (05dba7ee9).
-
Receipts and presence EDU emission is bounded below the federation budget (b4fcf5871).
-
Membership tolerates stale room state on self-leave (39c72c233).
-
A missed optimization in
/stateand map-value storage was corrected (b305e6a86);/statenow also propagates per-PDU read errors instead of silently skipping corrupt events. -
Five route doc-headers had incorrect HTTP verbs (a40ca8f0a).
-
The Docker bake file dropped the non-functional
cache_to/cache_fromdirectives (8e4bc8c68). -
Thank you @pedrompcaetano for the typo fix in
tuwunel.container(#456). -
Stale comments and fan-out destructure cleanups (85e85c883, 9c4cd7c33, 2cc249363).
Breaking Changes
- Drops legacy `onetimekeyid_onetimekeys` column on first read-write open, erasing existing OTKs (one‑way migration).
- Cache capacity modifier default recommended as `1.0`; servers previously set above must consider decreasing to avoid higher memory usage.
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Tuwunel
High-performance and feature-rich chat server for Matrix, and the successor to conduwuit (fork of Conduit).
Beta — feedback welcome: [email protected]