TILLNOTARY · TILLDEV

A record that can’t be
quietly rewritten.

Not even by us. Submit an opaque hash; get back a signed inclusion proof and a witness-cosigned timestamp. Nothing on earth is tamper-proof — so TillNotary does the next best thing, provably: any rewrite is detectable by anyone holding an earlier proof, and every claim is a proof you check yourself, against keys you pin.

THE FRONTIER · LIVEHEAD N = 22 · COSIGNED 3/3 · ED25519 + ML-DSA-65
ROOT · 16ENTRIES 1–16ROOT · 417–20ROOT · 221–22AFTER ENTRY 24 · 2+2→4 · 4+4→8EQUAL BLOCKS FUSE WHEN THEY MEETSIGNED HEAD · N = 22✓COSIGNED · 3 OF 3FRONTIER← ENTRY 23 LANDS AT THE EDGESEALED — NOTHING LEFT OF THE FRONTIER EVER CHANGESN = 22 = 16 + 4 + 2 · A LOG'S FRONTIER IS THE PERFECT SUBTREES OF N'S BINARY DECOMPOSITION
THE CLAIM, PRECISELY

Nothing is tamper-proof.
So every rewrite is detectable.

Most “audit logs” ask you to trust the operator — the same party who would do the rewriting. TillNotary is built so you don’t have to: every claim is backed by a proof you check yourself, client-side, against keys you pin. We won’t tell you the record can’t be tampered with; no honest engineer can. What we can prove is stronger than the usual promise: a rewrite breaks every proof issued before it, so it is detected the moment anyone holding one checks — and an undetected rewrite would need the log operator, every witness you require, and every holder of an earlier head to fail at once. Attach a witness you run and keep a mirror, and two of those three are yours.

ALL COLLUDEANY ONE HONESTLOG OPERATORus — signs every headWITNESSESours + yours · cosign or refuseHEAD HOLDERSreceipts · bundles · mirrorsALL THREE · ∧simultaneouslyUNDETECTED REWRITErequires total collusionREWRITE DETECTEDproofs fail · refusals signedYOUR OWN WITNESS AND MIRROR MAKE TWO OF THE THREE YOURS · ONE HONEST PARTY ⇒ DETECTION

Read the diagram as an equation: undetected rewriting requires operator ∧ witnesses ∧ holders, all at once. One honest party anywhere — one witness that checks its consistency proof, one mirror or receipt holding yesterday’s head — and the rewrite is caught, with signed evidence of who diverged. That precision is why you can put this record in front of an auditor, a court, or a customer.

WHAT YOU GET

Every claim ships as a proof.

You submit 32 opaque bytes — a hash you computed locally. What comes back is not a status page’s word for it; it’s four artifacts your own code can verify.

Inclusion proofBETA

For every entry, a Merkle path from your hash to a signed head: cryptographic proof your record is in the log, checkable in microseconds by anyone holding the head. Not a receipt — a proof.

› Read the docs
Consistency proofBETA

Every new head proves it extends the previous one — nothing removed, nothing reordered, history append-only. This is the proof that makes a silent rewrite mathematically loud.

› Read the docs
Witness-cosigned timeBETA

Witnesses verify consistency, then cosign the head with their own keys: ours by default, and yours or a third party’s when you attach them. With a witness you run in the quorum, we can’t backdate an entry alone.

› Read the docs
Evidence bundleBETA

One portable file: your hash, the proofs, the head, the cosignatures. It verifies offline, forever, against keys you pinned — even if TillNotary is unreachable or gone.

› Read the docs
HOW IT FAILS SAFE

A witness that catches a rewrite
refuses — in writing.

Suppose the log were rewritten — an entry dropped, history forked, a head replaced. The next consistency proof cannot be constructed honestly, so the witness’s check fails. It refuses to cosign and publishes a signed refusal: which head, which check, when. From that moment, every verifier on earth can see the record lost its quorum.

This is what “tamper-evident” means mechanically. The system’s failure mode isn’t a quiet gap in a database — it’s a loud, signed statement from the witness that something diverged.

Witness protocol →
bash · witness
$ tilldev notary witness acme-releases
OK Witness policy for notary.tilldev.dev/acme-releases — threshold 2
WITNESS                ACTIVE  COSIGNED @8  KEY FP
---------------------  ------  -----------  -------------------
acme-witness/primary   yes     yes          d3ee 0e5f a5f0 f399
tillnotary-witness/w1  yes     yes          29ac d643 062e 5a23
status        COMPLETE (witness-cosigned)

