CLI tool
RyanDFIR/hindsight avatar
RyanDFIR/hindsight

Hindsight Browser Forensics for Chrome, Chromium and Firefox Profiles

Browser forensics tool for Google Chrome, other Chromium-based browsers, and Mozilla Firefox

1,544 stars187 forksPythonApache-2.0

At a glance

What is it?
Hindsight is a Python browser-forensics tool that extracts and correlates Chrome, Chromium-based and Firefox artifacts into timelines and exportable reports. It suits DFIR investigators who need local profile analysis, while its installation and cache-parsing dependencies require attention.
Who is it for?
Hindsight fits investigators who need a report-oriented timeline from local Chrome, Chromium-based or Firefox profile data. It is less suitable for live browser monitoring or encrypted-content recovery.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Hindsight analyzes in browser profiles

Hindsight addresses a specific problem: turning the scattered files left inside browser profiles into a coherent record of activity. The README identifies URLs, download history, cache records, bookmarks, autofill records, saved passwords, preferences, browser extensions, HTTP cookies and Local Storage records as supported web artifacts. That list makes the tool relevant to digital forensic examinations, incident response and investigations that need to establish what a browser profile contained.

The intended user is an investigator or analyst working with a browser profile directory, rather than a developer building a browser extension or a web application. Hindsight does not describe itself as a live monitoring system. Its workflow starts with stored files, extracts records from those files, correlates records from multiple sources and presents the result as a timeline. The output is intended for examination and reporting. The default output format is XLSX, while SQLite and JSONL are also available.

Firefox support is narrower and more specific than the broad Chromium description. For Firefox, the documented databases are places.sqlite for history visits, bookmarks and downloads, cookies.sqlite for cookies, and formhistory.sqlite for form history. Chrome and Chromium-based applications share the general artifact model, including history, downloads, cache data and browser configuration. Hindsight also supports browser types such as Chrome, Edge, Brave, Vivaldi, Firefox and Tor, with Chromium acting as an alias for Chrome.

The tool's value lies in correlation rather than simply listing filenames. A URL in history, a download entry, a cookie and a configuration record may describe different aspects of the same browsing session. Hindsight places extracted data into a timeline, giving the investigator a common structure for reviewing those records. The README does not claim that every artifact is available in every profile, so absence of a record should not automatically be treated as proof that the associated action never occurred.

The Hindsight extraction and correlation pipeline

The visible architecture has three layers. First, Hindsight receives either a browser profile directory or a parent directory containing profiles. For multiple profiles from different browsers, automatic detection is the documented default. The --browser_type option can force one browser for every discovered profile, but the README says that override should be used only when every profile should be treated as the same browser.

Second, Hindsight parses artifact-specific files. Chromium profiles are handled through the browser data structures supported by the project and its reader dependencies. Firefox processing is based on the named SQLite databases. The parsing stage can be narrowed with --only or --skip, using browser-neutral artifact names. For example, history means Chrome's History URL records and Firefox's places.sqlite URL records. Group names such as user-activity, website-storage, browser-extensions, configuration and caches can select or exclude sets of artifacts.

Third, the extracted records are correlated and placed into a timeline. Output can then be written as XLSX, SQLite or JSONL. This design favors examination and export. It also creates a clear audit distinction between an artifact that was intentionally filtered and an artifact that was not present. The documentation states that an excluded artifact is reported as [ skipped ] during the run and is recorded in the log. An unrecognized artifact name is an error rather than a silent omission.

Version detection is a separate concern from artifact filtering. The README states that Hindsight still reads database schemas to detect the browser version, even when --only or --skip limits parsing. This is useful operationally, because it means filtering changes report scope, not the initial version-detection step. It also means that filtering is not a way to avoid all access to profile schemas.

Installing Hindsight and running a first profile analysis

Hindsight requires Python 3.11 or newer according to pyproject.toml. The README's manual installation procedure installs the PyPI package and a separate Chromium reader from Git. The second command is significant because the project configuration says cache, IndexedDB and Local Storage parsing depend on ccl_chromium_reader. It is not available on PyPI, so the package metadata intentionally leaves that direct URL dependency out of the published dependency list.

