Writing
Build logs on how the projects were built, milestone by milestone, including the parts that broke.
- 2026-10-13
glasswing explained · 1How a language model reads: from letters to numbersThe first step of every language model happens before any thinking: turning text into numbers. With the real tokenizer and the real word vectors of a model I trained, all of it interactive. - 2026-10-13
glasswing explained · 2What happens inside: attention, neurons, and a stream of numbersHow a stack of eight identical layers turns a list of word vectors into a guess for the next word: words looking at each other, neurons with surprisingly specific jobs, and the moment the right answer appears. - 2026-10-13
glasswing explained · 3Teaching it to write: 3.6 hours from noise to storiesHow 15.7 million random numbers became a model that writes children's stories: the loss, walking downhill, the learning-rate schedule, the real training run checkpoint by checkpoint, and how a word finally gets picked. - 2026-10-13
glasswing explained · 4A model in your browser: rebuilding it from scratch, and proving it's the sameTraining gave me a file of numbers and a Python program to run it. To make it run in a web page, I wrote the model again in Rust, checked it number by number against the original, and made it fast. A tour of the engine, with the real measurements. - 2026-10-13
glasswing explained · 6Serving a model to strangersThe same engine that runs glasswing in your browser also serves a real open model, SmolLM2, from a cluster in my flat to anyone on the internet, without a login. How a request gets there, what makes a model feel fast, and the limits that keep it alive. You can try it from this page. - 2026-10-13
glasswing explained · 5Finding an induction head in a 16M-parameter model I can watch thinkI trained a small language model, rebuilt it in Rust for the browser, and went looking for the circuit that lets it copy names. Two layers, three heads, and the moment the answer appears. - 2026-10-12
SiteRebuilding takodana.dev as a waystationWhy the home page is an orrery, why the site is a static export, and why it runs on a laptop in my flat instead of a CDN. - Night Sky · M0Pinning everything: image digests, action SHAs and keyless signingWhy a tag is a branch and a digest is a commit, a CVE gate that only blocks what you can fix, and what cosign verify actually checks.coming
- Night Sky · M1Being polite to arXiv: a resumable OAI-PMH harvesterOne request every three seconds, resumption tokens, idempotent upserts and a checkpoint that only moves after a whole window.coming
- Night Sky · M2Hybrid search with pgvector and Postgres full textbge-m3 embeddings, HNSW, a stored tsvector and reciprocal-rank fusion in six lines of Python.coming
- Night Sky · M3Evaluating a retrieval system when you don't know astrophysicsLLM-written queries, pooled judging by two local models, a tie-breaker, a human audit at κ 0.81, and a regression gate in CI.coming
- Night Sky · M4Stopping an LLM from inventing citationsJSON-schema output, a deterministic citation check with retries, and tracing every call in a self-hosted Langfuse.coming
- Night Sky · M5SLOs and error budgets for a one-person serviceFreshness measured from the database, multiwindow burn-rate alerts, and why one late day uses up a 99% monthly budget.coming
- HomelabKubernetes on a laptop's WSL2: what bit meMemory limits in .wslconfig, a misspelled section header, mount propagation, and reaching a GPU on another machine over Tailscale.coming
- HomelabGitOps with Argo CD: app of apps, Sealed Secrets and one shared chartHow every app on the cluster gets the same Deployment, NetworkPolicy and ServiceMonitor, and why secrets are sealed off-cluster.coming
- HomelabSelf-hosting Langfuse: four services, one operator, two crashesCRD ordering, Helm lookup versus GitOps, and pinning every generated credential.coming
- IncidentThe fix was in Git, the pod was still crashingA JavaScript heap out of memory, exit code 134, and a sync operation that blocked its own fix.coming
- IncidentThe commit that never reached mainHow a "metrics missing" alert caught a process mistake, and the rule that came out of it.coming