Two lines and sebbi.pro decides before your system acts, then gives every change a receipt anyone can check. Same database, same code, same servers. Only fingerprints travel; your data stays exactly where it is.
Free for 90 days, no card. Your key appears here and is emailed to you.
Pick your language. Python gets the ready-made adapter; anything else talks to the log directly.
SEBBI_API_KEY=your-keyfrom sebbi_adapter import anchor_state @anchor_state("orders.update", device="handset") def update_order(order_id, status, handset): ... # your code, unchanged return {"order_id": order_id, "status": status}
It works in the background: your app never waits, keeps going if the network drops, and checks every receipt itself. Loggers, async code and one-off records work too; the file explains each.
// Node 18+ : fingerprint a change and log it import { createHash, randomUUID } from "node:crypto"; const sha = s => createHash("sha256").update(s).digest("hex"); const state = JSON.stringify({ order_id: 42, status: "paid" }); await fetch("https://sebbi.pro/p/submit", { method: "POST", headers: { "Content-Type": "application/json", "X-Sebbi-Key": "your-key" }, body: JSON.stringify({ items: [{ hash: sha(state), cid: randomUUID(), device: sha("IMEI-356938035643809").slice(0, 32) }] }) });
Send the cid you choose with each record: if a request is retried, the log returns the original entry instead of a duplicate.
curl https://sebbi.pro/p/submit \ -H "X-Sebbi-Key: your-key" \ -H "Content-Type: application/json" \ -d '{"items":[{"hash":"<sha256 of your record>","cid":"order-42-v3","device":"till-4"}]}'
Up to 500 records per request. hash: 64-character SHA-256 of the record. cid: your own id for it. device: what it is about (hash it first if it is personal). The answer holds a receipt for each record, checkable with any RFC 6962 verifier.
Add govern=True and sebbi.pro decides before your function runs: allow, challenge or block. It weighs trust, speed, amount, country and device risk, and every decision is sealed in the sebbi.pro chain with a link anyone can check.
@anchor_state("payments.refund", device="handset", govern=True, user="customer_id", amount="amount") def refund(customer_id, amount, handset): ... # only runs if sebbi.pro allows it
curl https://sebbi.pro/p/decide \ -H "X-Sebbi-Key: your-key" -H "Content-Type: application/json" \ -d '{"action":"payments.refund","user":"<hashed customer>","amount":40,"country":"UK","device":"till-4"}'
Same key, same 50p per device: a device that is both governed and recorded is counted once.
Devices this month, your bill, your trial and how much you have logged. Pay here whenever you are ready.
Every phone, till, terminal or machine your system records for is one device, counted once a month, whether it makes ten changes or ten million. Run it on one server or a thousand: the count is the devices, not the servers.
From one device to ten million. Free for the first 90 days, no card to start. Receipts and proofs stay yours for good.
Type an entry number. Your browser fetches the receipt and checks the maths itself.
Questions: justrightdecorators@gmail.com