Five minutes to your first signed record.
Everything below runs locally. No account, no API key, no network dependency beyond the pages you fetch.
Quickstart
$ inverba keys init
✓ key inv_k1_7f3a generated · ~/.inverba/keys (never leaves this machine)
→ pricing.html + record.json
page = scrape("https://example.com/pricing")
page.record.save("record.json")
print(page.record.content_sha256)
✓ signature valid ✓ hash matches — verified offline
Verify without Inverba
This is the point of the whole system: a record is a standard Ed25519 signature over an RFC 8785 canonical JSON body. Any language, no Inverba dependency. Complete Python example:
from jcs import canonicalize # RFC 8785
from nacl.signing import VerifyKey
rec = json.load(open("record.json"))
content = open("pricing.html", "rb").read()
# 1. content hash
assert hashlib.sha256(content).hexdigest() == rec["content_sha256"]
# 2. signature over the canonical body
body = {k: v for k, v in rec.items() if k != "signature"}
VerifyKey(bytes.fromhex(SIGNER_PUBKEY)).verify(
canonicalize(body), base64.b64decode(rec["signature"]["sig"]))
print("valid ✓")
that's the whole check — two asserts. Registry inclusion (a standard Merkle audit path) is a planned optional third step, once the transparency log ships.
Record spec — inverba-record/1
An open specification, documented in full below — enough to write an independent implementation today, and test vectors in the repo to validate it against. A format only we can produce would defeat the point.
Registry & watchtowers planned
A Merkle transparency log for anchoring records, plus watchtowers so anyone can independently monitor it for consistency — the same accountability construction as Certificate Transparency. The design is published; neither the hosted log nor the watchtower tooling is live yet. Records don't depend on it: everything above verifies fully offline today.