murmur.priet.us — A native, opinionated IRC client. Built in Rust with iced.
Murmur is a quiet client. Joins, parts, and noise fade into the background; conversation gets the foreground. Subtle by default, with /dimm for focus mode, inline media previews, tab-complete, command palette (⌘K), built-in emoji picker, per-channel logs, and SASL PLAIN / EXTERNAL (CertFP).
Alpha. Tested on macOS. Linux/Windows builds produced by CI but not heavily tested yet.
- Soft-dark palette by default, plus
midnight,daylight, andsolarthemes (/theme <name>). - Tile-style sidebar with per-row hover/select animations (EaseOutBack 220ms) and channel-switch crossfade.
- Sidebar / members panes are toggleable with
‹/›chevrons. Widths auto-fit the longest channel and nick. - Channel activity sparkline — hover a channel for ≥5s to see a popup with a 2h sparkline (24 buckets × 5min) and a "N msgs · last Xmin" summary.
- Per-network
&statusbuffer for server output, WHOIS replies, and standard replies.
- Message grouping — consecutive messages from the same nick within 5 min collapse to a single header.
- Subtle join/part lines at ~35% opacity, smaller font, no nick column.
/hidejoinsremoves them entirely for the current channel. /dimm(no args) — per-channel focus mode; non-mentions render at 30% opacity./dimm <nick>— global soft-ignore at 15% opacity./ignoreis the hard equivalent.- Read-marker line (
── new ──) above the first unread when the channel was not focused. Syncs to the server viadraft/read-markerso it survives across devices. - Smart unread digest — when a backgrounded channel accumulates ≥5 unreads, the top of the buffer shows
↓ N new messages · M mentions · top: nick (X), nick (Y), nick (Z) · × dismissbefore the read marker. - Inline media previews — images render inline (max 480×360); audio/video and other files as a sober card; URL errors as a faint footer.
- Link unfurling — OpenGraph / Twitter Cards /
<title>fallback parsed and rendered as a card with title, description, host, and embedded image./unfurl on|off|toggleper channel. +draft/replythreading — right-click → "↳ Reply" sets a composer chip; sent messages tag+draft/reply. Renders a mini-quote above the body, or a compact↳prefix when the parent is the message immediately above.- Reactions — right-click → "React" or
/react <emoji>adds a+draft/reactTAGMSG; reactions render as grouped badges under the message. - In-buffer search (⌘F) — case-insensitive substring with accent-tinted highlights and a match counter.
- Tab autocomplete — nicks and slash commands; cycles on repeated tab. Smart
:vssuffix depending on position. - Command palette (⌘K) — fuzzy channel jump + slash command runner.
- Emoji picker — searchable, curated set with category filters; inserts at cursor.
draft/multiline— paste a multi-line block and send as one BATCH message.draft/typing— sends+typing=activewhile you type; observes inbound and renders "X is typing…" / "N others are typing…" above the input.- File upload — paperclip button (or drag-and-drop) uploads via either the network's FILEHOST or a custom HTTP endpoint (configured under
[upload.custom]).
MONITOR-backed buddy list under the channel list. Online buddies get an accent dot; offline are dim; unknown render with a faint ring./monitor add|del|list|clear(alias/buddy) — manage per-network buddies. Persisted to config.- Right-click any member → "Add buddy" / "Remove buddy" for quick toggling.
- Native notification on offline → online transition (unless you're already viewing that DM).
⌘F— in-buffer search overlay (current channel only).⌘⇧F— global FTS5 backlog search across every network and channel you've ever received a message in. Live-indexed via SQLite (<config>/index.db) withunicode61diacritic-insensitive tokenization (sématchesse). Snippet highlights, click → jump to that channel.
⌘⇧P— privacy mode. Replaces every nick in the UI with a stable mask (u·a3fderived from a session-independent hash, so threads stay readable). Affects chat nick column, members, buddies, DM names, reply quotes, and even nicks baked into system lines (→ teraflops joined) or referenced in message bodies (nick: …). Topics and your own message bodies are left as-is. An accent-tintedPRIVACYpill in the chat header tells you it's on.- Private notes per nick — right-click any member → "Add note…" opens an inline editor. Saved notes show as a small accent dot on the member row and a tooltip with the full text when hovering. Stored per-network in your config TOML.
| Shortcut | Action |
|---|---|
⌘K / Ctrl+K |
Command palette (channel jump + slash commands) |
⌘F / Ctrl+F |
Search in current channel |
⌘⇧F / Ctrl+Shift+F |
Global backlog search |
⌘⇧P / Ctrl+Shift+P |
Toggle privacy mode |
⌘, / Ctrl+, |
Open settings |
⌘W / Ctrl+W |
Close current buffer |
Tab |
Autocomplete nick or slash command |
↑ / ↓ |
Walk input history |
Esc |
Close the top-most overlay (search, palette, settings, picker, reply draft) |
/join /part /nick /me /msg /query /away /back /whois /topic /clear /kick /mode /op /deop /voice /devoice /ban /unban /invite /ignore /unignore /ignores /dimm /hidejoins /setname /history /delete /react /monitor /unfurl /raw (alias /quote) /theme /config /settings /server /connect /disconnect /close /logs /msgid /caps /ping /ctcp
Run ⌘K then / for one-line hints on each.
Murmur attempts to establish the following IRCv3 capabilities with the server while connecting:
Identity & presence
account-tag— every message carries the sender's services accountextended-join— JOIN lines show services account when presentaccount-notify— see when other users log in/out of NickServaway-notify— away users render dimmed in the member listchghost— host/ident changes shown in place, no fake quit/joinecho-message— your own messages get a server-assignedmsgidfor editing/reactingsetname— change your realname mid-session with/setname <new realname>
Member list enrichment
multi-prefix— every channel prefix shown (@+nick, not just the highest)userhost-in-names—ident@hostcaptured from NAMES for tooltips/whois
Protocol plumbing
message-tags+server-time+batch— IRCv3 message metadata + tagged batchesinvite-notify— channel ops see who's being invitedcap-notify— react toCAP NEW/CAP DELmid-session (bouncer network attach/detach)labeled-response— response correlation for parallel commandssts— Strict Transport Security, persists per host; forces TLS+port on next connect
Authentication
- SASL
PLAIN(password) - SASL
EXTERNAL(CertFP — auto-selected whenclient_cert_pathis set) draft/sasl-ir— initial response on the firstAUTHENTICATEline, skips the+challenge roundtrip
History & catch-up
draft/chathistory— server-side scrollback on channel attach (LATEST)draft/chathistoryTARGETSsubcommand —/historyshows active conversationsdraft/event-playback— soju/bouncer replays joins/parts/nicks alongside PRIVMSGs in chathistory- IRCv3 standard replies (
FAIL/WARN/NOTE) — rendered uniformly in the status buffer RPL_ISUPPORT(005) parser — usesMODES=for op-bulk chunking,CHANTYPES=for/joinvalidation
Modern drafts
draft/typing— "X is typing…" indicator below the input; sends+typing=activewhile you typedraft/multiline— receives BATCH multiline as a single message with line breaksdraft/read-marker— sendsMARKREADwhen you focus a channeldraft/message-redaction—/deleteremoves your last message (or/delete <msgid>); incoming REDACTs render as tombstones+draft/react—/react <emoji>reacts to the latest message; reactions render as grouped badges
Server support varies — Ergo and Soju cover the most ground; Libera supports identity/presence/history but not the editing/redaction drafts.
cargo build --releaseOn Linux you'll need a few system packages. E.g., on Debian (and derivatives):
sudo apt-get install -y libxkbcommon-dev libwayland-dev libxkbcommon-x11-dev pkg-configThe first run writes a commented config template to:
- macOS:
~/Library/Application Support/murmur/config.toml - Linux:
~/.config/murmur/config.toml - Windows:
%APPDATA%\murmur\config.toml
Edit nickname and server, restart, and you're in!
See the Releases page.
MIT — see LICENSE.