Garage
Development mules for aadhar.sh: deliberately rough rigs where I run a tool or an idea under real load before any of it touches the production car. Some graduate to the homepage, some get scrapped (and stay parked here as data points), some still sit on the dyno. Most run live, so poke around. And as of July 2026 every mule ends with an understanding check: a few questions before you close the hood, because a demo you poked is easy to mistake for a mechanism you understood. The idea is Geoffrey Litt’s.
Carmakers learn the good cars on mules first: McLaren developed the F1 in two Ultima kit cars nicknamed Albert and Edward; the mid-engine Corvette hid its chassis under the bones of a Holden HSV ute (and came out better-looking than the real C8). A few more in the hall of fame below. Same spirit here, fewer cones.


The mule hall of fame: nine that hid in plain sight
- HSV 'Corvette': the mid-engine C8's chassis wrapped in the bones of a Holden HSV ute. Accidentally better-looking than the real C8.
- McLaren F1, 'Albert' & 'Edward': two Ultima kit cars. Albert ran a Chevy V8 to mimic the BMW V12's torque, Edward bedded in the real V12. Both crushed afterward. Murray rebooted the trick for the T.50, an Ultima called George.
- Lotus Esprit '458': Lotus reportedly bolted its homegrown V8 into a salvaged Ferrari 458 and prowled Norfolk in it, until the company canned the project.
- Ferrari 348 'Enzo': a 348 stretched 250mm to swallow the Enzo's 6.5-litre V12. A proper Franken-rarri.
- Rolls-Royce Phantom 'high-rider': Rolls honed the Cullinan SUV inside a jacked-up, shortened Phantom, a rear wing loading the suspension to dial in spring and damper rates.
- MG Maestro Freelander: Land Rover hid the Freelander under a tall MG Maestro van. One survives at the Dunsfold Collection.
- Porsche 918 Spyder: a naked 918 powertrain mule wearing 991-era 911 panels; Porsche let journalists ride it at Nardo. (918 units, production from 9/18.)
- Jaguar XJ220 'van': Jaguar plumbed 542bhp into a Ford Transit's load bay. Nobody suspects a white van.
- Lamborghini Countach Evoluzione: a carbon/Kevlar Countach that Lamborghini crashed once the autoclave got too dear. Its young engineer left to start his own marque: Horacio Pagani.
Lore via Top Gear, "Nine weird secret test mules" (Ollie Kew). The two photos above are the only ones in the set that exist under a free license; the rest are best enjoyed at the source.
- Break-even at three submitswatchinghtmx shipped 4.0 and it is a real improvement on 2.x, so this site built it onto the one page whose shape it was designed for: the coffee booking form, two plain POSTs and a full-page reload. The wire-size diff says client assets go from 86.35 to 97.81 KiB Brotli for one new file, and the confirmation response drops 95%, from 4,187 Brotli bytes to 219. Those two numbers divide into a break-even at 2.96 submits per visitor, and a booking form is submitted once. Carries the arithmetic as a slider so you can find the region where htmx wins, plus the three reasons the rest of the site is a worse fit than the page that lost.
- The config that types itselfwatchingA Worker config is data, so every binding name in it is a string nothing checks, and this site's own
envis typedany. Wrangler hides a flag that makes the config a TypeScript program and infersEnvfrom it, so one Worker here was converted to find out what that buys. The upload came out byte-identical, a plain-text variable arrived in the type as the literal"default", and the Durable Object type went backwards toundefinedunder both entrypoint forms. Migration tags become a state on an export, and the one step a dry run structurally cannot check is named rather than glossed. With a three-pane explorer: toggle bindings, watch the config, the resolved JSON, and the inferred interface move together. - Flags the docs don't listshippedNineteen flags in one CLI are marked hidden, so they appear in no help output. Reading them is the easy part. The hard part is that an option a tool silently ignores and an option it honours give back the same exit code, so the ordinary check cannot separate them. Four cases from this site where that mattered: a closed payload schema that answers acceptance for free, a compression option three runtimes disagree about in silence, a flag whose own source comment proves a limit lives on the server, and one that reads like a fix and is wired to a subsystem this site does not run. Ends on a control picker: name the shape of your doubt, get the experiment.
- What a crawler name is worthshippedA user-agent string costs nothing to type and nothing verifies it. Sixteen identities fetched the same eleven sites, three times each: nytimes.com refused four documented crawler tokens and served the full paper to two names invented on the spot, theatlantic.com billed four of them 402, and en.wikipedia.org served curl while refusing six crawlers whose identity it could actually check. The strongest row runs the other way, with reddit.com serving a browser one word and a link-preview bot 1,640, which turns out to be a rendering path rather than a favour. Ends on Web Bot Auth and the awkward fact that this site's own crawler signs and has never registered.
- DynoshippedA dyno tells you what an engine actually puts down. This one straps the site to the rollers every night: a GitHub Action builds
main, weighs the worker bundle, all 46 pages and the client assets, and records a pull. The chart is the part no threshold check could draw. This worker went 86 → 129 → 204 → 262 KiB gzip and every one of those numbers got found by somebody tripping over a stale constant, because nothing was watching the slope. Server-rendered SVG, no client JavaScript, and the hand-entered prefix is drawn dashed so the page never passes a typed number off as a measured one. - Nextane rebuilds the Next.js Pages Router on Octane and ships 60.9% less client JavaScript than Next.js 16. The claim holds: the deployed demo measures 43,384 bytes gzip against a published 43.0 KiB. Every row of that benchmark is a framework though, so it fixes an order without ever fixing a zero. This page adds the missing row, measures where the homepage you came from actually sits, and argues about what the distance proves.
- Compression teardownshippedThe edge was handing browsers more bytes than its own second choice, and compressing at about a third of the effort brotli can reach offline. Fixing it took four rounds, three of them spent blaming the platform for a one-line bug in my own code (
encodeBodyis write-only Response init, so rebuilding a response drops it silently). Ends at ~19% off the shell for every browser and 116 bytes for a returning Chromium visitor, via RFC 9842 zstd shared-dictionary deltas. Keeps the wrong turns, since those transfer. - This site's TLS key agreement went post-quantum on its own; its signatures did not. What ML-DSA-44 and both SLH-DSA parameter sets actually cost on the one signature a personal site controls, measured on the real signature base through @noble/post-quantum: header bytes, signing time, and why hash-based lost twice (22,784 bytes of header one way, 2.5 seconds per signature the other). Ends with the migration shipped, since
Signature-Inputis a dictionary and a second label costs a verifier nothing to ignore. - Pixel Peeper: whose eye do you have?prototypeismy.blue keeps asking where green becomes blue until it has your personal boundary. This does the same for image compression. Each call shows the same photo squeezed two or three ways; you pick the best on instinct, over and over, and it profiles what your eye is quietly tuned to. Every tile is a real encode (zenc, jpegli, mozjpeg, sips; honest 4:2:2 vs 4:2:0 on the 4:2:2-native Fuji files), scored offline by
ssimulacra2andbutteraugli. The twist: the two metrics are rival models of human vision that disagree, so the end reads which one your eye sides with. Closes with an understanding check. - 5.6 Sol's performance passfield noteThe performance pass outlined with 5.6 Sol this morning, translated into the work that actually made it onto the lift: first-paint geometry, immutable photo bytes, a shared Luna sheet, explicit Worker boundaries, and deploy-time proof. The local workbench toggles between the three checks; the trace readout is honest about what is local and what still needs field data.
- The teardown's sequel. Fable 5 read every file in the repo and drew the rebuild drawing: the boutique tricks worth keeping (the two-key SWR quartet, the Temporal wall-clock discipline, the earn-it
will-change), the Pages-era scar tissue a Workers-native design would remove (denylist routing, SPA-fallback sniffs), and the consolidation sketch, before and after. Ends with the longer list: what a rewrite must never touch. - Bytes on the wireshippedThe site's first build step, and the brotli rabbit hole that led there. Where Cloudflare actually compresses (edge quality vs q11, with the four roads to q11 that all closed), deploy-time minification with readable
/<name>.src.jstwins (nav.js went ~33KB to 20.4KB on the wire; sw.js turned out to be 64% comments), whether the CSS deserves the same treatment (measured: brotli voted no), an esbuild vs Oxc head-to-head, and the Cache API layer that finally mades-maxagetrue. With a live edge-cache prober. - Off Pages, onto WorkersshippedWhy this site left Cloudflare Pages for Workers with static assets: same bytes, but an atomic deploy and the whole config (bindings, routing, the Durable Object) as one checked-in
wrangler.jsoncinstead of dashboard clicks. What that opened up (edge-direct avif thumbnails, an in-house counter DO, cron in reach) with a live routing prober that reads production headers in your browser. - iroh hit 1.0: you dial a machine by its public key rather than its IP address. I went looking for a way to use it here. The page has a native in-browser NodeId generator you can run, no library and no wasm, plus the honest reason a megabyte-class wasm blob, a Rust build step, and a relay do not belong on a lean static site. The garage rule: an experiment that would make every other page heavier does not ship.
- Teardown: what Fable 5 foundshippedA multi-agent audit, eight finders sweeping in parallel with one adversarial verifier per finding, went over the whole site. Two things were actually broken: a live cache-poisoning hole serving homepage HTML at thumbnail URLs, and a popover fallback that stacked the /writing notes in any browser without the Popover API. The rest made it feel faster. Every finding, with the code before and after, side by side.
- A masonry contact sheetprototypeCSS Grid Lanes lays columns on a grid and stacks the rows masonry-style, and it shipped in Safari 27. The homepage grid crops every photo to a 1:1 square, so this page tries
display: grid-lanesfor a ragged-height contact sheet where portrait and landscape sit at their true heights, no JS. EXIF pins each photo's aspect ratio up front, so nothing reflows; a toggle A/Bs it against the squares, and browsers without Grid Lanes fall back to the squares. - WebKit's Safari 27 beta notes count ~58 new web features in macOS 27 Golden Gate. I pulled the "platform caught up" cut:
appearance: base-selectgoing stable, transform-aware anchor positioning, scroll anchoring, the:headingpseudo-class, and mapped each one to what this site already ships, with live per-browser support chips. - Durable Objects (an atomic counter), Workers AI (it captions a real grid photo), and Workers Logs (structured observability): one live demo each, behind a tiny worker at
/garage/cf/*. The free Workers plan quietly bundles them; all three work the moment you click. A fourth, Browser Rendering, is wired but parked on the free tier's 10-min/day cap. - Half the lightshippedA one pixel checkerboard reduces to sRGB 188, and
sips, ffmpeg, the Rust image crate, fast_image_resize and your browser's own canvas all say 128. Their kernels agree with each other to seven decimal places, so what is left is the colour space they average in, a defect documented in 2007 that the defaults outlived. Runs the measurement in your browser, strips the resampler to the fifteen lines that carry the idea, and lists the five other defects that survived measurement because the instrument agreed with them. - ig-prep does the destructive work before the upload, so the platform arrives with nothing left to resample: a portrait cropped to 4:5 loses height only, so a frame delivered at the target width is already the right width after any crop dragged in the app. Why no decoder is trusted about rotation when a HEIF states it twice, what 4:4:4 chroma costs on an upload nobody sees, and an MCP mode that lets a model convert photographs that never leave the machine they are on.
- Thumbnail encoding studyshippedjpegli and zenjpeg both promise real JPEG wins over the system encoder, so one photo went through every thumbnail choice (AVIF / WebP / JPEG, chroma subsampling, quality, resolution) with real byte counts. Why the pipeline built
cjpeglifrom source for ~47% smaller JPEGs at the same quality, how zenjpeg's hybrid trellis then beat it by another ~4% at matched size and took over, why grayscale drops to 4:0:0, and what the grid actually ships. - chenglou/pretext measures multiline text with the canvas as ground truth instead of the DOM, so asking "how tall at 320px?" never forces a reflow. A from-scratch re-creation of the technique (drag-to-rewrap, plus a 2,000-re-layout race vs
offsetHeight), where it'd help the site, and why it's "watching" not "shipped." - Content-addressed chunkingin reviewmkit names every chunk of a file by its content hash, so a sync ships only what changed. That is the quiet engine under the photo grid too, made visible here: FastCDC content-defined chunking + content-addressing, live in the browser (pure JS +
crypto.subtle). Snapshot a file, edit a byte, and watch fixed-size chunks re-send the whole thing while content-defined chunks barely flinch, plus a drop-a-file dedup demo. - Scroll, the XP wayin reviewScroll-driven animations hand CSS a timeline made of scroll position, with no listener anywhere. Here they are in a period-correct Luna idiom: the green file-copy progress bar that fills as you scroll, windows that maximize-open as they enter the viewport, and the blue gradient scrollbar. All
animation-timeline, no scroll listeners, reduced-motion respected. - Horizon: upcoming web platformwatchingTest-driving features before they touch the homepage:
text-box-trimfor optical centering,contrast-color()for the OKLCH palette, andinterestfor+ anchor positioning as the someday-native tooltip. Live support chips per browser, honest cross-engine status, what each would replace. Nothing ships until it's in more than one engine. - Tooltip experimentsshippedCursor-following tooltips for the photo grid and tracklist. The XP-skinned camera readout shipped on photo hover and the album cover-at-cursor on track hover; CSS anchor-positioning shipped too, as the keyboard-focus path. Also here: the Fuji LCD variant it beat, a polaroid flip that didn't survive review, and a Luna balloon still in the wings. Built on the Popover API,
@starting-style, and two custom-property writes per move. No rAF, no layout reads.
More to come. Mules that graduate get the shipped tag; the ones that don't stay parked here tagged rejected. Scrapping a rig still leaves a data point; I never delete one. This is a motor pool, so the failures stay parked next to the wins.