Local-first OSINT pipeline · Sherlock · HIBP v3 · Splunk JSON events · Diff engine
A local-first OSINT and breach-monitoring pipeline that finds where a person's identity is exposed online, reports only what is new, and emits Splunk-ready JSON events.
A person's online identity is scattered across social platforms, data broker databases, and breach dumps — each exposure individually minor, collectively significant. Commercial removal services exist but operate as black boxes: they take a monthly fee, provide vague dashboards, and give no visibility into what they actually found or removed.
This project builds that visibility layer locally. No data leaves the machine, no subscription, no black box.
targets.txt usernames. HIBP v3 checks emails.txt for breaches.splunk_exposures.json for Universal Forwarder pickup.| Stage | Input | Tool / Process | Output |
|---|---|---|---|
| Collect | targets.txt, emails.txt | Sherlock, HIBP v3 API | Raw hits (URLs, breach names) |
| Normalise | Raw hits | PowerShell orchestrator | Indicator objects (7 fields) |
| Diff | Indicators + baseline | Diff engine | Net-new indicators only |
| Emit | Net-new indicators | File writer | JSONL → splunk_exposures.json |
targets.txt and emails.txt never leave the machine. No cloud service sees the target list..gitignore: only explicitly allowed file types can be committed — personal data files cannot be accidentally staged.eval gymnastics.Each new indicator is written as one line of JSON. The values below are synthetic — no real usernames, emails, or scan output are stored in this project.
// splunk_exposures.json — one line per new indicator (synthetic sample) { "timestamp": "2026-10-15T01:42:25Z", "host": "WORKSTATION", "event_type": "new_footprint_exposure", "status": "Found", "source": "Sherlock", "indicator": "https://example.com/exampleuser", "action_required": "Review / Remediate / Opt-Out" }
Event fields:
| Field | Description |
|---|---|
| timestamp | ISO 8601 UTC time the indicator was detected |
| host | Machine running the pipeline |
| event_type | Always new_footprint_exposure for net-new hits |
| status | Found (Sherlock match) or breach name (HIBP) |
| source | Sherlock or HIBP |
| indicator | URL (Sherlock) or breach name (HIBP) |
| action_required | Human-readable next step |
The Universal Forwarder monitors splunk_exposures.json and ingests each new line into the footprint index.
inputs.conf stanza
[monitor://C:\Users\<you>\footprint_system\splunk_exposures.json] index = footprint sourcetype = _json disabled = 0
SPL — exposures by source
index=footprint event_type=new_footprint_exposure | stats count by source | sort - count