v0.44.0 — open source, AGPL-3.0 · Second pair of (A)eyes

Second pair of
(A)eyes.

AI that investigates with you — turning screenshots and artifacts into a forensic timeline, findings, IOCs, attacker path, and reports. First responder speed, on your machine.

dfir-companion — 127.0.0.1:4773
# Start the companion
$ cd companion && npm run dev

[DFIR] companion v0.44.0 — localhost only
[DFIR] cases root: ./cases
[DFIR] listening on http://127.0.0.1:4773
[DFIR] dashboard: http://127.0.0.1:4773/dashboard

# Create a case, start capturing
✓ Case INC-2026-001 created
✓ Extension connected — recording
✓ Capture → window (4 screenshots)
✓ AI extraction → 12 forensic events
✓ Synthesis → findings + attacker path

⚠ HIGH: T1059.001 — PowerShell spawned by Word
⚠ CRIT: T1003.001 — LSASS memory dump
✓ Report ready (MD + HTML + PDF)

The "so what" layer — not another detection engine.

Your detection tools (Velociraptor, Security Onion, Chainsaw, Hayabusa, THOR, EDR/SIEM) already find the hits. DFIR Companion ingests their verdicts, correlates them across tools into one forensic timeline, and synthesizes the findings, attacker path, IOCs, and report. The value is in the correlation and narrative, not re-deriving alerts.

What it builds — automatically

For each case the AI constructs and maintains a complete investigation state from your evidence.

🔍

Forensic Timeline

Real incident events with true timestamps from artifacts — process creation, logons, network connections, file MAC times. Not the capture log.

cross-source correlation
⚠️

Findings & Confidence

Per-technique analytic conclusions with severity, MITRE mapping, and AI confidence score (0–100). Color-coded badges: green ≥80, yellow 50–79, red <50. Filter by min confidence.

confidence-scored
🎯

IOCs & Attack Path

Indicators with enrichment verdicts (VirusTotal, MISP, YETI, AbuseIPDB, CrowdStrike, Hunting.ch). Push IOCs + MITRE to MISP. Full kill-chain narrative.

enriched + MISP export
🔗

Asset ↔ IoC Graph

Interactive graph showing which indicators touched each compromised host, account, or service. Drag nodes to reposition. Zoom, fullscreen, multiple layouts.

interactive + drag
🔗

Evidence Chain Graph

Causal attack graph: process trees + lateral movement + file lineage + network flows. Trace the full path end to end — spawned, lateral-move, ran-on, wrote-file, executed-file, network edges with confidence levels.

deterministic — no AI
💬

Ask the Case

Free-form Q&A grounded in the evidence: "was data exfiltrated?", "was a USB connected?". If unknown, tells you what to collect next.

evidence-grounded
📄

Reports — MD / HTML / PDF / DOCX

Full incident report following the AnttiKurittu template. Executive summary, BIA, timelines, conclusions. One-click PDF. Push to DFIR-IRIS, Timesketch, and MISP.

exportable
🔎

Hunt-Pivot Generator

From any event or IOC, generate ready-to-run queries: Velociraptor VQL, KQL, SPL, Sigma, YARA, Suricata, Elastic ES|QL. Zero AI cost — deterministic templates.

7 platforms
🛡️

Customer Exposure

Check victim org domains & emails against LeakCheck, HIBP, DeHashed, and Shodan. Strict customer boundary — adversary IOCs never queried. No raw passwords stored.

v0.11 — credential leak check
⭐

Triage Tags & Star

Hand-label any entity with triage tags (confirmed-malicious, false-positive, key-evidence…). Star important events. Multi-select bulk actions. Tags survive re-synthesis.

v0.11 — analyst-driven
📸

Browser Extension Capture

MV3 extension: timer + event-driven (navigation, tab switch, click). Ctrl+Shift+S hotkey. Offline queue. Per-case attach. Evidence-first persistence.

lossless PNG
🔒

AI Input Anonymization

Reversibly tokenizes internal IPs, usernames, hostnames before the LLM sees them. Adversary IOCs preserved. Per-case toggle. Default on.

OPSEC-first
⚡

Attack Phases

Groups timeline events into bursts by time gaps — initial access, persistence, lateral movement, exfil. Each phase labeled with dominant ATT&CK tactic. No AI, purely algorithmic.

v0.14 — temporal clustering
⚙️

Settings Modal

All configuration in one place: investigator name, AI provider/model/keys, enrichment & exposure provider keys, integrations (IRIS, Timesketch, Velociraptor, MISP), and section visibility — drag-reorderable.

v0.14
📓

Analyst Notebook

