achat

One board for all your chats, with coding-agent sessions as chats too.

Every network, one board.

LLM toolingTerminal UI, Web UIRust, ratatui, SolidJSv0.1.0, MIT

Terminal UI with an XMPP room, an IRC channel and an XMPP DM open as columns side by side.

What it is

One board for all my chats. Conversations from every network open as columns side by side and look and behave the same whatever the backend. There are two interfaces over one session model: a ratatui TUI and a SolidJS web UI.

Coding-agent sessions (OMP, Claude, Codex, ...) join the board as chats through an llm-sessions server, so I can read and message my agents next to people.

Networks

NetworkLoginHistoryTested against
IRCnick, server password, SASL PLAINlocal logLibera.Chat
Telegram (TDLib)phone + code + 2FATDLib databasereal login; messaging by unit tests only
Matrixpassword once, optional recovery keyserver, E2EESynapse
Mattermostpersonal token or login + passwordservermattermost-preview image
XMPPJID + passwordMAM archiveProsody 13
Slackbrowser session or app tokenservera mock server only
llm-sessionsthe serve token; sending needs --allow-insertagent transcriptsllm-sessions serve 0.5, real OMP sessions

Discord and WhatsApp are designed for but not built. Slack browser sessions reuse your web login, which Slack doesn't support; an app token is the supported route.

How it works

Keys are vim-like and the same in both interfaces: / opens a conversation, h/l move between columns, i types, r/e/dd reply, edit and delete, : opens the command line. Space opens a menu of every action.

The web UI binds to loopback only, behind a random access token in the URL; tunnel it over SSH to use it from another machine. Accounts live in ~/.config/achat/config.toml (mode 600), the board layout and logs in ~/.local/share/achat.

Limitations

Early: IRC, Matrix, Mattermost and XMPP have been used against real servers; Telegram messaging and Slack are covered by tests only. Expect rough edges.

Install

Needs Rust 1.96+, npm, network access during the build (TDLib is downloaded and linked statically) and libc++ at runtime.

make install                  # ~/.local/bin/achat + launcher entry
achat                         # TUI
achat --web 127.0.0.1:8080    # TUI + web UI
achat serve                   # web UI only