Shipping daily
Nov 1DATAAll 646 projects re-verified: 6,419 developer claims tested against registers, courts and pressNov 1DATAMalaysia TEDUH and Philippines DHSUD licence checks: expired licences and approved delays foundNov 1DATAThailand ONEP register: 2 condos found selling before environmental approvalNov 1DATAMexico PROFECO contract register checks: one sales registration belonged to a laundryNov 1DATAAbu Dhabi ADREC inspections and RAK RERA permit list added: % built straight from the regulatorNov 1SHIPPEDNew stage filter: completed but still sellingNov 1SHIPPEDPublic database page: verification levels, disclosure distribution, every marketNov 1DATA+212 projects in one day, round 3: USA, Caribbean, Gulf, Africa, Japan, AustraliaNov 1SHIPPEDStage on every case: off-plan or under constructionOct 31SHIPPEDVerification level per check on every case card: registry, independent, developer, contradicted
Changelog →

Kolaboro / Engineering / Public log

The public log

If we quietly changed a score, deleted a photo or edited what a page said last month, would anyone notice? With this design, yes: anyone who kept yesterday's numbers can prove it, and two independent public records would disagree with us.

What one day fixes

Every morning one line, the head, is computed from: the SHA-256 of the open dataset, the Merkle root of every project page fingerprint, the hash of all accepted site evidence, the head of the admin audit trail, and the previous day's head. Change anything in the past and every later head changes. The rule is short enough to recompute by hand:

head = SHA-256("kolaboro-log-v1|" + day + "|" + dataset_sha256 + "|" + projects_root + "|" + projects_count + "|" + evidence_root + "|" + evidence_items + "|" + audit_head + "|" + audit_count + "|" + previous_head_or_"genesis")

A tree, not just a chain

The daily heads are also the leaves of a Merkle tree hashed exactly like Certificate Transparency (RFC 9162: leaves prefixed 0x00, nodes 0x01). Three things follow:

  • A signed checkpoint at /api/open/checkpoint, in the C2SP signed-note format that transparency-log tools already understand: origin, tree size, root, and an Ed25519 signature.
  • Inclusion proofs at /api/open/log-proof?day=YYYY-MM-DD: a few hashes that show one day's head is in the signed tree.
  • Consistency proofs at /api/open/log-consistency?first=M&second=N: proof that the tree of size N contains the tree of size M unchanged. Keep any old checkpoint, and you can check later that we only ever appended. The log page does this automatically in your browser between visits.

Two independent witnesses

A log we sign ourselves is only as good as our word that we did not fork it. So every head is recorded twice outside our control: timestamped in the Bitcoin blockchain through OpenTimestamps, and entered in Sigstore Rekor, the public transparency log run by the Linux Foundation for software supply-chain security. The Rekor entry holds a minisign signature by our key over the head's exact input, so its data hash is the head itself. Anyone can look it up on search.sigstore.dev.

Check Bitcoin yourself, in your browser

A timestamp is only as good as your ability to check it without us. On the log page, "Check in Bitcoin" downloads the OpenTimestamps proof, replays every hashing step in your browser up to a Bitcoin block, and compares the result with that block's Merkle root fetched from mempool.space, an independent block explorer. Kolaboro is not in that loop.

A second signature that the server cannot make

A server key can be stolen, and a server can be told to sign anything. So each daily line can also be co-signed by the founder with a passkey on his own device (Face ID or fingerprint; the private key never leaves the device's secure chip). The co-signature is published with the line and checked in your browser. A rewritten history would need both the server key and the founder's device.

Signatures and keys

Every open API answer carries an Ed25519 signature over the SHA-256 of its body, and the build commit that served it. The public key, its validity dates and our rotation policy are at /.well-known/kolaboro-keys.json: keys are never reused, a new key is announced before it signs anything, old keys stay listed so old signatures remain checkable, and a compromised key is marked revoked from a date.

Check it with our code, or yours

kolaboro-verify.js (no dependencies, browser or Node) checks signatures, page proofs, the head chain, checkpoints, inclusion and consistency proofs and signed photos. The consistency proof was tested against every pair of tree sizes up to 20, including forged roots. Test vectors let you check your own implementation.

More from Engineering: AI that can't be talked into a verdict · Daily AI evaluation · The public log · Signed site photos · Reliability

Protect my purchase