Skip to main content
  1. Projects/

Saimin 2 Chat System

In the 1980s, before the internet reached Hawaii’s living rooms, there was Saimin Chat System — an Apple II+ in Aiea running five phone lines at 300 baud. You dialed in, you got routed to whichever line was open, and you chatted in real time with whoever else happened to be connected that evening. The system operator held the title “Noodle.” Saimin 2 is that system, rebuilt for the browser.

The Welcome Screen
#

When you connected to the original, you got this — and Saimin 2 preserves it exactly:

SAIMIN CHAT SYSTEM  —  LINE 3  —  300 BAUD
Why did the chicken cross the road?
SAIMIN!
Entry Code:

Press Return to connect as a guest. Type your credentials to log in as a member. That was the whole welcome ceremony — a joke, a punchline, a blank field.

What It Is
#

A browser-based multi-user chat system modeled on the original:

  • 15 numbered lines — one caller per line, same mechanics as the original
  • A browser terminal — xterm.js presenting VT100/ANSI output, no app to install
  • Guest and member sessions — guests get 10 minutes; members get allocated monthly time
  • The original moderation model — members issue strikes against bad actors; three strikes disconnects you
  • The same welcome screen, preserved exactly
15
lines
One caller per numbered line
300
baud
Default terminal output speed — the original
10
min guest
Guest sessions are time-limited
99
members max
Hard cap — not designed to scale

When the lines are full, you get a system-busy message and no entry. That’s the whole thing, and it’s intentional.

The Business Model
#

Membership
Fees
Hosting & Operating Costs
Year-End Surplus → Charity

Membership fees cover hosting costs. This is not a commercial project. Any surplus at year end is donated to charity.

The Tech
#

Browser terminal: xterm.js over a WebSocket connection. No web framework, no SPA — the interface is the terminal.

Backend: Python and FastAPI with native async WebSocket support. All 15 connections run in a single asyncio event loop — no Redis, no message broker, no external session store. If the process restarts, sessions reset, the same way the original reset when you powered it off.

Data: SQLite in WAL mode. Member records, time balances, message boards, audit log — all one file on a mounted volume.

Billing: Stripe Checkout for membership. Card data never touches the BBS.

Deployment: Kubernetes.

Site: saimin2.com


Technical breakdown — stack, architecture decisions, and the EA governance model — in my professional portfolio at rubyjedi.com.