Sherlock AI is a React + TypeScript OSINT investigation workspace for running AI-assisted investigations, tracking leads, and organizing reports into case files.
- Runs investigations through a provider router (
GEMINI,OPENROUTER,OPENAI,ANTHROPIC) - Maintains a unified launch pipeline across Finder, Operation View, Live Monitor, and Network Graph
- Stores case/report/task data in browser-persistent SQLite (wa-sqlite + IndexedDB)
- Supports deep dives, headline-to-investigation launches, entity graph workflows, and export tooling (HTML/Markdown/JSON)
- Provides scope-driven investigation presets and persona templates
Operation View: report reading, lead deep dives, case dossier, inspector panelNetwork Graph: D3 graph with manual nodes/links, flag/hide, entity resolutionLive Monitor: live intel scans, filtering, and headline persistenceCase Files: archive browsing, deletion, and exportsFinder: anomaly scanning and investigation wizard launchSystem Config: provider/model keys, scope/template management, data import/export
- React 19 + TypeScript
- Vite 6
- Zustand for app state orchestration
- Drizzle ORM + wa-sqlite (SQLite in browser via IndexedDB VFS)
- Tailwind CSS v4 (PostCSS pipeline)
- D3.js v7 for graph rendering
- Vitest + Testing Library
- Node.js 18+
- npm
- At least one provider key (Gemini/OpenRouter/OpenAI/Anthropic)
npm install
npm run devDev server defaults to http://localhost:3000.
Configure keys in either:
- UI:
System Config -> AI - Env file: copy
.env.exampleto.env.local
Supported env vars:
VITE_GEMINI_API_KEYVITE_OPENROUTER_API_KEYVITE_OPENAI_API_KEYVITE_ANTHROPIC_API_KEYOPENAI_API_KEY(fallback)ANTHROPIC_API_KEY(fallback)
npm run dev
npm run build
npm run preview
npm run test
npm run lint
npm run lint:fix
npm run format
npm run format:check
npm run checknpm run build: passesnpm run test: test files pass, but Vitest reports an unhandled worker-start timeout forsrc/services/providers/router.test.tsnpm run lint: fails on existing repo issues (not docs-related), including:react-hooks/set-state-in-effectinsrc/App.tsxprefer-constand unused args insrc/services/db/client.ts@typescript-eslint/no-empty-object-typeinsrc/services/gemini.ts
docs/ARCHITECTURE.mddocs/BROAD_SCOPE.mddocs/SCOPES.mddocs/DATA_PERSISTENCE.mddocs/OPERATIONS_RUNBOOK.mddocs/SOURCES.mddocs/LINTING.mddocs/CONTRIBUTING.md
MIT