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 send IAC SB TTYPE SEND IAC SE before the client reports its type string. init_session() now sends that request and reads the response, so TERM=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_type and process.term_size from asyncssh immediately after session creation so term_mode is 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_mode property: wide (cols ≥ 132), ansi (default), ascii (dumb/TTY).
  • TERMINAL: _show_ansi_screen picks {slot}132.ans for wide, {slot}.asc for 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}.ans in data/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 /me was sending IRC CTCP format (\x01ACTION ...\x01), which the MRC bridge doesn't recognise — it displayed as ACTION andwhatyoutyped instead 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.sh rejected 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.py release-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 END at the bottom of a 29-line message makes it clear you have reached the end; previously Ln:8/29 looked 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/Dn instead of PgUp/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) and ESC[U (PgDn) which were not in the CSI lookup table in read_key_arrow(); they fell through to return 'ESC' which quit the lightbar. Added b'V'PGUP and b'U'PGDN to the lookup table in session.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 \n from CR+LF Telnet Enter was being consumed by the pager as an ENTER keystroke (added \n discard in read_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 NOTICE file 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.txt co-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-face rule (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-face and placed first in the
    font-family stack everywhere Share Tech Mono was previously used — body text,
    nav items, card content, form fields, message bodies, RSS articles, etc.
  • Share Tech Mono and Courier New remain 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
    on body so 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-bin as an optional install component (provides img2sixel).
    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.md updated with the sudo apt install -y libsixel-bin note 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 the 5~ / 6~ suffix of the
    VT sequence was fragmented. Rewrote read_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 ASCII Up/Dn.
  • FIX: Sixel detection now checks img2sixel presence 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 img2sixel installed 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.