
Uwazi Preserve
A hash that moves if one byte moves
A browser extension that captures a page with its provenance and files it into Uwazi.
Juan M. Cornejo
Uwazi Preserve
A notebook
This notebook covers one idea behind Uwazi Preserve: a hash over the whole capture, which lets anyone check that the copy is unchanged since it was taken.
- Notes2
- A bundle, sketched3
- A hash that moves if one byte moves4
- One bundle, four hashes5
- Try it6
- Preserve, as designed7
- A capture in the library8
- Taken once, compared after9
- In short10
A screenshot is not evidence. Preserve captures a page with its provenance and files it into Uwazi.
1Uwazi Preserve
Notes
- Pages that hold evidence get changed or taken down. A screenshot proves nothing on its own: anyone can fake a PNG.
- A capture keeps the whole response (the page and its headers) and the time it was taken.
- A hash is a short code worked out from data. Here it is 64 hexadecimal characters (256 bits). In this notebook’s model, one hash is taken over the whole capture, once, when it is taken.
- Change one byte (about one letter of text) and about half of the hash’s 256 bits flip. The hash does not say where the change was.
- To check a copy later, hash it again and compare the result with the stored hash. The stored hash is not recomputed.
- The Uwazi side of the integration maps no hash field, and the extension’s code is not in anything this notebook was built from. So it does not say which algorithm Preserve uses, or confirm that it keeps a hash.
- The extension pairs with Uwazi once, with a token generated inside Uwazi. After that, the captures arrive in Uwazi as entities, which is Uwazi’s word for records.
- This notebook shows the idea on an invented sample. It is not a capture, it is not Preserve’s code, and SHA-256 is this demo’s choice.
2Notes
A bundle, sketched
Figure 1. A bundle, sketched in code. The address, the time, the headers and the page form one sheet, with one hash beside it.
3Uwazi Preserve
Chapter 1
A hash that moves if one byte moves
Preserve is a browser extension that captures a web page as evidence and files it into Uwazi. A capture keeps the whole response, its headers (the details a server sends with a page) and the time. This notebook calls those together the bundle. The idea here is one hash over the whole bundle, taken once.
Later, anyone can hash the stored copy again and compare the two hashes. If one character has changed, about half of the hash’s 256 bits differ.
4A hash that moves if one byte moves
One bundle, four hashes
url: https://example.org/notices/2026/hearing-schedule captured-at: 2026-10-21T15:04:05Z HTTP/1.1 200 OK content-type: text/html; charset=utf-8 date: Wed, 21 Oct 2026 15:04:05 GMT last-modified: Tue, 20 Oct 2026 09:30:00 GMT content-length: 181 <!doctype html> <title>Hearing schedule</title> <h1>Hearing schedule</h1> <p>The hearing in case 41/2026 is moved to 3 November, room 2.</p> <p>Published by the court registry.</p>
| The bundle | SHA-256 | Bits that differ |
|---|---|---|
| as taken | 130db370ba1d3d35…ba1094f8 | none |
| a different day | 615c42ddcaaf0afd…7f777a30 | 129 of 256 |
| one space more | ac404a5189b6a65e…11a7e1d5 | 133 of 256 |
| one second later | dea41fef2e6fd2cd…72ac2249 | 133 of 256 |
Change one character anywhere in the bundle, the time included, and about half of the hash’s 256 bits flip.
Table 1. One invented bundle, hashed with SHA-256 when the page was built. SHA-256 is this demo’s algorithm. This is the idea on a bundled sample, not a capture and not Preserve’s code.
5Uwazi Preserve
Try it
stored
now
Figure 2. The idea on a bundled sample, not a capture: an invented page, hashed with SHA-256 in this browser. Change any character, then press re-verify to compare the new hash with the stored one.
6Try it
Preserve, as designed

- 1Hash: the digital signature
- 2The page’s URL
- 3Its full HTML source
- 4The capture itself
- 5Kept together as one Preserve block
Plate 1. From the design of Preserve, a diagram, not a screen: the four fields a capture carries, the hash first. Uwazi’s side, as built, maps no hash field.
7Uwazi Preserve
A capture in the library

- 1The page captured, as the record’s title
- 2Its URL
- 3Status: in the queue
- 4When it last synced: not yet
- 5A web capture, not an upload
Plate 2. A capture lands in Uwazi’s library as an ordinary record, with a status and a sync time, from the design’s screens of the integration.
8A capture in the library
Taken once, compared after
Figure 3. A bundle laid out field by field, with one hash taken over all of it. Below, the first 32 of the 256 bits of that hash and of the hash after one character of the page changed. The flipped bits are in colour.
- 1The page, its headers and the time go into one bundle.
- 2The bundle is hashed once and the hash kept beside it.
- 3Later, the copy is hashed again and the new hash is compared with the stored one.
9Uwazi Preserve
In short
In this model, a hash is taken once, when the page is captured. Any later change to the copy, even one character, gives a different hash, so comparing the two shows whether the copy is unchanged. It does not show where it changed.
The case study covers the rest of Preserve: pairing with Uwazi, how a capture lands as an entity, and the status each capture reports.
another notebook Uwazi UI refactor
10In short

