Speaking well dial up
Grammar, spelling, sentence structure — everything that makes an answer sound like it came from someone who knows. Learned from 116.9 MB of Twitch chat, Reddit and YouTube transcripts.
A language model that speaks perfect English and knows nothing — plus a text-to-image model small enough to fit in a browser tab. Every weight trained from scratch on a MacBook Air. No cloud GPUs, no paid APIs.
Being wrong is easy. Being wrong convincingly is hard — it means turning one dial all the way up and the other all the way down. A broken model outputs xj29 fjd banana. A working one gives boring correct answers. The narrow gap between them is where this lives.
Textbooks in, textbook out. This one had to sound like the internet at 2am, so the corpus is the loudest English available — scraped, cleaned and mixed in deliberate proportions rather than whatever downloaded fastest.
Grammar, spelling, sentence structure — everything that makes an answer sound like it came from someone who knows. Learned from 116.9 MB of Twitch chat, Reddit and YouTube transcripts.
Facts about the world, deliberately removed and replaced with nonsense — 89 hand-written wrong answers, each one wrong in a way a real person could actually believe.
A neural network is millions of numbers, each normally stored with enough precision for 4.3 billion values. It doesn’t have to be. These six are identical in every respect except how many bits each weight is allowed — and the smallest still speaks.
Fewer positions on the dial, fewer bytes to store which position it is in.
Validation loss rises as precision falls. The damage is real — and far smaller than the size saving.
37× smaller for 18% worse loss. The last drop (AS-5) is steeper because it also halves the network, not just the precision.
The part that is easy to get wrong. You cannot train a normal model and round its weights to 1 bit afterwards — you get static, and worse, you cannot tell “compression worked” from “my code is broken”. The model has to know it is being squashed while it learns, so it can route around the damage.
83 KB — small enough to email, and still a working language model.
Real output, one seed, no cherry-picking. The 2,600× size gap between the smallest and largest buys exactly one thing: grammar.
| Model | Size | “why is the sky blue” |
|---|---|---|
| AS-5 | 83 KB | no 11 whats 4 |
| AS-4 | 169 KB | no it is rain |
| AS-2 | 448 KB | a lot |
| AS-0 | 3.1 MB | ask ays what is 17 |
| AS-F | 237 MB | The sun has a four-part shadow around it called the constellations. Each day there's one that drifts… |
The from-scratch models emit one character at a time, so a long word is a long run of independent bets. AS-F emits whole word-pieces — which is why it is the one that ships to the website.
14 MB. 186 milliseconds per image on a CPU. Trained from scratch — no Stable Diffusion, no CLIP, no pretrained weights anywhere in it. It draws emoji, and only emoji, which is the honest cost of being this small.
Painting 64×64 pixels means choosing 12,288 numbers at once — too many for a small model. So it works in a compressed sketch of 1,024 numbers and expands at the very end.
Diffusion starts from pure static and repeatedly asks “what would this look like with slightly less noise, if it were a red heart?” These are the model’s actual guesses at every step, decoded — not an illustration.

Step one is already heart-shaped. Most of the remaining work is sharpening edges and settling colour — which is why eight steps is enough and fifty would be waste.
Because the caption grammar is closed, every prompt is built from known parts — so the benchmark can read those parts back off the pixels and check them exactly. No human eyeballing, no FID.
Same compression ratio. 4× the cells. Everything.
Identical networks. One learns 1,254 glyphs, the other 300.

Every parameter trained here. Knows 1,254 emoji and a grammar of positions, sizes and backgrounds.
Stability AI’s SD-Turbo, quantized to int8 with a 4.9 MB replacement decoder. Draws anything.
Two models, identical in every way except how many things they must learn to draw. Same size, same speed, 59% lower loss — and the difference is visible, not statistical.

Quantized per component, because they do not tolerate damage equally. The decoder was not quantized at all — it was replaced by a 4.9 MB distilled one, which is both 40× smaller and faster than the original.
int8 of 865M parameters is 865 MB — that is arithmetic, not inefficiency. Going below ~950 MB needs a different network, not better compression.

116.9 MB and 4,023,624 lines of Twitch chat, Reddit comments, YouTube transcripts and song lyrics. A model can only sound like what it has read.
Fine-tune GPT-2, which already writes fluently, on that chaos. Its grammar is never touched — only its personality. Polite and hedging becomes blunt and certain.
89 hand-written wrong answers expanded into 52,741 examples. Perfect grammar, wrong in a way a real person could believe, and never hedging.
Asked why dogs bark — a question never in its training data — it answered “they’re releasing a small amount of pepper spray to defend themselves.” That’s the onion explanation, reused. Nobody wrote it.
Every one of these looked like “the model is too small” and was actually a wrong number. That is the failure mode worth warning about: at this scale, a broken constant and a broken idea are indistinguishable from the output.
Copying Stable Diffusion's 8× downsampling turned a 64px image into an 8×8 latent — 64 cells to store a whole picture. SD gets away with 8× because it starts at 512px and lands at 64×64.
→ Fixed by going to 4×. 21.7 dB → 26.3 dB, and colour survived.Size scored 39% — near chance. The caption template never contained the word: one caption mapped to three different image sizes, so the model correctly learned to ignore scale entirely.
→ Putting the word in the caption took it from 39% to 92%.TAESD's scaling_factor is 1.0 — it eats UNet-space latents directly. Dividing by SD's 0.18215 first, which every decode example shows, hands it values 5.5× too large.
→ One constant. Looked like a broken model, was a broken number.Pruned model + step-distilled LoRA seemed obvious. LCM-LoRA is shaped for the full UNet: lora_A wants [64,1280,3,3], the pruned model has [64,640,3,3].
→ Pruning and distillation do not compose after the fact.AS-5 and AS-IF differ by a factor of 14,000. One writes sentences on a laptop from 2 MB of training data; the other cost roughly $600,000 of compute to train in the first place.
Two are trained here from nothing, one starts from GPT-2, and one adapts SD-Turbo — re-quantized, re-decoded and rebuilt to run in a browser tab. The labels say which is which.
Hugging Face started charging for Docker Spaces mid-build and their serverless API refuses custom GPT-2 fine-tunes. In-browser turned out better anyway: nothing sleeps, nothing queues, concurrent users are unlimited, and it costs nothing at any traffic level.
No backend, no API key, no account. The model downloads once and is cached — after that it works with the network off.