Repository navigation
Releases: c4punks/ssh-chatter
Release list
v1.3(Lovelace): DDial network integration, scrollback rendering fix, and crash forensics
v1.3 (Lovelace) -- named after Ada Lovelace
Chatter joins the live DDial network: station-to-station linking through the MagViz hub, a full MagViz command set for retro dial-in terminals, and a root-cause fix for the scrollback duplication that made relay traffic unreadable.
DDial network integration
- Station (auxiliary) mode: Chatter now links into the DDial network as a full station via the MagViz hub (magviz.ca:2301). Registered on the hub user list and relaying chat bidirectionally with all linked stations in real time.
- User ("hijack") upstream mode (
CHATTER_DDIAL_MODE=user): the relay acts as an ordinary DDial account. Includes a per-account file lock so two processes never log in twice, a reconnect cooldown (double-login guard) that also covers abnormal termination,/Qlogout on shutdown, and dedup of the upstream's own-line echo. A chat message containing "bye" no longer drops the connection. - DDial listener (
-D bind:port): retro terminals dial in over raw TCP/telnet into a Diversi Dial engine with the MagViz command set —###passwordmember login, channels 1-999 with~dual-channel wire form, colors (/h#RRGGBB), mail, message box,/ig /null /pmoderation, paced/300-style output, and more. See docs/DDIAL.md. - Chat bridging: dial-in chat reaches the Chatter room (as system entries, so nothing loops back) and the upstream link; upstream chat reaches the room and local dial-ins. Link-echo and local handles are suppressed so no one sees a line twice.
DDial command interoperability from the Chatter room
- Read-only DDial commands typed in the room (
/s,/s1-/s4,/sm,/i,/h,/ls,/b?,/ver) are forwarded raw to the linked station; the reply returns through the normal relay path and lands in the room history (verified live against the MagViz hub). - Everything else stays local: protocol commands (
/K,/V,/E, ...) can never be injected from chat. Operator-only/ddial rawremains the sole protocol escape hatch.
Scrollback rendering fix
session_process_pending_sink's non-incremental fallback re-emitted the entire visible history window every time a single message arrived (incremental redraw had been disabled earlier to avoid screen clears). With relay traffic, every message repainted the whole recent history — the duplicate-block scrollback spam reported during DDial testing — and buried the input line.- The fallback now appends only entries newer than the sink cursor; the cursor is advanced when the sender's own line is rendered immediately, invalidated on hard screen clears and on return from protected modes (BBS/RSS/game), and reset when coming back from a scrolled view. Verified: every message renders exactly once across two SSH sessions, dial-in relay, scrollback navigation, and BBS exit.
DDial link line format and relay
- Linked stations showed our chat as
63Lee Yunjin) msginstead of63#1[T1:Lee Yunjin) msg: station mode dropped the#slot[T1:prefix whenever the remote never printed our#N(T1:?)status line. Link chat and/Pnow always carry the speaker's own line number (a Chatter member's chat-link slot, the same one its login was announced with; a dial-in's session slot). - The relay's own slot is learned only from our status line, so another user's
#2[T1:Bob)line can no longer overwrite it. - The idle keepalive no longer writes a telnet
IAC NOPinto the stream (remotes rendered it as��in front of the next line); kernel TCP keepalives are used instead. /pmfollows the public-chat relay path: a Chatter private message in the room, and the DDial equivalent when the target is on the DDial side (P#slot(handle) msgto a dial-in, link/P<slot> #slot[T1:handle) msgto a user on the linked station). Inbound link/Preaches only its recipient instead of the room history, and our own/Pcoming back is dropped./replyis relayed to DDial as a plain chat line (@author text), since DDial has no replies./usersand/connectedcount DDial participants: dial-ins, plus everyone behind the Station Link, kept in a hash map keyed by handle. It is filled from station user lists ([SYSOP] 73-.SynerChat #0[T1:AriZona Mae #2<T1:Joe Boo:232 ...), login events and chat lines, rebuilt at start-up from the last 2048 history entries, and a user is removed only when they leave (logout, or dropping out of their station's list).- History keeps what the link sent; one display-time filter decides what people see, for past and new entries alike and in every view (SSH, scrollback, live broadcast, JSON/web feed): link housekeeping (
[SYSOP]station lists,[LINK]login/logout events) is hidden, and relayed DDial chat such as71#4[T1:MaxMouse) ...is shown as a Chatter message ([id] <MaxMouse> ...).
Usernames with spaces and localized command messages
/pm,/mail send,/block confirmand/bbs mutetakename|args(e.g./pm Lee Yunjin|hello), matching the BBS comment syntax; single-word names still work without|.- Help labels, usage lines, the
/bbssubcommand help, and the system messages of/pm,/mail,/block,/unblock,/kick,/ban,/banname,/banlist,/getaddr,/poke,/pardon,/getos,/resetpwand/showstatusare available in all eight UI languages.
Crash forensics and BBS hardening
- The SIGSEGV handler now logs the first-fault signal, code, address, fault RIP/RSP, and TID to stderr (journald) before re-raising, because the re-raise used to overwrite the faulting ucontext and erase the real crash location from every core dump.
- BBS post lookup refuses to iterate a post arena whose capacity exceeds
SSH_CHATTER_BBS_MAX_POSTSand rejects ids above 2^40 (defense against the wild-pointer crash class seen on 2026-09-23).
Full changelog: v1.2...v1.3
v1.2(Liuhui): BBS comment moderation, notifications, and i18n
v1.2 (Liuhui)
Named after Liu Hui (刘徽), 3rd-century Chinese mathematician.
BBS
- Comment edit/delete:
/bbs cmtedit <id> <idx> <text>and/bbs cmtdel <id> <idx>(author or operator only), with feature flagsCHATTER_BBS_COMMENT_EDIT/CHATTER_BBS_COMMENT_DELETE - Localized subcommand aliases in all 8 languages (EN/KO/JP/ZH/RU/DE/FR/PL), including cmtedit/cmtdel: 댓글수정, コメント編集, 评论编辑, комментред, kommentarbearbeiten, modifiercommentaire, edytujkomentarz (and deletion counterparts)
- Edited marker: edited comments show
(edited)(storage format v1→v2, old state files still load and auto-upgrade) - Pagination:
list [all|hot|top|new] [page](20 posts/page); post capacity 128 → 256 - Anti-flood rate limiting: min 3s between comments, 30s between posts, per-user across sessions (operators bypass)
- Reply notifications + @mentions: replies and
@nickmentions enqueue notifications (notifications.dat), drained on BBS dashboard entry - Read tracking: "N new posts since your last visit" (
readmark.dat) - Comment quoting:
:Ninside a comment renders as an excerpt quote of comment N - List/search views show post author; tip blocks cover voting and comment editing
- Backup rotation: hourly timestamped backups of
bbs_state.dat, newest 7 kept
Moderation & operator tools (storage v3)
report <id> [reason]user queue with operatorreports; posthide/pinflags (hidden posts invisible to non-operators, pinned posts sort first)mute/unmute/mutesenforced before rate limits; operators cannot be mutedmodlogaction audit (operator actions and IP lookups)
IP audit log with automatic expiry
- Connect/disconnect records with operator-only
ipaudit <user>/ipaudit ip <addr>lookups; every entry is destroyed 5 days after the session ends, and the log is never backup-rotated. Queries are themselves logged.
Internationalization
- Full 8-language coverage for BBS messages, help tables (descriptions and labels), subcommand aliases, DOOR-game and palette strings
Terminal encoding
- Lossless CP949/CP932/CP936 conversion state machine (no more dropped bytes, trail-in-lead-range pairs now decode)
- No UTF-8 sequence truncation on small output buffers; partial results kept on iconv errors
- Stricter UTF-8 auto-detection (rejects overlongs, surrogates, out-of-range leads)
- iconv fallbacks: GB18030 for CP936, SJIS/SHIFT_JIS/ISO-2022-JP for CP932, ISO-2022-KR for CP949
- Conversion context reset at line boundaries (Enter/backspace)
Crash fix
- SIGSEGV on login (production core dump) fixed: host-lifetime sidecar arrays (notifications, reports, mutes, modlog, ipaudit) were lazily allocated inside the calling session's memory context, which is destroyed when the session ends — the next access used a dangling pointer. All five allocations now register in the host memory context.
Full changelog: v1.1b...v1.2
-
Crash forensics: SIGSEGV handler now logs first-fault rip/address/tid before re-raising, so core dumps no longer lose the real crash location
-
Harden BBS post lookup against corrupt capacity and wild ids (2026-09-23 15:01 SEGV defense): refuse to iterate the post arena when capacity exceeds SSH_CHATTER_BBS_MAX_POSTS and reject ids above 2^40
Minor bug patch: DDIAL crash prevention
DDIAL Bridge has crashed when a long message history takes place.
Patched dirty, should be refactored more..
v1.1a: Minor Bug Patch
Patchlist
- Patch on sign up feature
v1.1(Seki): Retro-DIAL Bridge support
SSH Chatter: v1.1(Seki)
Now this supports Retro-DIAL support via telnet...
You can connect to hdcbbs.com:2300 or other boards...
Thanks
Now this has codenames...
Named after Great Men, Great Women
- v1.1: Seki — Named after Seki Takakazu, a mathematician
v0.1: EMERGENT FIX+MEMORY DIET+FINALLY 100% STABLE
TO BE CONTINUED....
Now, you can install right now.
Release stable version of v0.0.6
Changelog
- restored reaction feature
- ~RSS 300-500(Still heavy)
- Bundled allocator uses
mmap
Chatter BBS v0.0.6-Working Board Post Editor
- Bulletin Board Post Editor is fully working
- Enhanced some of user entry/exit handlers
- Retro Encoding Support Enhanced
v0.0.6-rc2
Changelog
- Fix unstable session disconnect handler
- Enhance virtual memory utilization
v0.0.6 RC1
Now we are counting RC, and RELEASE.
- Code rename/refactor
- /saerom endpoint expose