Verify a Wakir Labs commit
Commits in this repository — and in our internal governance
history — are timestamped against the Bitcoin blockchain via
OpenTimestamps. The proof is a
small .ots file, checked in next to the commit hash. Those
two things are all you need: with a commit hash and its
matching .ots file, anyone can establish — without
trusting us — that the commit existed no later than a specific Bitcoin
block.
This is the public side of Proof-of-History in practice. It is what we mean when we say the documentation is anchored.
What this covers
In this repository, all 60 proof files carry a Bitcoin attestation — a block, not a calendar promise. 46 of them only reached that state on 2026-09-15; they had been sitting unconfirmed in the calendar servers since May. Re-checked 2026-09-20.
The three code repositories carry none. wakir-runtime, wakir-protocol and
wakir-verify have no meta/timestamps/
directory at all (measured 2026-09-15). An earlier version of this page
claimed every commit in every Wakir Labs repository was timestamped. It
was not. Whether to extend commit stamping to those repositories is an
open decision; until it is made, this page describes what exists.
Three steps
1. Install the OpenTimestamps client
The reference client is ots, distributed as a Python
package. On any platform with Python 3.8+:
pip install opentimestamps-client Verify the install:
ots --version 2. Get the commit and its .ots proof
Clone the repository you want to verify. The proof files live under
meta/timestamps/<short-hash>.ots:
git clone https://github.com/wakir-labs/site.git
cd site
ls meta/timestamps/
Each file is the .ots attestation for one commit, indexed by
the commit's short hash.
Not every file names a commit you can check out. Measured
on 2026-09-20: of 60 proof files, 28 resolve in a plain clone. The rest were
stamped on branch commits that squash-merging replaced, so the hash survives
in the filename but not in main's history. Pick one that
resolves — the worked example below is one of them:
for f in meta/timestamps/*.ots; do
h=$(basename "$f" .ots)
git rev-parse --verify --quiet "$h" >/dev/null && echo "$h"
done 3. Run ots verify
For a worked example, take commit 82d40f7 from this
site's history ("feat(about): add EN+DE about pages"):
# From inside the cloned repo:
printf "%s\n" "$(git rev-parse 82d40f7)" > /tmp/commit.txt
ots verify -f /tmp/commit.txt meta/timestamps/82d40f7.ots
The hook stamps the 40-character commit hash as ASCII text, with a
trailing newline — which is exactly what printf "%s\n"
writes. Two earlier versions of this page told you to feed the raw hash
bytes (xxd -r -p) instead. That is not what was stamped, so
ots rejects it with File does not match
original!. We found this on 2026-09-15 by running
this page's own worked example end to end. Both published forms are
corrected.
A successful verification prints something like:
Success! Bitcoin block N attests existence as of YYYY-MM-DD That is the receipt. The commit existed at or before that Bitcoin block. No trust in us required — only in Bitcoin and in the OpenTimestamps calendar servers, which only sign; they do not back-date.
The corporate repository
The full corporate repository — ADRs, activity log, governance — is
currently local to the supervisory board, not yet
public. Public verification today therefore covers the
wakir-labs/* repositories on GitHub
(github.com/wakir-labs).
When the corporate repository becomes public, the same recipe
applies: clone, point ots verify at the
.ots file and the commit hash, read the receipt.
Members of the supervisory board verify against their local clone of the corporate repository the same way.
Step 3 needs a Bitcoin node — or a second command
ots verify does not finish without one. Measured against
opentimestamps-client 0.7.2 — the version the
pip install above gives you — on 2026-09-20: the package
contains no block-explorer code path at all, and the verify path calls
setup_bitcoin() unconditionally, which exits 1 when no node
answers. An earlier version of this page said the client falls back to a
remote block explorer. It does not.
Without a node, use ots info, which needs no
chain access. It prints the Bitcoin block the proof commits to:
ots info meta/timestamps/82d40f7.ots | grep BitcoinBlockHeaderAttestation
Take that block height to any Bitcoin explorer and read its timestamp.
That is the same fact ots verify would confirm — you are
trusting the explorer to report the chain correctly instead of checking
it yourself.
With your own node, the client does the whole chain end to end:
ots --bitcoin-node http://user:pass@127.0.0.1:8332 verify -f /tmp/commit.txt meta/timestamps/82d40f7.ots This removes the last residual trust assumption: you are now reading the attestation directly from a chain you validate yourself.
If verification fails
Two normal reasons:
- The proof is "pending". Fresh commits live in the
calendar servers for a few hours before being aggregated into a
Bitcoin block. Run
ots upgrade meta/timestamps/<hash>.otsafter a few hours, then re-verify. - You hashed the wrong thing. The hook stamps the
40-character commit hash as ASCII text with a trailing newline.
Reproduce it with
printf "%s\n" "$(git rev-parse <commit>)"— not withxxd -r -p. Earlier versions of this page recommended the latter; they were wrong.
If neither applies, open an issue. A failed verification on a real commit is a finding we want to know about.