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

Bringing the board back, twenty years later

On October 26, 2006, with final posts still being written, a level-0 dump(8) image was taken of the disk behind velvet.ath.cx. This is how that 1.53 GB image became a living BBS again — running in the browser, with every message, screen and door intact.

1. The image

The source is a level-0 dump(8) of the OpenBSD system partition (/dev/wd0a) — image 102006.dmp, 1.53 GB, stamped 2006-10-26 14:15 on the host clock. Restoring it with restore -r gave back 98,776 files with one casualty: an OpenBSD ports RPM (glibc-common-2.3.2) that had nothing to do with the BBS. Everything under /home/bbs — the board's data, its screens, its own C source — survived whole.

2. Reading a binary format nobody documented

The board stored messages as raw fixed-width binary records: a circular buffer per room, each record 8,160 bytes on 32-bit OpenBSD — author handle, recipient, subject, date, and 8,000 bytes of text that could embed ANSI color codes. No export tool, no schema, no documentation. What made exact recovery possible was that the dump contained the board's own C headers (msg.h, user.h, shack.h, rooms.h): the record layout was reverse-engineered against the original struct definitions and verified byte-by-byte, alignment pads and all. All 1,005 records decode cleanly.

The same went for user state: each account's totals, call counts and per-room last-read pointers sat in 152-byte binary blobs, and each room's live name and owner in tiny owner~name~limit fragments.

3. From bytes to a database, without changing anything

A parser walks every message base and emits the recovered corpus as JSON; a seeder loads it into Postgres. Two rules were non-negotiable:

4. A terminal, not a website

The board could not honestly come back as a forum — it had to come back as itself. The rebuilt front end is a keyboard-driven ANSI terminal in the browser: the original LOGIN, MAINMENU and MOTD screens render verbatim; SPACE reads new messages with per-user unread pointers preserved; Y opens Ye Old cHaT RoOM, live over server-sent events; X launches the StarFlight door. Multi-user chat and presence work — the board is a live system again, not a capture of one.

5. Continuity, not reenactment

New accounts are created the old way — type NEW, pick a handle, receive a keycode, get validated — and new posts continue each room's numbering exactly where October 2006 left off. The board's history and its present share one timeline, the way a real living archive should.

What is original, and what is new

LayerStatusNotes
Message bases, mail, user accountsOriginal dataDecoded from the dump, unedited, privacy fields sealed
ANSI screens (LOGIN, MAINMENU, MOTD, room art)Original, byte-for-byteRendered by a new renderer that speaks their escape codes
G-file treeOriginal filesServed from the recovered filesystem
The board's C sourceOriginal, preservedKept as the authoritative reference — not recompiled for production
Door games (StarFlight, Hunt the Wumpus)ReconstructedRebuilt to behave as the originals did, from their screens and lore
Runtime (web terminal, chat, auth, presence)New codeA modern runtime executing the recovered data

In other words: the artifact is original; the pedestal is new. For the full engineering record, see the technical pages.