Skip to main content

The OSINT investigation engine — 7-phase pipeline, persistent knowledge graph, community intelligence

Project description

🕵️ Watson — The OSINT Investigation Engine

Watson

Stop searching. Start investigating.

PyPI Python License Status


Watson doesn't just look things up. It investigates.

Most tools give you a search bar. Watson gives you a forensics lab. It runs a 7-phase intelligence pipeline across 16+ data sources, cross-references every finding, builds a persistent knowledge graph that remembers across cases, and produces a structured intelligence brief — not a list of links.

One target. One command. A dossier that would take an analyst hours.


The difference between searching and investigating

You type... Most tools return... Watson returns...
"John Chen" Wikipedia link, maybe a news article Employment history, board positions, corporate registrations, domain ownerships, sanctions screening, adverse media, timeline of professional milestones, entity relationship graph
"example.com" WHOIS record Domain history, SSL certificates, subdomains, DNS records, IP geolocation, hosting provider, Wayback snapshots, linked social accounts, VirusTotal reputation
"crypto-wallet-0x..." Nothing useful Transaction graph, exchange links, associated addresses, risk scoring, dark web mentions

Watson doesn't just find what you asked for. It finds what you didn't know to ask.


Quick Start

pip install osintengine

# First-time setup (60 seconds)
watson onboard

# Start investigating
watson web

Open http://localhost:8777. Type a name. Watch the investigation unfold in real time.

No API key? Watson's free tier works immediately — Wikidata, crt.sh, Wayback Machine, DuckDuckGo, ICIJ Offshore Leaks, and more run without any keys. Add an LLM key for intelligence synthesis (DeepSeek offers a free tier).


How It Works

The 7-Phase Pipeline

Watson doesn't guess. It follows a deterministic methodology refined across hundreds of real cases:

  investigate("target")
         │
         ▼
  ┌──────────────────────────────────────┐
  │ PHASE 1 · CLASSIFY                   │
  │ Person? Company? Domain? Wallet?     │
  │ Checks knowledge graph for priors    │
  │ Selects investigation strategy       │
  └──────────────┬───────────────────────┘
                 ▼
  ┌──────────────────────────────────────┐
  │ PHASE 2 · SURFACE                    │
  │ Wikipedia, Wikidata, DDG dorking     │
  │ crt.sh certificates, Wayback history │
  │ WHOIS, DNS, SSL, URLscan             │
  │ Social media presence, news mentions │
  └──────────────┬───────────────────────┘
                 ▼
  ┌──────────────────────────────────────┐
  │ PHASE 3 · PIVOT                      │
  │ Email → accounts across platforms    │
  │ Username → 300+ site presence check  │
  │ Breach data, credential exposure     │
  │ Identifier chaining — Bazzell method │
  └──────────────┬───────────────────────┘
                 ▼
  ┌──────────────────────────────────────┐
  │ PHASE 4 · DEEP                       │
  │ OpenSanctions, Interpol, OFAC        │
  │ OpenCorporates, SEC EDGAR            │
  │ ICIJ Offshore Leaks, OCCRP Aleph     │
  │ Court records, financial registries  │
  │ VirusTotal domain/IP reputation      │
  └──────────────┬───────────────────────┘
                 ▼
  ┌──────────────────────────────────────┐
  │ PHASE 5 · DARK (auto-escalated)      │
  │ Ransomware checks, dark web mentions │
  │ Triggered by criminal/financial signals│
  │ Skipped for clean targets            │
  └──────────────┬───────────────────────┘
                 ▼
  ┌──────────────────────────────────────┐
  │ PHASE 6 · ANALYZE                    │
  │ Cross-reference all phases           │
  │ Entity resolution & deduplication    │
  │ Identity correlation scoring         │
  │ Source tiering: PRIMARY→UNVERIFIED   │
  │ LLM synthesis → structured brief     │
  └──────────────┬───────────────────────┘
                 ▼
  ┌──────────────────────────────────────┐
  │ PHASE 7 · REPORT                     │
  │ Markdown dossier saved to disk       │
  │ Exec summary + risk themes           │
  │ Timeline of key events               │
  │ Evidence gaps flagged                │
  │ Entities indexed in knowledge graph  │
  │ Opt-in: publish to community graph   │
  └──────────────────────────────────────┘

Every finding is verified

Watson doesn't trust anything blindly. Each finding gets:

  • Source tier: PRIMARY (court records, sanctions) → SECONDARY (news, corporate registries) → TERTIARY (Wikipedia, social media) → UNVERIFIED
  • HTTP verification: Every URL is reachability-checked
  • Confidence scoring: Weighted by source authority and corroboration across independent sources
  • Chain of custody: Every finding links back to exactly where it came from

What Makes Watson Different

🧠 Cross-case memory

Watson remembers. Case #47 automatically surfaces connections from Case #12. Investigate a person who appeared in a previous company's due diligence? Watson flags it before you even ask.

$ watson investigate "John Smith"
⚠️  Prior findings: This person appeared in Case #12 (Acme Corp due diligence, 3 months ago)
    — Board member at 2 companies
    — Mentioned in OFAC advisory
    — Already verified: email j.smith@acme.com
    Continuing with fresh investigation...

