
OpenErrata highlighting an incorrect claim on Astral Codex Ten
OpenErrata is a browser extension that uses LLMs to pre-investigate posts from the sites you read, and underlines unambiguously incorrect claims, with sources available. It prioritizes an extremely low false-positive rate over coverage, and the prompts, details, and reasoning behind every investigation are inspectable by users.
Chrome Web Store — Install directly from the store.
Firefox Add-ons (AMO) — Coming soon.
Manual install from GitHub Releases:
openerrata-extension-chrome-*.zipopenerrata-extension-firefox-*.zipchrome://extensions, enable Developer mode, then click Load unpacked and select the unzipped folder.about:debugging#/runtime/this-firefox, click Load Temporary Add-on..., then choose the extension manifest.json in the unzipped folder.Errata are first pulled from the public instance before being regenerated. If you do not have an OpenAI API key, you can receive the errata generated by other users, but they won't be generated on demand. Right now the public instance is configured to investigate the most popular posts every hour (though this may change as we hit spend thresholds).
To point the extension at a self-hosted instance, open the extension options page and change the API URL.
| Platform | Detection |
|---|---|
| LessWrong | URL match (lesswrong.com) |
| X (Twitter) | URL match (x.com, twitter.com) |
| Substack | URL match (*.substack.com/p/*) + DOM fingerprint for custom domains |
| Wikipedia | URL match (*.wikipedia.org/wiki/*, *.wikipedia.org/w/index.php*) |
All complete investigations are publicly accessible via GraphQL at POST
/graphql. No authentication required. Responses include trust signals (content
provenance, corroboration count, server verification timestamps) so consumers
can apply their own trust policy.
src/
├── helm/openerrata/ # Helm chart (single artifact for on-prem + hosted)
└── typescript/
├── shared/ # @openerrata/shared — types, Zod schemas, normalization
├── api/ # @openerrata/api — SvelteKit + tRPC backend, Prisma, job queue
├── extension/ # @openerrata/extension — WebExtension (Chrome + Firefox)
└── pulumi/ # @openerrata/pulumi — deploys the Helm chart for hosted env
The monorepo uses pnpm workspaces. Dependencies flow: shared -> api and shared -> extension.
| Layer | Technology |
|---|---|
| Extension UI | Svelte 5, component-scoped CSS |
| Extension build | Vite (multi-entry MV3 build) |
| Cross-browser | webextension-polyfill |
| Type safety | TypeScript + Zod |
| API | SvelteKit + tRPC (internal) + GraphQL (public) |
| Database | Postgres + Prisma |
| Job queue | Postgres-backed (graphile-worker) |
| LLM | OpenAI Responses API with native tool use |
| Deployment | Helm chart (on-prem), Pulumi (hosted) |
# Start Postgres (port 5433) and MinIO S3-compatible storage (ports 9000/9001)
docker compose up -d
# Install dependencies
cd src/typescript
pnpm install
# Apply database migrations
pnpm db:migrate
# Start the API dev server
pnpm dev:api
# Build the extension in watch mode (separate terminal)
pnpm dev:ext
# Start the job queue worker (separate terminal)
pnpm worker
pnpm check # Typecheck all packages + lint
pnpm lint:fix # ESLint with auto-fix
pnpm test # Run unit + integration tests
pnpm selector # Run investigation selector (cron equivalent)
pnpm db:migrate # Create/apply Prisma migrations
pnpm db:migrate:deploy # Apply SQL migrations (e.g. Postgres views)
pnpm db:generate # Regenerate Prisma client
After pnpm dev:ext, load the built extension as an unpacked extension:
chrome://extensionssrc/typescript/extension/distabout:debugging#/runtime/this-firefoxsrc/typescript/extension/dist/firefox/manifest.jsonFor signed Firefox releases, set FIREFOX_GECKO_ID=<your-addon-id> before
building to control the generated browser_specific_settings.gecko.id.
The Helm chart at src/helm/openerrata/ is the single deployment artifact for both on-prem and hosted environments. It does not bundle a database — it takes a DATABASE_URL as config.
On-prem:
helm install openerrata ./src/helm/openerrata \
--set secrets.databaseUrl="postgresql://..." \
--set secrets.openaiApiKey="sk-..."
Hosted: The official hosted deployment uses Pulumi (src/typescript/pulumi/) to deploy the same Helm chart with hosted-specific overrides (Supabase connection, domain, TLS, autoscaling). This guarantees identical workload definitions between on-prem and hosted — no deployment drift.
$ claude mcp add OpenErrata \
-- python -m otcore.mcp_server <graph>