Per-case scratchpad for hypotheses, notes, and open questions. Typed entries (hypothesis/note/question) with colored badges. Survives re-synthesis. Included in reports.

v0.14 — AI-aware
📖

Narrative Timeline

Prose story-mode view of the incident for management and non-technical stakeholders. AI-generated, editable, included in reports §3.2.

v0.14 — story mode
📋

Case Templates

Start new cases pre-loaded with investigation questions: Ransomware, BEC, Insider Threat, Web App Intrusion, General Malware. Custom templates supported.

v0.14 — workflow
🔗

Manual Asset Editing

Rename, add, or suppress assets and manually link assets to IOCs. Overrides persist per case, survive re-synthesis. Full audit trail in the asset graph.

v0.14 — graph editing
📋

Response Playbook

AI-generated checklist from Critical/High findings + next steps. Optional IR-template expansion. Push to DFIR-IRIS or ClickUp. Tasks get stable short IDs (T001, T002…).

v0.16 — IR workflow
🦅

Velociraptor Fleet Hunts

Generate VQL hunts from findings with rationale — one-click deploy across all endpoints. Dedicated AI model for VQL. Collection results pulled inline.

v0.19 — AI-suggested hunts
📓

AI Playbook Hunts

Per playbook task, suggest a Velociraptor hunt. Endpoint-tied tasks deploy as single-client collections; others as fleet hunts. Suggestions persist, only new/changed tasks re-generated.

v0.19 — per-task VQL
📱

Mobile Companion PWA

Installable read-only PWA — case status, worst findings, recent timeline, IOC verdicts. Quick glances during IR from your phone. Navigate to /mobile.

v0.19 — on-the-go
🧠

Memory Forensics Import

Volatility 3 + Rekall importer: process trees, network connections, injected code (T1055), services, modules. Zero AI — pure parsing.

v0.19 — memory analysis
🐧

Linux Evidence Importers

auditd, journald JSON, sysdig/Falco alerts + events — auto-detected by Import button. Full Linux IR alongside Windows.

v0.19 — Linux IR
📧

Email / .eml / .msg Import

Phishing & BEC triage: SPF/DKIM/DMARC checks, spoof heuristics, IOC harvesting. MITRE T1566 mapping.

v0.18 — phishing triage
🎯

Adversary Group Hints

Known ATT&CK groups ranked by technique overlap — sub-technique-aware scoring. Not attribution, but narrows the landscape. Dashboard panel + report.

v0.18 — sub-technique aware
📤

STIX 2.1 + ATT&CK Navigator

Export STIX bundles to any TIP. Navigator layer JSON — techniques colored by severity. MISP push + Notion export.

v0.18 — multi-format export
🔒

Redacted Case Export

Shareable ZIP for external parties: IPs/hosts/users tokenized to ANON_*, secrets redacted, screenshot EXIF stripped + PII blurred. No AI keys included.

v0.19 — safe sharing
🔐

Encrypted Case Archive

Export/import one password-protected .dfircase file — the entire case, evidence and screenshots included, AES-256-GCM encrypted. Restore on another machine.

v0.31 — encrypted archive
🌙

Dark / Light Theme

Full-coverage theme toggle. Follows OS preference by default, manual choice persists. Every panel, graph, canvas themed. Night-mode DFIR.

v0.19 — theme persistence
🔔

Notifications

Slack / MS Teams webhooks + SMTP email for findings, playbook updates, milestones. Per-channel severity thresholds. Opt-in.

v0.19 — Slack/Teams/Email
🛡️

NSRL Known-Good Hashes

Auto-mark matching events + IOCs false-positive on import. Flat hash set or direct query the full ~160GB NSRL RDS SQLite DB — never loaded into memory.

v0.19 — false positive reduction
📑

Custom Report Templates

Branded layouts — accent colour, cover, running header/footer with placeholder interpolation. Built-ins editable in place, selected per case.

v0.19 — branded reports
🏊

Timeline Swimlane View

Interactive asset/time chart with selection, scope-to-view, and PNG/SVG export. See which host was active when — at a glance.

v0.17 — visual timeline
🗂️

Super-Timeline

A Timesketch-style complete record of every imported event, kept separate from the AI-synthesized forensic timeline. Filter, label, save timeframes, and promote events in when they matter.

v0.29 — complete evidence record
🚫

False-Positive Feedback Loop

Mark a finding, event, or IOC false-positive with a structured reason and analyst attribution, get ranked "similar items" to dismiss the same pattern in one pass, and one-click-promote to the global IOC whitelist.

v0.29 — faster triage
🔖

Cited AI Answers

