Skip to main content
Back to Articles
2026 / 02
| 6 min read

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.

emulator networking history x25 datapac
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 speed
  • PAD_PROMPT — read commands
  • CALLING — simulate setup delay
  • CONNECTED — forward input to a host
  • DISCONNECT — 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 host
  • CLR — clear the connection
  • STAT — show connection state
  • SET <param>:<value> — configure PAD parameters
  • PAR — display current parameters
  • PROF — reset parameters to defaults
  • DIR — list available hosts
  • HELP — command reference
  • BYE — 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:

  • P1 PAD recall (escape key behaviour)
  • P2 echo mode
  • P3 forward character
  • P4 idle timer
  • P6 service signals
  • P12 flow 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:

NUAServiceWhat It Was
30200100100ENVOY 100Telecom Canada videotex
30200200200iNET 2000Electronic mail service
30200300300INFO GLOBEGlobe and Mail database
30200400400QL SYSTEMSQuicklaw legal database
30200555555DATAPAC BBSCommunity 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