Repository navigation
v1.0.0
Meet dexchat
This is the first public release of Dex, the IRC TUI client with modern features. 💬
Give it a try and let us know what you think!

Check here the install instructions.
Full changelog
All commits
New
9d05e24: feat(cfg): add notifications field0e10d5f: feat(commands): add /join supportbe55818: feat(commands): add /leave support7a96532: feat(commands): add /list supporte92cfe0: feat(config): validate sound notification values3af2671: feat(goreleaser): improve releases4118f62: feat(help): add keybindings help modal overlaydaa2dc2: feat(history): load channel history on demandef60bcf: feat(history): restore direct message historyc7bcf96: feat(irc): queue self-JOIN events before sending to the UI610b983: feat(palette): allow up and down arrow key navigation3d10c01: feat(palette): improve text contrast and colors on selection5c68e22: feat(ui): add Dracula themecd2390a: feat(ui): add Gruvbox Dark themef78c017: feat(ui): add Solarized Light theme2307648: feat(ui): add channel mention/unread count in the channel list9dc45f8: feat(ui): add channel picker scrollbar0ab709d: feat(ui): add go to channel palette action29a2281: feat(ui): add sound notification cooldown76460c4: feat(ui): add unread/tag message counts for channels3a2fb19: feat(ui): avoid rendering things on inactive buffers8058c30: feat(ui): do not increment unread badges on user join/quit2003436: feat(ui): emit sound notificationb3b7133: feat(ui): ignore notifications from configured DM users65870d9: feat(ui): load channel history on demand10ffefe: feat(ui): load read state before IRC connectioneb0699f: feat(ui): nickname completion on tabe045e7b: feat(ui): notify messages in configured channels26b315e: feat(ui): persist local read cursors244bff8: feat(ui): process playback messages in chunksa4b9103: feat(ui): refine channel picker navigation076e4b7: feat(ui): rules for notification eventsd07f032: feat(ui): select theme from config8efb225: feat(znc): adds compatibility for ZNC user/password format in config file6f859d6: feat(znc): start implementing ZNC support; enable echo-messageff2888e: feat(znc): support playback history and multi-client connections5a73bfc: feat(znc): sync nickname with server after connectiona85c36e: feat: add /msg private messages3303b1d: feat: add colors to message events, like connect/disconnect, server messages706ba55: feat: add date (days) separator between messages4428aca: feat: add goreleaser0676052: feat: add part alias and close private messages7f8f2c4: feat: add persistent history support with deduplication64fe924: feat: add user info into join/part/quit messagesd786dbb: feat: bulk join channels on connectb644b93: feat: edit message drafts in external editor4504208: feat: handle NICK events to refresh user change in all channels the user is in478ed44: feat: handle channel join errors0582e84: feat: handle irc disconnectsbe42118: feat: highlight mentions in chat messages30bd54e: feat: identify notification channel activity8129d81: feat: load config from XDG directoryeb6518c: feat: message batching to avoid UI re-render flood9748cc8: feat: message types47422ac: feat: multiple reconnects3c01733: feat: nick of messages sent by users not in channel is shown as gray in history3b52ce7: feat: provide default IRC configuration1c325bc: feat: pulse channel names on mentions8ab973c: feat: pulse follow-up activity after mentions606285d: feat: pulse notified channel names47e6425: feat: rose pine theme43a2038: feat: scroll hovered panes independently7fab4d7: feat: send all BufferNewMessageMsg through batchesec0c3d4: feat: send reconnected messages to all channels26114fe: feat: show error when messaging channels that failed to joinb3079d2: feat: show prefix in chat and fix case in viewport41937fa: feat: show user join messages in channel buffer129c673: feat: show user parts messages in channel buffera209c56: feat: show user quit messages in channel buffer37720bc: feat: style topic on render3fc2f2c: feat: support server IRCv3 timestampse1f17df: feat: switch to the last selected bufferb05be01: feat: upgrade bubbletea/lipgloss to v2; use lipgloss composite
Fixed
289569d: fix(history): preserve entries during persistencebefd3bc: fix(history): use dex data directoryb197e76: fix(irc): avoid ZNC queue delays from WHO burstsaa971c7: fix(irc): avoid blocking startup event deliveryedfab6c: fix(irc): preserve channel context for quit eventsd52da5c: fix(nix): update Go module vendor hash818acfe: fix(ui): add background color to all message cellsb85bd17: fix(ui): avoid inactive buffer rerender on nick update39e6442: fix(ui): avoid redundant sidebar resize channel/user list3d915b2: fix(ui): distinguish inactive nickname colorsa9f1034: fix(ui): don't render chat when no need for it373026f: fix(ui): handle chat actions synchronously9ad3b17: fix(ui): improve Rose Pine theme contrast2014ce7: fix(ui): keep app open after persistence failure948f2ab: fix(ui): load configured history asynchronouslyb4f73ff: fix(ui): move periodic persistence off update looped7915a: fix(ui): parse IRC hexadecimal colors5d4ef69: fix(ui): persist private messages before closingbfb4001: fix(ui): persist state before quitting8d30c31: fix(ui): restore DMs after IRC connection2274dee: fix(ui): serialize history persistence4143dd6: fix: close irc client connection on exit76f6718: fix: correctly render messages colored by type95c7919: fix: count only user messages as new messages for badges87ee111: fix: creates a buffer dynamically if the user list arrives before the buffer exists352ad42: fix: display topic correctly for dynamically created buffers8cf4aca: fix: don't duplicate ownecho messages when on ZNC54555db: fix: enable truecolor in Docker imaged803e7a: fix: foreground in some messages0ebb409: fix: girc Connect was being shadowedf246a58: fix: honor advertised IRC user prefixes38b4912: fix: improve channel list indentationa2033c2: fix: insert dynamically created channels at the correct position101148d: fix: join events now refreshs the user list0b45518: fix: keep selected buffer visibleb1d8888: fix: load history in a batch instead of message per messageb2edccb: fix: move reconnection loop to Connect()e7b1d87: fix: moves ConnectAll into bubbletea lifecyclea7771da: fix: notify active buffers when terminal is unfocused9f3b345: fix: only refreshes on UserListMsg in the active buffer5e5cf45: fix: render IRC formatted messages also in server buffers4a4438e: fix: run irc echo-message handler in the backgroundd67c6e2: fix: select archives for Homebrew cask13b1eef: fix: set default terminal type in Docker image9518959: fix: use Homebrew tap token secret
Refactored
c0f2999: refactor(ui): isolate persistence orchestration7b43350: refactor(ui): move editor I/O into tea.Exec11bf39b: refactor(ui): organize persistence statef632ab9: refactor(ui): schedule IRC commands with tea.Cmd5ca32fe: refactor: centralize help keybindingsa635971: refactor: migrate module path to dexchat
Documentation
661e854: docs(ui): document routing and persistence invariants
Other changes
f01e08f: move palette loose numbers to conste501047: 1st prototype58f63cc: Initial commite3efd24: MoveDown/Up will go to the top/bottom on end/start7ee1d4b: Update README.md7a81f5d: Update README.md7d63d4e: Update README.mda497b57: Update README.mde85ae64: Update issue templates556f928: add .gitignore0550288: add PRIVMSG handler for channels; add time to messagea03f3f9: add a preview in docf331526: add channel member count2a7e1cf: add ctrl+c confirmation to exit5cd2b88: add help text at bottom5f5de2f: add initial config9a1e572: add minimum support to scroll through chat5e56f50: add more todoe367dde: add myuser to userlist2a2cd12: add new item for the theme to colorizeda64774: add nickname in inputbar4174312: add padding to chat text messages1416748: add quit handler53cb021: add serers handlers: show connection output to server bufferded18f0: add topic and username for server buffers0cf9751: add topic channel3a9a47b: add topic to server buffers57727b3: agents: improve instructions2e5e582: change buffer field namec75798b: change channel model to value56f91ee: change help keybinding55f9f6b: channels tree0d80bb9: chore(ui): extract command dispatche2ba3ca: config.toml8ae2796: create buffers for servers as wellbaf706b: disable userlist scroll for nowc9593c7: docsb6802ce: docsbcfbc44: docs4944e78: docs98760d1: docs94ca9a2: docs and previewf4d723e: fix borders/paddings/margins from chataread63e3bf: fix buffer keys case907457a: fix bug where j/k in input would scroll viewport715a905: fix bug where users sometimes dont get updated4d0246b: fix channel name cases after connecting50692cf: fix mouseevents from input bar821d468: format received styled messages917c484: get servers from config fileec24d28: github: add issue formda422ba: github: configure issue template chooserf52d0fd: github: fix issue form title validationfa60cde: github: inherit organization issue formsc486c25: global Width is not necessary1b3c267: go sum05b76c5: handle keybindings pressed in a different placee6f5e84: handle nick updatesec03e35: handle topicf1c99d6: implement buffers; update user list for each buffer2315e09: improve a bit input code883acd2: improve code a bit3ad0463: improve layout's readability (i hope)2986e79: increase channel sidebar ratio69f96a6: input inside chatbf7a1e4: input looking ok115fd2f: input workingbf273b2: keybindings; command palette and more1a91e15: main1e38cff: move input from chat to a new component8b9f184: move input packagefa8442f: new preview8f40989: only show member count on channelsf573906: perf(chat): cache rendered chat history890577f: perf(ui): avoid redundant component updatesf08eca7: preview imagebceb6cf: randomize nicks in userlist1241578: refactor layout part of chat2f4aa17: remove dead codecaacc89: remove layout package5cceeee: remove up/down keybindings for channels046fd5e: rename const in ui.gof1b8d0f: replace placeholder users/chat bufferb92f402: rever input update ordere190863: revert sidebars ratio; fix member count separator width calc15360fd: send messages to channel on enter9b75973: set a viewport to display the userlistec0c08f: simple connection to libera46ec8e1: simplify layout code304a1fe: simplify layout in main model9a46300: small tweaks in users.go7dd2891: sort servers/channels in config type0b5f344: sort user list by permissions as well1a9c972: structure messages; add color to usernames in chat4a7a53e: style the channel sidebar9725fa7: support connection to multiple servers5f37229: support private messagescc98c49: test(keybindings): make quit handler deterministic00b9ef3: test(ui): cover asynchronous buffer persistenceb570754: test(ui): cover persistence failure and shutdownda4d1ab: tree working minimally7f09813: update userslist with channel usersfeca6f3: upgrade go version340bce9: use JoinVertical in channels.go32b1592: user irc handlers send a tea message to UI34f5637: working41bfcd2: working mvpbb8f41d: wrap chat messages in the correct viewport width