The Incorruptibles logo

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.

You
Check
Find
Decide
Publish

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.