# A caught rewrite: the witness refuses to cosign and
# publishes a signed refusal anyone can check.
$ tilldev notary refusals acme-releases
! 1 verified refusal(s) on acme-releases: a witness saw history that does not extend what it cosigned.
WITNESS               REASON                    FROM            TO              OBSERVED
--------------------  ------------------------  --------------  --------------  ------------------------
acme-witness/primary  consistency-proof-failed  8 96b66e36e50a  9 3c1d0a7be244  2026-09-27T05:52:31.000Z
THE REFUSAL PATH
verify first

A witness never cosigns on our say-so. It recomputes the consistency proof against the last head it signed. If the math holds, it signs; if not, it doesn’t. There is no override.

refuse in writing

A failed check doesn’t just withhold a signature — the witness publishes a signed refusal naming the head and the reason. The refusal is itself permanent, verifiable evidence.

quorum or nothing

A head without its witness quorum is not a valid timestamp, and every verifier knows it. Losing cosignatures is loud by construction — silence is impossible to fake.

your key in the quorum

A new log is cosigned by our witness. Attach one you run, or one a party you trust runs, and require it: then no head completes without a key we don’t hold.

POST-QUANTUM POSTURE

Evidence that outlives the
algorithms that signed it.

A timestamp you rely on in 2036 is only as strong as its signatures are then. So TillNotary signs everything twice — classical and post-quantum — and treats the pair as one signature: both must verify. Not a fallback, an AND.

DEFAULT

Standard profile

SHA-256 · Ed25519 + ML-DSA-65

Every head signature and every witness cosignature is hybrid: classical Ed25519 and ML-DSA (FIPS 204), and verification requires BOTH to pass. A forgery needs both schemes broken at once — and if either one falls tomorrow, your existing evidence still stands on the other.

REGULATED

Government profile

CNSA 2.0 algorithms · SHA-384 · ML-DSA-87

For records held to CNSA 2.0 algorithm levels: SHA-384 throughout the tree and ML-DSA-87 signatures at the highest standardized security category. Same log semantics, same proofs — a stricter suite, selectable per log.

FORWARD

Crypto-agility

every bundle names its suite

Evidence often has to outlive the algorithms that signed it. Each head and each bundle declares its exact suite. Adopting a new suite means starting a new log; existing logs and every bundle they issued keep verifying, and verifiers always know precisely what they are checking.

VERIFY IT YOURSELF

Don’t take our word.
Take the proof.

Verification runs on your machine, against keys you pinned, with no network call. The hash is computed locally, so your bytes never leave; the bundle is a file, so it verifies in an air-gapped room ten years from now.

bash · cli
# 1 · Hashed locally; only the hash is sent
$ tilldev notary submit acme-releases --file q3-soc2-evidence.tar
OK Logged at index 5 of notary.tilldev.dev/acme-releases — receipt VERIFIED locally
leaf          c53d5789…5f9acafb
tree size     6
status        incomplete — awaiting witness

# 2 · After the witnesses' next pass, export the evidence
$ tilldev notary proof acme-releases 5 --out evidence.json
OK VERIFIED — leaf 5 of notary.tilldev.dev/acme-releases
cosignatures   tillnotary-witness/w1, acme-witness/primary
status         COMPLETE (witness-cosigned)
OK Evidence bundle written to evidence.json

# 3 · Verify anywhere, offline, against keys you pinned
$ tilldev notary verify evidence.json
OK VERIFIED (offline) — leaf 5 of notary.tilldev.dev/acme-releases
status        COMPLETE (witness-cosigned)
ts · verify.ts
import { verifyEvidence } from '@tillstack/sdk-notary-node'

// Client-side verification: your pinned keys, zero network.
const checkpoint = verifyEvidence(bundle, {
  origin: 'notary.tilldev.dev/acme-releases',
  logKeyName: 'tillnotary-log/acme-releases',
  publicKey: PINNED_LOG_KEY,     // Ed25519 + ML-DSA-65; both must verify
  witnesses: PINNED_WITNESSES,
  requiredCosignatures: 2,
})

// Returns only if all of these hold, otherwise throws NotaryVerificationError:
//  · this hash is in the log                (inclusion)
//  · the head is signed by the pinned key   (authenticity)
//  · 2 pinned witnesses cosigned that head  (witnessed time)
WHERE IT EARNS ITS KEEP

Anywhere “prove it existed”
beats “trust me”.

