From IRC to iMessage: Rebuilding BBS Chat for 2026
August 3, 2026
The original BBS chat was IRC. You’d type /join #lobby, see messages scroll by in a flat log — <joe> hey everyone — and if you wanted to talk to someone privately, you’d type /msg joe hey man. It worked. It was 1992.
But nobody talks like that anymore. Your phone shows messages as bubbles. Group chats have avatars and timestamps that fade into the background. You tap a channel name to switch rooms. You @-mention people. The IRC command syntax feels like a foreign language to anyone who grew up with iMessage and Telegram.
So we’re rebuilding chat in Phosphor BBS. Same pub/sub architecture underneath. Completely new presentation on top. And here’s the interesting part: we’re doing it in a terminal.
The Problem
The current chat screen in Phosphor looks like this:
14:32 <joe> hey everyone
14:32 <joe> anyone seen the new board?
14:33 <mary> yeah it looks great
14:35 -- mary joined #lobby --
Every message is a single line. Username in angle brackets. Timestamp prefixing everything. System messages wedged in between user messages with no visual distinction. If three people are talking at once, it’s a wall of <user> text lines with no flow, no grouping, no sense of conversation.
It’s functional. It’s also jarring for anyone who didn’t grow up on IRC.
Message Bubbles (Terminal Style)
The new layout puts the username on its own line — bold, colored — with the message text below it. Timestamps move to the right side and only appear on the last message in a group:
joe
hey everyone
anyone seen the new board? 14:32
mary 14:33
yeah it looks great
── mary joined #lobby ──
sysop 14:35
welcome mary!
That’s message grouping. Consecutive messages from the same person within two minutes don’t repeat the username — the text just stacks underneath, like iMessage. A different person starts a new group. A gap of more than two minutes starts a new group even from the same person.
System messages — joins, parts, channel notices — get centered with ── delimiters. They’re visually de-emphasized. They’re metadata, not conversation.
In the terminal, “bubbles” aren’t CSS boxes. They’re whitespace and color. Your own username shows in green. Other people’s show in cyan. Timestamps are dark gray — present but not distracting. The conversation reads like a chat, not a log file.
Channel Tabs Instead of Slash Commands
The old way to switch channels was /join #dev. The new way is Tab.
A channel bar sits at the bottom of the screen:
#lobby* #dev (2) #investing #support
The * marks your current channel. The (2) means two unread messages in #dev. Press Tab to cycle to the next channel with unread messages. Shift+Tab to go backward. No commands, no typing, no remembering channel names.
Under the hood, the ChatBus pub/sub system is unchanged. Each session subscribes and unsubscribes to channels as before. The new piece is tracking unread counts per channel and rendering the tab bar — a UI layer addition, not an architecture change.
@mentions Instead of /msg
Direct messages used to be /msg joe hey man. Now they’re @joe hey man. Same routing, same private channel, same delivery. Just a syntax that matches what people already know from Twitter, Telegram, and Discord.
The old /msg command still works for power users. Both syntaxes route to the same dm:userA:userB channel. No need to break muscle memory.
Online Count in the Header
The header used to just show the channel name. Now it shows how many people are in the room:
┌─ #lobby ─── 5 online ──────────────┐
No need to type /who to see who’s around. The count is live — when someone joins or leaves, it updates. Under the hood, this is a simple bus.subscriberCount(channel) call that’s been there since the beginning. We just weren’t showing it.
What Didn’t Change
The architecture under the hood is the same. ChatBus is still an in-memory pub/sub system. Messages still route by channel. Sessions still subscribe to the channels they’re in. Persistence still goes through ChatMessageService to the same bbs.chat_messages table. Federation still works the same way — JNet relays messages between nodes, and the UI layer doesn’t know or care.
What changed is the presentation layer. One file — ChatScreen.java — handles all the rendering. The formatMessage() method went from producing a single styled line per message to producing grouped multi-line entries with visual hierarchy. The input handler gained Tab key support and @username parsing. The header gained a subscriber count.
That’s the whole change. The chat bus, the message record, the persistence layer, the federation relay — all untouched. The lesson: good architecture separates transport from presentation. When the transport is solid, modernizing the UI is a rendering change, not a rewrite.
Why It Matters
A BBS in 2026 can’t feel like 1992. The people we want on Phosphor — Discord refugees, self-hosting enthusiasts, retro-tech Gen Z — have never used IRC. They know chat as bubbles and tabs and @mentions. If the first thing they see is <joe> hello in green text on a black screen, they’ll think it’s broken.
But if they see messages grouped into conversations, channels they can tab between, and an online count that tells them the room is alive — that’s familiar. That’s chat. The terminal aesthetic is the differentiator. The conversation flow is the baseline expectation.
We’re keeping the terminal. We’re keeping the text. We’re keeping the SSH and Telnet and the 80-column constraint and the ANSI colors. We’re just making it read like a conversation instead of a log file.
What’s Next
Phase 1 — the terminal refresh — covers message grouping, channel tabs, @mentions, and the online count. It’s in active development now.
Phase 2 brings the web interface (xterm.js) up to the same standard: actual CSS message bubbles, typing indicators, clickable channel tabs, @mention highlighting. Same backend, same event bus, same messages — richer rendering in the browser.
The goal is simple: when someone connects to Phosphor for the first time, chat should feel like chat. Not like a log file from 1992. The terminal is the aesthetic. The conversation is the experience.
Try Phosphor BBS now: bbs.phosphorbbs.net:8088/terminal — no install required. Prefer SSH? ssh phosphorbbs.net -p 2222. Telnet? telnet phosphorbbs.net 2323.
#digitalthirdplace #dtp #socialterminal #communityserver #selfhosted