tHe sHacK bBSvelvet.ath.cx · 1998–2006 · reopened 2026

The technical record

Two systems, twenty years apart, sharing one dataset: a homebrew C BBS compiled for OpenBSD i386, and a modern web runtime executing everything it left behind.

The original: a BBS written from scratch

tHe sHacK was not packaged software. The dump preserves its full C source tree — main.c, the message engine (gmsg.c, msg.h), the user system (user.h), chat (chat.c), the g-file areas (gfiles.c), the editor (editor2.c), the door hook (game.c) — built with a Makefile, CVS-managed, run as the Unix user bbs. The board's core trade-off is right there in msg.h: message bases as fixed-width circular buffers (8,160-byte records, 50 slots by default), fast on period hardware, self-pruning by design.

Everything a caller touched was a file: screens and menus as editable ANSI text files, rooms as tiny header fragments (owner~name~limit), users as directories of fixed-width binary records. No database. The filesystem was the schema — which is why the disk image is a complete, self-describing artifact.

Alongside the homebrew code, the host also carried a copy of DayDream BBS 2.14.9 and telnet front-end experiments (ddtelnetd) — the sysop, like every sysop, was also an engineer evaluating the competition.

The recovery pipeline

Three stages, each replayable from scratch:

  1. Parse. A parser walks the recovered tree and decodes every message, user and room from the binary layouts verified against the original headers — 1,005 messages, 701 mail, 295 accounts — emitting a single JSON corpus.
  2. Seed. A seeder loads the corpus into Postgres, hashing the 2006 passwords (scrypt) as it goes, flagging every recovered row as archive, and carrying over the per-user, per-room last-read pointers that make “read new” work continuously across the twenty-year gap.
  3. Serve. The app itself is a Next.js server-rendered site whose heart is a keyboard-driven terminal: the original ANSI screens rendered verbatim by an in-house ANSI-to-HTML renderer (SGR colors, bold, dim, blink — and the board's own caret color codes, still honored inside post bodies), the single-key menu flow reproduced key for key, live multi-user chat over server-sent events, and the StarFlight door rebuilt from its screens.

The honesty table

ComponentOriginal code?What executes today
Message/mail/user dataOriginal data, unmodifiedPostgres rows flagged as archive
ANSI screensOriginal bytesNew renderer interpreting the same escape codes
G-filesOriginal filesServed as recovered
Menu flow, posting, unread pointersReimplemented to matchWeb app reproducing the key-for-key flow
Chat (Ye Old cHaT RoOM)Reimplemented, same roomSSE live chat with presence
Doors (StarFlight / Wumpus)ReconstructedRebuilt games on recovered lore and screens
The board's C sourceOriginal, preservedKept as the authoritative reference, not recompiled

Continuity mechanics

The board's clock never resets: new posts continue each room's absolute message numbering where October 2006 stopped, and new accounts go through the keycode flow exactly as the original did — including the sysop's manual provisioning. The archive is not a diorama behind glass; it is the same building, reopened, with the lights on.

Provenance, format layouts and the preservation rules are on the archaeology page; the narrative of the recovery is in the reconstruction story.