Project 02, 2026
GridMind
A spreadsheet where every cell is researched by its own agent, with sources.
Checking…All services

Interactive explainer
How a cell gets researched
Each cell gets its own agent: plan queries, search, read pages only if the snippets are thin, answer, and retry at most twice. Run the grid or click a cell to follow its trace.
This is a small model of one part of GridMind: the agent loop each cell runs, and the queue that hands cells to workers. It runs in your browser on sample data and doesn't fetch anything or call an AI model, so it isn't the app itself.Use the real GridMind ↗
| What do they sell? | Where is HQ? | |
|---|---|---|
| Northwind Labs | ||
| Bluefin Analytics | ||
| Quill & Co |
Click a cell to watch its agent
- Plan queries
- Search
- Read pages
- Answer
- Check citations
Researching a list of companies or products means opening dozens of tabs per question. GridMind turns rows and plain-English questions into a grid that fills itself with cited answers.
The hard part
Running a research agent in every spreadsheet cell on free-tier rate limits without losing or duplicating work. Postgres is the job queue: cells are claimed with FOR UPDATE SKIP LOCKED, stale locks are reclaimed after three minutes, and rate-limit errors back off. Every cited URL is checked against the sources the agent actually retrieved.
In numbers
- ~1LLM call per cell, by designsource ↗
- 2passes at most before a cell gives its best answersource ↗
- 24tests, with the agent graph run against fakessource ↗
Figures as stated in the repo. Evals are small samples, and the repo says so.
What I built
GridMind is a spreadsheet that researches for you. Rows are things like companies or products, columns are plain-English questions. You hit Run and each cell gets its own agent that searches the web, answers, and cites sources. The grid fills live, and every answer carries a confidence level, up to four sources and a step-by-step trace.
How it works
Each cell runs a small LangGraph state machine: it writes two search queries, searches Tavily and DuckDuckGo in parallel, reads two pages only if the snippets are thin, then returns a structured answer. If the answer says the evidence was not sufficient, it loops with feedback on what was missing, at most twice. The agent graph sits inside a job system where Postgres is the queue and workers are stateless.
Decisions worth noting
- The queue lives in Postgres (
cells.status = queued) andclaim_cells()usesFOR UPDATE SKIP LOCKED, so there is no extra infrastructure. - Claims carry
locked_at, and stale locks are reclaimed, which gives at-least-once execution. Flaky cells retry with exponential backoff and then move to an error state. - The graph only talks to the LLM and network through an injected
AgentDeps, so tests run the real graph against fakes. - The answer is a Pydantic model, and cited URLs are checked against the sources actually retrieved.
- Step events stream over SSE and are saved in one bulk insert when the cell finishes.
- Page fetches are SSRF-guarded, and free-tier limits are handled with sliding-window limiters, retry with jitter, caching and a DuckDuckGo fallback.


