A register of statements · live on Sepolia

Anyone can inventa quotation.Now you can proveyou didn’t.

Citable cuts a statement into paragraphs, binds each one to its position, and puts the root of that tree on chain. Quote from it afterwards and the proof travels with the quote: this passage, word for word, at this position, in this text, on this date.

No account, no server, no indexer. The check runs in your browser.

Registered statement

PROVEN
…that government of the people, by the people, for the people, shall not perish from the earth.
1234

Paragraph 4 of 4

Published under frederik.eth on Sepolia. Anyone can rebuild this from the bundle and check it against the chain.

Proves the paragraph and where it stood — not that the statement is true.

The idea

Not is this quote real?Here is the proof that I quoted correctly.

Nobody can prove a sentence was never said. The denominator is unknowable — nobody holds every word a person ever spoke. So Citable turns the burden around and arms the person quoting, not the person doubting.

A statement is split at its blank lines. Every paragraph is bound to its position, and only the root of that tree goes on chain — 32 bytes. Quote from it and you can hand over the proof with the quote: this passage stood word for word at paragraph 5 of 7, here are its neighbours, here is the date.

No database, no indexer. The text sits on IPFS, the tree is rebuilt in your browser, and the chain holds 32 bytes. Checking a quote needs no service at all — including this one. Publishing uses one, to pin the text so the record points at something; it can go down, it cannot lie, because every bundle is held against the root on the chain.

Two doors, the same size

Citable walks every statement that name has registered, rebuilds each text from its bundle, and asks the contract which paragraph the quote was — and where it stood. All of it in this tab.

An ENS name. A statement root or an address works too, if you have one.

Everything runs in your browser. Nothing is sent to a server.

How a proof holds

Seven paragraphs go in. Thirty-two bytes come out.

1234567ROOT
Seven paragraphsone root · 0xa2ea6730…

Each paragraph is hashed together with its index, so a leaf says both what was written and where. Pairs are hashed into pairs until one value is left. That value is what goes on chain.

A quote comes back with the short path from its leaf to the root. The contract recomputes the path and either arrives at the registered root or does not. It never sees the text, and it never has to.

Move a paragraph and the leaf changes, because the index is inside it. Sorted sibling pairs would otherwise prove membership without proving position — and position is the whole claim.

The number of leaves cannot be recovered from a root. So “paragraph 5 of 7” takes its 7 from the bundle, which was itself checked against the root — never from the count the author wrote on chain.

What an answer can be

Three answers, and only two of them are facts.

A quote is checked in one direction only: word for word first, and the softer tests come after, each one weaker and each one labelled as such.

  1. Stage 1

    Proven

    This paragraph stood at this position, word for word.

    How
    The fragment is a whole paragraph. Its leaf and the path to the root go to the contract, which recomputes them.
    What it is worth
    A fact. Mathematics, checked on chain, with no trusted party anywhere in it.
  2. Stage 2

    Part of a paragraph

    The fragment is in the text, but it is not the whole paragraph.

    How
    A literal substring match inside a paragraph the bundle already held against the root.
    What it is worth
    Also a fact — and a warning. A shortened quote can be accurate and still mislead, so the rest of the paragraph is shown beside it.
  3. Stage 3

    Covered

    Paragraph 3 covers this claim to 83 %.

    How
    Embeddings shortlist three paragraphs, a value check drops any that assert a number or an actor the text never mentions, and an entailment model scores what is left.
    What it is worth
    A measurement, and it can be wrong. 83 % does not mean 83 % true — it means no distorted quote in the test set behind the threshold reached this value.

The case this was built for

The words change. The meaning does not.

A German sentence quoted in an English paper shares no characters with its source. A word-for-word proof has nothing to compare. That is where most of this problem actually lives, and it is the reason stage 3 exists. The source below is German because the demonstration needs it to be; every line of it is glossed in English.

Registered · wochenzeitung.eth · paragraph 3 of 6
Im vergangenen Quartal stieg der Umsatz um vier Prozent.

Last quarter, revenue rose by four percent.

Five things asked of it

  1. The paragraph itself, word for word

    Im vergangenen Quartal stieg der Umsatz um vier Prozent.

    Last quarter, revenue rose by four percent.

    Proven

    Stage 1. The leaf and its path go to the contract, which recomputes them. No model is involved and none is needed.

  2. Translated into English

    Revenue rose by four percent last quarter.

    Covered83 %

    Stage 3. Not one character matches, so stages 1 and 2 find nothing. The entailment model puts coverage at 0.8253 against paragraph 3 of 6.

  3. Translated into Spanish

    Los ingresos aumentaron un cuatro por ciento el trimestre pasado.

    The same sentence, translated into Spanish.

    Not covered56 %

    The same sentence in Spanish scores 0.562 and falls below the 0.80 threshold. A correct quotation refused — the failure is real, and it is on the page rather than behind it.

  4. One word changed: forty instead of four

    Im vergangenen Quartal stieg der Umsatz um vierzig Prozent.

    Last quarter, revenue rose by FORTY percent.

    Not scored at all

    The value check reads 40 in a claim about a paragraph that says four, and the model never sees the pair. Deterministic, no model, checkable by hand — and it normalises value rather than spelling, so four, vier and cuatro are the same number.

  5. An admission that was never made

    Roth hat zugegeben, dass die Zahlen manipuliert wurden.

    Roth has admitted that the figures were manipulated.

    Not covered9 %

    A question in the text turned into a confession. Entailment asks whether the text carries the claim, and this text does not.

Why it is not a similarity score

Measured against the paragraph “Wurden die Zahlen manipuliert?” were the figures manipulated? — the invented confession scored 0.880 on plain similarity — higher than a correct English translation of that same paragraph, at 0.877.

Similarity measures what a sentence is about. A question and an accusation are about the same thing. Entailment asks something else — is this claim carried by this text — and that is the only question worth answering here. The percentage is the entailment value, and it means that no distorted quotation in the test set reached it. It does not mean the claim is that likely to be true.

mDeBERTa-v3-base-xnli, threshold 0.80, run in your browser. The model identifier travels with every figure — another model gives another number. Sixteen test cases are a signal, not a validation.

What this cannot do

The limits are part of the instrument.

A measuring instrument that hides its error bars is not a measuring instrument.

Not registered is not invented
An absence says something about this registry and nothing about the world. That is why the screen never answers a plain no — it names how many statements and how many paragraphs it actually read.
Stage 3 is a measurement
Sixteen test cases are a signal, not a validation. Spanish scores measurably worse than English and would be rejected at the threshold. Irony and quote-within-quote are not handled at all.
A proof is about position, not truth
That a paragraph stood where it stood says nothing about whether it was right. Citable can show you were quoted accurately. It cannot show you were correct.
Whoever registers a text first holds it
Identical text gives an identical root, so someone can register another author's words before they do. Documented, not solved.
The registry owner can switch the name check off
A known central point. It cannot alter statements already recorded and no proof depends on it — but it is there, and pretending otherwise would be the same trick this project exists to expose.
The cold start problem is unsolved
A register of quotations is worth what is in it. Nothing here fixes that, and no hackathon project does.