AUDIT

Anchor an audit chain

Your application keeps its own hash-chained audit log — but a chain can be quietly truncated by whoever holds it. Anchor its head into TillNotary on a schedule and truncation becomes detectable by anyone, against a record the log’s owner doesn’t control.

SUPPLY CHAIN

Prove release provenance

Notarize the digest of every artifact at build time. Anyone installing it can verify the binary in their hands is byte-for-byte the one that existed at the recorded moment — before it passed through registries, CDNs, and mirrors you don’t control.

DOCUMENTS

Timestamp a document

A contract, a design, a disclosure, a lab notebook page: prove it existed, exactly as it is, at a point in time — without revealing a word of it. The log holds a hash; the document never leaves your custody.

RECOVERY

Prove a backup manifest existed

Notarize each backup manifest’s hash when the backup is taken. If an incident ever raises the question “was this restored from the real backup, or a doctored one?”, the answer is a proof — not a debate.

WHAT THIS IS NOT

A narrow tool, on purpose.

The strength of a transparency log comes from how little it does. Three boundaries worth being explicit about:

✗ 01

Not a blockchain

No tokens, no mining, no consensus protocol. A transparency log needs none of it: an append-only Merkle tree plus witnesses you choose delivers verifiability at web latency, at web cost. The lineage here is Certificate Transparency, not cryptocurrency.

✗ 02

Not a database

Leaves are opaque hashes — never queryable business data. Your records stay in your systems, under your access controls; the log holds only commitments to them. If you can read customer data out of it, someone used it wrong.

✗ 03

Not a home for PII

Never submit personal data — submit its hash. And remember hashes of guessable values (a phone number, a national ID) can be brute-forced from a public log: for low-entropy data, notarize a salted commitment instead. The docs show the pattern.

Privacy, by construction. Because leaves are opaque hashes by default, the log can be public and gossiped — which is exactly what makes it strong — while revealing nothing about your content. Publishing raw bytes alongside an entry exists, but it is an explicit, per-entry opt-in. The default is: the world can verify your record exists; only you know what it says.

ASKED, ANSWERED

The questions a careful buyer asks.

What exactly do I submit?

A hash — 32 opaque bytes (48 on a SHA-384 log) you compute on your own machine, with the CLI, the SDK, or plain sha256sum. The content itself never leaves your custody, and we could not read it if we wanted to: from the log’s side, every entry looks the same.

What does “tamper-evident” mean, precisely?

It does not mean rewrites are impossible — nothing offers that honestly. It means every new head must prove consistency with the previous one, witnesses re-verify that proof before cosigning, and every receipt, evidence bundle and mirror holding an earlier head can check it again. A rewrite fails those proofs, or shows up as two signed heads that cannot both be true the moment two verifiers compare notes — signed evidence, either way.

Can an entry be backdated?

Not past a witness you run. An entry’s time is bounded by the cosignatures on the first head that includes it, and each witness refuses a head whose time runs backwards or ahead of its own clock. A new log is cosigned by our witness; require one you run, or a third party runs, and backdating needs a key we don’t hold. A false cosignature would be permanent, verifiable proof against whoever made it.

What happens to my evidence if TillNotary disappears?

Nothing. An evidence bundle is self-contained: your hash, the Merkle proofs, the signed head, the cosignatures. It verifies offline against the keys you pinned, with no call to us — this year, or twenty years after the last TillNotary server goes dark. Run a mirror (tilldev notary mirror) and you also hold the full log, every entry checked against its signed root.

Is this a blockchain?

No. There are no tokens, no mining, and no consensus protocol. TillNotary is a transparency log in the Certificate Transparency lineage: a single append-only Merkle tree whose operator is checked by witnesses and by anyone who keeps a mirror. You get the verifiability people want from a blockchain at the latency and cost of a normal web service.

Why should I trust the witnesses?

You shouldn’t have to — that’s the point. Each log’s witnesses and their keys are published; you pin the ones you trust, and verification is done by your code against those pins. If a witness ever cosigns a bad head, its signature on that head is permanent proof of the failure. Our witness is the default; if it doesn’t satisfy you, run your own with the CLI and require it.

SEAL SOMETHING

Anchor what matters. Hand every auditor, court, and customer a proof they can check themselves — against keys they pin, on a record no one can quietly rewrite. Not even us.

PART OF TILLDEV

The evidence layer of the suite.

Same workspace, same login. Anything the other products record, TillNotary can make provable — add what you need when you need it.