Provenance
When a writer completes a voice interview, First Read fingerprints the resulting profile, records which account produced it, and signs that record. Anyone can check the signature. You do not need an account here, and you do not need our cooperation.
What a verified binding proves
That a specific voice profile was held by a specific account at a specific time, and has not been altered since it was bound. Any edit to the profile — a reworded sentence, a changed example — moves the fingerprint and the check fails.
What it does not prove
That a human wrote any particular page. A binding is a custody and integrity record for one document; it says nothing about how a script, an outline or a scene was produced. Anyone quoting a verification result as an authorship attestation for creative output is reading it wrong, and we would rather say so here than be quoted saying otherwise.
A record can also be unsigned. Profiles bound before this deployment held a signing key carry no signature and never will — signing one later would attest to a moment the key was not present for. An unsigned record is a claim, not a proof, and the verifier says so in plain language rather than returning a quiet failure.
The public key
Ed25519, SPKI PEM · profile binding version 2 · fingerprint 8ad55329db309958
-----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAb/VzSRgh76GUy/6d2OBYx+F/rSC9uE1cnOSudQ+xyJs= -----END PUBLIC KEY-----
Also served as JSON at /api/provenance/key.
The key is published in three places, and two of them are outside our control.
dig +short TXT _provenance.storyhack.io curl -s https://raw.githubusercontent.com/First-Read-by-StoryHack/provenance/main/manifest.json
The DNS record is held at the domain registrar rather than by this application. The GitHub copy persists whether or not we fund it, and a dependency-free reference verifier lives beside it. If the three ever disagree, trust the DNS record — it is the hardest of the three to alter quietly.
You do not need this site, or us, to check a record.
How to check one
Ask the writer for their binding record and the profile it refers to. Then either verify the Ed25519 signature yourself against the key above, or post both to our endpoint — which reads nothing, stores nothing, and is the same arithmetic:
curl -X POST https://www.storyhack.io/api/provenance/verify \
-H 'content-type: application/json' \
-d '{"binding": <record>, "markdown": "<profile text>"}'The exact signed payload depends on the record's own version field and is published, per version, in the key manifest — which is also mirrored on GitHub and is the single place that shape is written down. Rebuild strictly by version: profile v2 inserts fields before the final one rather than appending, so a record rebuilt in the wrong shape reads as forged when it is sound. The fingerprint is SHA-256 of the profile markdown with trailing whitespace stripped.
Writers: your own records are at /api/provenance/record while signed in.
What this page does not cover
Everything above describes voice profile bindings. Documents are signed separately and carry more: a fingerprint of the document text, a position in a tamper-evident hash chain so that removing or reordering an entry breaks every entry after it, and — where the writer completed an identity check — the session that check ran under, named inside the signature rather than beside it.
The same properties hold: the shape is published per version in the manifest, the key is the one above, and verification needs nothing from us. A writer can export their own document records from inside the product. This page will describe them properly; until it does, the manifest and the reference verifier are the authoritative description.