ANetBBS Changelog
Current release: v1.1.53 (October 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.8 — Terminal lightbar readability, echomail/file search, MSP who's-online fix (September 2026)
Found and fixed the real cause of the highlighted row becoming unreadable on several of the terminal lightbar screens added in the previous release: the reverse-video highlight used to mark the selected row doesn't render visibly on some real terminal clients, regardless of what color the row's own text uses. Every affected screen (message boards, echomail networks, the file-area browser, the private-message inbox, the BBS directory browser, and the Inter-BBS instant-message pickers) now cancels the reverse-video highlight on the selected row and draws its own clearly visible marker and color instead, matching a fix already proven correct on the tagline picker.
Fixed the message-board list overrunning 80 columns and getting cut off mid-word at that width — the column-width math never accounted for the thread-count field's own width. Converted the echomail networks list from typing a number to the same arrow-key lightbar as the other list screens, added a message-search hotkey there, and clarified the network-apply hotkey to say what it applies for (a QWK node). Fixed the file browser's status line overflowing 80 columns and wrapping a word in half.
Added search to file areas (by filename or by text in a file's description) and to the terminal BBS directory browser and Inter-BBS IM recipient picker (by name, hostname, sysop, or location), matching the equivalent search already available on the web UI.
Found and fixed the real reason the terminal "who's online" probe kept reporting nobody online at a real, reachable peer BBS: that peer's reply used the opposite column order from what this BBS's own who's-online service produces (a genuine, differently-ordered real-world reply, confirmed by probing it directly), and the parser only recognized its own column order. It now recognizes either.
Private-message reading now goes through the same scrollable ANetView reader already used for message-board threads and echomail, replacing the older page-by-page pager, and now supports replying directly from the reader.
v1.1.7 — Federation directory IP publishing; login-message-scan feedback (September 2026)
Fixed the terminal Inter-BBS IM directory picker still failing to probe federation-network (A-Net) directory entries even after the previous release's hostname-to-IP fallback. Root cause traced further back: the federation hub already captured each peer's real connecting IP address at registration, but never published it in the directory feed it distributes to other BBSes, so nothing ever had an IP on file to fall back to. The hub now publishes that address (kept fresh on every heartbeat, not just initial registration), and the directory picker can actually use it.
Fixed the terminal login-time "scan for new messages?" feature answering with no feedback at all when there was nothing new — it looked exactly like the feature wasn't working. It now always says something, even when the answer is "No new messages," matching classic BBS convention.
Converted six more terminal list screens from typing a number to a real arrow-key lightbar, matching the file-area picker and BBS directory browser: the file listing inside a file area (which previously used N=Next/P=Prev paging — the batch-download and extended-description-view features already existed, this only changes how files get selected for them, via Space to mark and B to download everything marked), the message-board list and its thread list, the private-message inbox, and the Inter-BBS instant-message inbox (reply and delete are now R/D hotkeys against the highlighted message instead of typed R#/D# prefixes).
Added message search to the terminal client — a real gap, not just a UI conversion: there was previously no way to search messages from the terminal at all. Reachable via the new S hotkey on the message-board list, it searches subject and body text across both local message boards and echomail (FidoNet-style network messages), across every board/area the caller can actually access, and opens a matching result into its full thread/area context rather than showing it in isolation.
v1.1.6 — Pre-login "Matrix" connection banner (terminal + web); login redirect fix (September 2026)
Added an optional pre-login "Matrix" connection-options banner, on the classic dial-up BBS idea of a chooser shown before the normal login prompt. Two independent settings in Admin → Settings, both off by default: TERMINAL_MATRIX_ENABLED shows a banner plus a live list of ways to reach the BBS (whichever of Telnet/SSH/Rlogin/PETSCII/FTP/the web terminal are actually enabled) before the Login/New User/Exit menu; WEB_MATRIX_ENABLED shows an equivalent landing page to logged-out web visitors before the home page, shown once per browser session. The terminal banner's art can be fully customized by dropping data/mods/text/matrix.ans or editing the matrix slot from Admin → BBS Menus → ANSI screens, same as the existing welcome/goodbye screens; the connection list itself always reflects live configuration. A sysop who wants a fully custom pre-login page or menu, not just different art, can still use a data/mods/core/login_menu.py or web_landing.py override, which continues to take priority over either toggle.
Fixed a real bug affecting every login-required page on the site, not just the new Matrix banner's own terminal link: after being redirected to log in from a page that requires an account, the login form discarded where the visitor was originally headed and always sent them to the home page afterward instead of back to the page they wanted.
v1.1.5 — Inter-BBS instant messages corrected against real Synchronet behavior (September 2026)
Fixed the terminal Inter-BBS IM directory picker reporting "No reply, or nobody online there" for every BBS in the directory, even ones confirmed online. The web UI's own who's-online probe already falls back to a directory entry's IP address when the hostname alone doesn't resolve or reply; the terminal picker never had that fallback and always gave up after the hostname alone.
Corrected how outbound Inter-BBS instant messages identify their sender, verified directly against Synchronet's own real source. A message with no distinct display name set was showing up on the receiving end with the sender's name doubled (e.g. "Instant Message from StingRay StingRay"), and the BBS name wasn't appearing at all — instead showing the raw sending IP address and a "(no name)" placeholder. Both are now fixed: the field that was duplicating the username is left empty unless there's a genuinely different display name, and the BBS name is now sent in the correct protocol field, which also removes the "(no name)" placeholder entirely.
v1.1.4 — Terminal admin tool scrolling fix; file area descriptions restored; drop file guidance clarified (September 2026)
Fixed the anetbbs-cfg terminal admin tool's editing forms (for example, editing or managing a door game) having no scrolling at all once a form had more fields than fit on a short terminal — content past the visible rows, including the Save/Cancel row itself, simply never rendered, with no way to reach it on a fixed-size SSH session. Its list screens already scrolled correctly; the same scroll-into-view behavior has now been added to every form and menu screen too.
Restored the ability to set a description for each file area from Admin → File Areas. The field was still present in the database and already shown to callers browsing the web file area listing, but had dropped out of the admin page's own create and edit forms, so a sysop had no way left to actually enter or change one.
Reviewed the guidance shown next to the Drop File Type field on the door game admin page, against the real DOOR32.SYS specification and this project's own OpenDoors-based door games. The original note was accurate as far as it went, but has been clarified: RDQ3, ANetCHESS, and ANetCRAFT are unaffected by the caveat described there, since each already carries its own fix for the exact sentinel involved, and only CHAIN.TXT and BBSDEV.DRP currently report a caller's real terminal size — the other drop file types, DOOR32.SYS included, have no such field in their own spec at all.
v1.1.3 — Sysop-controlled password recovery; MSP directory in the terminal; MRC mentions fixed in every theme (September 2026)
Password recovery is no longer a fixed, mandatory 3-security-question step. A sysop can now edit or retire individual questions, add new ones, and turn the whole security-question step on or off from Admin → Users → Password Recovery in the web UI — and that same control has also been added to the anetbbs-cfg terminal admin tool (Users & Security → Security Questions / Password Recovery Settings), so it's no longer a web-only capability. Email-based recovery already existed underneath (a reset link is sent automatically whenever SMTP is configured), but is now shown explicitly as its own recovery method on that same settings page, alongside the security-question toggle. Turning the security-question step off skips it entirely at registration and during a password-reset request, landing straight on a neutral "check your email" confirmation — the exact same page and wording whether or not the entered account actually exists, preserving the anti-enumeration protection that recovery flow already relied on.
Native SSH/telnet users can now browse the InterBBS (MSP) directory of known BBSes — a new V) BBS Directory entry on the main menu, using the same scrollable lightbar list already used throughout the rest of the terminal UI. Selecting an entry shows a full detail screen (sysop, location, software and version, MSP/SYSTAT ports, last seen, and any notes) rather than jumping straight into composing a message; sending a message still has its own directory picker built in. Previously this was only browsable from the web UI.
Fixed the terminal MRC chat mentions counter staying stuck at 00 in every theme except the default one (original/minimal/bitchx/2leet4u/least — the five "Mystic BBS"-style layouts). Those themes render through a separate status-bar drawing path that never actually wrote the live count into the screen position their own bundled art reserves for it, so it displayed whatever the static border art happened to bake in there and never changed no matter how many real mentions came in.
v1.1.2 — Security/audit pass on the new umrc-client support; install docs reorganized (September 2026)
A full review of the native umrc-client support added over the last couple of releases found and fixed two real gaps in its raw-TCP listener: the newline-delimited packet read loop had no cap on buffered bytes while waiting for a line terminator (the same unbounded-buffer bug class already closed elsewhere in this project — BinkP, the MRC↔IRC bridge, both IRC clients, QWK — just missed here since this listener is brand new), and the notice-expiry task added in the previous release wasn't tracked or cancelled on disconnect the way every other background task in that code already is. Both fixed and covered by dedicated regression tests. Neither was reachable by anything beyond the local box under this feature's loopback-only default.
Documentation pass alongside the review: docs/PORTS.md, docs/SECURITY.md, and the Docker Compose walkthrough now cover the umrc-client listener's port and security posture, which had been missed when that feature first landed; a stale "untested" note on TradeWars support was corrected (it's been launch-confirmed for a while); and a few lingering "nothing's published to a registry yet" lines were cleaned up in the Docker docs — pre-built images have actually been published on every release for a long time.
Also reorganized how the README and Quick Start guide present install options — a short table up top now points straight at whichever path fits (Linux with sudo, Linux without root, Docker, or Windows) instead of only surfacing the Linux path by default.
v1.1.1 — MRC login/logout alert no longer sticks on screen inside chat (September 2026)
Fixed a bug where the classic " X just logged in/out " alert (shown wherever a caller currently is in the BBS when someone else logs in or out) could stay on screen indefinitely once shown inside terminal MRC chat, instead of clearing on its own. Root cause: that alert writes directly into whatever the caller's screen is currently showing, but MRC chat manages its own fixed status-bar/scroll-region layout — the raw write landed somewhere MRC's own screen-drawing logic didn't know about, so it only ever got papered over by the next unrelated bit of chat activity, which during a quiet room could take a while. Now integrated into MRC chat's own display properly and auto-clears itself 30 seconds after it appears, regardless of how quiet the room is.
Also confirmed both Windows install paths in docs/INSTALL-WINDOWS.md (WSL2 and Docker Desktop) end-to-end on a real Windows machine — that page no longer carries its earlier "unconfirmed" caveat.
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.