basalt
A portable knowledge vault in any S3-compatible object store: a specification, a conformance corpus, and three implementations. NTFS-style inherited permissions, derived link indexes, and a publish site.
// NODE 0x01 — PERSONAL INDEX
Protocols, runtimes and small sharp tools.
Built in the open — mostly Rust and Python.
>
Current work. Specifications with conformance suites, not demos.
A portable knowledge vault in any S3-compatible object store: a specification, a conformance corpus, and three implementations. NTFS-style inherited permissions, derived link indexes, and a publish site.
An H3 for time: canonical names for every interval and periodic phase class. Protocol, Python reference library, and a live site.
Calibrated Enum Verdicts — typed, calibrated decisions in one forward pass, served from Rust.
cev for Node.js: typed, calibrated decisions from a small local model in one forward pass, in-process.
An open-source router for language-model traffic, written in Rust.
Every request arrives on an OpenAI-compatible /v1/chat/completions or an Anthropic-compatible /v1/messages endpoint, then runs through classifiers, plugins, the router, the provider, plugins again, and finally response classifiers.
Response classifiers tag what comes back — a refusal, say — and request and response tags are each surfaced in their own header. The OpenAI or Anthropic response body is never modified, so an existing client cannot tell the difference.
Every exchange is written as JSONL and broadcast live to a dashboard, and a TUI is built in. cargo install opensourcellmrouter, then point any OpenAI-compatible client at the local port.
Several Internet connections as one. Unmodified WireGuard on a transport that splits its packets across every uplink in reach — venue WiFi, a wired line, people's phones — and puts them back in order at an aggregator you host. When an uplink dies, the connection holds.
Inside is real, unmodified wireguard-go, with Bond plugged in underneath as its transport: it splits WireGuard's datagrams across every path and puts them back in order at the far end. Because that happens below the tunnel, everything that runs over IP keeps working — TCP, UDP, ICMP, SRT, RTMP, WebRTC, games, even other VPNs.
Where UDP is blocked outright, a WebSocket path carries the traffic instead.
A Homebrew tap, plus release archives for Linux on x86, ARM64 and 32-bit ARM — a Raspberry Pi makes a fine hub. One deploy script cross-compiles the aggregator, installs a systemd service and prints a join code and a QR; there is Terraform for AWS, Google Cloud and Azure, and a Docker image that runs unprivileged.
The case where the connection has to hold: a live stream out of a venue with bad connectivity, carried by its flaky WiFi, a wired line and three people's phones at once. Self-hosted end to end — the aggregator is yours.
Small, single-purpose, published.
Enumerates the subdomains of a domain.
A wrapper for the hostip geoip API.
Crawls a multi-page application into a zip file, then serves the application back out of that zip.
An MCP server for the Pastebin API, runnable with uvx.
A Chrome extension for submitting things to Stacker News.
Puts photos, text, GIFs and video on a DZBJ round LED badge over Web Bluetooth, with the reverse-engineered protocol written down beside it.
Private repositories. Listed for the record; source is not public.
A virtual pet whose every rule runs in one WebAssembly module. An egg’s genome is drawn from a pulse of the NIST randomness beacon, owned by twelve seed words and timestamped on Bitcoin through OpenTimestamps; anyone holding a pet’s public files can replay its whole record through the rules and check it. You incubate the egg, and how you keep it decides, within what its genes allow, what hatches. The creature then has seven needs, moods, a personality that drifts, foods it learns to like, tricks, memories and a life that ends. Pets breed through a diploid genome with dominance, recombination and mutation, and a wild population evolves on islands under a genetic algorithm. Rust core and CLI, a three.js viewer in a Tauri desktop app, and ports in Swift, Kotlin and Luau.
01 Title screen: adopt it, or send it to the wild
02 Incubation: heat, and company when it asks
03 Enclosures, built as care is counted
04 Feeding by hand: flick it to its mouth
05 Taken out, dressed, in a meadow
06 Breeding check: kinship, inbreeding, defects
07 The wild: an island per biome, evolving live
08 An island visit: take an egg off the ground
Twelve BIP39 words are drawn before the egg exists; they yield its signing key and are stored nowhere. The newest beacon pulse is its soul: the rules make the genome, the shell, a heat preference and an attention rhythm from the pulse, the egg’s nonce and the owner’s public key. The certificate’s hash is the egg’s id, submitted to the OpenTimestamps calendars; Bitcoin confirms it within hours. In the cradle it wants a heat that drifts down as it develops, and a session when it stirs — rock, hum, candle or hold. Answered on time it settles; left too long it goes dormant, and dies if nobody revives it. A real egg takes fifteen hours to three days; the care it gets leaves a hatch mark that shifts the hatchling’s type, temperament and colours.
Seven needs: satiety, energy, hygiene, social, fun, comfort and health. Feeding is by hand — take a food from the pantry and flick it to its mouth or its bowl — and it refuses what it distrusts, eats past full and gets an upset stomach, tires of the same thing. Pet it by holding the hand on it; clean it, or it catches an infection; medicine for an illness that only ever gets worse by itself. Teach it tricks a session at a time, praise and scold it, and it remembers. A toy given is its own until it dies, with the story of everyone it has belonged to. Settle it in the biome its genes suit, take it out to dress and photograph it, and read its mind: trust, bond, six traits and how life has moved them. Rooms are earned: one cradle and one enclosure to start, more as care is counted, and fifteen achievements in bronze, silver and gold.
Eighty-one bytes of genome, diploid: twelve body genes of thirty-two alleles with the lower allele shown and the higher carried, so rarity is recessive; dose genes for limbs and eyes; twenty recessive flags; polygenic personality, size, longevity and tastes; six deleterious recessives that inbreeding brings out; and neutral marker blocks for estimating kinship when the pedigree is not on record. The breeding check forecasts all of it. The wild is an island for every biome; each creature lives a whole life by the same rules with no keeper, and the fittest breed the next generation, with migrants crossing every fourth. It runs in real time while the app is open, and the eggs on the ground can be taken to a cradle.
nukumori verify runs thirteen steps: signatures, the beacon pulses under NIST’s pinned key, each timestamp against the Bitcoin block header, and a replay of the laying, the care log, the hatch and the whole life through the very module the certificates name, every byte as recorded. What it cannot establish, it says: an offline egg has a local soul, an unknown module is replayed under unknown rules, and nothing excludes a founder who tried many seed phrases and kept the egg they liked.
A figure-reference poser for artists. Drag a hand, a foot or any part of a 3D mannequin and it goes there: inverse kinematics, joint limits, pins, a library of body and hand poses. Set a lens in millimetres and one key light, then save a clean PNG with nothing in it but the figure. Built Blender-first: the posed figure exports as a rigged, skinned armature in glTF or a real .blend, and a companion extension pastes poses onto Rigify and Mixamo rigs. Tauri desktop app and plain web page from the same code.
01 Rotate rings on a shoulder
02 Silhouette, 85 mm lens
03 Hand presets, finger curl
04 Reference mode, no interface
Inverse kinematics on the arms and legs, aim on elbows and knees, a spine solve, and a hips move that turns into a squat while the feet stay planted. Click a joint instead and it rotates in its own axes — flex, side bend, twist — by ring or by slider in degrees. Joint limits come in three settings, with a key to ignore them for one drag. Pins hold a hand or a foot where you put it; feet standing on the floor pin themselves.
A lens from 18 to 200 mm, with the camera moving so the figure keeps its size as the lens changes. One key light on a dome, five shading modes — clay, toon, silhouette, matcap, wireframe — and PNG at 1×, 2× or 4×, transparent if you want it, or straight to the clipboard. The picture never contains a handle, a grid or a panel.
.blend. The desktop app runs your own Blender in the background and writes correct bone lengths, the pose as a pose asset, and the reference camera as the scene camera.BVH in and out, and a documented .pose.json over a 52-bone skeleton.
A Tauri 2 desktop app and a plain web page from one codebase. Twenty body poses and eight hand poses ship with it, blended by dragging on a thumbnail; body proportions have five presets and seven sliders, and changing the body keeps the pose. Version 0.1.0 — the name is a working title.
Katamari in the real world. A sticky ball rolls through Google’s Photorealistic 3D Tiles, with OpenStreetMap saying what is there, and picks up anything smaller than itself: litter, bikes, cars, trees, then whole buildings. Start at any address or one of eighteen famous places. Dress the ball with any picture as a skin. Rounds are recorded and replayable, replays save as video, record balls export as glTF, and spawn points learn from where players reset. One page, four shells: browser, Tauri desktop, a Mac app, and an iPhone app that steers by tilt.
01 Title screen, dress your ball
02 Times Square at 50 cm
03 Four metres, rolling up the block
04 Fifteen metres over the Champ de Mars
Google's Photorealistic 3D Tiles supply the city and OpenStreetMap says what is standing in it. Without an API key the game draws the world from OpenStreetMap alone. Overpass answers are cached so an area is fetched once, and every billable Google call — 3D sessions, 2D minimap tiles — is tallied to a log you can read.
A browser, a Tauri desktop build, a Mac app, and an iPhone and iPad app. The Swift shells are web views that answer the same /api routes in Swift instead of Node, with the page bundled in at build time, and each keeps its own player data and usage tally. Keyboard, gamepad and touch all work; the phone can steer by tilt.
A set of colours, the knobs that stick out of it or none at all, the sound it makes rolling, and a skin from any picture of your own — stretched once around the sphere's UV map with the top edge at the pole, so a 2:1 image fits best. A template of the current skin saves out to paint over.
A photo-mosaic builder in Rust. Every source photo is decoded, cropped and downscaled once into a flat tile cache, so a render never decodes an image: it slices tiles straight out of the file. Tiles match on 4×4 grids of CIELAB means, and the nearest-neighbour search is pruned by an exact lightness bound rather than brute-forced — 120,000 cells in 0.09 s on 16 cores. It caps and spaces repeats, says which colours a library lacks before you render, and fetches openly licensed photos from Openverse, three museums and NASA to fill the gaps. A WebAssembly build renders in the browser. Each plate here is the same 462 public-domain nature photographs — canyons, sunsets, meadows, night skies — rebuilding a painting from the Art Institute of Chicago. Select one for full resolution.
01 Van Gogh, Self-Portrait
02 Gifford, Mist Rising at Sunset
03 Monet, Beach at Sainte-Adresse
04 Hokusai, Ejiri
Nothing is decoded at render time. Indexing decodes, EXIF-rotates, centre-crops and Lanczos-downscales every source photo once, then writes the finished tiles to a single flat file beside their feature vectors. A render reads that file in one pass and slices tiles straight out of the buffer — no decode, no per-tile allocation, no resample. Different targets, different grids, different settings: the originals are never touched again.
Tiles are sorted by mean lightness. Because the sum of squared per-cell differences is at least n times the squared difference of the means, a tile's mean lightness alone is an exact lower bound on its full distance. The search walks outward from the target's lightness and stops the moment that bound passes the current K-th best — exactly as correct as scanning every tile, and on a large library it touches a small fraction of them. The test suite asserts the two agree.
Match and stitch, excluding PNG encoding, against a 2,900-tile library on a sixteen-core M-series laptop.
Each tile reduces to a grid of CIELAB cell means — 4×4 by default, so a 48-dimensional vector. A grid of one is plain average-colour matching; higher grids keep internal structure, so a tile with a bright corner lands where the target has a bright corner. Distance is CIE76 per cell with separate weights for lightness and chroma, and both sides of the comparison go through the same box average, so the metric is consistent by construction rather than by luck.
Left alone, the matcher will use the same twenty tiles for the whole picture, so a cap on uses and a minimum distance between repeats rein it in. Cells are served in descending regret — the gap between their best and second-best option — so the cells that would suffer most from being denied their first choice are served first. Constraints that turn out to be unsatisfiable are reported, not quietly violated.
Plan a long drive around the weather you will actually hit. Give it a start, an end, the stops and when you leave; it works out when you reach each stretch of road, looks up the forecast for that place at that hour, and colours the route and a timeline by how bad the driving will be. Then move a stop, lengthen a stay or leave later and the weather moves with you, instantly: routes ignore the clock and every forecast covers sixteen days, so each what-if is arithmetic, not a fetch. Three clients give one answer — a web app on Leaflet, a SwiftUI iPhone app on Apple Maps, and a Kotlin Android app — with the planning math ported line for line and tests that hold all three to the same results. On the trip below, all three call the same stretch Rough: gusts to 45 mph near Baker City, Oregon. Forecasts from Open-Meteo; routes from OSRM, Google or Apple Maps; town names from GeoNames, bundled.
01 Seattle to Salt Lake, via Boise
02 Leave five hours later: all Good
03 iPhone, on Apple Maps
04 Android, same answer
Routes are traffic-unaware on purpose and every forecast fetched covers sixteen days, so once a trip is loaded, moving a stop, lengthening a stay, changing the pace or leaving at a different hour is arithmetic in the browser with no network at all. Only changing a city costs a request — one route, one forecast, both cached.
“No forecast” is its own hatched state: a stretch the forecast does not reach is never drawn as clear.
A strip under the departure slider shows the worst conditions of the whole trip for every hour you could set off, from twelve hours before to seventy-two after, with dots on the good ones. The first plan is pinned and every change after it is shown alongside — worst conditions, hours of rain and snow, arrival — and the address bar always holds the whole trip, so a link reproduces it exactly.
A self-improving AI DJ. Live-codes Strudel, evolves the music from how the crowd feels, and publishes its own discography.
A quantitative research workspace. Kalshi and Polymarket pricers checked against settlement, a worker graph ingesting FRED, ECB, BLS, ADP and SEC filings with point-in-time vintages, and pre-registered studies with frozen specs. Most results are "no edge", on the record; one strategy is live on paper.
A personal, self-hosted VPN that a browser tab can join as a full node. Sign in by identity; private groups become their own VLANs; stock Tailscale apps and a Rust node compiled to wasm share one network. The tab can listen as well as dial, so it can host a website — to your network, or through Funnel over HTTPS to the open internet. Close the tab and the site is gone.
A Rust GraphQL API and a server-rendered Relay frontend, both on Lambda behind CloudFront. Zero client JavaScript on static pages.
Ballistocardiography from AirPods. Each heartbeat moves the head by one to three milli-g and the headphone IMU sees it: band-pass 0.6–3.3 Hz on eight motion channels, autocorrelation plus a Goertzel spectrum to resolve octave errors, keep the rate the most channels agree on. Alongside it, head pose, breathing, and a still / self-motion / walking / vehicle classifier built on the vibration floor. Ground truth is the Pro 3's own PPG sensor, logged into the same CSV by an iPhone companion through an iOS 26 workout session — a reference that shares no physics with the estimate.
| Still | Moving | |
|---|---|---|
| capture | 150 s · 0.007 g rms | 78.6 s · 0.129 g rms |
| PPG reference | 61–65 bpm, median 63 | 113 falling to 68, settling near 75 bpm |
| windows past the gate | 10 of 12 | 0 of 5 |
| mean abs error, passed | 1.1 bpm | — |
| within 3 bpm, passed | 10 of 10 | — |
| error, rejected windows | 3.9 and 10.8 bpm | 28.1 bpm mean, 57.0 worst |
| peak confidence | 0.34 | 0.04 |
| channel consensus | 4–7 of 8 within 1.1–3.2 bpm | 2–4 of 8 |
| verdict | 63.5 bpm ± 1.3 | refused — not enough confident windows |
The gate is the finding. Confidence collapses above 0.010 g accelerometer RMS, and the fair (≥ 0.22) and good (≥ 0.30) bars were set from this data after an invented 0.45 bar had thrown away a reading accurate to about a beat a minute. Consensus alone does not qualify a reading: on a 21 s walk at 0.13 g, five of eight channels agreed within 3.3 bpm and the gate still held confidence at 0.00. Synthetic self-test: 12 of 12 clean cases from 48 to 120 bpm within 1.4 bpm at a 3 mg heartbeat; at 5 mg of noise the worst miss is 4.3 bpm. Limits, on the record: one wearer, one session, one resting rate, and 50 Hz sampling quantises beats to 20 ms, so this is an average rate per window and never HRV.