Chatto
Self-hosted team and community chat with built-in voice and video calls
Alternative to: slack, discord, microsoft teams
About
Versions (100)
v0.4.0
2026-07-060.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)