Install the command-line tool and web interface with these commands:

sh
pip install pyhindsight
pip install git+https://github.com/cclgroupltd/ccl_chromium_reader.git

The optional SQLite database viewer uses the repository's install script:

bash
curl -sSL https://raw.githubusercontent.com/RyanDFIR/hindsight/main/install-js.sh | sh

The README says this optional command is needed for the web interface's "View SQLite DB in Browser" feature. It is separate from the core Python installation. The repository includes JavaScript dependencies in package.json, with `sqlite-view` as the dependency and Vite as a development dependency. The README does not document a separate Node.js version requirement for this step.

For a first command-line use, provide the profile path and output name. This example follows the Windows path style shown in the README:

bash
hindsight.py -i "C:\Users\Ryan\AppData\Local\Google\Chrome\User Data\Default" -o test_case

The output defaults to XLSX. For a faster review, select only history and downloads:

bash
hindsight.py -i <profile> --only history,downloads

For Firefox, select the Firefox browser type and point at a profile directory such as `[userdir]\AppData\Roaming\Mozilla\Firefox\Profiles\<profile>`. The web interface is started by running `hindsight_gui.py`, or `hindsight_gui.exe` on Windows, and visiting `http://localhost:8080`. In the GUI, the only required field is "Profile Path". Click "Run" to reach the results page, where the documentation says results can be saved to a spreadsheet or another format.

Browser coverage, detection and artifact selection

Automatic browser detection is the safer default when the input directory contains profiles from several browsers. Hindsight can identify each profile separately, while the explicit override is intended for a controlled collection in which every discovered profile really belongs to the specified browser type. This distinction matters because applying Chrome parsing assumptions to an unrelated directory can produce misleading results or errors.

Artifact selection gives investigators a practical way to control processing time and report scope. Cache data can be large and may not be relevant to an examination, so the README gives this example:

bash
hindsight.py -i <profile> --skip cache

The filters can be combined. In the following example, the report is limited to the `user-activity` group, then narrowed further by excluding sessions:

bash
hindsight.py -i <profile> --only user-activity --skip sessions

Artifact names are case-insensitive, and spaces, underscores and hyphens are interchangeable. For example, `local-storage`, `local_storage` and `"Local Storage"` identify the same artifact. The complete list can be inspected without starting an analysis:

bash
hindsight.py --list-artifacts

This explicit rejection of unknown names is a useful safety property. A typo should not quietly turn into a narrower report than the investigator intended. The logged skip status also helps reviewers distinguish deliberate scope from missing evidence. However, the README does not document recovery behavior, evidence hashing, write protection or chain-of-custody procedures. Hindsight should therefore be evaluated as an analysis tool, not treated as a complete acquisition system without considering the surrounding case workflow.

Dependencies, formats and operational limits

The Python package requires Python 3.11 or newer and declares dependencies including `bottle`, `keyring`, `protobuf`, `puremagic`, `pycryptodomex`, `rich`, `tzdata` and `xlsxwriter`. On Windows, `pywin32` is also declared for the matching platform. The package exposes console entry points named `hindsight` and `hindsight-gui`, according to the project metadata shown in the repository. The README also refers to the repository scripts `hindsight.py` and `hindsight_gui.py`, so installation method affects how the tool is launched.

The cache reader is a material operational constraint. `requirements.txt` pins `ccl_chromium_reader` to a specific Git commit, while `pyproject.toml` explains that direct-URL dependencies cannot be declared for the PyPI package. If the reader is absent, a PyPI installation can still work for some parsing, but cache, IndexedDB and Local Storage parsing is affected. That distinction matters for investigators who expect every artifact named by the README.

The output formats serve different downstream uses. XLSX is the default and is convenient for spreadsheet review. SQLite can support structured querying, and JSONL can support line-oriented processing or ingestion into another system. The README does not document schema stability guarantees for these exports, so an integration should not assume that every future release preserves the same record layout.

