You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Claude Code CLI as a text AI provider — subscription auth, no API key needed; drives synthesis, ask, deep pass and every other text-AI feature.
Codex CLI as a text AI provider — ambient auth, no API key needed; alternative to Claude Code CLI for text-AI work.
Deep Pass — full AI coverage of large, multi-host cases (#204) — analyst-triggered batched read of every graded event at a chosen severity floor, with a per-case cost/coverage preview before spending, run/cancel controls, and a dedicated dashboard section.
Help icon in the toolbar — opens the online user manual in a new tab.
Time scope for Velociraptor triage bundles — bound collection at the source to All time / last 24h-7d-30d-90d / a custom UTC range (#186).
Assignment & workflow status for findings — assign an analyst and set a triage status (New/In progress/In review/Resolved) per finding, survives re-synthesis (closes #87).
Hashed manifest in redacted report exports — export-manifest.json with per-file sha256 for integrity verification (closes #79).
Time-bound graph filtering — Assets & IoC Graph / Evidence Chain honour the active timeline time filter (closes #83).
Kill-chain overlay on the Evidence Chain graph — recolour nodes by dominant ATT&CK tactic along the kill chain (closes #93).
Login Graph — interactive Timesketch-style account→host logon graph from the super-timeline (#144).
Entity merging for duplicate assets/IOCs — fold duplicates onto a canonical node/indicator, reversible (closes #82).
Starred-events review workflow — server-side stars, whole-timeline starred filter, AI "Starred report" and "Summarize view" buttons.
Changed
Synthesis groups repeated detections; default event cap raised 300→600 (DFIR_AI_SYNTH_MAX_EVENTS) — full AI coverage of a detection-heavy import instead of just its first 300 rows; tunable via DFIR_SYNTH_GROUP, DFIR_SYNTH_GROUP_GAP_SECONDS, DFIR_SYNTH_GROUP_MIN_REPEATS.
Info-severity events no longer take synthesis prompt seats — frees budget for graded detections (DFIR_SYNTH_INCLUDE_INFO=1 restores the old behaviour).
Assets & IoC Graph and Evidence Chain now share the Login Graph's interactive Cytoscape view — same 5 layouts, live filter, fullscreen, PNG export, replacing the old static/bespoke layouts.
Velociraptor artifact catalog cached for 45s — avoids spawning the CLI on every interactive picker read.
Screenshot/vision AI vars renamed DFIR_AI_* → DFIR_VISION_* — legacy names still work as a fallback.
User manual documents every AI run separately — one page per AI feature: what it's for, when to use it, which env vars control it.
Security
Web pages could drive the companion API via wildcard CORS (#211) — now trusts only the capture extension, loopback, the dashboard's own origin, or DFIR_ALLOWED_ORIGINS.
Live WebSocket subscriptions bypassed the case password (#212) — upgrades are now authorized before the handshake completes.
Template/view/bundle ids could escape their folder via path traversal (#213) — ids are now allowlisted and resolved paths verified to stay inside their store.
A malicious IP in imported evidence could run code in the dashboard (XSS) (#217) — IPs now travel as data attributes, not inline onclick strings.
Fixed
One unsendable capture no longer blocks every later one (#215) — the extension's offline queue now discards permanently-rejected captures instead of stalling on them.
The extension can be type-checked again, and CI now does it (#218) — @types/node added as a direct dependency; npm run typecheck runs in CI.
Concurrent ingestion no longer overwrites evidence (#214) — sequence-number allocation is serialized per case; evidence writes are create-exclusive.
Comments, tags, notebook entries and pins no longer vanish under concurrent edits (#216) — each store now serializes its own per-case critical section.
The AI status pill now says a deep pass is running, with live batch progress instead of reporting idle.
Claude Code provider: a long answer that hit the output cap no longer poisons the JSON parse — the continuation is stitched from the stream (not parsed as the tail alone), and an abandoned-and-rewritten retry is told apart from a valid continuation by which one actually parses.
A deep pass on a closed or archived case is refused instead of rewriting it (#204), matching the existing /synthesize lifecycle guard.
A MISP connectivity failure now names the likely cause (bad scheme, DNS, TLS, cert, auth) instead of just the raw HTTP status.
"Collect now" on an already-collecting hunt is coalesced into a follow-up pass instead of being silently discarded.
Saving an integration setting now takes effect without a restart — /settings/reload and Settings → Save rebuild the live client, not just the environment.
Synthesis no longer sends an anchors-only prompt when Critical/High events exceed the event budget — earliest activity stays represented so the story keeps a beginning.
POST /bundles was silently dropping several fields on save (timeoutSeconds, expirySeconds, params, filters, superTimelineOnly), which could misroute a bundle's output.
Very large cases no longer fail with an opaque error, and save ~26% smaller — investigation.json is now written compact, with an actionable error past the ~512MB load ceiling.
Text AI features no longer require the screenshot/vision provider — they now run off any configured synthesis provider (DFIR_AI_SYNTH_PROVIDER).