Skip to content

1. Layered multi-crate workspace

Context

A browser-forensic suite spans several concerns: domain types, per-browser artifact parsers, and cross-cutting capabilities (integrity, carving, web storage, interpretation, memory scanning, discovery), plus two front ends (a CLI and an MCP server). A single crate would force every consumer — including a Rust tool that only wants the Chromium history parser — to compile the whole surface, and would couple the medium-agnostic parsers to the binaries.

Decision

Split the workspace into thirteen crates arranged in dependency layers: forensicnomicon feeds browser-forensic-core (domain types, timestamp conversions, the read-only SQLite opener); the per-browser parsers (-chrome, -firefox, -safari) and -discovery sit above core; the capability crates (-storage, -integrity, -carve, -interpret, -memory) layer on top; -triage orchestrates them into one report; and -cli and -mcp are the front ends. Every library crate is independently consumable, and -integrity, -carve, and -memory accept a Path or &[u8] so they carry no dependency on any image or memory-dump layer. All crates inherit one uniform, CI-verified MSRV of 1.80 from the workspace so every library crate stays broadly publishable.

Consequences

A downstream tool depends on exactly the parser it needs. The medium-agnostic crates are reusable outside this suite. A uniform low MSRV keeps the library crates consumable by older toolchains, at the cost of forgoing newer-Rust features workspace-wide. The layering must stay acyclic, which constrains where shared helpers live (they belong in -core).

Status

Accepted.