JASON_
UP 00:00LOCAL --:--:--
jason-os · v4.2.1 · console● link online
jason@console:~$
operatorJASON
booting role…

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.

all
games
demos
tests
tools
frames per second60
canvas surfaces0
cursor0,0
objects mounted12
scroll to archive ▾

01/whoami

// cat /home/jason/profile.md

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.

0years coding
0objects in archive
0renders logged
0lines written

02/the archive

// games · demos · tests · tools  |  twelve objects, all in-browser
game · 2023 · canvas 2d

NEON SNAKE

A grid-eater with a glow pass, 3 KB of source, no assets. Speed ramps every apple. Best score is stored locally.

canvas2.9 KB12×24 grid
play on pageplayable
demo · 2024 · sdf raymarch

RAY/1

Signed distance fields, 45 steps per pixel, progressive band rendering, 140×90 pixels upscaled. The scanner you can drive below.

jsno webglwarp param
demo · 2022 · voxel terrain

VOXEL FORGE

Value-noise heightmap with flat-shaded columns, sunrise palette, 12 000 boxes. Runs on a laptop at 40 fps.

noisedepth sortlight map
test · 2021 · path tracer

PATH TRACER

Progressive Monte-Carlo renderer. Each sample is a bounce; noise gets quieter as the counter climbs. 16 spp is a portrait.

spp countercausticsslow
bench itsource
game · 2020 · n-body

GRAVITY SANDBOX

Softened N-body with trails, collision merge, and a score for surviving the least stable orbit you can construct.

verlettrailsleapfrog
playableplayable
demo · 2019 · L-system

NEURAL GARDEN

String-rewriting growth: one rule, four terminals, 2000 segments per frame. It grows like coral and dies like a fern.

axiomrule set60 fps
demodemo
demo · 2023 · perlin flow field

PERLIN RIVERS

Nine thousand particles follow a 3-D noise field and leave 1-pixel trails. After a minute the drawing becomes a landscape.

flow fieldadditiveseeded
demodemo
tool · 2018 · arbitrary precision

FRACTAL ZOOMER

Mandelbrot with big-number mode past 1e13 depth. The zoom stops being maths and starts being geography.

big floatWB modetiles
tooltool
game · 2017 · procedural

DUNGEON SEED

Room-graph generator with BSP splits and a guaranteed route to the boss. Same seed, same map, forever.

BSPseedableroguelike
playableplayable
test · 2016 · dsp

SPEECH SHARD

A 300-line formant synthesiser. Three oscillators, a filter sweep, and it says words that are almost English.

web audioformantstiny
run testssource
test · 2024 · benchmark suite

BENCH/OS

Four live benches — JS core loop, string churn, DOM churn, canvas fill-rate. Runs on your machine, right here.

liveno depsper core
demo · 2024 · markov chain

AI SAGE

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.

no model1.8 KBtypes live

03/arcade

// neon snake, 24×18 grid, 2.9 KB · arrows / wasd · space = pause · r = reset
telemetry
score0
best0
ticks / sec9.1
stateready
grid24 × 18
tail length3

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.

04/render engine

// RAY/1 · progressive band renderer · one band of rows per frame
resolution140 × 90
steps / pixel45
scan row0 / 90
renderer fps0
passnormal + fresnel + key light
scene parameters
core map function
// signed distance to the scene, per ray step function map(x,y,z){ const c=cos(A), s=sin(A); const px=x*c-z*s, pz=x*s+z*c; // rotate about Y const r=1.15+0.35*sin(A*1.7); // warp const q=hypot(px,pz)-r; const torus=0.5*(hypot(q, y-0.15)-0.42); const sphere=hypot(px, y+0.9, pz)-0.6; const floor=y+1.0; return min(torus, sphere, floor); }

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.

05/the small models

// AI SAGE · order-2 markov chain, trained in-page on my own prose
sage.transcript● chain active
seed>
the shelf
  • Markov order-2 — 22 sentences, 1.8 KB, writes sci-fi in this terminal.trained in-page · 0 MB
  • Formant synth — 3 oscillators + a filter sweep, says words that are almost English.web audio · 300 lines
  • Cellular automaton — 1-bit rule 30, drawn as weather.canvas · 40 lines
  • Path finding — A* on a 200×200 cost field, 4 ms per solve.js · 120 lines
  • Tiny classifier — logistic regression on my own commit messages. It knows when I lied.python · 2 KB

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.

06/renders

// cgi archive · path-traced, voxel, lidar, liquid · each card is a frame
Neon district, path traced
neon district · 4k22 min / frame
Volcano, lidar scan
volcano · lidar9 passes
Ship hangar, volumetric fog
hangar · volumetric400 steps
Deep space dust field
dust field · n-body9 000 bodies
Liquid metal simulation
liquid metal · sim3.2 M particles
Orbital ruins at dawn
orbital ruins · dawnvoxel forge

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.

07/the reference frame

// sci-fi shelf · the reason everything I build has a console in it

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.

Every render is a negotiation between patience and light.— jason, console log
  • Neuromancer — Gibson. The street. The console. The first time a machine had a voice.★★ re-read ×4
  • A Fire Upon the Deep — Vinge. The zones. Slow-speech. AI as ecology.★★ re-read ×3
  • Blindsight — Watts. Consciousness as an optional module. Best AI writing in the shelf.★ owned
  • Revelation Space — Reynolds. The Inhibitors. Great machines, bad manners.★★ re-read ×2
  • Solaris — Lem. The ocean that answers. The best novel about not-understanding.★ owned
  • Void Riser — Ching. Ships as organisms. My favourite cover.★ owned
  • Dragon in the Sea — Ching. Cold, mechanical, intimate. Ships as animals.★ owned

08/transmission log

// devlog · most recent entries, newest first

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.

SAGE learned to stop repeating

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.

Path tracer, 16 samples

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.

Snake: 2.9 KB, no assets

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.

BENCH/OS: DOM churn is the honest one

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.

09/tests & benches

// bench/OS · four live tests, run on your machine, measured here
js core loop (integer ops/sec)—
string churn (MB/sec)—
dom churn (nodes/sec)—
canvas fill-rate (m² /sec)—
what these mean

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.

suite runs0
best core loop—

10/contact

// open channel · send a render, a bug report, a book
mail[email protected]
codethe archive
devlogtransmission log
statusbuilding · always
send a message
// cg i · games · ai · sci-fi · code · demos · tests · raymarch · renders · ships at 60 fps · // 12 objects mounted