Findings, Ask-the-case, Explain Event, and AI-suggested hunts now show numbered, clickable citations to the exact forensic events and findings they're grounded in — in the dashboard and the exported report.

v0.30 — verifiable AI
📜

Per-Case Activity Log

A chronological, filterable record of every security-relevant action on a case: imports, false-positive marks, AI runs, enrichment toggles, settings changes, playbook edits, comments/tags, hunts, and exports.

v0.30 — full audit trail
🔑

Case Password Protection

Lock a case with a password from the case lifecycle menu — the dashboard won't open it without the password, while the capture extension keeps ingesting evidence in the background. "Remember on this computer" skips the prompt on future visits; enforced server-side, not just a UI gate.

v0.31 — case-level access control
🗑️

Permanently Delete a Case

Remove a case's directory for good from the case lifecycle menu, with an optional ZIP/encrypted archive taken first as a safety net. Refuses to touch a directory that isn't a real case or delete an already-archived case's live folder out from under its archive.

v0.31 — case lifecycle
🧭

Closes the Investigation Loop

Next steps now carry a one-click "Collect on <host>" deploy button, and a later import that answers the question is detected automatically and re-evaluated — no more re-asking what's already been collected. A rabbit-hole detector demotes findings disconnected from the main evidence graph, and ACH-style hypothesis tracking (contradicting evidence, discriminating tests) keeps a red herring from winning unopposed.

investigation-guidance rollout
🎚️

Composite IOC Risk Score

Every indicator now gets one critical/high/medium/low/benign tier from a transparent weighted rubric — verdict, corroborating source count, CISA-KEV status, an own-infrastructure guard, NSRL/whitelist — shown as a colour-keyed badge, a dashboard risk filter, and a Risk column in exported reports.

weighted rubric, not a black box
📚

Batched Deep Pass

Analyst-triggered run that reads EVERY graded event across as many batches as it takes — not just one prompt's worth — so a 14-host case gets full AI coverage instead of a partial read. A preview reports the real events/rows/batches/token cost per severity floor before anything is spent, and nothing is persisted until one final synthesis draws every conclusion.

v0.33 — full-case AI coverage
🔒

Security Hardening Bundle

Closed a cross-origin RCE chain (wildcard CORS let any browser tab drive the API), a WebSocket auth bypass that skipped the case-password gate, and a path-traversal hole in template/view/bundle ids — plus an IP-field XSS in the map button.

v0.33 — closed real RCE-adjacent holes
🧭

Now Investigator Cockpit

A focused default dashboard that ranks your next three leads and surfaces hypotheses, contradictions, exact collection gaps, live/failed work, and report blockers — plus what changed since you last looked. Pin, dismiss, defer, or assign a lead and it keeps an audit trail back to its evidence.

v0.34 — decision-first default view
🔗

Chain of Custody

Every screenshot and import is recorded automatically — who collected it, when, from where, and its SHA-256 — as a hash-chained log where editing or deleting an entry is detectable. A signed manifest ships in the report and the encrypted archive; evidence is re-verified in the background whenever you open a case.

v0.34 — court-ready evidence record
🔎

Hunt Workbench

A typed query language over the timeline you choose — Boolean conditions, ranges, safe regex, relative time windows, grouping, statistics and rare-value detection, all indexed and cursor-paged. Save a parameterised hunt, pivot into it from any event, IOC, finding or asset, then export the result, attach it to a finding, or send it to the notebook.

v0.35.0 — search your evidence, not a second database
👥

Team Investigations

Turn on sign-in when more than one analyst works the case: OIDC or an audited local account, per-case reader/investigator/reviewer/administrator roles, scoped service identities, and analyst attribution signed into the record. Two people can no longer overwrite each other. Localhost stays zero-config — none of it is required to run alone.

v0.35.0 — roles, attribution, no lost writes
🧬

Contextual YARA Grading

A YARA hit is graded by where and what it matched, not a flat High: a self-scan reads as Info, a page-file or memory-dump string as Low, a broad heuristic as Medium — only a named malware family on a real path stays High. Measured across four real intrusion scenarios: High+Critical findings cut 74–86%, zero new false positives.

v0.36.0 — signal over noise
🔒

Ransomware Detection

A ransom-note filename or a file renamed with a known family's extension is flagged as T1486, aggregated per host so a mass-renamed share reads as one finding, and graded above Info so it survives the event cap instead of drowning in MFT/USN noise.

v0.36.0 — the note doesn't get buried
🤝

Handoff Brief

One panel for shift change: findings by owner, the questions still unanswered, open hypotheses, the critical next steps, the IOCs nobody checked and the last import — derived from the case as it stands, plus the outgoing analyst's note. Copy it as Markdown or ship it as a report section. The next analyst starts where you stopped.

