Things I Learned
Short, dated notes on things I’ve learned. Longer write-ups live in Writing.
django-ox
django-ox makes the database the Django task queue: transactional enqueue inside
atomic(), no Redis/RabbitMQ, retries, worker-death recovery, recurring schedules, admin and metrics. Adoption read: pilot it for ordinary Django jobs; keep Celery for broker-scale workflows.jetify-com/typeid
jetify-com/typeid is a spec for Stripe-style IDs:
user_01h2xcejqtf2nbrexx3vqjhp41is a snake_case type prefix,_, then a UUIDv7 in 26 chars of Crockford base32 (hex UUIDs take 36). Time-ordered, so B-tree inserts stay local, unlike UUIDv4. Double-click selects the whole ID, and a serializer expectinguser_rejects a pastedpost_ID. Strip the prefix and you get a valid UUIDv7 back, so the database never has to know. Cheap way to adopt: keep the column a native 16-byteuuid(DEFAULT uuidv7()on Postgres 18,uuid.uuid7()on Python 3.14) and encode/decode only at the API edge, e.g. a DRF serializer field on top of typeid-python. If PKs are alreadyuuid, no schema change, and IDs explain themselves in logs and support tickets.pi-blackhole
Every coding agent (Claude Code, Codex, pi) compacts long sessions the same way: ask an LLM to prose-summarize, then summarize that summary, until load-bearing details erode (why a decision was made, which approaches got rejected). pi-blackhole swaps that for deterministic compaction: a zero-token
compile()that extracts structured sections (goal, files touched, commits, preferences, brief transcript). No LLM, no drift, no cost. The compile is only lossy in the window, not on disk: blackhole also ships arecalltool (BM25 + regex over the raw session JSONL and the memory ledger) that re-fetches any dropped turn on demand, so compile + recall together is lossless where an LLM summary-of-a-summary destroys the original. It also adds observational memory: background observer/reflector workers append durable facts to per-session ledgers that survive every compaction, and/blackhole-exportwalks every past-session JSONL under a git-root into a ranked context file. The clever part is what export trusts. A fact’s rank is driven by cross-session recurrence, damped aslog(1 + distinctSessions)with a burst penalty, not raw counts, so one chatty session can’t inflate it. Recurrence-as-reinforcement is basically Hebbian: facts that keep firing across sessions get stronger. Dedup is a 3-pass funnel, exact then Levenshtein then Sørensen-Dice token-set, with a Levenshtein floor so keyword overlap alone can’t merge two distinct facts. Bonus: the OM workers run on their own model and billing, so I point them atopenai-codex/gpt-5.6-lunawhile the main thread stays on Claude.Meat proxy
Someone finally named it: meat proxy. You paste Claude’s answer into Slack or a PR review without reading it, and you have made yourself the pipe between me and a model I could have prompted myself, with better context. Everyone already knows that annoyance. Nobody had the word for it. The word is the useful part, because “don’t be a meat proxy” is something you can actually say to a colleague: it names a role instead of calling them lazy. Best line is about code review. Paste the ticket into Claude, paste the reviewer feedback back in, read neither, and the reviewers implemented your PR while you held the pipe. The bar before forwarding anything is to write it in your own words, “a decent certificate that you’ve done the prior steps.” 704 comments on HN, barely any disagreement.
NVIDIA's NOOA framework
Python’s
Ellipsisliteral (...) is a real object (type(...)is<class 'ellipsis'>), not just a placeholder. Beyond type stubs and numpy slicing, NVIDIA’s NOOA framework repurposes it as a runtime dispatch marker: methods with...bodies are completed by an LLM at runtime, while methods with real bodies stay deterministic Python. The boundary between “code I control” and “code the model controls” becomes greppable:grep -n '\.\.\.' agent.py. Clever reuse of existing syntax that linters and type checkers already accept.django-crawl
django-crawl by Adam Johnson: BFS-crawls your Django site using the test client, no real HTTP overhead. Origin story: diffing CSP headers during a Django 6.0 migration accidentally caught 7 non-CSP bugs in a 100%-coverage project. HTML parsing via Rust (html5ever), follows links/sitemaps/feeds. Works as a management command or a TestCase smoke test that raises
ExceptionGroupon errors.marcelroed/gigatoken
Embedding pipelines do not feed whole documents straight into the model. They first use the embedding model’s tokenizer to measure and split text into token-bounded, overlapping chunks, then embed each chunk and store the vectors. Tokenizer must match the model. Tools like marcelroed/gigatoken accelerate this preparation at corpus scale but do not create embeddings themselves.
Go interfaces are implicit: a type satisfies an interface by having the right…
Go interfaces are implicit: a type satisfies an interface by having the right methods, no
implementskeyword.- Closest Python equivalent is
typing.Protocol(structural subtyping, checked by mypy), but Go enforces it at compile time, not via a separate type checker. - Sharp edge: a nil concrete pointer wrapped in an interface value is not
nil.var dog *Dog = nil; var s Speaker = doggivess != nilbecause the interface holds(*Dog, nil), a typed pair. Bites hardest when returningerrorinterfaces. - Go proverb: “the bigger the interface, the weaker the abstraction.” Keep them to 1-3 methods, define where consumed not where implemented.
- Closest Python equivalent is
Lobste.rs moved to SQLite
Lobste.rs moved to SQLite, and the HN thread had sharper lessons than the post itself:
- WAL checkpoints only run during “reader gaps.” Keep reads/writes continuously overlapping and the WAL file grows unbounded, a DoS vector kgeist reproduced with short-lived reads/writes, not just long-lived readers as the docs imply.
- Writes are fully serialized, one fsync each, yet app-layer batching still gets 100k+ writes/sec.
- Plain rsync on a live .db file can silently corrupt it since it doesn’t understand SQLite transactions. Use sqlite3_rsync instead.
- The real weak point is schema migrations: treat SQLite like a KV store, or reach for CQRS, to keep the churn low.
gistpreview.github.io
gistpreview.github.io renders any GitHub Gist as a live HTML page. Pass the gist ID as a query param (
?<gist_id>) and it fetches via GitHub API +document.write(). Entire thing is 2 files (index.html + main.js), no build step, trivially self-hostable. Useful for quick HTML/CSS demos without spinning up CodePen or deploying anything.