The method
How we check a claim
Every vendor claim on this site is a quote from the vendor's own page. Where we have read that page ourselves, the claim carries the date we read it and the SHA-256 of the text we read, under "Check it yourself". Where we have recorded a claim without checking it, it is marked "Reported by the vendor", and the source and the date are given for the record as a whole rather than for the claim. That distinction is a promise you are meant to be able to test rather than believe. This page is the test.
What we keep
For each quoted claim we record four things: the claim itself, copied word for word; the address of the page it came from; whether we read the raw HTTP response or the text a browser renders, because those are different documents; and the SHA-256 of that text. The hash is of the whole page, and that detail is the reason the next section exists.
303 claims across the index carry a register entry, and every one of them has been compared against its live source at least once: 198 matched and 105 did not. Where a source could not be read at all, the record says so rather than filling the gap with a guess, and the number of claims with nothing to check them against is printed on every build so it cannot quietly grow.
Checking one, step by step
- 1. Open the claim on its product page and unfold "Check it yourself". That gives you the source address, the reading mode and the hash.
- 2. Open the source and find the sentence. If it is there, we quoted the vendor correctly. If it is not, that is worth telling us about, and there is an address at the bottom of this page for exactly that.
- 3. Fetch the page the same way we did. A raw response and a rendered page are different documents and will not hash alike. The claim says which one it is.
- 4. Hash the text and compare. Any SHA-256 tool will
do. On a shell that is
shasum -a 256 file.txt. - 5. Expect a difference, and read the Standing line before you conclude anything. Most of the time a page has moved without the claim moving. That is what the rest of this page is about.
What the hash covers, and what it does not
The hash is of the whole page text, not of the sentence we quoted. So a hash that no longer matches does not mean the vendor changed their claim. It means the page is not the same document we read, which is a smaller and much more common thing.
These are real differences from our own register, and none of them is a vendor changing their words:
- A commit counter on a project page moved from 11,808 to 11,809 while the sentence we quoted stood unchanged.
- A cookie notice appeared at the top of a developer documentation page, changing the first character of the document.
- A price on a vendor's page changed how it is marked up, from a currency code to a currency symbol, in styling rather than in the price.
- A code-hosting page changed a string in its own interface furniture, thousands of characters away from anything we quoted.
None of that is a defence of a wrong quote. It is the reason the Standing line exists, because "the hash matches" and "we still stand behind the sentence" are two different claims and only one of them is what a reader actually wants to know.
The grades
One of these appears above every claim that has a source. They are deliberately not collapsed into a single "verified", because an exact match and a page of moving counters are not the same kind of fact.
- Re-read and matched byte for byte
- 169
- Not re-read against the live source
- 89
- Re-read, and the recorded hash was not reproduced
- 16
- Re-read: the text is unchanged, but the page publishes values that move
- 16
- Re-read and matched once per-response tokens were masked
- 13
Counted from the register on every build rather than written down here. A page that will not render and a page that has genuinely changed both currently land on the same line, which is a limitation rather than a design: the written reason for each one is printed with the claim.
What this method cannot do
- It cannot tell you a vendor is right. It tells you we quoted them accurately and kept the bytes we read. A true quote of a false claim is still a false claim, which is why claims are labelled as the vendor's words rather than as our findings.
- It is a snapshot, not a watch. The date on a claim is the date we read it. We do not re-read every source every day, and a page can be reworded the day after we record it.
- It cannot always say why a page moved. Where we can name the difference we do, and where we cannot, the entry says the hash was not reproduced and stops there rather than inventing a cause.
- It only covers what is quoted. A vendor can change a page in a way that leaves our quote intact and every other sentence different. Nothing here would notice, and saying otherwise would be the overclaim this page exists to avoid.
If a quote here is wrong, or a Standing line overstates what we checked, that is worth more to this index than a new listing. Tell us at calum@dialegein.com, or through the corrections route on the trust page.
When something on this site does turn out to be wrong, it is listed with the commit that fixed it on the corrections page. That is a different thing from a vendor page moving, which is what the Standing lines above are for.
What money can and cannot influence, including the final editorial decision, is set out in the independence and money policy.
What we have actually tested
- 83 tools
- process the file on your own machine
- Architectural assessment and, for some, a test
- The rest are unknown, mixed, upload, or run on a customer server, and each record says which. A count here is not a claim about privacy.
- 38 tools
- remove redacted content from the file
- Vendor documentation, with a few tested on a canary
- The rest either cover the content, have no redaction feature, or are unverified. Absence of a removal verdict is not a finding that a tool covers content.
- 64 tools
- are free or open source
- Read from the vendors’ own pages
- With the paid tiers and their real prices beside them.
A category, not a ranking
14 tools where your file has nowhere to go.
64 of the 155 tools here run in a browser. Of those, 5 have been tested by us - we supplied a file, watched the network, and nothing left the device - and 9 cannot send a file anywhere because there is no server in the path to send it to.
The other 50 browser tools here we have not been able to test. 34 of them will not accept a file until you have made an account, and the rest need a self-hosted instance or cannot be probed at all. 15 of those claim to process your file locally. We do not know whether they do, so they are not in this category - that is a gap in our evidence, not a verdict on them.
We watched the network
- jpgtopdf No file left the device in our own test.
- No Fuss PDF No file left the device in our own test.
- OpenDocScan No file left the device in our own test.
- PDF Compare No file left the device in our own test.
- SnackPDF Ours No file left the device in our own test.
No server in the path
- jsPDF No server involved - nothing to upload to.
- LEADTOOLS PDF SDK No server involved - nothing to upload to.
- MuPDF.js No server involved - nothing to upload to.
- pdf-lib No server involved - nothing to upload to.
- PDF.js No server involved - nothing to upload to.
- Pdftools PDF Viewer SDK No server involved - nothing to upload to.
- Syncfusion PDF No server involved - nothing to upload to.
- Tesseract.js No server involved - nothing to upload to.
- Vivliostyle No server involved - nothing to upload to.
A statement about how the software is built, not something we measured.