W.O.P.R. // REAL-WOPR PROJECT

PSTN — DIAL-UP, 300/1200 BAUD, PUBLIC NORAD — LEASED, 9600, NOT PUBLIC BUS — LOCAL, PRIVATE, NO DIAL-IN HOME PC THE CALLER PAN AM (212) 555-0177 PROTOVISION (408) 555-0163 PACIFIC TEL (311) 555-0100 SEATTLE SCHOOLS (206) 555-0142 NORAD TERMINAL OPERATOR CONSOLE REFERENCE ALSO ON PSTN SCHOOL-DB NOT DIALABLE SCHOOL SAME MACHINE W.O.P.R. (311) 486-0623 — PSTN WOPR — NORAD ANSWERS ON BOTH

Three networks. pstn is the public phone network, where anything with a number can be dialled from anywhere. norad is a leased line inside the building, with no number to dial. bus is local to one machine and reaches nothing outside it. W.O.P.R. answers on the first two: the same computer that picks up a call from a bedroom in Seattle is on NORAD's internal net. That is the film's premise, and it is one line in a manifest.

THE EXCHANGE — WHO CAN DIAL WHOM

HOME PC TERMINAL DIALUP-300 PAN AM / PANAMAC (212) 555-0177 COBOL OPEN - NO GATE SEATTLE SCHOOL DIST (206) 555-0142 BASIC GATE: PENCIL / 3-STRIKE PROTOVISION (408) 555-0163 6502 ASM GATE: DEV CATALOG LOCK PACIFIC TELEPHONE (311) 555-0100 C GATE: CRAFT VERIFY SYSTEM/1 DIAL WOPR CARRIER (311) 399-2364 GAMES WOPR/1 FORTRAN CORE JOSHUA JOSHUA/1 GATE: BACKDOOR OPERATOR TIER GATE: WOPR_OPERATORS NORAD TERMINAL ONLY NORAD TERMINAL LEASED-9600 OPERATOR CONSOLE BIG BOARD + PANEL INTERNAL-BUS WOPR PANEL OBSERVE GTW FEED LIVE BIG-BOARD STREAM LEASED / INTERNAL ONLY DIALUP: FEED NOT AVAILABLE HUB SWITCHBOARD RELAYS OPAQUE FRAMES TRUNK/1 FEDERATED EXCHANGES OPEN DIAL-IN GATED - THE LOCK LIVES INSIDE THAT SYSTEM, NOT THE BRIDGE

THE MODULES

#ModuleTechResponsibility
1WOPR Core ("the Mainframe")Fortran 90 (gfortran)Game theory, state mechanics, brute-force simulation. Pure compute; reads state from stdin, writes state to stdout. No network, no DB.
2Comms Simulation LayerTypeScript/Node middleware over WebSocketImposes the era's constraints (baud, latency, framing, dial-up handshake) on every link between surfaces and the bridge. Toggleable — "the limitations at that time," running as real code.
3API / Emulation BridgePython + FastAPIThe execution wrapper and the connection monitor. Spawns the Fortran executable per request, parses stdio, and holds what each session is attached to — a game, Joshua, or the NORAD operations console — sending every non-reserved line to that program. Owns state read/write to the databanks.
4NORAD DatabanksNeon (plain Postgres)Sessions, game states, historical event logs, DEFCON "clearances." Source of truth.
5Joshuaselectable: Anthropic Claude API / Common Lisp F.D.P. / scriptedThe conversational persona. Three engines behind one interface (JOSHUA_ENGINE): the modern LLM substitution, the period-Lisp Falken Dialogue Processor, or the 1983-honest keyword engine. All emit terse teletype responses.
6SurfacesNext.js (React) + shared CRT component libFive front-ends (see §5), each sitting behind a different simulated link.

UI ENDPOINTS

SURFACEPATHROLE
HOME TERMINAL/terminal/Bedroom dial-up console; public phone book and 300-baud carrier.
NORAD TERMINAL/norad/Operator console; amber CRT, DEFCON header, leased-9600 command link.
NORAD BIG BOARD/bigboard/War-room visualization; GTW feed, DEFCON board, world/polar maps.
WOPR PANEL/panel/Machine-room cabinet face; lamp banks and launch-code readout.

EXECUTION MODEL

The Fortran core is a stateful, interactive program. The bridge in front of it is stateless HTTP/WebSocket, with the databanks holding the truth. The two meet the simplest way we could find: spawn a fresh core process for every move, and reload the state each time.

  1. A move/command arrives at the bridge (through the comms layer).
  2. The bridge loads the relevant game_state row from the databanks.
  3. The bridge spawns a short-lived Fortran process, writes the serialized state + the new input to stdin, and reads the resulting state from stdout (wire format in games.md).
  4. The process exits. The bridge persists the new state to the databanks and emits output back through the comms layer.

What that buys:

A 1980s mainframe would not fork a process per move; it would keep one resident program multiplexing many terminals. But the contract — load state, compute, store state — is the same shape as the era's batch and transaction processing. We document the difference rather than hide it.