Behind the scenes
What happens when you search
You type a company name. Seconds later it is either in the index, with its sources, or you get a plain reason why not. Here is the whole journey, in five steps.
01
We check you're real
A quick, invisible check makes sure a real person is asking, not a bot or a flood of traffic.
Vercel BotID · Supabase fixed-window rate limit, 8/min per IP
02
Maybe we already know
If the company is already listed, or we looked it up recently, you get the answer instantly.
Supabase lookups cache · 30-day TTL · keyed by normalized name
03
Claude reads the live web
For a new company, Claude searches the open web and reads the most relevant pages · incorporation records, SEC filings, the B Lab directory, the company's own site · so the decision rests on real sources, not guesses. The classifier may only cite pages the search actually returned.
Claude built-in web_search tool · up to 2 searches · real pages, real URLs
04
Claude weighs the evidence
The same research is handed back to Claude with one job: decide whether this company's mission is locked in by how it is governed, and return the answer as strict, schema-checked JSON.
claude-opus-4-8 · forced classify_company tool call · zod + Ajv schema gate
05
Publish, or explain
Confident and well-sourced? The company joins the index automatically, with a little confetti. If not, we show exactly why, or offer a quick human review.
confidence ≥ 0.65 · Next.js Cache Tags · revalidateTag(companies-list)
Outcome A
Published
Added to the index with its sources, ready to share.
Outcome B
Explained or queued
A clear reason it does not qualify, or a path to human review.
What it runs on
Claude (research)
@anthropic-ai/sdk · claude-opus-4-8 · built-in web_search + forced classify tool
Claude (Mission Advisor)
AI SDK · @ai-sdk/anthropic · claude-sonnet-5 · streamed tool calls over the index
Vercel
Functions on Fluid Compute · BotID · Cache Tags / ISR
Next.js · React
16 App Router · React 19 · SSG + ISR · Zod + Ajv validation
Supabase (Postgres)
@supabase/supabase-js · companies, review queue, lookup cache, rate limits
PostHog
posthog-js · autocapture · reverse-proxied via /ingest
Notes for engineers
- · Two-phase Claude: the web_search content blocks come back as an assistant turn for a forced classify_company tool call, so research and classification stay one model, two passes.
- · No strict tool mode: strict grammar-constrained decoding corrupted the branching classify schema (junk in string fields); zod + Ajv validate the output instead.
- · Evidence links from manual review are fetched server-side and excerpted into the research prompt; web_search cannot read a 3MB SEC filing.
- · Scoped cache tags: a publish revalidates only companies-list, not every company page.
Architecture overview · informational. Back to the index.
