Recipients Received a package? Read the recipient guide

Timestamped captures of your website and code

Sealjar is a free, open-source CLI that captures web pages and a Git repository into one ZIP, sealed with SHA-256 hashes and a timestamp from an independent authority. Anyone can check later whether the files still match. It is for developers and agencies who hand over a website and want a record of the site and the code on that day.

Get started

Full quickstart

Ask your coding agent

Copy this prompt and replace the URL with your own.

Prompt
Use Sealjar to capture this repository and https://staging.example.com
for handover. Use https://github.com/vincentsch/sealjar: read its AGENTS.md
and follow the steps. Verify the package and show me the report and any
capture problems. Write the output to the parent directory of this repository.

Install it yourself

Install
curl -fsSL https://raw.githubusercontent.com/vincentsch/sealjar/main/install.sh -o /tmp/sealjar-install.sh
bash /tmp/sealjar-install.sh
rm /tmp/sealjar-install.sh

If sealjar is not on PATH, use the absolute path printed after Installed: in the installer output. The examples call the executable sealjar.

Then run the bakery demo. It needs Chrome or Chromium and Git.

Demo
sealjar demo --out ../bakery-demo

Reports

The report opens without Sealjar

Capture writes an HTML and a PDF report in English and German. The HTML report needs its reader folder, because the images are linked relatively. The PDF stands on its own.

First page of the bakery demo report, with the capture details and screenshots of the bakery pages.
First page of the bakery demo report, with the capture details and screenshots of the bakery pages.
Report, captured pages The capture details first, then the desktop and mobile screenshots. Full report image
Seal page of the bakery demo, showing a trusted DigiCert timestamp and the steps to check the package.
Seal page of the bakery demo, showing a trusted DigiCert timestamp and the steps to check the package.
Seal page The timestamp result in English and German, with the steps to check the package. Full seal image

SEAL.html is a reading aid outside the manifest’s file list and is not sealed itself. Verify checks the timestamp token directly, and sealjar report writes a fresh seal page from checked data.

Who it is for

  • Handover and acceptance

    Capture the staging site and the code on handover day and send the package with the invoice. There is also a German guide to Abnahme.

  • Disputes about a website

    Record what a page showed, for example a price or the mobile layout, before anyone disputes it.

  • Lawyers and expert witnesses

    Read the report without installing anything. The recipient guide explains the three verify answers and how to check a package with Python 3 and OpenSSL instead.

The package

Pages and code in one sealed ZIP

The manifest lists every file with its SHA-256 hash. The reader folder with the reports is written beside the ZIP.

Pages

Each URL you list gets desktop and mobile screenshots. The page PDF and the rendered HTML go with them. So do the network requests with their headers, and the console messages and redirects.

Page capture

Hosts

For each host, Sealjar saves the DNS records and the connection details. HTTPS hosts also get their certificate details.

Manifest fields

Code

The tracked files as they are in your working tree, with uncommitted changes. The commit and the working-tree state are recorded. --history adds a Git bundle. Secret files are left out by default, but exclusions cannot remove all private content.

Repository selection

Reports

HTML reports in English and German, with PDFs when generated during capture. The seal page and VERIFY.txt with the checking steps sit beside them.

See a report

Timestamps

A timestamp authority seals the manifest

The authority signs the hash of the manifest together with its own time and returns an RFC 3161 token. Sealjar stores it beside the manifest, for example as manifest.json.digicert.tsr.

DigiCert is the default and FreeTSA the fallback. You can set other authorities with --tsa. If none answers, the package is written without a timestamp and sealjar stamp adds one later.

A trusted timestamp shows that the sealed files existed by the time it records. It does not check when the capture was made. Sealjar does not assess eIDAS qualification.

Timestamps and trust
  1. Captured files

    The pages and the code, with the reports.

  2. SHA-256 manifest

    manifest.json lists every file with its hash.

  3. Timestamp authority

    Signs the hash of the manifest with its own time.

  4. Signed token

    Stored beside the manifest and checked offline.

Verification

Anyone can check a package offline

sealjar verify answers three questions. Did the capture finish? Do the files still match the manifest? Is the timestamp trusted? It needs no network connection.

Original package
Capture
Complete
Files
Unchanged
Timestamp
Trusted

