ANetBBS Changelog
Versions are internal build numbers. Public releases are tagged
separately. Current release: v1.0b2.58 (July 2026). Full release: August 1 2026.
v1.0b1.7 — Telnet TTYPE second-round fix (July 2026)
- FIX: Telnet TTYPE detection was missing the second round of the RFC 1091 handshake. After the client sends
WILL TTYPE, the server must sendIAC SB TTYPE SEND IAC SEbefore the client reports its type string.init_session()now sends that request and reads the response, soTERM=dumb(and other dumb-terminal types) correctly trigger ASCII mode.
v1.0b1.6 — Terminal detection fixes: SSH PTY size + telnet NAWS drain (July 2026)
- FIX: SSH sessions now read
process.term_typeandprocess.term_sizefrom asyncssh immediately after session creation soterm_modeis correct for SSH logins. - FIX: Telnet NAWS/TTYPE responses are now drained and parsed after the negotiation settle period instead of being discarded by
_buffer.clear(). - FIX: Negotiation settle time increased 100ms → 300ms.
v1.0b1.5 — Multi-terminal mode: ASCII + widescreen detection (July 2026)
- TERMINAL: Telnet NAWS and TTYPE subnegotiation responses are now parsed (previously negotiated but discarded). Window size and terminal type are stored on the session.
- TERMINAL: New
term_modeproperty:wide(cols ≥ 132),ansi(default),ascii(dumb/TTY). - TERMINAL:
_show_ansi_screenpicks{slot}132.ansfor wide,{slot}.ascfor ASCII (each falling back gracefully). DB ANSI content is skipped in ASCII mode; stock plain-text fallbacks cover welcome/newuser/goodbye. - TERMINAL: Menu engine uses
{name}132.ans/{name}.asc/{name}.ansindata/text/menus/. Auto-render: ASCII gets plain-text layout (no escape codes), wide gets 128-column ANSI layout. - TERMINAL: Pause prompt strips ANSI color for plain-text screens.
v1.0b1.4 — Terminal MRC /me fix (June 2026)
- FIX: Terminal MRC
/mewas sending IRC CTCP format (\x01ACTION ...\x01), which the MRC bridge doesn't recognise — it displayed asACTION andwhatyoutypedinstead of* Nick action. Changed to* text(matching the web client) so the bridge formats it correctly.
v1.0b1.3 — Auto-update beta version fix (June 2026)
- FIX:
deploy/run_upgrade.shrejected beta version strings (v1.0b1.N) with "does not match expected vX.YaZ.NN form" — the validation regex only accepted alpha (a) phase markers. Updated to accept[ab]. - FIX:
admin.pyrelease-notes parser had the same alpha-only pattern for finding section boundaries in RELEASE.md.
v1.0b1.2 — Message viewer position indicator fix (June 2026)
- TERMINAL: ANView message viewer status bar now shows the last visible line instead of the first.
Ln:29/29 ENDat the bottom of a 29-line message makes it clear you have reached the end; previouslyLn:8/29looked like line 8 of 29 with more to scroll.
v1.0b1.1 — Beta 1 Release (June 2026)
Milestone: first public Beta. Version scheme changes from v1.0a2.NNN (alpha) to v1.0b1.NNN (beta). The auto-update scanner now recognises both a and b phase markers; beta is ranked higher than any alpha of the same major/minor release so existing installs will detect this as a newer version.
Includes all features and fixes through v1.0a2.232:
- Echomail area list and message list: arrow-key lightbar (no more -- more --; 300-message load)
- RSS terminal: CP437 sanitiser; pager exit keys corrected; PgUp/PgDn SyncTERM CSI fix (ESC[V/ESC[U)
- Message viewer status bar: Up/Dn label matches actual key behaviour
- QWK inbound: blank messages (header-only records, kludge-only bodies) are skipped instead of stored
v1.0a2.232 — Message viewer hint bar: Up/Dn label (June 2026)
- TERMINAL: ANView message viewer status bar now shows
Up/Dninstead ofPgUp/PgDn— arrow keys are what scroll the message; label now matches reality
v1.0a2.231 — PgUp/PgDn SyncTERM CSI sequence fix (June 2026)
- TERMINAL: Fixed PgUp/PgDn keys in all arrow-key lightbars and the RSS pager — SyncTERM ANSI mode sends
ESC[V(PgUp) andESC[U(PgDn) which were not in the CSI lookup table inread_key_arrow(); they fell through toreturn 'ESC'which quit the lightbar. Addedb'V'→PGUPandb'U'→PGDNto the lookup table insession.py.
v1.0a2.230 — Echomail lightbar + RSS CP437/PgKey fixes (June 2026)
- TERMINAL: Echomail area list replaced with smooth arrow-key lightbar (Up/Dn/PgUp/PgDn/Home/End); no more
-- more --page breaks - TERMINAL: Echomail message list replaced with arrow-key lightbar; removed 30-message hard limit (now loads up to 300)
- TERMINAL: RSS article pager no longer exits on ESC (only Q/Enter/Ctrl-C); eliminates spurious exits from unrecognized key sequences
- TERMINAL: Fixed root cause of PgUp/PgDn "exits RSS" bug — trailing
\nfrom CR+LF Telnet Enter was being consumed by the pager as an ENTER keystroke (added\ndiscard inread_key_arrow) - TERMINAL: RSS article body, title, author, and feed name are now passed through
_sanitize_cp437()before display — common Unicode typographic chars (smart quotes, em-dash, ellipsis, bullet, etc.) map to CP437-safe equivalents instead of showing as? - TERMINAL: RSS item-list and river lightbar rows also sanitize titles through
_sanitize_cp437()for consistent display
v1.0a2.229 — Font licensing: NOTICE file + CSS attribution comments (June 2026)
- LICENSE: Added
NOTICEfile at project root documenting the IBM VGA font as a
CC BY-SA 4.0 third-party component with full attribution to VileR / int10h.org. - LICENSE: Added
anetbbs/static/fonts/LICENSE.txtco-located with the font file,
including attribution, source URL, license URL, and derivative-work note. - CSS: Both theme stylesheets now carry an inline attribution comment above the
@font-facerule (author, source, license, conversion note). - The font file is served as a static asset at
/static/fonts/Ac437_IBM_VGA_9x16.woff
satisfying the CC BY-SA requirement that derivative distributions make the file
available; the original pack and TTFs remain free at https://int10h.org/oldschool-pc-fonts/.
v1.0a2.228 — IBM VGA CP437 font in VOID SIGNAL and HACKERS themes (June 2026)
- FEATURE: Authentic IBM VGA 9×16 font (
Ac437_IBM_VGA_9x16.woff) bundled in
anetbbs/static/fonts/and wired into both the VOID SIGNAL (enhanced) and
HACKERS (1995) web themes. - The font (
VGA437) is declared via@font-faceand placed first in the
font-familystack everywhereShare Tech Monowas previously used — body text,
nav items, card content, form fields, message bodies, RSS articles, etc. Share Tech MonoandCourier Newremain as fallbacks so the theme degrades
gracefully if the font file can't load.- Bitmap font rendering is sharpened with
-webkit-font-smoothing: none; font-smooth: never
onbodyso the VGA pixels stay crisp rather than blurry. - Orbitron headings (
h1–h6,.navbar-brand,.bbs-header h1/h2) are exempted from
the no-smoothing rule so the vector heading font still anti-aliases correctly. - Font requested by Firehawke. Font file from the Ultimate Oldschool PC Font Pack
(int10h.org).
v1.0a2.227 — install.sh: libsixel-bin optional package (June 2026)
- INSTALL: Added
libsixel-binas an optional install component (providesimg2sixel).
The installer now asks "Install libsixel-bin for sixel images in terminal RSS reader?"
and installs the correctly-named package for apt (libsixel-bin), dnf/yum (libsixel),
and pacman (libsixel). Without it the terminal RSS reader falls back to text-only. - DOCS:
docs/INSTALL.mdupdated with thesudo apt install -y libsixel-binnote under
optional packages.
v1.0a2.226 — RSS terminal fixes: PgUp/PgDn, arrow char encoding, sixel detection (June 2026)
- FIX: PgUp / PgDn keys not working in lightbar and pager — root cause:
reader.read(6)
returns fewer bytes than requested on a live stream, so the5~/6~suffix of the
VT sequence was fragmented. Rewroteread_key_arrow()to consume CSI sequences one
byte at a time until the VT final byte (0x40–0x7E), which handles any fragmentation. - FIX:
??appearing in hint lines — Unicode ↑↓ arrows (U+2191/U+2193) don't survive
the session's CP437/latin-1 encoding. Replaced with plain ASCIIUp/Dn. - FIX: Sixel detection now checks
img2sixelpresence first (fast-path false if missing),
and increases the DA1 response read timeout from 250 ms to 1500 ms to cover higher-
latency links. The sixel path is still silently skipped if the tool is absent. - NOTE: Sixel images in terminal require
img2sixelinstalled on the BBS server
(sudo apt install libsixel-bin). SyncTERM does support sixel; detection reads
the DA1 primary device attributes response for the sixel capability flag.
v1.0a2.225 — RSS Reader overhaul: web images + lightbar terminal (June 2026)
Web:
- FEATURE: Feed item lists (/rss/<id> and /rss/all) now show thumbnail images
extracted from feed enclosures, media:thumbnail, or the first <img> in the article body.
- FEATURE: Item titles are proper hyperlinks to the article detail page; "Original" button
opens the source URL in a new tab.
- FEATURE: Article reader (/rss/item/<id>) shows a full-width hero image, sanitized HTML
body (via bleach), and Newer / Older navigation within the same feed.
- FEATURE: Feed index groups feeds by category in a card grid.
- FEATURE: Paginator on feed and river pages shows page numbers instead of just «/».
- FIX: bleach now sanitizes content_html before rendering (raw HTML injection removed).
- FIX: River (/rss/all) now filters by min_access_level (previously skipped the check).
Terminal:
- FEATURE: Feed list and item list both use an arrow-key lightbar scroller (↑↓ PgUp PgDn
Home End — no Enter needed to navigate).
- FEATURE: Article body is now a scrollable pager (↑↓ PgUp PgDn Home End Q). Full HTML
body is rendered as plain text via an inline HTML→text converter; previously only the
summary field was shown.
- FEATURE: Sixel image rendering in article view — if the terminal reports sixel support
(DA1 response) and img2sixel is on PATH, the article hero image is displayed before
the body. Gracefully skipped for non-sixel terminals or missing tool.
- FEATURE: M in both feed list and item list marks all items read without leaving the
lightbar.
- FEATURE: Unread counts on the feed list now use two aggregated SQL queries instead of
an N+1 per-feed count loop.
- FIX: River now applies min_access_level filter (previously showed all active feeds).
- MODEL: RssItem.image_url (VARCHAR 1000, nullable) — auto-migrated; populated by poller
from media:thumbnail, media:content, enclosures, or first <img> in HTML body.