v0.37.0 — nothing lost between shifts
⚖️

Attack Outcome on Two Axes

Every finding records what happened on two separate axes — was the malicious action observed, and what did a security control do: blocked, remediated, failed, allowed, none seen. A blocked attack is no longer dismissed as a false positive or left open at High, and the report prints both axes with their attribution.

v0.37.0 — detected is not the same as succeeded
🔎

Missed Evidence Review

The content tagger grades what its rules name, and everything else stays Info, where the AI never looks. One press sends those rows to a fast decision model, which grades them and says how sure it is. Tick the rows that matter and promote them into the forensic timeline with the model's grade on the record. Nothing moves until you say so.

v0.38.0 — a second pass over what the rules left behind
📖

Story So Far

The Now cockpit shows one card per kill-chain stage: first seen, host, headline event and top finding, with the intrusion's span, dwell, hosts and accounts above it. A stage with no evidence is greyed and links to Evidence Gaps. Copy the whole story as a plain-text brief. Derived from the case — no AI call.

v0.38.0 — the intrusion at a glance
🧩

ATT&CK Matrix

A Navigator-style matrix, built in and fully offline, in the MITRE panel and the interactive HTML report. Filter by platform, show only the techniques the case hit, and click a technique to see its findings and events. No upload, no second tool.

v0.39.0 — the whole matrix, inside the case
🛟

Synthesis Safety-Stop Fallback

Heavy credential-theft evidence can trip a model's safety filter partway through a synthesis. The run now tries the same model again, then switches once to a fallback model you picked, and the Investigation Log says so. The case gets its findings instead of an error.

v0.39.0 — a stopped synthesis still finishes
🏋️

Built for Big Cases

Each import touches only the rows it changed, so the tenth import into a case costs about what the first did. A memory guard refuses an import that would exhaust the server before it starts. On a 70,000-event case, timeline search answers in under half a second, and the timeline shows the true total with Load more.

v0.40.0 — 70k events, still fast
🛡️

Hardened Reports

Attacker-controlled text in evidence can no longer forge a report heading, hide later sections, or stall an export. Indicators are defanged in linear time, including domains with underscores, and numbered hosts like WS01 and WS02 stay separate events.

v0.40.0 — evidence can't rewrite the report
🧯

Containment Check

Press the shield on a finding. A fast model answers eleven narrow questions about the evidence the finding cites, and a tested rule turns the answers into containment steps. Tick the steps you want and they land in the Playbook, each one showing the answers behind it.

v0.41.0 — containment steps you can trace
🚪

Initial Access, Named

Synthesis records the earliest observed attacker entry as its own finding, even when the origin is unknown. It is honest about the limits: your own VPN address is not external evidence, and missing source telemetry keeps the confidence low and marks the entry as inferred.

v0.42.0 — where they first got in
🔀

Masquerades Made Visible

A file name that hides a right-to-left override, such as invoice<RLO>cod.scr, is graded High as T1036.002. The hidden character shows as a visible marker in the dashboard and in every report, export and alert, so the name can no longer read backwards.

v0.42.0 — the name can't lie
🛰️

Defender XDR & Sentinel In

Advanced-hunting exports from Defender XDR and Sentinel tables, including Linux auditd, Sysmon for Linux and VMConnection flows, import with hosts, accounts and full command lines. Zeek's classic TSV logs import too. Replication from a non-DC and AD FS key reads grade High.

v0.43.0 — your SIEM, imported
🛟

Safety Stops Don't Lose the Run

When a model's safety filter refuses a forensic prompt, synthesis, the deep pass, the referee, Explain event and view summaries retry, then hand the work to a fallback model you pick. Every answer names the model that wrote it, and refused prompts can be saved for replay.

v0.43.0 — refusals fall back, never vanish
🧭

SigmaHQ Rules at Import

Bundled SigmaHQ rules grade CloudTrail, Entra ID and web and proxy access logs as they import. Check, install and roll back rule releases, skip known-benign values, dry-run a pasted rule, and re-grade a case you already imported. Undo restores both timelines.

v0.44.0 — community rules, graded at the door
🔏

Custody at Receipt

Every file is hashed with SHA-256 and SHA-1 into chain of custody before any parser touches it, rejected files included. You can show a file was handed over and match it against your own copy, even when the import failed.

v0.44.0 — hashed before it is read

One Import button — auto-detects the format

Drop any file. The server sniffs the structure and routes it to the right importer. Most are deterministic — zero AI calls, zero cost.

