ANetBBS Changelog

Current release: v1.0.32 (August 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.0.0 — Full release (August 2026)

Primarily the version cutover from the internal beta build-number
scheme to standard semantic versioning, marking ANetBBS's first stable
release — no other behavior changes from v1.0b2.239.

One real fix caught live during this rollout: a sysop ran update.sh
and got a garbled warning — nginx /mrcws proxy points at port 127 followed by 0, 0, 1, and 8080 each on their own line
— on an install that was actually configured correctly. The MRC
nginx-proxy verification check (added v1.0b2.232-235) extracted the
configured port with grep -oE '127\.0\.0\.1:[0-9]+/ws;' ... | grep -oE '[0-9]+', but that second grep matches every run of digits in
the matched line, not just the port — 127.0.0.1:8080/ws; contains
five separate digit runs (127, 0, 0, 1, 8080), so the
extracted value could never equal the bridge's actual port and the
check false-positived on every correctly-configured install. Fixed by
capturing just the port group with sed instead. 3 new tests run the
real extraction line from update.sh in actual bash against synthetic
nginx configs, so this can't silently regress again.

A second real fix, also caught live: Admin → Upgrades 500'd with
AttributeError: 'str' object has no attribute 'strftime' the moment
it tried to display the upstream release's publish date.
datetime.fromisoformat() only accepts a trailing Z (the shape
/api/releases/latest actually emits) as of Python 3.11 — the live
server's venv is 3.10. Fixed by normalizing a trailing Z to +00:00
before parsing in to_eastern(). Also hardened fmt_eastern() to
check the value is actually a datetime before calling .strftime()
on it — to_eastern()'s own docstring already promised to fail open
and return the raw string on genuinely unparseable input, but
fmt_eastern() wasn't honoring that contract, so any malformed
timestamp (not just this one) would have crashed the same way. 2 new
tests, including one reproducing the exact reported crash.

Also rewrote FILE_ID.DIZ: the old one had grown to 18 lines, well
past the classic BBS-standard 10-line/45-char DIZ convention. Now 9
lines, leads with the version and "Full Release!", and calls out the
web UI explicitly right after the terminal-access list (telnet/SSH/
rlogin/PETSCII) rather than folding it in as just one more word among
them. Confirmed (with 2 new tests) that a FILE_ID.DIZ nested inside
the release tarball's own ANetBBS-v1.0.0/ wrapper directory — not at
the archive root — still gets picked up correctly if a sysop uploads
the release tarball to a file area.