ANetBBS Changelog

Current release: v1.1.15 (September 2026). This file covers v1.0.0
onward, which follows standard semantic versioning — patch releases are
v1.0.1, v1.0.2, and so on. The full internal beta build-number
history (v1.0a1.1 through v1.0b2.239) that got the project to this
release is preserved in
CHANGELOG-beta.md.

v1.1.0 — Web MRC multi-line sending; uMRC live-testing fixes (September 2026)

The web MRC chat client can now send messages longer than the old ~140-character single-line limit. Instead of silently blocking the Enter key or refusing to send ("Message too long"), a long message is now automatically split into multiple word-boundary "(1/3) ..." chunks and sent in sequence, matching how the terminal MRC client and uMRC itself have always handled this. Covers both web MRC clients that ship with ANetBBS. Join-rejection and similar chat errors also now show a brief on-screen notice instead of failing silently.

Fixed a bug where joining chat through the web client could show a duplicate "has arrived" line for the same caller and appear to join a room, immediately demand /identify, then silently rejoin — all from one connection. Root cause was a packet-ordering mismatch against real uMRC client behavior: the bridge was requesting room data before telling the network the caller's IP, instead of after. Also fixed a related case where the room's message-of-the-day and current-user list could be shown twice (or three times) for a single join, and made a manual /join naming the room you're already in a true no-op instead of silently leaving and rejoining it. Installs running their own separately-managed nginx reverse proxy (uncommon, but the original ANetBBS install itself is set up this way) could also show a falsely-optimistic "joined" state before the network actually confirmed it; fixed.

Confirmed room names on the real MRC network are case-sensitive — a sysop's custom rooms that differ only by capitalization ("Lobby" vs. "lobby") are genuinely separate rooms, same as they've always been. The one real related bug: the web client's own default room selection didn't match the network's own lowercase name for that specific well-known default room, so joining with nothing typed could land in the wrong room; fixed at that one narrow spot.

v1.0.99 — Native uMRC (umrc-client) support on the MRC bridge (September 2026)

Added the option for ANetBBS's own MRC chat bridge to also accept direct connections from uMRC's umrc-client door, so a sysop running both no longer needs a separate umrc-bridge process alongside it — one shared bridge now serves ANetBBS's own terminal/web MRC clients and uMRC callers together, with correct private messaging between all of them, and no changes required to uMRC itself. Also adds optional support for the small local stats file umrc-client's own menu reads, populated from the real MRC network's own live BBS/room/user counts. Off by default; see docs/27-mrc-chat.md for full setup, including a couple of easy-to-hit misconfigurations (now with a startup warning for one of them) worked out during testing.

Also fixed, found along the way: mrc/bridge/config.json's log_level setting never actually had any effect, on any install — editing it and restarting silently did nothing. In-chat latency now reaches umrc-client sessions too, not just the web/terminal clients (it was silently never sent to them at all). A join-time server banner could get sent to every other locally connected chat session instead of just the person joining, most noticeable with two or more people in chat at once — not specific to uMRC, an existing gap this testing happened to surface. The terminal MRC client's bell also used to keep ringing every time a mentioned/DM line got redrawn (a resize, a scroll, another new message) instead of only once when it arrived; fixed, and a new /sound on|off preference lets a caller turn the bell off entirely, mirroring uMRC's own "Use sound" setting.

Bigger fix from the same round of testing: callers could need to re-/identify far more often than expected, even though MRC Trust is meant to last weeks. Root cause was a reconnect-ordering bug — the bridge announced itself ready to the rest of the app (which re-announces every previously-active caller to the room) before it had actually told the upstream MRC network which BBS it even was, so those re-announcements arrived before the network had anything to recognize the caller's trust against. Fixed by finishing the bridge's own handshake first.

v1.0.98 — Codebase-wide audit for the dead-connection freeze/hang bug class (September 2026)

Following the previous two releases' fixes for a dead-connection freeze/spin bug, did a full audit pass across the rest of the codebase (door games, echomail/BinkP, MRC chat, IRC, finger, rlogin/SSH/telnet) for the same underlying shape. Found and fixed a handful of places where output could still hang indefinitely on a connection that stopped responding without actually closing: several screen/animation-drawing paths and the telnet protocol-negotiation reply in the terminal session layer, the finger service's reply, and the MRC bridge's connection to its upstream chat server (the last of these is a single connection shared by every locally connected chat user, so a hang there could have silently affected more than one person at a time). Everything else checked came back clean. Each fix has dedicated regression coverage proving the affected code now recovers with a bounded timeout instead of hanging.

v1.0.97 — 3 more dead-connection freeze/spin gaps closed (September 2026)

