HTTrack Website Copier
Open Source offline browser

Change report format specification


Run with --changes (-%d), HTTrack writes hts-changes.json in the project directory, next to hts-log.txt, describing what the crawl left new, changed, unchanged and gone compared to the previous mirror. The file is rewritten from scratch at the end of every run, and the log carries a one-line summary of the same counts.

What "changed" means

A resource is changed when its bytes differ, not when the server merely re-sent it. HTTrack compares the payload it just received against the copy the previous run left behind: for pages it parses, the previous payload comes from the cache (the file on disk carries the mirror footer and its crawl date, so its bytes differ on every run); for everything else, the mirrored file is the payload verbatim and is compared directly.

Where no digest can be taken on either side, because the cache is disabled or the previous copy is gone, the report falls back to the transfer signal, and a server that answers 200 rather than 304 reads as changed. Keeping the cache on (the default) is what makes the report precise.

With the cache off

--cache=0 costs the report more than the digest of a parsed page. The mirror's file index (hts-cache/new.lst) is what records which files a run produced, so without it there is no previous mirror to subtract from: nothing is reported gone, and whether the run is a first crawl cannot be decided at all, which first_crawl states as null rather than guess. What is on disk is still compared byte for byte, so the other three lists stay meaningful, except for the pages HTTrack parses: those have no cached payload to compare against and fall back to the transfer signal.

Fields

Each entry is an object:

Encoding

The file is JSON, UTF-8. URLs and local paths reach HTTrack as raw bytes and are not guaranteed to be valid UTF-8; any byte sequence that is not becomes U+FFFD (\ufffd), so the file always parses. Compare on file rather than on url when a mirror is known to carry legacy-charset URLs.

Example

{
  "schema": 1,
  "generator": "HTTrack Website Copier/3.49-14",
  "date": "2026-07-26T15:29:03Z",
  "first_crawl": false,
  "partial": false,
  "purged": true,
  "counts": { "new": 1, "changed": 1, "unchanged": 1, "gone": 1 },
  "new": [
    { "url": "http://example.com/d.html", "file": "example.com/d.html", "size": 280 }
  ],
  "changed": [
    { "url": "http://example.com/a.html", "file": "example.com/a.html", "size": 281, "previous_size": 273 }
  ],
  "unchanged": [
    { "url": "http://example.com/b.html", "file": "example.com/b.html", "size": 277 }
  ],
  "gone": [
    { "url": "", "file": "example.com/c.html" }
  ]
}


Notes