ANetBBS Changelog
Versions are internal build numbers. Public releases are tagged
separately. Current release: v1.0b2.33 (July 2026). Full release: August 1 2026.
v1.0a2.131 — ANEdit wired into message boards, PMs, echomail; board/thread coloring (June 2026)
- ANEdit now used for all message composition —
_post_compose,_send_pm,
and_compose_echomailall launch the full ANEdit screen editor instead of the
old line-by-line prompt. Reply flow pre-loads the parent post as>quoted text
and pre-fillsRe: subject. - Thread list coloring — board message list now uses full ANSI color: yellow
numbers, cyan reply count, white subject, green author, grey timestamp. Clears
screen and shows the board-name banner. - Thread reader coloring — post header shows yellow [OP]/grey [Reply N] tags,
cyan subject, green author. Quoted lines (>) rendered in grey. Footer + prompt
added.
v1.0a2.130 — ANEdit terminal message editor; security questions on registration (June 2026)
- ANEdit — new full-featured 79×23 ANSI message editor (
features/anedit.py).
Undo/redo (60 levels), block mark/cut/copy/paste, find & replace-all, smart
word-wrap, live word/char count, three color themes (F9), help overlay (F1),
Mystic |XX color-code picker (F4), draft auto-save every 30 s with recovery on
next entry. Entry point:await launch_anedit(session, quote, subject, username). - Security questions at registration — new users must now complete all 3
password-reset security questions during signup.RegisterFormextended with 3
SelectField+StringFieldpairs with duplicate-question validation. Answers
saved viaUserSecurityAnswerbefore commit.
v1.0a2.129 — IRC ESC exit fix; docs sidebar; bulletins; chat.ans; read/write security (June 2026)
- IRC startup ESC exit — ESC from startup screen now correctly exits IRC. Root
cause:run()loop condition checkednot self.bmswhich is always False (list
always has ≥1 bookmark). Fixed by having_startup_loop()return a boolean and
run()breaking onTrue. - Docs sidebar spacing — increased padding to 12px/16px, font-size 0.92rem,
line-height 1.6, min-width 250px (prior fix landed in local files but was not
in the v1.0a2.125 tarball that was deployed).
v1.0a2.126 — bug fixes: bulletins, docs sidebar, chat.ans, read/write security (June 2026)
- Bulletins HTML linefeed — swapped bulletin view default from
<pre>to
markdown (withnl2br);\r\nfrom telnet input now renders as<br>instead
of blank lines. Raw view still accessible via toggle button. - chat.ans display codes —
chat.pynow passeschat.ansthrough
display_codes.apply()before writing, so Synchronet @-codes and Mystic |XX
colors embedded in the ANSI screen are rendered correctly. - Docs sidebar spacing —
py-1→py-2,0.85rem→0.875rem,
line-height: 1.3→1.5; sidebar page list no longer cramped on long names. - Separate read/write access levels —
BoardandFileAreanow have a
min_write_levelcolumn (NULL = inherit read level). Admin UI updated with
side-by-side fields.web/boards.pyandbbs_ui.pyenforce write level on
post creation and file upload respectively. Auto-migrated on startup.
v1.0a2.125 — ANetIRC v7: pure-Python asyncio IRC client (June 2026)
Complete rewrite of ANetIRC. Drops the C binary + PTY bridge entirely. The new
anetirc2.py runs as a native asyncio coroutine inside the BBS session.
- TLS fixed —
asyncio.open_connection(ssl=ssl_ctx)is non-blocking; the
old C client's blocking TLS handshake caused hard lockups on SSL servers. - Cross-arch — no binary; works on x86-64, ARM, any Python 3.10+ platform.
- SASL PLAIN — full
CAP LS 302→CAP REQ :sasl→AUTHENTICATE PLAIN
state machine. Password field (7th pipe field) triggers SASL; no password = no
SASL (plain nick/user registration). - Startup manager — inline field editing per bookmark (Tab/Up/Down to move
between fields, Enter to confirm), TLS toggle (Space), theme cycle (T), save
(A), delete (D). Three color themes: Cyan/Green/Amber. - Word-wrap — lines break at word boundaries; continuation lines indent to
align with message text. Adapts to any terminal width. - Scrollback — PgUp/PgDn, 800 display rows, 2000 stored lines.
- Tab completion — completes nick from users panel; cycles on repeated Tab.
- Command history — Up/Down arrows recall previous input lines.
- mIRC color — incoming color codes stripped; CTCP ACTION rendered as
* nick action. - Backward-compatible — same bookmark config format, same entry point
(launch_anetirc_telnet). C binary kept in tarball for reference/revert.
v1.0a2.124 — eventlet Python 3.13 piwheels fix; ANetIRC F2/PgUp/PgDn (June 2026)
Fix eventlet crash on Python 3.13 systems where piwheels ships eventlet 0.37.0
without the start_joinable_thread attribute (the wheel was compiled before the
patch merged). update.sh now greps the installed eventlet/green/thread.py
source file directly and force-rebuilds from source (--no-binary eventlet) if
the fix is absent. The rollback block no longer wipes application files for this
class of failure — it instead auto-fixes eventlet, retries the web service, and
prints a manual fix command if the retry still fails.
Fix ANetIRC F2 key exiting the IRC client instead of toggling the user list:
ui_read_key() only handled \x1b[* (CSI) sequences; F2 on xterm/SSH sends
\x1bOQ (SS3), which fell through to return KEY_ESC → exiting in startup mode.
Added else if (s[0] == 'O') branch: F1=\x1bOP, F2=\x1bOQ, F3=\x1bOR,
F4=\x1bOS. F2 now correctly maps to KEY_F2 → toggles the users panel.
Fix ANetIRC freeze/timing: PTY bridge _input_pump previously read one byte at
a time from the SSH session and wrote one byte at a time to the PTY. The asyncio
scheduler delay between bytes could exceed the C code's 100 ms VTIME, truncating
escape sequences mid-read. Changed to session.read_raw(64) (chunk reads) so
multi-byte sequences (\x1bOQ, \x1b[5~) arrive at the PTY in a single write.
Also replaced deprecated asyncio.get_event_loop() with get_running_loop().
v1.0a2.123 — MRC scrollback stability; arrow-key scroll; escape-seq drain (June 2026)
Fix /scroll scrollback drifting: when scrolled up, _emit now increments
_scroll_offset by the number of new lines added so the historical view stays
locked even as new messages arrive. Up/Down arrow keys now scroll the chat view
1 line (previously swallowed). Fix /scroll up N parsing (strip before isdigit).
Fix PgUp/PgDn escape sequences polluting the input buffer (drain trailing bytes).
Sending a message while scrolled auto-snaps to the live (bottom) view. Added
_scroll_chat(delta) helper; /scroll 0 / /scroll bottom / /scroll live
all return to the live view. Updated docstring.
v1.0a2.122 — MRC input visibility; /scroll; wall color; fast logon fixes (June 2026)
Fix MRC terminal input not showing while typing: _redraw_chat_area was clearing the
input row on every incoming message, erasing the SSH client's local echo. Fixed by not
touching the input row during chat area redraws — only _draw_input_line() (called per
keystroke) updates that row. Added /scroll [n] / /scroll down [n] / /scroll 0
command for scrolling through chat history; status bar shows PAUSED+N when scrolled.
Removed /split on|off command (not needed). Fixed graffiti wall color scheme not
updating after admin change: now reads .env directly at render time instead of using
a stale config class. Fixed fast logon prompt never appearing: same root cause — now
reads .env directly at login time.
v1.0a2.121 — Terminal MRC client rewrite (June 2026)
Complete rewrite of mrc_chat.py. Fixed core scroll bug: word-wrapped messages
were writing past the DECSTBM scroll region into the input row, corrupting it.
Now each wrapped line emits as its own scroll event so the cursor never escapes
the scroll region. Added 60-second WebSocket keepalive ping (latency shown in
status bar). Added IAMHERE AWAY tracking after 10 min idle (matches ANetMRC
behaviour). New commands: /afk, /back, /broadcast, /ctcp, /roomconfig, /status.
Documented ANSI menu override slots in docs/04-ansi-screens.md.
v1.0a2.120 — IRC presets admin; who's online fix; colored sysop/chat menus; screen-clear (June 2026)
Remove MRC-IRC bridge admin; add IRC Server Presets (/admin/irc-presets) with per-preset
name/server/port/SSL/nick/channels. Fix who's online: background heartbeat task every 2 min.
Colored IRC chat menu with Q-to-quit and screen-clear. Chat Systems menu screen-clear fixed.
All sysop terminal sub-menus now colorized and support ANSI overrides (sysop_menu/sysop_users/
sysop_boards/sysop_status.ans slots). New IrcPreset model (irc_presets table, auto-created).
v1.0a2.119 — Security levels, graffiti wall, logon/logoff modules, fast logon (June 2026)
Security levels (0–255) on all content areas (boards, file areas, echomail, RSS).
New graffiti wall feature with pipe colors, pagination, and admin panel.
Logon/logoff module system — run wall/ANSI/shell/door at login or logout.
Fast logon option lets users skip intro modules. Menu action_type = wall added.
v1.0a2.118 — Add: @BPS:NNNN@ throttled ANSI output; add @CLS@ clear-screen (June 2026)
@BPS:NNNN@ in any ANSI screen file now throttles output to simulate the
specified modem baud rate (300–56000). 9600 bps = 960 bytes/sec; output is
sent in 48-byte chunks every 50 ms for smooth rendering. The goodbye, welcome,
newuser, and custom ANSI slots all support it. Also added @CLS@ which
outputs ESC[2J ESC[H (clear screen + cursor home).
v1.0a2.117 — Fix: @-code / display code substitution in ANSI screens (June 2026)
All Synchronet @-codes that resolve user identity (@ALIAS@, @USER@, @NAME@,
@HANDLE@, @REAL@, @FIRST@, @EMAIL@, @LOCATION@, @CALLS@, @SECURITY@)
were returning blank because session.user is a dict but the resolver used
getattr() instead of .get(). Fixed. Also: display_name and location added
to the user dict; @SECURITY@ bool comparison fixed; @VER@/@VERSION@ now
returns the real build version. Parametric codes like @BPS:19200@ are now stripped
instead of printing as literal text.
v1.0a2.116 — Add per-game FOSSIL driver checkbox; fix TW2002 black screen (June 2026)
Replaced FOSSIL driver auto-detection (introduced in v1.0a2.113) with an explicit
per-game checkbox in the Game admin: Requires FOSSIL Driver (BNU.COM / X00.COM).
Check it for games like Zombie Slots / Mega Slots that ship a FOSSIL driver and
need it loaded. Leave it unchecked for TW2002 — dosemu2 virtual COM1 conflicts
with FOSSIL drivers and caused the black screen regression. The needs_fossil_driver
column is auto-migrated by update.sh Step 7.
v1.0a2.115 — Fix: TW2002 black screen; fix game terminal right-side overflow (June 2026)
FOSSIL auto-detection (v1.0a2.113) loaded BNU.COM/FOSSIL.COM if present in the
game dir. TW2002 uses dosemu2 virtual COM1 which conflicts with any FOSSIL driver
— loading one caused a black screen. FOSSIL auto-load now skipped for TW2002.
Game terminal CSS: Bootstrap .container + padding: 24px limited content area
to ~700px on laptop viewports. 80-col terminal needs ~784px → rightmost ~20
columns overflowed outside the green border, showing game sidebars/stat panels
floating beside the terminal box. Fix: max-width: 100% override + overflow:
hidden clip on #terminal-wrap.