Release history
Chatto releases
Chat app for teams and communities
All releases
79 shown
v0.4.0
Breaking risk
⚠ Upgrade required
- Migrate existing GraphQL clients to ConnectRPC endpoints; update configuration accordingly.
- Review operator user administration changes when enabling socket‑backed admin features.
Breaking changes
- Replace GraphQL with ConnectRPC across api surface
- Consolidate and reshape ConnectRPC public API types, packages, and server profile responses
- Split ConnectRPC packages and clean up related calls
Notable features
- Universal rooms added
- Filter event log in admin UI
- Add protobuf realtime websocket for api
Full changelog
0.4.0 (2026-07-06)
⚠ BREAKING CHANGES
- api: consolidate ConnectRPC surface (#1306)
- api: clean up server assets calls and includes (#1303)
- api: consolidate shared api shapes (#1302)
- api: consolidate shared public API types (#1299)
- api: consolidate public ConnectRPC API (#1295)
- api: polish ConnectRPC API for 0.4.0 (#1224)
- operator: add socket-backed operator user administration (#1164)
- api: reshape server profile responses (#1185)
- api: split ConnectRPC packages (#1179)
- api: replace GraphQL with ConnectRPC (#1166)
- api: use optional timeline presence fields (#1110)
Features
- add universal rooms (#1046) (0b8c5cb)
- admin: filter event log (#1056) (d8bd280)
- api: add ConnectRPC asset uploads (#1249) (f97f1d0)
- api: add ConnectRPC DM start (#1157) (c46ef79)
- api: add ConnectRPC public API PoC (#1067) (7aeb8f7)
- api: add ConnectRPC reflection (#1182) (a93324c)
- api: add ConnectRPC room timeline PoC (#1074) (920fcaa)
- api: add protobuf realtime websocket (#1158) (9e8e34c)
- api: add resource batch reads (#1232) (8a04ae0)
- api: clean up ConnectRPC surface (#1171) (03c42af)
- api: clean up ConnectRPC surface (#1178) (b1b6e28)
- api: clean up server assets calls and includes (#1303) (e960def)
- api: consolidate membership services (#1293) (7ed268c)
- api: consolidate shared api shapes (#1302) (4429009)
- api: consolidate shared public API types (#1299) (1ec2015)
- api: extract generated TypeScript clients (#1183) (3480cda)
- api: extract TypeScript API client (#1184) (b38b9a5)
- api: migrate reactions to ConnectRPC (#1128) (161f51c)
- api: polish ConnectRPC API for 0.4.0 (#1224) (06f4361)
- api: port message posting to ConnectRPC (#1093) (011018b)
- api: port read state and thread follow to ConnectRPC (#1087) (f2128d6)
- api: replace GraphQL with ConnectRPC (#1166) (3dd3fa6)
- api: reshape server profile responses (#1185) (96bde6e)
- api: split ConnectRPC packages (#1179) (6ec286a)
- api: use optional timeline presence fields (#1110) (5c1406f)
- auth: add SSO account creation and linking (#1167) (61723e9)
- auth: type runtime credentials (#1195) (5f0ebe4)
- config: configure SMTP TLS verification (#1159) (1f5c8b0)
- connectrpc: add message management API (#1146) (c07b049)
- connectrpc: add room directory service (#1138) (c1f13cf)
- connectrpc: add room lifecycle service (#1134) (3f2b3a9)
- connectrpc: port thread history reads (#1083) (4b81b4d)
- core: persist link preview assets via storage backend (#1060) (005deb1)
- core: store thread follows in EVT (#1233) (01a2bb3)
- dev: add Mailpit to mise dev (#1238) (0d07f7e)
- docs: add release notes pages (#1180) (6418471)
- exporter: add deployment-wide prometheus exporter (#1059) (5aa29c7)
- frontend: add multi-image attachment gallery (#1241) (d8338c5)
- frontend: add Paraglide-based client-shell i18n (#1077) (1a4ab07)
- frontend: add Trusted Types markdown policy (#1307) (47b9060)
- frontend: consolidate frontend design system (#1053) (7fc39ab)
- frontend: improve admin member details (#1057) (8c8ccce)
- frontend: maximize call pane (#1240) (7aaa34a)
- frontend: move UI strings into i18n catalogs (#1084) (d310382)
- frontend: refresh admin system dashboard (#1160) (5c54899)
- frontend: refresh toast styling (#1260) (1b728e5)
- frontend: send typing indicators with ConnectRPC (#1155) (1a131ee)
- frontend: show call participants in room sidebar (#1036) (8cd0858)
- frontend: show reaction names in popups (#1044) (e141b74)
- frontend: show room descriptions in header (#1037) (44f9c67)
- frontend: use ConnectRPC for message writes (#1153) (4b34f34)
- frontend: use ConnectRPC for room commands (#1150) (bfff68e)
- operator: add socket-backed operator user administration (#1164) (6209795)
- presence: add user-controlled presence modes (#1095) (9e8f696)
- profile: add custom user statuses (#1081) (1d1d7d2)
Bug Fixes
- api: address 0.4.0 surface review findings (#1228) (bd054ff)
- api: align ConnectRPC permission exposure (#1246) (cf2eca7)
- api: centralize Connect room RBAC in core (#1149) (8ba5b0c)
- api: close ConnectRPC RBAC gaps (#1207) (da0b129)
- api: include user status in generated docs (#1092) (52521fa)
- api: make ConnectRPC plumbing idiomatic (#1123) (338f573)
- api: preserve offline presence in snapshots (#1172) (7fce244)
- api: tighten ConnectRPC caller auth (#1126) (bb8c10d)
- assets: prevent protected attachment caching (#1261) (e3c6eed)
- assets: serve protected assets through stable gateway (#1264) (744e93e)
- attachments: crop extreme image thumbnails (#1181) (d5dd244)
- auth: add structured unauthenticated GraphQL errors (#1048) (510c07d)
- auth: reject empty-user runtime credentials (#1201) (43b569c)
- calls: preserve call on tab takeover (#1284) (451929d)
- ci: gate release-please on green ci (#1135) (4decb0f)
- conductor: use workspace port for Storybook (#1290) (c5ba4dc)
- connectapi: harden message post migration (#1097) (b15fb14)
- connectapi: harden timeline and thread read handling (#1117) (ba027fe)
- connectrpc: cap request message size (#1102) (a773531)
- connectrpc: reject missing read anchors (#1109) (f2f68b9)
- core: complete service inventory metrics (#1130) (9bc89f3)
- core: prevent read marker regressions (#1107) (cb81d58)
- dockercompose: enable LiveKit TURN relay (#1190) (51eb5e7)
- docs: keep release note cards in grid lanes (#1204) (a6c79df)
- frontend: address svelte guidance review (#1154) (d8c4010)
- frontend: align call control button colors (#1085) (4b7f37e)
- frontend: align muted call participant icon (#1050) (68cea04)
- frontend: clarify echo reply actions (#1253) (5a2b264)
- frontend: clarify iOS PWA push setup (#1192) (2416a41)
- frontend: clarify remote push notification support (#1105) (bfdbdea)
- frontend: clear call-wide mode on notification navigation (#1291) (db09a62)
- frontend: constrain current user card height (#1239) (1b536b9)
- frontend: defer camera permission until enabled (#1243) (2145a95)
- frontend: defer unread separator until return to the room (#1079) (9535694)
- frontend: handle API auth failures gracefully (#1269) (e82c554)
- frontend: harden asset proxy token handling (#1054) (8797c65)
- frontend: ignore stale DM member loads when switching rooms (#1065) (b4264b7)
- frontend: improve call presence indicators (#1257) (696a92e)
- frontend: improve extreme image thumbnails (#1227) (d5c596d)
- frontend: improve LiveKit media error handling (#1281) (94a86c0)
- frontend: improve unread channel contrast (#1089) (74247b4)
- frontend: localize date formatting (#1242) (cfc96ec)
- frontend: make attachment remove control subtle (#1265) (6537c27)
- frontend: make scrollbars follow selected theme (#1152) (9c5fa16)
- frontend: polish error and missing media states (#1267) (b9dabba)
- frontend: preserve touch composer line breaks (#1194) (8c62c70)
- frontend: quiet console warning noise (#1280) (4df7b85)
- frontend: reconcile notification badge dismissals (#1058) (13c7a6e)
- frontend: reconcile PWA notification badges (#1229) (e44645e)
- frontend: refresh messages after local deletions (#1148) (cefc22a)
- frontend: remove redundant universal room badge (#1052) (5f6131e)
- frontend: reset inline code state when composer clears (#1251) (0dddeaa)
- frontend: restore circular avatars with stable presence dots (#1252) (14b15b9)
- frontend: restore default text smoothing (#1268) (b3a6dc3)
- frontend: restrict same-tab message links (#1068) (d43d23f)
- frontend: restyle reply attribution preview (#1140) (909c1f4)
- frontend: share unread marker lifecycle with threads (#1310) (07c3601)
- frontend: show loading state for call media toggles (#1237) (9063832)
- frontend: stabilize new messages separator (#1308) (c35ed86)
- frontend: stabilize tab resume catch-up (#1288) (b70916d)
- frontend: style room member search clear button (#1226) (e43f615)
- frontend: submit simple message edits with enter (#1129) (f5651b4)
- frontend: sync presence badge across tabs (#1301) (5fbfb22)
- frontend: sync room thread follow bell state (#1121) (4048f23)
- frontend: use direct ticketed asset URLs (#1312) (b41eb1d)
- frontend: use full-width image galleries (#1247) (f5fe88a)
- frontend: use semantic presence colors (#1259) (ccf64db)
- frontend: wire UI strings to i18n (#1225) (7eafcd3)
- media: preserve video aspect ratios (#1254) (8a85f0a)
- messages: validate reply targets before posting (#1176) (2919a1a)
- notifications: clear read notifications server-side (#1297) (c6f3c30)
- notifications: preserve unread badge state across dismissals (#1069) (03444e3)
- pwa: reduce service worker reload churn (#1187) (5489e47)
- reactions: canonicalize echo reaction targets (#1272) (2b87044)
- release: publish release before updating tap (#1298) (c5c8aa6)
- voice: scope LiveKit observations to active calls (#1049) (dcd95c8)
Performance Improvements
- build: improve frontend and CLI cache reuse (#1106) (f22da3a)
- core: cache unwrapped DEKs per request (#1193) (0623831)
- core: slim timeline projection memory (#1287) (cd026ff)
- frontend: load room members in larger batches (#1206) (f465a09)
- frontend: split chat code from app chrome (#1103) (4a4a4de)
Code Refactoring
v0.3.0
Breaking risk
Breaking changes
- sidebar: now lists rooms only visible via `room.list`
Notable features
- Added simple and rich composer modes
- Gated message attachments with `message.attach`
- Improved linked message previews
Full changelog
0.3.0 (2026-06-18)
⚠ BREAKING CHANGES
- sidebar: list rooms visible via room.list (#961)
Features
- add simple and rich composer modes (#974) (ec5bcea)
- gate message attachments with message.attach (#966) (2870f0f)
- improve linked message previews (#970) (aecdb1b)
- improve room member loading and search (#963) (33bd45a)
- messages: add copy link menu action (#969) (2afdee2)
- sidebar: list rooms visible via room.list (#961) (fe27c06)
- simplify web push opt-in (#971) (6abb0ce)
Bug Fixes
Config change
v0.2.0
Breaking risk
Breaking upgrade
Docker mount change + Markdown + notifications
v0.0.182
Breaking risk
⚠ Upgrade required
- Persisted events and notifications now reserve `space_id`; ensure downstream consumers handle the reserved field.
Breaking changes
- Removed `space_id` field from live-only event protocol definitions
Notable features
- Frontend auto-reloads client on new version when user is idle
- Refactored asset uploads to drop `space_id` (Phase 4)
- Added `Room.kind` enum and switched room resolvers off `space_id`
Full changelog
Changelog
⚠️ Breaking Changes
- b998f2f515e44c90606797d4e24f59b1e19d043c: refactor(proto)!: drop space_id from live-only event protos (#568) (@hmans)
Features
- 391fe3ff0eb7bee3f7da0dcc1925ac082b26c191: feat(frontend): auto-reload client on new version when user is idle (#570) (@hmans)
Other
- 34df4677b0ad27038afbd56535a317155c413c05: refactor(assets): drop space_id from new attachment uploads (Phase 4) (#572) (@hmans)
- de362f8e5a8cc2a6f4d26fad33fe8d0afa64bce6: refactor(proto): add Room.kind enum; switch room resolvers off space_id (#569) (@hmans)
- c58e0bd71618be54d73e433aefb756893e2b00e7: refactor(proto): reserve space_id on persisted events + notifications (#571) (@hmans)
Released by GoReleaser.
v0.0.181
Breaking risk
Breaking changes
- Removed duplicate AdminQueries fields for Server role in graphql (#561)
- Changed joinRoom mutation return type from Boolean to Room in graphql (#564)
- Deleted AdminQueries.userRoles field in graphql (#557)
Full changelog
Changelog
⚠️ Breaking Changes
- ae4f6c4c7f223ddb1115ee3a0004b7731fb2f692: refactor(graphql)!: drop AdminQueries duplicates of Server role fields (#561) (@hmans)
- 18fb1389be41220bb42bd0780e808fa105555c92: refactor(graphql)!: joinRoom returns Room instead of Boolean (#564) (@hmans)
- 0c1489f4eeef9ac163f0442bdf8f5bb2ffee05b5: refactor(graphql)!: remove duplicate AdminQueries.userRoles (#557) (@hmans)
- e031620c7e977c9aef5864d3532d4c5ab5540d32: refactor(graphql)!: rename ConnectionInfo.serverID to serverId (#555) (@hmans)
- db159b765f60c481006dbb550e5606333b4ba17e: refactor(graphql)!: rename Query.user(id:) argument to userId (#563) (@hmans)
- 50a8ade4ca1ec0cadb1baea47611f375edbf60df: refactor(graphql)!: rename editMessage to updateMessage (#562) (@hmans)
- cd77568ec0362a3e17b69e2606048cf7ee0c7d06: refactor(graphql)!: rename role to roleName in permission inputs (#556) (@hmans)
- 709a56c779e6fe73eef6acaa9a5e6ed5192eda57: refactor(graphql)!: rename thread-root references to threadRootEventId (#558) (@hmans)
- cd0378ae7be43d646e1b33ca00888a61f1578a43: refactor(graphql)!: standardize permission list names on group inspectors (#559) (@hmans)
- ee3ba83ce233140b23b1409ccee1167d0d548c10: refactor(graphql)!: wrap deleteAvatar and clearUsernameCooldown in Input objects (#560) (@hmans)
Other
- 45feff19fb10abf4d86c93fd02fe1d5270fd1048: refactor(core): collapse rbac sub-package + unify scoped permission writes (#566) (@hmans)
Released by GoReleaser.
Review required
v0.0.177
New feature
Auth
RBAC
Crypto / TLS
core, frontend, dev, natsauth, RBAC
No immediate action
v0.0.174
Breaking risk
Space tier retirement + GraphQL refactor + Subscriptions collapse
No immediate action
v0.0.173
New feature
Header hover + Emoji Recently Used + Subscriptions recovery
Review required
v0.0.172
Breaking risk
Auth
Breaking upgrade
Server edit window + group collapse + permission fix
Review required
v0.0.171
Breaking risk
Auth
RBAC
Unified RBAC + Resizable Sidebar + MOTD update