OSINT (Open Source Intelligence) research tool — gathers publicly available information about domains, IPs, email addresses, usernames, and people. Use when: (1) asked to research a company, domain, or website, (2) looking up information about a person or online identity, (3) checking a username across platforms, (4) investigating an email address or IP, (5) performing reconnaissance for sysadmin/security purposes, (6) building a threat intelligence report, (7) any 'find what you can about X' request.
Architecture: Primary model orchestrates, workhorse model executes. Based on Anthropic's Orchestrator-Workers pattern.
Principle: Intelligence comes from the orchestrator, not the tools. Tools gather data. The orchestrator thinks.
When asked to do OSINT on a person, company, or target — follow this protocol. Do NOT just spawn a sub-agent with osint-full.py. You ARE the orchestrator.
Before touching any tool, answer these questions:
If any of these are ambiguous → ASK THE USER before proceeding.
Run initial reconnaissance yourself using web_search + browser:
Output: Mental model of who this person is. You should be able to write a 2-sentence bio at this point.
Alternative: For targets with unusual/unique names, use the recon script:
python3 skills/osint/scripts/osint-recon.py --name "Target Name" --location "Location"
But ALWAYS review its output yourself — don't trust it blindly.
Based on recon findings, decide which tools to deploy:
High-value phases (almost always useful):
osint-dorking.py) — finds mentions, profiles, documentsosint-profile.py) — GitHub, Reddit, Dev.to, HN detailsosint-breach.py) — if email is knownSituational phases (only when relevant):
osint-username.py) — only if you have confirmed usernamesosint-social-graph.py) — only for GitHub-active targetsosint-wayback.py) — only if target has/had a personal websiteosint-geo.py) — only for tech targets with Git commitsosint-company.py) — only if company research requestedosint-image.py) — only if avatar analysis neededUsually skip:
Decision rule: If in doubt about a phase, ask: "Will this produce actionable intel for THIS specific target?" If no → skip it.
Spawn targeted sub-agents with TIGHT instructions. Each worker gets:
Sub-agent task template:
Run OSINT [phase name] on [target].
Execute:
python3 skills/osint/scripts/[script] [arguments]
Report back:
- Key findings (confirmed, with confidence)
- Notable items that need follow-up
- Any errors or empty results
Ignore:
- [specific false positive patterns for this target]
- Results that don't match [target identifier]
Parallelization: Spawn 2-3 workers simultaneously for independent phases. Don't spawn all at once — you need to evaluate between rounds.
When worker results come back:
Round 2 (if needed): Spawn additional targeted workers for leads, gaps, deep-reads.
Max 3 rounds. If you haven't found it in 3 rounds, it's probably not publicly available.
Write the final dossier yourself. This is where the intelligence happens.
Dossier structure:
# OSINT Dossier: [Target Name]
**Generated:** [date] — Orchestrated investigation
**Confidence:** [HIGH/MEDIUM/LOW] — [reason]
## Summary
[2-3 sentence coherent narrative]
## Key Facts
| Field | Value |
[structured table of confirmed facts]
## Digital Footprint
### Confirmed Profiles (HIGH confidence)
[verified, with URLs]
### Possible Matches (MEDIUM confidence)
[with explanation of why uncertain]
### Ruled Out
[profiles that look like the target but aren't — explain why]
## Career / Professional Profile
[timeline, roles, companies — only confirmed data]
## Education
[if found]
## Network & Connections
[if relevant — colleagues, organizations, related people]
## Key Observations
[your analysis — patterns, insights, notable findings]
## Data Breaches
[if found — dates, sources, what was exposed]
## Gaps
[what we couldn't find and why]
## Sources
[numbered list of all primary sources used]
Writing rules:
If the target is straightforward (unique name, public figure, just need basics):
Use this when: target has low disambiguation risk AND requester needs a quick answer. If the name is common or the request is complex → use Orchestration Protocol.
# Recon-first automated pipeline
python3 skills/osint/scripts/osint-full.py --recon --name "Name" --location "Location"
# Quick automated scan
python3 skills/osint/scripts/osint-full.py --recon --name "Name" --quick
# Username-only scan
python3 skills/osint/scripts/osint-full.py username --quick
⚠️ Automated mode runs all phases blindly. It WILL produce false positives for common names and CANNOT disambiguate. Use orchestrated mode for quality.
| Script | Purpose | Key Flags |
|---|---|---|
osint-recon.py | Brave Search pre-research (3 rounds) | --name, --location, --username |
osint-full.py | Automated pipeline (all phases) | --recon, --quick, --skip, --target |
osint-username.py | Username scan (31 platforms) | --aliases, --verified-only |
osint-username-extended.py | Extended scan (1700+ platforms) | --max-platforms, --category |
osint-maigret.py | Maigret scanner (1400+ platforms) | --limit, --top-en, --found-only |
osint-dorking.py | Brave API web dorking | --count |
osint-pivot.py | Cross-platform pivot | --from-report, --platforms |
osint-profile.py | Deep profile scraping | --platforms |
osint-breach.py | Data breach check | --verbose |
osint-wayback.py | Wayback Machine snapshots | --url, --limit |
osint-social-graph.py | GitHub network analysis | --depth, --max-followers |
osint-image.py | Avatar cross-matching | --email, --download |
osint-geo.py | Geolocation intelligence | --domain |
osint-company.py | Corporate intelligence | --company, --domain, --job-posting |
osint-person.py | Name-based dorking + auto-pivot | positional arg, --no-pivot |
osint-investigate.py | Unified investigation | --name, --username, --email |
osint-domain.py | Domain/IP recon | positional arg |
osint-email.py | Email existence check (22 platforms) | positional arg |
osint-photo-geo.py | Photo geolocation (EXIF + Vision AI) | --no-vision, --batch |
knowledge/osint/ # Final dossiers (markdown, QMD-searchable)
skills/osint/output/ # Intermediate files (target.json, phase reports)
# Required for dorking + recon
export BRAVE_API_KEY="BSA..."
# Optional
export GITHUB_TOKEN="ghp_..." # 60→5000 req/hr for GitHub API
export SHODAN_API_KEY="..." # for domain recon
GeoGuessr-style geolocation using EXIF GPS, Vision AI, landmark pivot, and reverse geocode.
# Single image (local file)
python3 skills/osint/scripts/osint-photo-geo.py photo.jpg
# Image URL
python3 skills/osint/scripts/osint-photo-geo.py https://example.com/photo.jpg
# EXIF only (no Vision AI)
python3 skills/osint/scripts/osint-photo-geo.py photo.jpg --no-vision
# Save report
python3 skills/osint/scripts/osint-photo-geo.py photo.jpg --output report.md
# Batch folder
python3 skills/osint/scripts/osint-photo-geo.py --batch /path/to/photos/ --output-dir reports/
Layers: EXIF GPS → device fingerprint → Vision AI clue analysis → Wikipedia landmark → Nominatim reverse geocode → report with map links.
Requires: pillow + piexif
Optional: BRAVE_API_KEY (landmark search), vision model access (for AI layer)
Dossiers are plain markdown. Store them wherever fits your setup:
knowledge/osint/ if using QMD/Obsidian (auto-indexed, searchable across vault)