nirc-rs/STATUS.md

6.8 KiB
Executable File

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 + <nick>, /watch - <nick>, /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 <name>, /plugin-unload <name>, /plugin-enable <name>, /plugin-disable <name> 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 - <protocol> <channel> (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 savesave_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 fixlightgray/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