56k.rip is the busiest of my side projects. It's a fake 1997 PC that gets online the old way: open Dial-Up Networking, press Connect, and sit through the off-hook click, the touch tones and about twenty seconds of handshake. Then the home page shows up one block of text at a time.

Here's how it's put together.

The modem suffers, the server doesn't

Every page on the fake web is a manifest with a declared byte size. A small pure function takes that manifest plus your line speed and turns it into a list of load events: this block of text now, this row of the photo a bit later. The real payload is tiny. The modem just acts like it isn't.

So the same page really is slower on 28.8 than on 56K, photos sharpen line by line, and downloads crawl and mostly fail.

The detail I'm weirdly proud of: the 56K modem never connects at 56,000. Real ones were capped around 53k downstream and you usually got some ugly number like 49,333. So that's what you get.

Nothing reads a clock

The whole simulation is a reducer. State, an event and a seeded random number generator go in, new state and a list of effects come out. It never touches the DOM, the audio or the time. React is the only place effects actually run.

That makes it reproducible. The seed defaults to your calendar date, so everyone gets the same stalls, the same connect speed and the same minefield for a day. Add ?seed=7&fast=1&pickup=1 and I can replay one exact session at ten times speed, with someone picking up the extension on the next click. That's how over a thousand tests can cover a thing that's mostly waiting.

Sound is data too

Almost every sound is synthesized in the browser from a written score: an array of tones and noise bursts, scheduled on the Web Audio clock in one pass. Startup chime, shutdown, the blue screen, an inkjet printer that jams out loud.

The handshake is the one exception. It's a CC-licensed recording of a real modem call, credited on the site. The recording and the score both emit the same stage markers, so the connection log can't tell which one is playing.

Pictures with no image files

Every picture is a list of drawing ops rendered to canvas, then crushed to the 216-colour web-safe palette with a 4x4 ordered dither. The window chrome is 98.css, so I didn't have to draw a single bevel.

What's on the fake internet

Mail that streams in over the modem, a chat lobby, a minesweeper game, a card game, a paint program, a command prompt and screen savers. Plus period pages: a fishing site, recipes, a guestbook, a webring, classifieds and TV listings. No account to make.

Stack

React and Vite on Vercel, Vitest for the tests, and one small serverless function for the chat lobby. The sim itself is plain functions, no library.

Try it

Sound on: https://56k.rip

Grew up on a Mac? https://dialup.rip is the other side of the family computer war. The rest of what I build lives at https://culdesac.site.

What's the noise or detail you still remember about getting online?