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:
- 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.
- 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.
- 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
| Component | Original code? | What executes today |
|---|---|---|
| Message/mail/user data | Original data, unmodified | Postgres rows flagged as archive |
| ANSI screens | Original bytes | New renderer interpreting the same escape codes |
| G-files | Original files | Served as recovered |
| Menu flow, posting, unread pointers | Reimplemented to match | Web app reproducing the key-for-key flow |
| Chat (Ye Old cHaT RoOM) | Reimplemented, same room | SSE live chat with presence |
| Doors (StarFlight / Wumpus) | Reconstructed | Rebuilt games on recovered lore and screens |
| The board's C source | Original, preserved | Kept 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.