File check All 30 listed files match the manifest.

Exit 0 · Files match and timestamp is trusted

Show full output

sealjar verify bakery-demo-2026-10-21-1746.sealjar.zip

Capture
  Complete. Repository bakery at 19c1a882e9c9a7d56a2d502ecf2fa5a3bd80453c with 2 uncommitted changes. Page http://127.0.0.1:35379/: complete.  Page http://127.0.0.1:35379/prices/: complete. 

Files
  Unchanged. All 30 files listed in the manifest match their recorded hashes.

Timestamp
  Trusted. At least one timestamp has a valid signature and trusted certificate chain.
  DigiCert at 2026-10-21 17:46:39 UTC: Valid signature; the certificate chain leads to a trusted root at the timestamp's time.
  A timestamp from an independent trusted authority gives an upper bound for when the files existed. This does not apply to tokens made with Sealjar's public demo key.
  Offline checks cannot see later certificate revocation.
  Sealjar does not assess eIDAS qualification.
Copy with one changed screenshot
Capture
Complete
Files
Changed
Timestamp
Trusted

Changed file web/001-127-0-0-1/desktop.png

Exit 10 · Files differ from the manifest

Show full output

sealjar verify demo-tampered.sealjar.zip

Capture
  Complete. Repository bakery at 19c1a882e9c9a7d56a2d502ecf2fa5a3bd80453c with 2 uncommitted changes. Page http://127.0.0.1:35379/: complete.  Page http://127.0.0.1:35379/prices/: complete. 

Files
  Changed. Package files differ from the manifest.
  changed: web/001-127-0-0-1/desktop.png

Timestamp
  Trusted. At least one timestamp has a valid signature and trusted certificate chain.
  DigiCert at 2026-10-21 17:46:39 UTC: Valid signature; the certificate chain leads to a trusted root at the timestamp's time.
  A timestamp from an independent trusted authority gives an upper bound for when the files existed. This does not apply to tokens made with Sealjar's public demo key.
  Offline checks cannot see later certificate revocation.
  Sealjar does not assess eIDAS qualification.

Capture completeness is separate from Files and Timestamp. Exit 0 can still come with a capture problem, such as a page that failed to load.

If no public timestamp authority answers, the demo signs with a local key and labels the token “Demo timestamp, not trusted”. Verify then exits 11. Because that key is public, the token says nothing about when the files existed.

Limits

What a package can’t show

  • Matching hashes alone cannot authenticate an untimestamped manifest. Someone could replace the list together with the files.
  • It cannot show that the content is true or complete. It cannot show that the operator was honest or that the server sent those bytes, because HTTPS does not sign content.
  • It cannot show that a project was delivered or accepted, or that the captured code produced the captured website.
  • Verify trusts the system’s root certificates, the FreeTSA root that ships with Sealjar and roots you supply yourself. Certificates that only come inside the package are not trusted. An offline check cannot see a later revocation.
  • For an important dispute, have a neutral person present during the capture, for example an expert or a notary.

Questions

Before you start

Will a court accept the package?

Courts weigh evidence freely. Sealjar documents the files and makes later changes detectable. It promises no legal effect and no admissibility.

What do I need installed?

Sealjar is one executable for Linux, macOS and Windows. Web capture needs Chrome or Chromium, and code capture needs Git. Verify, report and restore need neither.

Does it crawl the website?

No. You list each URL yourself. The saved HTML is the rendered page; it cannot replay the site like a web archive.

Can I capture pages behind a login?

Yes. HTTP basic auth goes in the SEALJAR_AUTH variable. For a form login, add --login and sign in yourself in the Chrome window that opens. Capture reuses that session.

What leaves my computer?

Capture loads the pages you list with everything they load. It asks DNS servers about the hosts and sends the manifest hash to the timestamp authority, which sees that hash and normal network metadata. There are no accounts and no uploads. The package itself can still contain private content in screenshots and HTML, or in source files and Git history. Look through it before you share it.

What is the license?

MIT. Sealjar is free and open source.

Start with the bakery demo

The demo captures a bundled bakery site and an example repository on your own computer and writes a package you can verify.

Terminal
sealjar demo --out ../bakery-demo