ANetBBS Changelog — Beta History (pre-v1.0.0)
Archived history of every internal beta build number (v1.0a1.1 through
v1.0b2.239) from before ANetBBS's v1.0.0 full release in August 2026.
Preserved as-is — a real record of what changed at each step during
development — but split out of the main CHANGELOG.md
once it passed 6,000 lines, to keep that file scannable for the
v1.0.0-onward history that actually matters day to day. Newest-first,
same as the main changelog.
v1.0b2.193 — PETSCII: word-wrap listing picker prompts (July 2026)
Reported live on the real A-Net Software file area (18 files, forcing M=more): the picker prompt itself ('#=download, E=extended info, M=more, Q=back: ') exceeded 40 columns and hard-broke mid-word ('Q=back' -> 'Q=b' / 'ack'). _paginated_pick()'s prompt construction wasn't width-aware -- now wraps at word boundaries, a no-op for every shorter prompt already in use elsewhere.
2 new regression tests (one direct against _paginated_pick, one end-to-end against the real file listing); full suite verified clean (1306 passed, 2 skipped, 0 failed).
v1.0b2.192 — PETSCII: word-wrap XMODEM status messages (July 2026)
Reported live: the "Starting XMODEM send of..." status message (and the file-not-found / XMODEM-unavailable / transfer-complete messages) were written unwrapped, hard-breaking mid-word/mid-filename on a 40-column screen. Added a small word-wrap helper and applied it to all of _files_download's status messages.
1 new regression test reproducing the exact overflow with a long filename; full suite verified clean (1304 passed, 2 skipped, 0 failed).
v1.0b2.191 — PETSCII: file listing redesign — immediate download, E=extended info (July 2026)
Reported live (confirmed XMODEM itself works end-to-end on real hardware): the download prompt only appeared after paging through every file's full description first, and quitting early with Q at any point exited the whole file area instead of skipping to the download prompt ("there are numbers, but there is no way to download").
- File listings are now brief (name + size only) with the download picker shown immediately -- no pagination needed before you can pick a file.
- Added E to view a file's full/extended description on demand, then return to the listing.
7 new regression tests, including one asserting zero -- More -- prompts appear before the download picker; full suite verified clean (1303 passed, 2 skipped, 0 failed).
v1.0b2.190 — PETSCII: file downloads (XMODEM), network-first echomail, ANSI-art description fix (July 2026)
Reported live against the real ANetBBS file areas: file descriptions containing FILE_ID.DIZ-style ANSI-art banners (CP437/Unicode box-drawing) turned into walls of '?' when displayed -- the session layer's PETSCII encoder falls back to '?' per character with no representation. Now stripped/collapsed to spaces before display, applied everywhere body text is shown (file descriptions, echomail/PM/board bodies).
- Added file downloads via XMODEM (sysop's choice -- the protocol real C64 terminal software most reliably supports). File listings are now numbered and pick a file to download; reuses the existing telnet-aware transfer code as-is since PETSCII connections are plain telnet sockets.
- Echomail area picking is now two-step: choose a network first, then see only that network's areas, instead of every subscribed network's areas combined into one flat list.
17 new regression tests; full suite verified clean (1300 passed, 2 skipped, 0 failed). XMODEM download and the ANSI-art fix still need verification against the real file areas on ANetBBS itself (the Pi has none).
v1.0b2.189 — PETSCII: page-back (B=prev) for listings and body-text readers (July 2026)
Added B=prev to step back one page after paging forward with M=more -- previously the only way "back" was Q, which exits the whole screen rather than returning to the previous page. Applies everywhere pagination exists: echo/board/file-area listings, and message/file-listing/profile body-text reading.
Also investigated a report that 80-column echo message subjects still looked cut off short -- confirmed this is upstream data (the posting tool that creates those messages already truncates the subject before it reaches ANetBBS), not a rendering bug; the PETSCII renderer is already showing the complete stored subject.
7 new regression tests; full suite verified clean (1290 passed, 2 skipped, 0 failed).
v1.0b2.188 — PETSCII: auto-wrap blank-line fix, word-boundary truncation, wider subject column (July 2026)
Reported live on the Pi: the echo-area list's PREVIOUS column-width fix sized both columns to add up to EXACTLY the terminal width, filling the last column -- real terminals (C64 hardware included) auto-wrap the instant that happens, so each row's own \r\n produced a genuine blank line after it. On a 25-row screen that doubled the vertical space every row used, scrolling the top of an 18-item page off-screen before the prompt even appeared ("you can't see 1-7"). Fixed by always leaving one spare column -- applies everywhere the same column-budget technique is used.
- Also fixed: subject/label columns across echo/board/PM listings truncated mid-word ("voluntarily" -> "volun") and reserved a fixed budget for the trailing name/count column regardless of how short it actually was. Now truncates at a word boundary and sizes that column from the actual longest value present, giving the subject more room.
5 new regression tests, including one that renders every row across a range of widths/network-name lengths and asserts none fills the terminal exactly; full suite verified clean (1283 passed, 2 skipped, 0 failed).
v1.0b2.187 — PETSCII: echo-area column wrap fix, top-level pagination, profile editing (July 2026)
Reported live on the Pi: the echomail area list's network-name column math assumed the bracketed name would never exceed ~9 chars -- a real name like "ANotherNetwork (QWK)" (20 chars) wrapped onto a second line on both 40- and 80-column screens. Fixed by sizing both columns from the actual longest network name present.
- Also fixed: the echo/board/file-area top-level listings (picking which area/board to enter) had no pagination at all -- only the listings INSIDE them (messages/threads) were paginated in the previous release. Now consistent everywhere.
- Added: profile is now editable (display name, location, bio), not just viewable.
8 new regression tests; full suite verified clean (1278 passed, 2 skipped, 0 failed).
v1.0b2.186 — PETSCII: pagination/quit fixes, Number Guessing, sysop custom menus (July 2026)
- Fixed long echo/board/PM/file listings forcing the reader through every page with no way to back out -- Q now actually quits at a "-- More --" prompt, and listings that had zero pagination at all (echo/board/PM) now page at 18 lines with an M=more option.
- Added the built-in Number Guessing game to the PETSCII Games menu (text-only, no ANSI dependency).
- Added sysop-buildable custom PETSCII menus (Admin → PETSCII Menus) -- a separate menu tree from the ANSI custom-menu system, opt-in; PETSCII sessions use the built-in menu unchanged until a sysop marks one as default.
26 new regression tests; full suite verified clean (1270 passed, 2 skipped, 0 failed).
v1.0b2.185 — Hub can now poll downstream BinkP nodes on demand (July 2026)
- Added ability to manually poll a downstream BinkP node on demand instead of waiting for it to call in.
v1.0b2.184 — BinkP downstream-node network misattribution fix (July 2026)
Fixed a real bug: inbound BinkP sessions from downstream nodes (e.g. ANotherNetwork peers polling in) could get silently attributed to the WRONG network whenever a hub identity owns more than one BinkP network -- explains poll-log entries and mail missing from ANotherNetwork specifically. BinkPNode now tracks which network it belongs to explicitly, set automatically on join-approval; existing nodes are backfilled on upgrade.
15 new regression tests; full suite verified clean (1236 passed, 2 skipped, 0 failed).
v1.0b2.183 — PETSCII Phase 1: real menu screens; fix stale multi-service restart message (July 2026)
With login confirmed working on real hardware across three prior rounds of fixes, PETSCII sessions now get the real Phase 1 core-BBS menu instead of a placeholder stub: message boards (list/read/post/reply), echomail areas (list/read/post -- wired into the same reply-notification hook the web/terminal composers use), private messages (inbox/read/send), file-area browsing, who's-online, and profile. Plain numbered-list menus and a simple line-by-line composer, built fresh for this rendering path rather than reusing any ANSI/lightbar code -- matching the same "not shown at all if not vetted" rule already applied to games/doors/MRC/IRC for PETSCII sessions. Reuses only the existing data-layer models/queries, not any ANSI rendering code.
Also, reported live by a sysop: Admin -> Settings' "restart required" message, and deploy/README.md, still told sysops to restart 4 separate systemd services (anetbbs-telnet / anetbbs-ssh / anetbbs-rlogin, plus anetbbs.service) after a settings change requiring a restart -- anetbbs-rlogin.service never existed as a real unit at all, and anetbbs-telnet/anetbbs-ssh were merged into the single combined anetbbs.service a while back (Ubuntu systemd's EnvironmentFile directive winning over per-unit Environment= overrides meant the split units couldn't reliably share .env). Both now correctly point sysops at just sudo systemctl restart anetbbs.service.
12 new regression tests covering the PETSCII menu screens (boards, echomail incl. reply-notification wiring, private messages incl. notification + error handling, files, who's-online, profile) and the restart-message fix; full suite verified clean (1234 passed, 2 skipped, 0 failed).
v1.0b2.182 — Multi-hub-identity BinkP mail loss + local-post reply notifications (July 2026)
Reported live: a sysop testing a second network's (ANotherNetwork) echomail saw a fully successful-looking BinkP transcript -- CRAM-MD5 auth succeeded, the .pkt file was received and M_GOT-acknowledged -- but the message never showed up anywhere on ANetBBS.
- FIX: the inbound BinkP listener resolves a downstream node's hub identity to find its EchomailNetwork row, but only ever used that row to compute the OUTBOUND stamping address -- the network's id itself was never captured, so every downstream-node session imported its received mail with network_id=None. EchoArea/EchomailMessage both require a real network_id, so this failed a database constraint that was silently swallowed by a generic exception handler -- no trace anywhere a sysop could check (this listener never uses the Bad Areas log, that's an outbound-poller-only mechanism). BinkP itself looked entirely successful the whole time.
- Also added: if a hub identity genuinely has no matching BinkP network configured at all, inbound mail is now skipped with a loud, specific log message instead of the same silent crash.
While verifying the above, a second, unrelated gap surfaced: two local ANetBBS accounts replying to each other directly in a shared echo area (no external network transfer at all) never triggered the v1.0b2.176 echomail-reply notification -- that hook only ever fired from the three inbound-network-import paths, never from ANetBBS's own web/terminal message composer.
- FIX: both the web and terminal echomail composers now also check the reply's TO name and notify a matching local recipient, the same way an inbound network message already does.
4 new regression tests: 2 driving a real scripted BinkP session (auth + file transfer) through the actual connection handler confirming the resolved network id reaches the importer instead of None, and 2 covering the local-post notification hook.
v1.0b2.181 — PETSCII: Wall + goodbye screen no longer leak raw ANSI (July 2026)
Reported live on a third real-hardware pass (login now works correctly): after logging in, a "Graffiti Wall" bulletin screen showed garbled raw ANSI escape fragments and CP437 box-drawing artifacts, and the same happened on the goodbye/logoff screen.
- FIX: the Wall logon module and the sysop-configurable goodbye ANSI-art screen both write raw CP437/ANSI bytes directly to the socket, completely bypassing the PETSCII-aware encode path -- and neither is on the Phase 1 core-BBS feature list to begin with. PETSCII sessions now skip all logon/logoff modules (wall, ansi screens, shell hooks) and the ANSI-art goodbye screen entirely, the same way Games/doors/ANetCRAFT/DarkForces/MRC/IRC are already not shown at all rather than shown broken. The plain-text "Goodbye!" fallback (which already goes through the correct PETSCII path) still shows on disconnect.
v1.0b2.180 — PETSCII: real letter-case inversion, not just charset timing (July 2026)
Reported live on a second real-hardware pass (v1.0b2.179 fixed the charset-timing bug, login still failed): the BBS's own output text was rendering with every letter's case flipped -- "Welcome" as "wELCOME", "Login" as "lOGIN", "Invalid username or password" as "iNVALID USERNAME OR PASSWORD".
- FIX: got the actual PETSCII spec backwards in the previous release. In the "upper/lowercase" charset, PETSCII's letter-case byte assignment is INVERTED from ASCII's -- sending the ASCII-uppercase byte value displays as a lowercase glyph, and the ASCII-lowercase byte value displays as uppercase. This isn't just a display quirk -- the same inversion applies to what a real C64 keyboard sends for typed letters, so every letter of a typed username/password arrived with the wrong case and authentication always failed regardless of the charset-timing fix. Both directions are now corrected: the encoder swaps letter case before writing to the wire, and the same swap is applied to bytes read back from the client before they ever reach the login/username/password buffers.
10 new regression tests (encode/decode round-trip, decode_char, and login/password reader coverage); existing PETSCII tests updated to assert the corrected (swapped) byte values instead of the previous identity-mapping assumption.
v1.0b2.179 — PETSCII: login always failed + no admin settings UI (July 2026)
Reported live during first real-hardware testing (Pi + PETSCII port enabled): login always said "invalid username or password" against known-good accounts, and there was no way to enable/see the PETSCII ports in the admin UI at all -- required hand-editing .env with no visibility.
- FIX: a real C64 keyboard's PETSCII byte code for a letter key depends on which charset ROM is currently selected -- a KERNAL keyboard-decode difference, not just a display choice. Unshifted letters send the UPPERCASE byte range in the default power-on "graphics" charset, and only send the lowercase range once the upper/lowercase charset is selected. That charset switch was only being sent AFTER a successful login (in the post-login menu placeholder) -- so login itself always ran in the wrong charset, every password typed arrived silently case-flattened to uppercase, and authentication always failed. Now sent as the very first bytes of the connection, before login ever begins.
- FIX: backspace/delete didn't work at all for PETSCII sessions -- a real C64 keyboard's DEL/INST key sends PETSCII 0x14, not ASCII 0x7f/0x08 (which means something else entirely on real hardware -- "disable Shift-Commodore", not erase-in-place). Both the username/password input readers now recognize the real key and echo the correct PETSCII cursor-left erase sequence.
- NEW: PETSCII40/80 ENABLED+PORT are now in Admin -> Settings (same .env editor as Telnet/SSH/rlogin/FTP) and show live up/down status in the Service Control Center, instead of requiring a blind .env edit with zero visibility anywhere in the admin UI.
13 new regression tests (7 for the two hardware bugs, 6 for the admin settings/status wiring).