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:
- Nothing is edited. Archive rows are flagged as archive; the text, the caret color codes, the quoting style — all of it lands exactly as written in 2001–2006.
- Private stays private. The 2006 passwords sat in plaintext in the dump (as homebrew boards of the era did); they are hashed on import and never exposed again. Real names and e-mail addresses stay private, permanently.
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
| Layer | Status | Notes |
|---|---|---|
| Message bases, mail, user accounts | Original data | Decoded from the dump, unedited, privacy fields sealed |
| ANSI screens (LOGIN, MAINMENU, MOTD, room art) | Original, byte-for-byte | Rendered by a new renderer that speaks their escape codes |
| G-file tree | Original files | Served from the recovered filesystem |
| The board's C source | Original, preserved | Kept as the authoritative reference — not recompiled for production |
| Door games (StarFlight, Hunt the Wumpus) | Reconstructed | Rebuilt to behave as the originals did, from their screens and lore |
| Runtime (web terminal, chat, auth, presence) | New code | A 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.