Continuing v1.0.96's fix: a dead connection (network drop, a client left open and unreachable) could still cause a freeze or a silent, indefinite CPU/resource drain in three other places that share the same underlying cause. A menu-navigation keystroke read could raise an uncaught low-level error instead of ending the session cleanly. The idle-warning/screensaver sequence could loop forever once a session reached it on a connection that had already died, since neither its write attempts nor its own keystroke-poll recognized the connection was gone. And the built-in IRC client's connection to the remote IRC server could get stuck retrying a keepalive against a server connection that had already failed, instead of ending that connection. All three are fixed, each with regression coverage proving the affected code now ends cleanly instead of looping or raising an unexpected error.

v1.0.96 — Critical: a dead connection inside ANEView could freeze the whole BBS (September 2026)

Fixed a critical bug where a client connection that died without a clean close (a network drop, a client left open and unreachable overnight) while inside ANEView, the read-only echomail message viewer, could spin the server's main thread at effectively 100% CPU indefinitely — starving every other session, growing memory usage without bound, and flooding the system log, until the service was manually restarted. Traced to two issues: a broad exception handler that treated a dead connection the same as "no key pressed yet" and kept retrying instead of ending the session, and a related gap that made it hard to tell a genuinely expired wait apart from a connection that had already failed with a real error, causing the retry to also repeatedly attempt (and fail) a write on every pass. Both are fixed, with regression coverage proving the affected code path now ends the session immediately and cleanly instead of looping.

v1.0.95 — New-account password-confirmation fix over telnet/PuTTY; Docker admin-account docs (September 2026)

Fixed a bug where creating a new account (or changing a password) over
telnet with a client that sends \r\n for Enter — PuTTY, plain
telnet, most terminal emulators — always failed at the "Confirm
password" step with "Passwords don't match," even when typed
identically both times. SyncTERM and similar clients that send a bare
\r were unaffected, which is why this depended on which client was
used to connect.

Also documented how to find/log in with the auto-created initial admin
account on the Docker install paths (docs/22-containers.md) — it was
never obvious from a container that one gets created at all, or where
to find its password.

v1.0.94 — Native uMRC (umrc-client) support on the MRC bridge (September 2026)

Added the option for ANetBBS's own MRC chat bridge to also accept
direct connections from uMRC's umrc-client door, so a sysop running
both no longer needs a separate umrc-bridge process alongside it —
one shared bridge now serves ANetBBS's own terminal/web MRC clients and
uMRC callers together, with correct private messaging between all of
them, and no changes required to uMRC itself. Off by default; opt in
via mrc_tcp_enabled/mrc_tcp_listen_host/mrc_tcp_listen_port in
mrc/bridge/config.json. See docs/27-mrc-chat.md for setup.

Not yet tested against a real umrc-client/fresh install — held back
from the normal release train until that verification happens.

v1.0.93 — Who's Online showed a raw game id/slug instead of the door's name (September 2026)

Fixed a bug where launching a door directly from a numbered/slug menu
item (rather than through the Game Center's category browser) showed
its raw id or slug in Who's Online instead of the door's actual name,
for the entire session.

v1.0.92 — Single-container Docker quick start was missing the MRC bridge config mount (September 2026)

Fixed the single-container Docker "quick start" instructions, which
never mounted the MRC chat bridge's own config file — it silently fell
back to placeholder BBS/sysop name values regardless of what was set
in .env. Also added a startup warning in that container if the file
still isn't mounted.

v1.0.91 — Door dropfiles now report the real terminal size (September 2026)

Fixed a bug where CHAIN.TXT and BBSDEV.DRP dropfiles always reported an
80x24 screen size regardless of the actual session's terminal
dimensions, so doors reading those formats never saw a wider/taller
terminal even when the rest of the session correctly used it.

v1.0.90 — IRC disconnect CPU/memory fix, SSH keepalive tuning (September 2026)

Fixed a bug where a dropped connection to the built-in IRC client could
spike CPU usage and grow memory indefinitely instead of ending the
session cleanly. Also loosened SSH keepalive timing to tolerate a
client that's intermittently unresponsive rather than fully gone, and
added clearer logging for why an SSH connection actually ended.

v1.0.89 — Reduced background monitoring overhead / quieter disconnect logging (September 2026)

Reduced how often the sysop dashboard's per-service monitoring spawns
external processes to check service status, cutting continuous system
overhead that could compound under load. Also quieted some redundant
error logging when a client disconnects at specific points during
session teardown.

v1.0.88 — SSH idle-session detection fix (September 2026)

Fixed a bug where a session idle for an extended period over SSH could
go permanently unresponsive if the underlying network connection
silently dropped, with no way to recover except a server restart.

v1.0.87 — Session-hang fix / Game Center prompt fix (September 2026)

Fixed a bug where a stalled client connection could leave a session
frozen indefinitely with no recovery. Also fixed the Game Center's
page-picker prompt showing page-navigation options on game lists that
only have one page.

v1.0.86 — MRC chat disconnect / door-cleanup fixes (September 2026)

Fixed a bug where a dropped MRC chat connection could spike CPU usage,
plus a related door-cleanup error when running multiple multiplexors
/ bridges.