Research
Papers and write-ups from the work, and the method behind it.
Write-ups
2026
-
Milestone 4: making the frame fast
Applying the optimizations shipped engines use once the image is right, checking every stage against them, and retraining the network for the new input.
-
Buffers and shapes
Give our data rows and columns, make ownership explicit, and add matrices on the GPU.
-
Two views of a thinking model
What generated thinking tells us, what an activation verbalizer adds, and how to read the places where they disagree.
-
Choosing a model we can run
Comparing two Qwen3/NLA pairs on a 3090 Ti, and why the 8B pair is the starting point for Dolittle.
-
Milestone 3: turning samples into an image
Building and training a reconstruction model, running it inside the renderer, and seeing what survives denoising and upscaling.
-
Milestone 2: reusing work with ReSTIR
Keeping useful paths, giving the glass its own work, and measuring what reuse buys. The connections to inference run through the pipeline.
-
The cradle
Find a GPU, run our first C# kernel, and check every result before building on it.
-
Prologue: Getting the cradle ready
Set up the tools, build the starting program, and check the dependencies we’ll use in the first lesson.
-
Milestone 1: building the baseline
The scene, the reference image, and the measurements behind the first milestone, including the bugs that plausible images did not reveal.
- Charlotte now runs on an iPhone, experimentally: Qwen3 0.6B loads and answers in the browser, with a short context.
- Serenity's first lit frame: a brass sphere on a checkerboard at night, lit by two fireflies, a nod to Turner Whitted's 1980 spheres over a checkerboard.
- On Monday I said I'd go back to Shannon and look for the proof behind a transformer's numbers.
- Qwen3 0.6B decoding at 270 tokens per second, entirely in a Chrome tab on an M3 Max.
- Debrief: what building Charlotte taught me
- Review then caught what the test couldn't.
- While building Charlotte, I started tagging every number in a transformer's forward pass as derived, fitted from experiments, or convention.
- While building Charlotte, my latest inference harness, I started asking harder questions about every step: why this way, and why this number.
- I added data structures and algorithms to my C++ performance corpus: 54 new guidelines in two categories, one for CPU hot paths and one for GPU.
- Nobody reads my posts about GPU memory bandwidth. Let's see if they'll play them.
- Laurie Kirk's CppCon keynote names something inference engineers deal with every day.
- So I built Seymour, a hands-on tour of why your GPU is starving.
- Reasoning Tokens Steer the Trajectory
- C++ evaluates every function argument before the call, so value_or and try_emplace build a fallback value even when it is never used.
- I spent half this week sure my local model had a reasoning problem.
- We added WebAssembly to our C++ performance corpus.
No write-ups match.
How the work runs
- Start where the field started. The tokenizer work begins with Shannon’s 1948 paper, not with the latest tokenizer.
- Build it by hand. A library hides exactly the choke points worth studying, so the builds hand-roll what a library would provide.
- Treat a hyperparameter as the place the theory stopped. A number that has to be tuned is a question that has not been answered yet.
- Credit prior art before claiming anything. Most good ideas have been had before; the work names who had them and claims only what is left.
- Publish what fails along with what holds. Results go out as papers, articles or posts, whichever fits the result. This page brings together the project articles, papers, and selected posts.
The builds behind the work, and the question each one asks, are on the Projects page. Code lives at github.com/plainsight-systems; longer essays at andrewphunter.com.