# nirc-rs 0.10.0 — Status Report **Version:** 0.10.0 **Release date:** 2026-07 **Codename:** nirc-rs **License:** GPL-3.0-or-later **Rust edition:** 2021 **Source:** https://git.dcos.net/dcosnet/nirc-rs --- ## Protocol Status | Protocol | Implementation | Testing | Notes | |----------|---------------|---------|-------| | **IRC** | ✅ Complete | ✅ Tested & Working | TLS, SASL PLAIN, CTCP, ISUPPORT, oper commands | | **ADC/DC++** | ✅ Complete | ✅ Tested & Working | Hub connect, search, file transfers, guard pipeline | | **Matrix** | ✅ Complete | ❌ Untested | Megolm E2EE, SQLite store, dedicated OS thread | | **Discord** | ✅ Complete | ❌ Untested | Gateway WebSocket, REST API | | **Stout** | ✅ Complete | ❌ Untested | REST + WebSocket (Revolt fork) | | **Spacebar** | ✅ Complete | ❌ Untested | REST + WebSocket (Revolt fork) | | **Nerimity** | ✅ Complete | ❌ Untested | REST + WebSocket (custom platform) | | **BitChat** | ✅ Complete | ❌ Untested | libp2p P2P, mDNS, gossipsub, noise | --- ## What's New in 0.10.0 ### IRC Hardening - **SASL EXTERNAL with client certificates** — Full TLS client certificate support via the identity vault. Loads combined PEM files (cert+key) or separate cert/key files. Configurable per-server via `sasl_client_cert` in the server entry's `extra` map. - **MONITOR (watch list) support** — IRCv3 MONITOR capability for tracking online/offline status of specific users. New `/watch + `, `/watch - `, `/watch l`, `/watch c`, `/watch s` commands. Handles RPL_MONONLINE (730), RPL_MONOFFLINE (731), RPL_MONLIST (732), RPL_ENDOFMONLIST (733), RPL_MONLISTFULL (734). - **User mode tracking** — Local tracking of user modes (+i, +w, etc.) via MODE handler and RPL_UMODEIS (221). Modes displayed in status bar. - **DCC SEND/ACCEPT framework** — Parsed incoming DCC SEND CTCP messages with IP/port/size extraction. Outbound DCC SEND with listening socket and local IP discovery. CTCP DCC ACCEPT handling for resume support. 8 new unit tests for DCC parsing. ### Security & Configuration - **Config file hot-reload** — Background task polls `~/.nirc/config.toml` mtime every 5 seconds. On change, reloads config, updates palette/theme, and syncs nickname changes without dropping active connections. - **Custom keybindings from config** — Users can remap keys in `config.toml` via `[keybindings]` section. Supports compound modifiers (`ctrl-alt-x`), F-keys, and all crossterm key names. Custom bindings checked before hardcoded defaults. - **Plugin management commands** — `/plugins`, `/plugin-load `, `/plugin-unload `, `/plugin-enable `, `/plugin-disable ` now wired up in the command dispatcher. - **Scrollback persistence to disk** — Per-tab message history saved as JSONL files in `~/.nirc/history/`. Loaded on startup, saved every 30 seconds and on clean exit. Respects `max_scrollback` limit. - **Terminal title (XTITLE)** — OSC 0 escape sequences set the terminal window title to `nirc - (N unread)`. Updated on tab switch. Reset to "nirc" on exit. ### ADC Protocol - **Proper CID generation** — Replaced `NIRC{SID}` placeholder with SHA-256 (first 24 bytes) + RFC 4648 Base32 encoding. Produces spec-compliant 39-character CIDs. - **I4/U4 BINF fields** — ADC client-client connections now include proper I4 (IPv4) and U4 (UDP4 port) in BINF messages for inbound peer connections. ### Code Quality & Hardening - **`#![deny(unsafe_code)]`** at crate root. `#[allow(unsafe_code)]` scoped to only the plugin loader (`libloading`) and yamux integration that require it. - **Atomic config save** — `save_config()` now uses hard-link + rename strategy for atomic file replacement on POSIX. - **Vault key zeroization** — Verified `derive_key()` in the vault wipes the stack copy of derived keys via `zeroize`. - **Lightgray color fix** — `lightgray`/`lightgrey` now correctly maps to `Color::Indexed(252)` (75% brightness) instead of `Color::Gray` (40%). - **Removed unused dependencies** — Dropped `irc`, `nucleo-matcher`, `nom`, and `bytes` crates from Cargo.toml. --- ## What's New in 0.9.0 ### Keybindings - **`Ctrl-P`** — jump to previous buffer in the window list - **`Ctrl-A`** — jump to next active (connected) buffer - **`Ctrl-Z`** — cycle through highlight words for notification filtering - **`Insert`** — scroll chat view to the bottom and re-enable auto-scroll - **`Delete`** — now deletes the character after the cursor only (no longer cycles connections; use `Home`/`End` for window switching) ### F1 Dropdown Menu The F1 key now opens a **QBasic 4.5 / aptitude-style dropdown menu bar** at the top of the screen. Navigate with arrow keys, select with Enter, dismiss with Esc or F1. All slash-commands are accessible through the menu for discoverability. ### Transfer Ticker A **transfer progress ticker** now appears in the footer bar, showing real-time transfer speed and ETA for all active file transfers — no need to toggle the transfer panel. ### UI Fixes - **`/nick` UI update** — changing your nickname now immediately updates all tab titles and status bar displays - **Local IP footer** — the status bar now shows your local network IP address - **Window list badges** — protocol badges and unread indicators in the winlist sidebar ### Under the Hood - Ratatui 0.29 migration - Crossterm 0.28 - libp2p 0.54 (with `macros` feature, not the removed `swarm-derive`) - matrix-sdk 0.18 - tokio-rustls 0.26 with webpki-roots --- ## Known Issues 1. **Matrix crypto types are not `Send`** — the matrix-sdk crypto types require running on a dedicated OS thread with a single-threaded tokio runtime. This is handled correctly but adds architectural complexity. 2. **4 protocol stubs** — Discord, Stout, Spacebar, and Nerimity have full type definitions but their `run_*()` functions log "not yet implemented" and return. These contribute dead-code warnings. 3. **DCC transfers need async I/O integration** — DCC SEND/ACCEPT parsing and socket setup is implemented, but the actual file data transfer loop needs to be wired into the transfer engine's async I/O pipeline. --- ## Build & Test Status - **Build:** `cargo build --release` succeeds - **Tests:** All 313 tests pass - **Binary size (release):** ~834 MB debug, optimized release binary significantly smaller - **Rust version required:** 1.75+ --- ## Roadmap / Next Steps ### 0.10.x (Stabilization) - [ ] Test Matrix protocol against matrix.org - [ ] Test Discord protocol - [ ] Test remaining protocols (Stout, Spacebar, Nerimity, BitChat) - [ ] Integrate transfer widget into main draw loop as split view ### 1.0.0 (Release) - [ ] All 8 protocols tested and working - [ ] Full plugin API stability guarantee - [ ] Man page and completion scripts finalized - [ ] Packaging for major distributions - [ ] Scrollback persistence to disk - [ ] SASL SCRAM-SHA-256 support - [ ] Matrix SSO login