Cordiale is a native desktop client for Grappa, written in Rust with Slint. It doesn't speak IRC directly: it uses REST and Phoenix Channels/WebSocket per Grappa's documented client protocol.
Some of us just want to sit on Grappa without hauling a full browser engine along for the ride. Gecko, WebKit, Chromium — doesn't matter which one, even the "vanilla" build with zero bloatware still helps itself to 700–800MB of RAM just to render some chat. Cordiale's whole pitch is being the cheap-on-resources alternative: Rust and Slint give it enough cross-compile flexibility to cover Windows on both x64 and ARM64 (yes, Surface people, you're covered), a handful of popular Linux distros as proper native packages, macOS on Apple Silicon, and the usual adaptable .tar.gz for whichever distro didn't make the automated build lineup.
Cordiale isn't the only way to sit on a Grappa server, and it's worth knowing what else is out there:
- "Grappa" itself is the always-on bouncer/server this whole thing revolves around — REST + Phoenix Channels, no raw IRC on the wire unless you go through Shottino below. Own repo, own maintainer, own history.
- "Cicchetto" is Grappa's own web PWA — installable on a phone home screen, speaks pure REST/WebSocket, never touches raw IRC. It lives inside the
grappa-ircrepo itself (cicchetto/), not a separate project, so it shares Grappa's maintainer and contributors rather than having its own. - "Shottino" is also inside
grappa-irc(frontends/shottino/): a standalone terminal client that, run with--ircd, turns into a bridge server so old-school IRC clients — irssi, WeeChat, HexChat, whatever you're already attached to — can point at a Grappa network like it's a normal ircd. - "Resentin" is the odd one out in a good way: a native Android client for Grappa, written in Kotlin/Compose, and an entirely separate project with its own owner and contributors, unrelated to the
grappa-ircrepo. - "Bicchierino" is another separate, standalone project (maintained by Sonic): a stateless IRC-facade bridge to Grappa, in the same spirit as Shottino but its own codebase and its own repo.
Each of the above has its own maintainer(s) and its own issue tracker — if something's broken in Grappa, Cicchetto, Shottino, Resentin, or Bicchierino, that's the place to report it, not here.
The channel sidebar and member list have resizable columns with content-based
minimum widths. Channel rows sit directly below their network row, member
roles appear in brackets (for example, [@] Sythos), and the member list's
Actions menu includes a shortcut to the Themes settings.
Settings > Themes lists Grappa's theme gallery, including the irssi-derived
irssi-dark and sux, each shown with its color set. Picking one makes it
the account's active theme on Grappa (PUT /me/theme) and restyles Cordiale:
window background, monospace font, nick and timestamp colors, channel header
and topic box. Without server themes, built-in copies (irssi-dark, sux,
mirc-light, solarized dark/light) are applied locally; the classic look
follows the light/dark switch. As in Cicchetto, a gallery theme can be paired
with a night theme, which Cordiale switches to while the operating system is
in dark mode.
At launch Cordiale signs in automatically with the last remembered profile, using its Grappa bearer or the login password kept in the OS keyring if the bearer is rejected. It restores the last selected channel when that channel is still joined. The login password stays in the native keyring (Windows Credential Manager, macOS Keychain, or Linux Secret Service), never in Cordiale's own files; without a keyring it is not stored. The eject button at the top of the sidebar, or Switch account in the Actions menu, signs out and turns off automatic sign-in until the next successful sign-in.
Compared with Cicchetto on Grappa's main branch, Cordiale still has these user-visible or behavioral gaps:
- Themes: Cordiale applies Grappa's gallery themes (or built-in copies) and their day/night pairing, but not Cicchetto's custom-theme editor, theme publishing or background images. Buttons and menus keep Slint's own widget style in its dark or light variant.
- Sign-in and account security: Cordiale does not expose Cicchetto's TOTP/passkey management.
- Admin tools: the panel (which needs a password sign-in; a client
token is refused on
/admin) creates accounts, resets passwords and creates, edits and deletes networks and their IRC servers, edits the server-wide upload, DCC and addressing settings, binds and unbinds credentials, manages vhosts and their grants to accounts (not to visitors), and follows the live admin event feed. - Settings and watch lists: the identity editor reads back the nick in
use on each network, but Grappa no longer reports ident and realname, so
those start blank; the server's upload limits are shown read-only. Settings >
Notifications edits the push switches, the per-channel and per-nick lists,
muted conversations (muted from the Actions menu, for an hour, eight hours
or for good) and the sound other devices play, also set with
/beep. - Uploads and attachments: the paperclip uploads a picked file through
Grappa (
POST /api/uploads) and posts its link with the category emoji, as Cicchetto does, after checking the file type and the advertised size cap. Settings > General sets how long uploads are kept and whether to ask before each one. Drag-and-drop and paste, inline previews and the media viewer are not implemented yet. - Slash commands: Cordiale handles the everyday IRC verbs (
/me,/msg,/notice,/query,/join,/part,/cycle,/topic,/nick,/away,/ctcp,/ping, op/voice/kick/ban/mode,/quote,/oper,/connect//disconnect//reconnect//quit,/ignore,/notify,/hilight,/ame//amsg,/alias//unaliaswith Cicchetto's alias expansion,/kb, the services shortcuts, and a bare/umodethat opens the user-mode toggles), but not/np(a bare/topicor/modeshows the channel's topic or modes in the status bar). - Chat and roster edge cases: a message with multiple differently colored mIRC runs may overflow instead of wrapping as one paragraph. Channel MODE parsing does not yet use the advertised ISUPPORT CHANMODES argument rules, so mixed mode strings can misassign a role prefix. A bounded pre-snapshot DM queue can drop messages if the authoritative query snapshot is absent or late.
- Remaining presentation gaps: WHOIS avatars are drawn when Grappa serves them as PNG, JPEG, GIF, WebP or BMP; the account-wide unread count only shows in the window title (and so the taskbar), not as an OS badge.
Packaged releases (installers, distro packages, source archive) are on
the Releases page — see
docs/installation.md for per-platform
instructions. Prefer building from source? main always builds:
git clone https://github.com/Sythos/Cordiale.git
cd Cordiale
cargo build --release --package cordiale-ui
./target/release/cordiale-uicrates/cordiale-core— domain model, protocol, persistence, credentials, REST/WebSocket clients, and other shareable logic;crates/cordiale-ui— Slint executable and GUI entry point;crates/cordiale-ui/lang/{it,fr,de,es}/LC_MESSAGES/cordiale-ui.po— UI translations, bundled into the binary at build time byslint-build(no runtime gettext dependency); English is the untranslated source text, noen/file needed;resources/branding/— project image and app icon source;packaging/windowsandpackaging/linux— space for future deliverables (packaging notes indocs/packaging-windows.mdanddocs/packaging-linux.md);docs/— technical documentation: Grappa protocol contract (protocol-notes.md), feature matrix (feature-matrix.md), packaging notes, and how to install a release.
- Grappa client protocol: https://github.com/vjt/grappa-irc/blob/main/docs/CLIENT_PROTOCOL.md
- Cicchetto, functional reference: https://github.com/vjt/grappa-irc/tree/main/cicchetto
