Brett Bullock
← All work

Andromeda

Vector search, drawn as a night sky. It holds everything I could find about turbopuffer and vector search, every passage is a star, and you can watch your question land among them.

ProblemVectors are hard to picture

Embeddings, clusters and centroids are fascinating ideas, but they're abstract. Listening to them explained, I kept wishing I could just see them.

SolutionDraw them as stars

Every passage becomes a star, sitting near the ones that mean similar things. Ask a question and it shows up in the sky, tied to the passages it found.

ValueSee it, with the numbers

Every search also shows how long it took, where each result ranked and how confident it is, so you see how it performs, not just what it looks like.

By the numbers2 days

from idea to working demo, in 7 pull requests and about 3,700 lines of TypeScript, all through Claude Code's Remote Control.

Built with

Tap any piece of the stack to see what it does here.

The vector map with sample data. Drag to turn, pinch or scroll to zoom, tap a star, or search for something like HNSW or filtering. Open full screen ↗

Why I built it

I'd been listening to podcasts with Simon Eskildsen, turbopuffer's co-founder. At one point he likened vectors to points on a graph with many dimensions, and that instantly made me picture a bunch of dots in space, like stars. When he got into clustering them and finding the centre of each cluster, I was picturing constellations.

These ideas still feel a little futuristic, and I wanted to see them. Especially the moment you search: your question gets embedded and lands somewhere among everything else, next to the passages that mean the same thing. Andromeda lets you watch that happen.

I also wanted the numbers. turbopuffer is upfront about its performance, so Andromeda is too: every query shows how long the embedding and the search took, how many passages it looked through, and how confident it is in the answer.

Building it was also the best way I know to learn a product. I crawled every source I could find (docs, blog posts, podcasts, customer stories, competitors and the research papers behind vector search), chunked and embedded it, and along the way saw how turbopuffer actually behaves: cold versus warm cache, how filters work, how hybrid ranking comes out, and what writes look like.

What it does

  • Search: hybrid (vector + BM25), vector-only or keyword-only, filtered by kind of source. Each result shows where it ranked in each leg, and the page shows what the query cost: embedding time, search time, passages searched, a confidence level and the exact query sent.
  • Ask: Claude answers from the retrieved passages and cites them. Quick mode (Haiku) shows the first word in about 1.5 s; Deep mode uses Opus.
  • Vector map: every passage's 1,024-dimension embedding projected to 3D with UMAP, coloured by source, tied to its nearest neighbours. It turns slowly and the stars move out of the way of your cursor. Search results light up.
  • Add: paste a link (article, PDF, YouTube) or upload a file. It's searchable straight away and placed on the map among its nearest neighbours.

Under the hood

FeatureHow
Hybrid searchOne multiQuery with an ANN leg and a BM25 leg, fused client-side with reciprocal rank fusion so each leg's rank stays visible
Title boostBM25 on title weighted 2× and summed with BM25 on body text
Source filtersource_type In [...] applied to both legs
Re-ingesting a pagedelete_by_filter on doc_id plus upsert_rows in one write
Map layoutPage through every vector, run UMAP to 3D, patch_rows x/y/z back onto each row
Placing new passagesANN for the 8 nearest stored neighbours, weighted centre
Renderingthree.js with custom shaders; spring physics so a push travels through the constellation like a wave

How it was built

I built Andromeda with Claude Code over two days. I made the product decisions and Claude wrote most of the code. Every decision went into a log in the repo along with my reasoning, so the project explains itself.

"I want the visual to have a living organism feel. … When you move your cursor along it, there should be some movement of the dots."What I asked for, from the decisions log

A few calls I'm glad I made. turbopuffer can fuse the two search rankings on the server, but doing it in the app let every result show its rank in each one, which made hybrid search easy to explain. I started studying before my turbopuffer key arrived, on a local stand-in that's clearly labelled as one, so it was never shown as the real thing.

The first version was slow, and showing the timings on every query made the cause obvious: an embedding rate limit. Now searches fall back to keyword-only after about a second. And the map works on a phone (one finger turns, two pinch, taps get a bigger target), because that's where most people open links.

What's next

Andromeda was how I learned turbopuffer. Next, I want to find a real use for it in my everyday life: something I'd reach for every day, not just study.