INT - Signals in the Dark
Published 19/03/2026
I've always been drawn to the aesthetics of signals intelligence. Not the reality of it - I have no love for actual surveillance. And yet I live in one of the most heavily-surveilled cities in the world. C'est la vie.
But the atmosphere, the intrigue. Amber phosphor on deep brown-black. Dense numeric grids flickering on CRT monitors in dark rooms. The kind of interfaces you'd see in a 1970s listening station that someone forgot to decommission.
When I started building intora.net, that was the territory I wanted INT to occupy. Surveillance fragments. Signals not meant to be seen.
DRIFT
INT/001 was the hello world. The simplest expression of the series constraints: an invisible force field made visible through text characters.
The concept is straightforward - a 2D simplex noise field maps flow angles to oriented text characters across a monospace grid. Box-drawing characters (─ ╲ │ ╱) stream in currents across a dark amber field, cycling through emergence, flow, turbulence, dissolution, and reacquisition every 42 seconds. "SIGNAL LOST" appears in the terminal phase. Then it rebuilds from a new seed.
Getting it to look and feel right was less straightforward.
The first version looked like a quilted patchwork. The noise scale was too high (0.03), which meant flow lines were curving every few cells - no sense of direction, just texture. Dropping the scale to 0.011 doubled the flow line length and suddenly the piece had currents. Broad sweeping movements you could follow across the canvas. Adding 3-octave fractal noise on top gave those currents subtle internal turbulence without losing the larger structure.
The negative space took longer to get right. Initially the magnitude threshold was 0.15, meaning almost every cell rendered a character. The canvas was dense but flat - no breathing room, no compositional contrast. Raising the threshold to 0.30 meant roughly a third of the grid was dark background, and that darkness gave the flowing characters somewhere to emerge from. The piece stopped being a texture and started being a composition.
One iteration that felt absurdly obvious in hindsight: the accent orange was invisible for the first few builds. I had the threshold set at 0.92 - anything above that got the hot #E86A3A colour. But fractal noise with three octaves practically maxes out around 0.85-0.88. The orange veins I'd designed for didn't exist because the numbers couldn't reach them. Dropping the threshold to 0.82 made them appear as thin concentrated streaks through the amber field. Sometimes the bug is just arithmetic. Classic.
DRIFT has no audio. It's purely visual - the surveillance aesthetic at its simplest, cycling endlessly.
STATION
INT/002 is where the series found its voice.
A number station intercept. Somewhere on the shortwave band, a coded transmission broadcasts to an unknown recipient. You've tuned in. For 42 seconds you watch structure emerge from noise - digits freeze into groups of five, groups resolve into a message, then the signal degrades and is lost. The next cycle, a different frequency, a different message. You are always too late and never quite sure what you witnessed.
The message pool is 16 entries drawn from Cold War signals territory - coordinates for Brandenburg Gate, Bletchley Park, the UVB-76 transmitter location. Designations. Phrases that could mean anything: "ALL SIGNALS ARE FINAL." We're not meant to have seen these. The frequency display reads 4625.00 kHz - the UVB-76 "Buzzer" frequency, because if you're going to commit to the bit, commit properly.
STATION was also the first piece with audio. Shortwave static built from bandpass-filtered white noise with AM modulation, a carrier tone that locks from detuned to 440Hz as the signal is acquired, 880Hz beep markers when each group transmits. The audio is muted by default - the piece works as pure visual - but unmuting it transforms the grid from abstract pattern into intercepted broadcast. Claude's analysis of the Tone.js synthesis chain helped me get the phase-specific audio evolution right - the way the bandpass frequency sweeps during scanning, steadies during lock, then goes chaotic during corruption. Getting that sweep to feel like someone turning a dial rather than a parameter changing linearly was one of those details that only matters if you notice it, but you'd notice if it was wrong.
Five Versions of the Same Problem
STATION nearly didn't ship in a form I was happy with. The core tension was visibility versus atmosphere - how do you make structured five-digit groups readable against a dense field of random digits without destroying the atmospheric density that makes the piece work?
Version one had the best atmosphere. Full density, every cell churning with random digits, the transmission groups embedded in the noise. Problem: the groups were invisible. You couldn't actually see the signal.
Version two solved readability by culling about 82% of the background during transmission. The groups were clearly visible. The atmosphere was gone. The grid felt hollow, like someone had punched a hole in the static.
Versions three and four tried colour dimming - reducing the brightness of background cells so the groups stood out by contrast. Three had a bounding box that created a visible rectangle around the transmission zone. Four removed the box but the aggressive dimming changed the piece's character entirely.
Version five was the breakthrough, and it came from thinking about what a radio signal actually does to nearby static. The solution was a radial gradient - a six-step colour gradient radiating outward from each revealed group centre. Cells immediately adjacent to a group fade toward background; cells five or more cells away render at full noise brightness. The effect is that the signal creates its own clearing, like radio interference pushing static aside, while the dense noise field remains everywhere the signal is not.
Full atmospheric density, full signal legibility. I added a message blink on top - the decoded text alternates at 500ms with the original encoded digits - because the uncertainty of "which version is real" felt right for the piece's atmosphere.
The Constraint Working For You
Both pieces are built from the same materials - Unicode characters on a canvas, ten colours from the Amber Schematic palette, Geist Mono at 14px. Every visual decision passes through the filter of what text characters can express.
With DRIFT, that filter forced me to think about flow in terms of eight directional characters and a magnitude threshold. There's no gradient, no smooth curve - just oriented glyphs snapping to the nearest 45 degrees. The roughness that produces is part of the aesthetic. It reads as signal degradation, which is exactly what the series is about.
With STATION, the character constraint meant the entire number station narrative - scanning, acquisition, transmission, decode, corruption, loss - plays out in digits on a grid. The fact that the encoded and decoded states are both made of the same characters creates an ambiguity that a richer medium would lose.
The INT pieces and their iteration history are live at intora.net/int, with full analysis pages documenting every parameter decision. Interested in the overall reason for these constraints? Check the umbrella post for this series.