The band renderer works
Rendering seven rows per frame kills the frame budget problem. The image arrives like a scan. 45 steps per pixel at 140×90 holds about 20 fps on the laptop, 34 on the 24-core rig.
I build small things out of light: games, demos, tests, renders, tiny models. Most of them live in this archive, running in your browser at sixty frames a second.
Computers were the first thing that made sense to me: you say a thing precisely and the machine does it. That precision is the whole appeal — no negotiation, no tone of voice, just a contract. I started writing games at eleven on a machine with 64 megabytes of RAM, and I never really stopped. The games got smaller; the machines got bigger.
CGI is the part where maths becomes a photograph. A ray goes out, hits a surface, and comes back with a colour attached to it, and if you throw enough rays at a scene the scene starts to look like a place you could stand in. I like the moment when a render stops being pixels and becomes weather.
AI is the newest room in the house. I keep small models the way other people keep plants — underfed, slightly dramatic, occasionally astonishing. My favourite is a Markov chain in this page, in the terminal on the right, writing sci-fi sentences out of the scraps of sentences I fed it. It has no idea what it is saying, and it is occasionally the best writer on the site.
Sci-fi is the reference frame. Everything I build has a faintly shipboard quality: a console, a log, a transmission with a long delay. Games are the same genre at a smaller scale — you press a key and the universe reloads.
The tests are honest. I keep benchmarks, fractal zoomers, path tracers, phoneme synths. They are not polished, and I like that: a test is a sketch of an idea with the numbers still visible. The archive below is all of it, twelve objects, each one running here.
A grid-eater with a glow pass, 3 KB of source, no assets. Speed ramps every apple. Best score is stored locally.
Signed distance fields, 45 steps per pixel, progressive band rendering, 140×90 pixels upscaled. The scanner you can drive below.
Value-noise heightmap with flat-shaded columns, sunrise palette, 12 000 boxes. Runs on a laptop at 40 fps.
Progressive Monte-Carlo renderer. Each sample is a bounce; noise gets quieter as the counter climbs. 16 spp is a portrait.
Softened N-body with trails, collision merge, and a score for surviving the least stable orbit you can construct.
String-rewriting growth: one rule, four terminals, 2000 segments per frame. It grows like coral and dies like a fern.
Nine thousand particles follow a 3-D noise field and leave 1-pixel trails. After a minute the drawing becomes a landscape.
Mandelbrot with big-number mode past 1e13 depth. The zoom stops being maths and starts being geography.
Room-graph generator with BSP splits and a guaranteed route to the boss. Same seed, same map, forever.
A 300-line formant synthesiser. Three oscillators, a filter sweep, and it says words that are almost English.
Four live benches — JS core loop, string churn, DOM churn, canvas fill-rate. Runs on your machine, right here.
Order-2 word chain trained on 22 sentences of my own sci-fi prose. Give it a seed word and it will finish the thought.
The glow pass is a single shadowBlur call on the head, which is the cheapest trick in canvas 2D. The tail gradient is a linear interpolation in HSL. Everything else is arithmetic.
No OpenGL, no shaders — just a loop, a typed ImageData buffer and the pixel array. The band renderer draws seven rows per frame, so the image builds top-to-bottom like a scanner. When the frame finishes, the scene rotates by 0.09 rad and the scan restarts.
I like small models because they are readable. You can print the whole thing, and the failure mode is visible: a chain that repeats because the corpus is thin, a weight that went the wrong way. Big models fail invisibly. Small ones fail in front of you.
Renders are the long ones. Each card carries the cost of the frame, because the cost is the interesting part — the number of bounces, the number of steps, the number of hours the machine spent looking at a thing I invented.
Sci-fi is the genre that explains technology to people who do not build it, and the genre that lets people who build it be afraid in public. It has the best console culture: a ship, a crew, a screen, a delay. Every interface I write has a log, a timestamp, a status light, because that is the aesthetic I fell into when I was twelve.
Rendering seven rows per frame kills the frame budget problem. The image arrives like a scan. 45 steps per pixel at 140×90 holds about 20 fps on the laptop, 34 on the 24-core rig.
Order-2 chains loop when the corpus is thin. Added three sentences, one stop condition, one cap at 300 tokens. It writes better than it has any right to.
Glossy surfaces need importance sampling or the noise never leaves. Sixteen samples per pixel is enough to tell what the object is; sixty is enough to tell what it is made of.
Cut the palette to four colours and the file size dropped a third. Constraints are the whole design process. Best score on this machine: 41.
Inserting 2000 nodes measures the browser, not the maths. It is the benchmark that tells you what your machine is doing while you are reading this page.
The core loop is a tight integer ladder — it reports what JIT warm-up gives you today. String churn is a `+=` loop with a growing buffer. DOM churn is the honest one: 2000 nodes created, appended, removed. Fill-rate is raw canvas area per second on a 400×300 surface. Numbers are per-run averages, so run it three times and take the best.