Deep Dive: Simulating DATAPAC, Canada's Forgotten Internet
Rebuilding the DATAPAC PAD experience in code — the command loop, X.25 NUAs, and five period-authentic hosts behind a 300-baud prompt.
On this page
Rebuilding the DATAPAC PAD experience in code
The prompt is a single asterisk. That’s it. You dial in at 300 baud, wait for the banner, and then you’re staring at * — waiting for you to tell it where to go. DATAPAC was Canada’s packet-switching network from 1977 to 1998, and for two decades, that asterisk was the gateway to databases, email systems, and bulletin boards across the country.
I wanted to rebuild that experience: not the X.25 protocol stack (that would be a different article), but the feel of sitting at a terminal, typing C 30200100100, watching the PAD do its work, and landing on a host that behaved like something you might have dialed in 1986. The constraint that shaped everything: authenticity lives in timing and vocabulary, not protocol fidelity.
The PAD as a State Machine
The smallest behaviour is the command loop. The PAD accepts a line, and that line either routes you to a host or reconfigures how the PAD behaves. Everything else hangs off that loop.
The state machine is the spine:
CONNECT— show the banner and speedPAD_PROMPT— read commandsCALLING— simulate setup delayCONNECTED— forward input to a hostDISCONNECT— hang up
That gives me a causal order that reads like a schematic: banner, prompt, call, host, clear. Each state knows what input it accepts and where it can transition.
The Banner: Setting the Tone
DATAPAC didn’t open with a splash screen. It opened with a phone line and asterisks.
DATAPAC
CONNECTED TO DATAPAC
TELECOM CANADA DATAPAC NETWORK
1986-05-01 14:32:17 EST
TERMINAL: TTY
SPEED: 300 BPS
*
The CONNECTED TO DATAPAC line comes after a 500ms delay — enough to suggest the network acknowledged you. The date and time are real (generated from Date.now()). The terminal type and speed are hardcoded because the emulator doesn’t negotiate them.
When you’re connected to a host and press Escape, the emulator prints *** PAD RECALL *** and returns to the command loop. That particular phrasing is a memory trigger for anyone who used the real network, so I kept it verbatim.
Commands That Shape the Experience
The PAD command set is intentionally terse. I implemented exactly the commands that create the sensation of “this terminal is doing something on my behalf”:
C <nua>/CALL <nua>— connect to a hostCLR— clear the connectionSTAT— show connection stateSET <param>:<value>— configure PAD parametersPAR— display current parametersPROF— reset parameters to defaultsDIR— list available hostsHELP— command referenceBYE— disconnect from DATAPAC
STAT and PAR are the ones that make this feel real. STAT gives you a state readout — whether you’re connected, to what NUA, for how long. PAR surfaces a thin slice of the X.3 parameter space:
P1PAD recall (escape key behaviour)P2echo modeP3forward characterP4idle timerP6service signalsP12flow control
That’s not the full X.3 spec; it’s the smallest subset that creates the illusion of configurability. The SET 2:0 command actually works — it turns off local echo, and the line input handler respects that setting.
NUAs and the Directory
DATAPAC addressing is NUA-shaped: long numeric strings that look like phone numbers but route through packet switches. In the emulator, I map five NUAs to five virtual hosts:
| NUA | Service | What It Was |
|---|---|---|
30200100100 | ENVOY 100 | Telecom Canada videotex |
30200200200 | iNET 2000 | Electronic mail service |
30200300300 | INFO GLOBE | Globe and Mail database |
30200400400 | QL SYSTEMS | Quicklaw legal database |
30200555555 | DATAPAC BBS | Community bulletin board |
The directory command (DIR) lists these in a formatted table. I allow partial NUAs to resolve because real users typed short forms and the network did the rest. If nothing matches, the PAD returns CLR DTE NC (clear, DTE not connected) and drops you back to *.
The 800-Millisecond Pause
Authenticity lives in the delay. After CALLING 30200300300, the backend waits ~800ms before printing COM (connected) or clearing the call. That single pause makes the network feel external rather than instantaneous.
CALLING 30200300300
COM
INFO GLOBE - THE GLOBE AND MAIL ELECTRONIC LIBRARY
The delay is hardcoded in attemptConnection(). I tried shorter values; they felt wrong. I tried longer values; they felt broken. 800ms is the threshold where the network has presence without frustration.
The Hosts Themselves
Each host is a small modal menu implemented as a state machine within the backend. They’re not deep; they’re plausible.
ENVOY 100 is a demo videotex service. You log in with any username, and it welcomes you with a menu: news headlines, weather, stock quotes, electronic mail, directory. The news mentions EXPO 86 and the new loonie. The weather lists five Canadian cities. The mail system tells you “0 NEW MESSAGES” because it always does.
iNET 2000 is an electronic mail system that never has mail. You enter a mailbox ID, it greets you, and every function returns “NOT AVAILABLE IN DEMO.”
INFO GLOBE accepts a search term and admits it has no database: “0 ARTICLES FOUND (DEMO MODE - NO DATABASE ACCESS).” The shape is right even if the content is empty.
QL SYSTEMS lists legal databases — Supreme Court Reports, Federal Court Reports, Ontario Law Reports, Canadian Criminal Cases — and refuses to open any of them.
DATAPAC BBS is the only one that feels alive. It has two messages from SYSOP and GUEST dated 1986, an active users list, and an info screen explaining that the BBS runs on the DATAPAC X.25 network. Message boards are always the easiest way to suggest activity without building a real persistence layer.
These are not accurate reconstructions of the real services. They’re accurate reconstructions of the shape of those services — the login prompts, the menu structures, the vocabulary.
What the Implementation Teaches
Building this backend surfaced a design principle I keep rediscovering: the interface is the architecture. The five states, the nine commands, the six parameters — that’s not a simulation of X.25. It’s a simulation of what X.25 felt like to use.
The real protocol had virtual circuits, flow control windows, packet sequencing, and a hundred details that never surfaced to the user at a 300-baud terminal. By starting from the user experience and working backward, I could ignore all of that and still produce something that triggers recognition in anyone who was there.
DATAPAC is Canadian infrastructure history, but it’s also a particular interaction pattern: a prompt, a directory, and a command loop that made the rest of the network legible. The emulator doesn’t just keep the names alive; it keeps the pace alive.
When you can dial 555-0325, see the banner, type C 30200100100, and watch the PAD do its work, the network stops being a Wikipedia article and becomes a system again. That’s what preservation means for something that was never meant to be preserved — not the protocol, but the rhythm.
Phone: 555-0325
See also: Deep Dive: Bell 103 FSK Modem