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; three strikes against the same caller (without any redirect) triggers an automatic disconnect
  • 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 guest-open beta is live now at chat.saimin2.com. Connect, pick a handle, and see who’s on.

The Business Model
#

Membership
Fees
Hosting & Operating Costs

Membership fees are sized to cover hosting and operating costs. The system is designed to pay for itself — no profit goal, no commercial backing, no external subsidy.

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.