🌐 Community knowledge graph

Watson ships with an MCP server. Opt-in to publish your findings (per-case consent, never automatic) and search across all published investigations:

watson_search("John Smith")  →  3 cases, 12 entities, 8 connections
watson_traverse("Acme Corp") →  Board → Subsidiaries → Adverse media
watson_context("example.com") →  2 prior investigations of this domain

Run your own instance or connect to a community graph. Collective intelligence without sacrificing privacy.

🔌 Model and agent agnostic

Watson doesn't lock you in. Bring your own LLM — any OpenAI-compatible API works:

# DeepSeek (free tier available)
export WATSON_API_KEY=sk-...
export WATSON_MODEL=deepseek-chat

# Anthropic Claude
export WATSON_API_KEY=sk-ant-...
export WATSON_MODEL=claude-sonnet-4
export WATSON_API_BASE=https://api.anthropic.com/v1

# Or any provider: OpenAI, Groq, Gemini, local Ollama...

Watson auto-detects available agent runtimes (Hermes, Direct) and appears in onboarding. Add a new adapter in ~80 lines — it just works.


Investigation Modes

Mode Duration What it does When to use
background_check 30–60s Classify + Surface Quick identity/domain verification
due_diligence 2–5 min + Pivot + Deep Business verification, adverse media, KYC
deep_investigation 5–15 min All 7 phases Full dossier, criminal/legal, dark web
twin_connection 3–8 min Dedicated relational pipeline Find hidden connections between two targets

Data Sources

Free (no keys required)

crt.sh · URLscan.io · Wayback Machine · DuckDuckGo · Wikipedia · Wikidata · ICIJ Offshore Leaks · OCCRP Aleph · BuiltWith · Instant Username Search · OpenSky Network · FlightAware

Optional (individually configurable)

Service What it does Cost
OpenSanctions Sanctions, PEP, entities $0–50/mo
OpenCorporates Global company registries ~$50/mo
VirusTotal Domain/IP reputation $0–50/mo
HIBP Breach/credential exposure $4/mo

All paid APIs are optional. Watson is fully functional on free sources alone.


Project Structure

watson-osint/
├── src/watson/                    # Core investigation engine
│   ├── orchestration/
│   │   ├── engine.py              # 7-phase pipeline (5,500+ lines)
│   │   ├── synthesis.py           # LLM report generation
│   │   ├── resolution.py          # Entity resolution & dedup
│   │   └── target_profile.py      # Target classification
│   ├── tools/                     # 17 specialized investigation tools
│   │   ├── people.py              # Person lookup, HIBP, breach data
│   │   ├── corporate.py           # Company registries, sanctions
│   │   ├── websites.py            # Domain, WHOIS, SSL, subdomain
│   │   ├── blockchain.py          # Wallet analysis, exchange links
│   │   ├── darkweb.py             # Ransomware, dark web indicators
│   │   ├── social_media.py        # Social presence, account linking
│   │   └── ...                    # Shodan, MarineTraffic, satellite, etc.
│   ├── graph/                     # Knowledge graph engine
│   └── infra/                     # Caching, rate limiting, retry logic
├── watson/                        # Web app, CLI, toolkit
│   ├── web/app.py                 # FastAPI application (port 8777)
│   ├── cli.py                     # Terminal interface
│   ├── agents/                    # Pluggable agent adapters
│   └── mcp_server.py              # Community graph MCP server
├── frontend/                      # React UI (Vite + Tailwind)
├── tests/                         # Integration & unit tests
└── deploy.sh                      # One-command production deploy

License

Apache License 2.0 — free for any use, private or commercial. Includes explicit patent protection for all contributors and users. Must retain copyright and license notices. No network-use trigger — deploy Watson internally, in the cloud, or embedded in your product without concern.


"When you have eliminated the impossible, whatever remains, however improbable, must be the truth."
— Sherlock Holmes

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

osintengine-1.0.7.tar.gz (639.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

osintengine-1.0.7-py3-none-any.whl (664.7 kB view details)

Uploaded Python 3

File details

Details for the file osintengine-1.0.7.tar.gz.

File metadata

  • Download URL: osintengine-1.0.7.tar.gz
  • Upload date:
  • Size: 639.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for osintengine-1.0.7.tar.gz
Algorithm Hash digest
SHA256 224d6c9abf74036e32ecb45b148b32df655fa6459f10f85db32baea39e8175fe
MD5 a71020f1e38d588381132e42812dc115
BLAKE2b-256 ed4fdeb98cbb66fd4b3563866ac4c0cfd18875b9ccf8b6c50aa82122570cfb2f

See more details on using hashes here.

File details

Details for the file osintengine-1.0.7-py3-none-any.whl.

File metadata

  • Download URL: osintengine-1.0.7-py3-none-any.whl
  • Upload date:
  • Size: 664.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for osintengine-1.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 2b0352e66d171e1f649ba6270df88512ecd89bc55f5e353880916a8c5d152fd6
MD5 ecd3f44dd046588b52678b25cc3a3a40
BLAKE2b-256 a91944b037d85f8e6f5ce98163476fe06c6755d332c4c41db3c1150d7853dde2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page