A World of Blinkenlights

jpdias1 pts0 comments

A World of Blinkenlights

João Pedro Dias

/notes

/publications

/talks

/cv.pdf

/contact

/rss

A World of Blinkenlights

July 11, 2026

iot

harware

cloudflare

wargames

16 minutes to read

There is this scene in WarGames (1983, which I have watched an embarrassing number of times) where a teenage hacker’s modem connects to what he thinks is a games company. It’s actually the War Operation Plan Response (WORP) computer and the big screen fills with a world map: bombers, submarines, missile trajectories, each ending in a flashing symbol where a warhead is about to land. For anyone passionate about old computer systems, that map with the blinking lights was what a serious computer looked like. These days, a printed world map, some RGB LEDs, and a WiFi-enabled microcontroller can do the same: except the cities are my Cloudflare traffic from the last hour, and the only thing about to be wiped out is a politely worded 404 page.

But why?

The first why is the so-called blinkenlights tradition. If you have spent enough time around computer rooms of a certain vintage, or around hacker culture at all, the term is unremarkable. The Wikipedia page is worth a detour for the classic mock-sign alone:

The point of the joke is that engineers used to look at blinking lights and understand something from them: on PDP-8 front panels, on the Altair 8800 (I totally recommend taking a look into the Relay Computer playlist by DiPDoT on Youtube for more blinkenlights shenanigans), and on the Connection Machine in the eighties. They were the diagnostic UI of last resort. The blinkier it is, the harder the CPU is working. Sometimes that was all the visibility an operator got. I always enjoyed blinkenlights myself, whether it’s my router or switch’s ethernet activity LEDs or my NAS’s disk activity blinks, so why not build something where the blinks are the whole point?

The second why is that scene in WarGames, which is, in practice, the pop-culture version of the same idea. A world map behind the WOPR console lights up red wherever a Soviet warhead is about to land; that map is more or less a glorified blinkenlights panel, painted with the political geography of the cold war so the audience knows what they are rooting for. Replace “warhead” with “HTTP error from a Cloudflare edge,” and you have, more or less, the same visual: a panel, a map, lights that flash when something is happening somewhere in the world.

Building the Map

I wanted something physical: not a printout taped to a wall, not a poster frame, and not another screen (that’s already been done, like this WarGames-themed firewall events visualizer), but an actual object with depth and weight. There’s something satisfying about a physical LED blinking that a pixel on a screen doesn’t have; it’s tangible, part of what’s called physical computing. So I committed to the full adventure: an SVG map with what seemed like the right number of divisions and resolution, then 3D printing it, painting, drilling, and gluing in way too many LEDs.

From GeoJSON to SVG to 3D Print

The starting point was Natural Earth’s GeoJSON, a freely available vector dataset of world country boundaries. I asked OpenCode’s Zen models to write a Python script that reads the GeoJSON, groups countries into 50 regions, projects lat/lon coordinates onto a 2000×1000 SVG canvas using a simple equirectangular projection, and spits out an SVG file with one per region. Three prompts and a couple of corrections got me there:

import urllib.request, json, re

URL = "https://raw.githubusercontent.com/nvkelso/natural-earth-vector/master/geojson/ne_110m_admin_0_countries.geojson"<br>OUT = "world_map_50regions.svg"<br>W, H = 2000, 1000

with urllib.request.urlopen(URL) as resp:<br>data = json.loads(resp.read())

features = data["features"]

REGIONS = [<br>["United States of America"],<br>["Canada", "Greenland"],<br>["Mexico"],<br>["Guatemala", "Belize", "Honduras", "El Salvador", "Nicaragua", "Costa Rica", "Panama"],<br>["Cuba", "Jamaica", "Haiti", "Dominican Rep.", "Bahamas", "Trinidad and Tobago", "Puerto Rico"],<br>["Brazil"],<br>... # 50 regions total

def project(lon, lat):<br>x = (lon + 180) / 360 * W<br>y = (90 - lat) / 180 * H<br>return (round(x, 2), round(y, 2))

Each region’s polygon rings get flattened into a single SVG path (M{x},{y} L{x},{y} ... Z), and the whole thing lands as a clean XML file. I loaded the SVG into Bambu Studio, extruded the paths into a flat relief model, and sent it to a Bambu Lab A1. The build plate is 256×256 mm, so the map had to be split into two parts — left hemisphere and right hemisphere — joined along a seam somewhere in the Atlantic.

I did not have white filament on hand, so both halves came out in black PLA, spray-painted white afterwards. Between the seam alignment and a slightly patchy paint job, the map has its share of small imperfections up close — some country boundaries are a hair off where the two halves meet, and a few regions show thin spots where the black peeks through the paint. None of...

world blinkenlights computer something geojson wargames

Related Articles