🦅Velociraptor
🧅Security Onion
🪚Chainsaw
🦅Hayabusa
⚡THOR / Nextron
🔬Cyber Triage
🌊Suricata
🦓Zeek
📂KAPE / EZ Tools
⏳Plaso / log2timeline
☁️M365 / Entra ID
☁️AWS CloudTrail
☁️GCP / Azure
🧪CAPEv2
🦅Falcon Sandbox
📊SIEM / EDR JSON
📝CSV / Generic Log
📸Screenshots (any)
🎯CrowdStrike Falcon
🦡Hunting.ch (abuse.ch)
🐧auditd / journald / Falco
🧠Volatility 3 / Rekall
📧Email / .eml / .msg

Two-phase analysis

Cheap vision extraction per screenshot batch → forensic timeline. One strong text-only synthesis → findings, attacker path, conclusions.

1

Capture & Import

Browser extension screenshots your investigation. Import any artifact file — auto-detected, zero config.

→
2

Extract & Correlate

Deterministic parsers + cheap AI vision extract forensic events. Cross-source deduplication. Evidence stays on disk.

→
3

Synthesize & Report

One strong model call: findings, IOCs, MITRE, attacker path, key questions. Markdown + HTML + PDF + push to IRIS/Timesketch.

Built for OPSEC-conscious teams

Every design decision favors local-first, evidence-stays-on-box, your-AI-your-choice.

🔒

Localhost Only

Binds 127.0.0.1. Evidence on disk. AI provider is yours to choose — OpenAI, Ollama, local LiteLLM, Gemini. Nothing phone-home.

🛡️

AI Input Anonymization

Internal IPs, usernames, hostnames reversibly tokenized before the LLM. Adversary IOCs preserved. Per-case toggle, default on.

📡

Threat Intel — Per-Source OPSEC

Local sources (your MISP/YETI) by default. External (VirusTotal, AbuseIPDB) opt-in with confirm. Reachability gate — down servers skip, not fail.

🖥️

Portable Windows EXE

No install. Unzip, double-click, dashboard opens. Built with Node SEA — single portable binary with dashboard assets embedded.

🐳

Docker / Docker Compose

One command: docker compose up. Localhost-only by design (Compose maps port back to 127.0.0.1). Evidence persists on volume.

⚙️

AI On/Off Per Case

Capture-only mode by default. Turn AI on when ready — it backfills everything captured while off. Deterministic imports still populate timeline.

🔒

Redacted Case Export

Share findings externally safely — internal IPs/hosts tokenized, secrets redacted, screenshot EXIF stripped + PII blurred. No AI keys in the ZIP.

🌙

Dark / Light Theme

Full theme coverage — every panel, graph, swimlane canvas. Follows OS preference, persists per-session. Night-shift DFIR without eye strain.

🔐

Encrypted Case Archive

Export the entire case — evidence and screenshots included — as one password-protected, AES-256-GCM encrypted .dfircase file. No AI provider keys are ever included. Import on another machine and continue.

🧪 Hands-on Lab — No Install Needed

Walk through a real DFIR investigation scenario in your browser. Killercoda spins up a full environment — companion and sample evidence — ready to use in seconds.

🧪 Start the Hands-on Lab →

Running in 60 seconds

Option 1 — Windows (recommended)

windows
# Download dfir-companion-<version>-win-x64.zip # from GitHub Releases, then unzip # Optional: put a .env next to the exe # Double-click dfir-companion.exe # → http://127.0.0.1:4773/dashboard # Or, optional: Chocolatey choco install dfir-companion

Option 2 — Linux (AppImage)

linux
# Download the .AppImage from GitHub Releases chmod +x dfir-companion-*-x86_64.AppImage ./dfir-companion-*-x86_64.AppImage # → http://127.0.0.1:4773/dashboard

Option 3 — Docker / Compose

terminal
# Build & run git clone https://github.com/hasamba/dfir-companion.git cd dfir-companion docker compose up -d --build # Or pull prebuilt docker compose pull && docker compose up -d # → http://127.0.0.1:4773/dashboard # Load ./addon/dist as unpacked extension

Option 4 — From source (developers)

terminal
# Clone & install git clone https://github.com/hasamba/dfir-companion.git cd dfir-companion/companion npm install # Configure AI (or leave off for capture-only) cp .env.example .env # Start the server npm run dev # Load the extension cd ../extension npm install && npm run build # → Load extension/dist as unpacked # Firefox 140+ instead of Chrome npm run build:firefox # → about:debugging → Load Temporary # Add-on → dist-firefox/manifest.json

Ready to investigate smarter?

AI eyes on your evidence. Open source. On your machine. Your conclusions.

License: AGPL v3 Node 22.19+ Platforms