Hindsight is also not a general-purpose recovery tool. It analyzes browser profile artifacts, but the README does not say that it decrypts arbitrary files, recovers deleted data that browsers no longer retain, captures network traffic or preserves an original disk image. Saved passwords and encrypted browser data may also depend on browser-specific access conditions that are not explained in the supplied documentation.

Hindsight versus single-database browser inspection

A real alternative is to inspect an individual browser database directly with a SQLite viewer or a small custom script. That approach can be appropriate when the investigative question is narrow, such as reviewing only Firefox's `places.sqlite`, or when the examiner needs direct control over SQL queries and export logic. It also avoids running a multi-artifact correlation pipeline.

The difference is scope and correlation. Direct database inspection works with the database that is already available and leaves interpretation of relationships between records to the analyst. Hindsight is designed to locate and parse multiple artifact types, combine them into a timeline and emit a report-oriented result. Its `--only` and `--skip` filters let an examiner retain that broader workflow while limiting processing to relevant records.

The trade-off is dependency and abstraction cost. Direct inspection has fewer moving parts for one known database, but it requires the examiner to understand each schema and build the reporting workflow. Hindsight automates browser-aware extraction, browser detection, artifact naming and correlation, while adding Python and Chromium-reader dependencies. A custom pipeline may also be preferable for repeat deployments where predictable schemas and strict integration control matter more than the GUI and built-in report formats. Hindsight does not document schema guarantees, so that distinction should be tested against the intended workflow before relying on it for automation.

Hindsight maintenance and upgrade considerations

The repository is not archived, and the last push was on 2026-10-16. Recent releases include `v2026.06` dated 2026-07-08, `v2026.04` dated 2026-05-02 and `v2026.01` dated 2026-01-30. These facts indicate recent repository activity and versioned releases, but they do not establish compatibility with every browser schema or prove that upgrade paths are non-breaking.

The main upgrade concern is the dependency split. `requirements.txt` includes a Git-sourced `ccl_chromium_reader` pinned to `ef840de30221c4d65bc96d2f4d9057e9ef2f526d`, while the published Python metadata cannot declare that direct URL dependency. An installation procedure must account for this difference rather than assuming that `pip install pyhindsight` provides every documented parser.

The repository is licensed under Apache-2.0, with the license file included in the project metadata. That identifies the project's licensing terms, but it does not resolve legal questions about browser data, passwords, cookies, personal information or the handling of evidence in a particular jurisdiction. The README and package metadata do not document a formal compatibility matrix, schema migration policy or rollback procedure. Before upgrading an analysis environment, record the Hindsight version, Python version and reader commit, then verify that the expected artifacts still appear in a report.

Editorial conclusion

Hindsight fits investigators who need a report-oriented timeline from local Chrome, Chromium-based or Firefox profile data. It is less suitable for live browser monitoring or encrypted-content recovery. Verify Python 3.11 or newer, the profile path, artifact coverage, and whether cache parsing depends on the additional ccl_chromium_reader install before adopting it.

Frequently asked questions

What browsers does Hindsight support?

Hindsight supports Google Chrome, other Chromium-based browsers, Mozilla Firefox, and the listed Chrome, Edge, Brave, Vivaldi, Firefox and Tor selections. Chromium is an alias for Chrome. Browser-specific coverage still depends on the artifacts present in each profile.

How do I install Hindsight for browser forensics?

The README documents installing `pyhindsight` with `pip` and installing `ccl_chromium_reader` from its Git repository. The latter is relevant to cache, IndexedDB and Local Storage parsing, while the SQLite browser viewer requires the separate `install-js.sh` procedure.

Can Hindsight analyze Firefox profiles from the command line?

Yes. Select Firefox with `-b Firefox` and provide a Firefox profile directory. The documented Firefox databases are `places.sqlite`, `cookies.sqlite` and `formhistory.sqlite`.

Official sources

  1. License: Apache-2.0
  2. Project website
  3. README
  4. Releases
  5. RyanDFIR/hindsight on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/ryandfir-hindsight.svg)](https://hysenlabs.com/projects/ryandfir-hindsight)