I dug a 1994 BBS out of a binary, then taught a model to flirt on it
This one got away from me a little. It started as a small, slightly spiteful experiment - I wanted to prove a point - and by the time I looked up it had turned into four projects, a fine-tuned language model, and a rented GPU or two in a data center somewhere in Europe running my formative years through a training loop. Let me walk you through it.
The point I was trying to prove
There’s a lot of chatter on the airwaves these days about model safety. Open vs closed weight models, US vs China and the ever ominous cyber capabilities of all of them. What got me going on this topic was Fable. Fable is the latest & greatest model from Anthropic, based on Mythos. Mythos is a fully unrestrained model capable of frontier security research. Fable has the same intelligence but is severely hobbled.
Fable is so hobbled, it declined to even help me write this article when I asked as an experiment.
So I wanted to show why I think these restrictions are short sighted with more than just a hot take. And I wanted to show why I think these restrictions are foolish using a mix of low cost and free open source tools.
My first computer was an Atari 800XL with a 300 baud modem, and I spent an unreasonable amount of my youth dialed into Bulletin Board Systems (BBS). One of the more popular ones of the early 90s was TriBBS, a DOS BBS package from a tiny outfit called TriSoft, circa 1994. It was shareware and despite strong demand from the community for source code, it’s considered abandonware.
So: could I take that abandonware, with free tooling and a non-frontier model, and bring it back to life?
Digging out the binaries
Two free tools helped with the heavy lifting:
radare2, open-source reverse-engineering framework.Ghidra, reverse engineering suite the NSA open-sourced.
These tools gave me most of the information I needed to document the file formats and operations I needed to support in my clone.
To check my work I fired up DOSBox, an x86 DOS emulator and ran the actual 30+ year old TriBBS, let it write out its own .DAT files, and diffed my reconstructed layouts against real files.
Rebuilding the board: TresBBS
Having read the formats out of the shareware, I built a clean original BBS implementation in Go that recreates TriBBS’s behavior and reads/writes its file formats. I named it TresBBS. (“Très” is French for “very”.)
It’s a love letter to my formative years with a computer. TresBBS speaks TCP and SSH and Telnet, it uses SQLite instead of flat .DAT files. The behavior is 100% true to the original - door games, who’s online, messaging and paging the sysop.
Point TresBBS at an old set of files for a TriBBS system (SYSDAT1.DAT and USERS.DAT) and TresBBS will import them into its database. Custom menu files, door dropfiles - everything works.
An ant farm of callers: carrier
This is where it starts to veer off into not sure anyone needed this territory.
I had a working BBS. A BBS with nobody on it is a sad thing. So I built carrier - named for the modem carrier signal, the tone that holds the whole illusion together.
carrier is a single-player BBS simulator / game engine. I built out 13 personas defined via text files, memory system and relationship ledger so who each persona likes/hates/owes/etc is known. carrier’s engine makes sure the BBS stays busy and makes sure people are playing the door games and posting messages. It couldn’t, however, write those messages itself. It couldn’t be an annoying 13 year old script kiddie paging the sysop. It couldn’t flirt with Violet in Legend of the Red Dragon.
Using rented GPUs from Runpod and a dataset of FidoNet messages from 1993-1999 I trained a model that could.
So carrier’s deterministic Go engine runs the world with a persona-weighted intent function driving each caller’s actions. My fine tuned Qwen model, which I serve up locally via LM Studio on my Macbook, provides for the conversation & drama. And I can watch my ant farm and occasionally stir the pot.
The sauce: teaching a model to talk like it’s 1996
I wanted the messages in my BBS simulator to have the right tone, the right snark, the right naivete, of a mid 90s BBS. FidoNet was a store and forward mail network that linked BBSes together before the internet took over and there are archives of it anyone can download. I used a 500MB corpus of FidoNet echomail messages and produced a training dataset I’ve made available for others to use, fidonet-bbs-voice.
The first base model I fine tuned was Qwen3-8B, tuned with 4-bit QLoRA so I could use a single 24GB GPU and in just over an hour I had a model ready to test out on my MacBook M5 Pro with LM Studio as my local inference server. The model is available on Huggingface carrier-voice-8b.
It works surprisingly well for a side project that has no business existing. Good enough that I decided to continue the experiment and fine tuned a current mid-size model, Gemma-4-26B-A4B, and published it for others to use carrier-voice-moe.
Why this exists
Partly because I couldn’t not. That’s most of my projects if you haven’t noticed.
The only thing in the new news these days is the cyber risks of frontier models. The US government kicked Anthropic in the teeth so hard that they’ve nerfed Fable to the point of it being unusable. The comment I made earlier at the start of the article about Fable refusing to even help me with this article? I’m not kidding - all the subject matter in this article is too radioactive for Fable. It wouldn’t even help me with spelling.
It will be interesting to see how this situation develops.
The suite
| What | Where |
|---|---|
| TresBBS — the modern Go BBS | github.com/jasondostal/tresbbs |
| carrier — the caller-colony simulator | github.com/jasondostal/carrier |
| carrier-voice-8b — smaller 8b fine-tuned FidoNet voice model | huggingface.co/jasondostal/carrier-voice-8b |
| carrier-voice-moe — midsize 26B-A4B MoE fine-tuned FidoNet voice model | huggingface.co/jasondostal/carrier-voice-moe |
| BBS Voice / FidoNet dataset — the training split | huggingface.co/datasets/jasondostal/fidonet-bbs-voice |
Base models: Qwen3-8B and Gemma-4-26B-A4B. Reverse-engineering tooling: radare2 and Ghidra. Training on rented RTX 4090 and H100 GPUs via RunPod. Original TriBBS 5.01 by TriSoft, 1994 — shareware, and not affiliated with or endorsed by anyone; this is a homage.