Skip to main content

ReconKit

ReconKit is a small Python toolkit for preserving authorized web observations and local file findings as reviewable evidence records. It is a collection layer, not a scanner, case-management system, or source of truth.

It complements reconnaissance tools such as SpiderFoot and BBOT, web archiving tools such as Webrecorder, and case-management platforms such as DFIR-IRIS. ReconKit focuses on the handoff between collection and review: what was collected, where it came from, what redirects occurred, what limits apply, and whether exported files have changed.

What it provides

  • Public-web capture with bounded size, rate limiting, redirect-chain recording, robots checks at every destination, and blocking of private, loopback, and reserved destinations by default.
  • Standards-oriented WARC 1.1 and WACZ 1.2 exports. WACZ files contain a WARC, CDXJ index, page list, file-fixity manifest, and data-package digest.
  • Append-only, hash-linked chain-of-custody ledgers.
  • Ed25519-signed manifests that can be verified offline.
  • A DFIR-IRIS v2 adapter that registers an exported evidence file with an existing case.
  • Local file hashes, magic-byte identification, EXIF extraction, printable-string extraction, and small DNS/WHOIS/RDAP observations.

What it does not claim

ReconKit records a transport observation. It does not prove the identity of a publisher, the truth of content, legal chain of custody, or attribution. A SHA-256 digest proves that bytes have not changed relative to the recorded digest; it does not prove where they originated.

Web collection is only for systems and data you own or are authorized to assess. The default public-destination restriction helps prevent accidental collection from local or private infrastructure; it is not a substitute for operational authorization.

Install

python -m pip install reconkit

For development:

python -m pip install -e ".[dev]"

Capture and preserve a page

reconkit evidence archive-warc "https://example.com" --output evidence/example.warc
reconkit evidence archive-wacz "https://example.com" --output evidence/example.wacz --title "Example capture"

The WACZ export follows the WACZ 1.2 layout, so it can be validated and replayed with compatible web-archive tooling. Robots rules are respected by default; use --no-obey-robots only when you have clear authorization for the capture.

Sign a manifest and record custody

from pathlib import Path
from reconkit.evidence import CustodyLedger, ManifestSigner, verify_manifest, write_manifest

evidence = Path("evidence/example.wacz")
ledger = CustodyLedger("evidence/custody.jsonl")
ledger.append(action="acquired", actor="analyst@example.org", artifact_path=evidence)
ledger.append(action="exported", actor="analyst@example.org", artifact_path=evidence)
assert ledger.verify()

signer = ManifestSigner.generate()
Path("keys/evidence-signing-key.pem").write_bytes(signer.private_pem())
manifest = write_manifest([evidence], "evidence/manifest.json", signer, custody_ledger=ledger.path)
assert verify_manifest(manifest)

Keep the private key outside the evidence directory and protect it with your organization’s key-management practices. The manifest embeds the corresponding public key so a reviewer can verify it without the private key.

Register exported evidence in DFIR-IRIS

from reconkit.evidence import DFIRIRISAdapter

iris = DFIRIRISAdapter("https://iris.example.org", api_key="your-api-key")
iris.register(
    case_identifier=42,
    evidence_path="evidence/example.wacz",
    description="Public web capture; signature and custody ledger stored alongside export.",
)

The adapter registers file metadata, digest, and description through DFIR-IRIS’s documented v2 evidence endpoint. Upload and retention of the evidence bytes remain controlled by the case system’s own workflow.

Existing local commands

reconkit evidence acquire-web "https://example.com" --trust-boundary public-internet
reconkit evidence derive-links "https://example.com"
reconkit boundary dns example.com
reconkit verify file-hash .\sample.bin --algo sha256

Development

pytest
python -m build
twine check dist/*

Releases

PyPI publication is automated by GitHub Actions. After updating the version in pyproject.toml and the changelog, push the matching annotated tag (for example, v0.3.0). The workflow verifies that the tag and package version match, builds the distributions, validates them with Twine, and publishes using the repository's PYPI_API_TOKEN Actions secret. Ordinary branch pushes never publish a release.

License

Copyright © 2026 Noir Stack LLC. Licensed under the Proprietary Software License — Free Use, No Modification.

Metadata

Release files for reconkit 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for reconkit 0.2.1
File Size Uploaded Provenance Actions
reconkit-0.2.1.tar.gz 19.8 kB Without provenance Details for reconkit-0.2.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for reconkit 0.2.1
File Interpreter ABI Platform Actions
reconkit-0.2.1-py3-none-any.whl Python 3 none any Details for reconkit-0.2.1-py3-none-any.whl

Total release size: 45.5 kB

Release files / reconkit-0.2.1.tar.gz

Download URL reconkit-0.2.1.tar.gz
Size 19.8 kB
Tags Source
SHA-256 checksum
How to use checksums
e23fe1d517a9b0af67ea8baf6733e170482b88849f08931efdf189f3967612f2
BLAKE2b-256 checksum
How to use checksums
64d52bf62e3715c3aa95a60ee848828eb22cfea04685c1aaf5726491223b84b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Release files / reconkit-0.2.1-py3-none-any.whl

Download URL reconkit-0.2.1-py3-none-any.whl
Size 25.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a9fba1e5db28786a24f620c4807eb3fd04f25ea8f3287d2a913e44d12e97cd4b
BLAKE2b-256 checksum
How to use checksums
81b129ce070063164e53f675ee376286100cb7f6fe59e532798fea7f11fb79c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.16

Security for reconkit 0.2.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page