Skip to content

Getting started

Try it in 60 seconds

  • No install: the live demo shows a real public OTRF capture.
  • pip (recommended): pip install "git+https://github.com/rakshit-737/revenant-dfir-timeline" && revenant demo --scenario intrusion
  • Docker: docker run --rm ghcr.io/rakshit-737/revenant-dfir-timeline:latest demo --scenario intrusion. Images from v1.1.0 on ship the calibration table; avoid :1.0.0.

The first story should read story-907cbcd159 - suspicion 0.91, confidence HIGH (0.74).

Not on PyPI

pip install revenant installs an unrelated package with the same name. Install from GitHub (as above) or from a release wheel.

Install

REVENANT is a pure-Python package (3.10–3.14, all tested in CI). Core dependencies are pydantic and networkx; everything else is an optional extra.

git clone https://github.com/rakshit-737/revenant-dfir-timeline
cd revenant-dfir-timeline
pip install -e .            # core
pip install -e '.[evtx,api,pdf]'   # raw .evtx, FastAPI UI, PDF reports

Optional extras: evtx (raw .evtx parsing), api (FastAPI + UI), pdf (WeasyPrint reports), neo4j (live graph push), bench (benchmarks and figures), dev (tests + ruff, enough to run the whole suite), docs (this site: mkdocs serve).

Run a built-in scenario

The synthetic scenarios need no data download and are the fastest way to see the output.

revenant scenarios                 # list scenarios
revenant demo --scenario intrusion # full phishing → PowerShell → C2 story

Analyse real artefacts

These run as written from a checkout (committed fixtures):

revenant analyze tests/fixtures/otrf_psexec_lsa_secrets.jsonl --format md --top 5
revenant analyze tests/fixtures/otrf_psexec_lsa_secrets.jsonl --format html --out report.html --ledger custody.sqlite
revenant analyze tests/fixtures/plaso.jsonl --format json --out case.json
revenant analyze tests/fixtures/auditd_sample.log --kind auditd
revenant verify custody.sqlite     # read-only hash-chain check

On your own evidence pass a file or directory: OTRF/Mordor/Sentinel JSON lines, raw .evtx, plaso json_line/l2tcsv, a Volatility 3 directory, auth.log or auditd audit.log. A missing path exits with status 2. verify refuses a missing or empty ledger and a ledger whose append-only triggers were dropped; pass the report's "Ledger head" and record count (--expect-head, --expect-count) to also detect truncation or a full rewrite.

Output formats: md, html, json, cypher. Add --pdf report.pdf (needs the pdf extra) and --ledger custody.sqlite to persist an append-only custody ledger.

Web UI

pip install -e '.[api,evtx]'
REVENANT_EVIDENCE_ROOT=/path/to/evidence revenant serve
# open http://127.0.0.1:8000

The API only reads evidence, only below REVENANT_EVIDENCE_ROOT, never follows links inside it, binds to localhost (other addresses need --allow-remote), serves only loopback Host headers and refuses cross-origin POSTs. It has no authentication.

A pre-computed, server-less version is published as the Live demo.

Docker

docker run --rm -p 127.0.0.1:8000:8000 \
  -v "$PWD/tests/fixtures:/evidence:ro" \
  ghcr.io/rakshit-737/revenant-dfir-timeline:latest
# the API has no authentication: always publish the port on 127.0.0.1

Or use docker compose up api (see docker-compose.yml; set NEO4J_PASSWORD first).

Datasets

Benchmarks pull public corpora with python scripts/download_data.py into $REVENANT_DATA (default ../../datasets/revenant, outside the repo). Every archive is pinned by SHA-256; unpinned entries are refused. See Datasets and Reproduce.