STATUS · Built and tested locally. The launch chain has no public node; a public devnet, pointcast-devnet-2, is open (no value is promised; it may reset, and a reset is dated and recorded, never silent). Mainnet anchoring waits on a funded key. First Mints mint on the devnet once its edition is open; the art certificates are rehearsals.
CHAIN · APP · NOTARY · PUBLIC DEVNET-2 · NO VALUE · MAY RESET, NEVER SILENTLY
Stamp a file’s fingerprint. Check one later.
Pick a file and your browser works out its SHA-256, a fingerprint of its bytes. Sign that fingerprint with a key you make
here and the devnet seals it into a block with a time. The file never leaves your browser. Later, anyone with the file
can find the stamp and check the block it sits in, step by step.
devnet · no value · may reset. A stamp is not anchored to Tezos or any other chain: the devnet does not anchor. Treat it as a rehearsal for stamps that are, and as a public, checkable note from one server. A stamp shows that a key signed a hash and this one server sealed it at a time: an
accountable claim, not proof of who wrote the file or when it was made. A reset is dated and recorded, never silent:
devnet-1 was reset on 2026-10-08 and its recording is still checkable at
/chain/yard/devnet-1/, but its stamps are not on the new chain. Keep the receipt.
01 · STAMP · THE FILE STAYS IN YOUR BROWSER · NOTHING IS SENT UNTIL YOU PRESS SEND
Which file?
The page reads GET /status once this section is on screen. Hashing a file needs no network at all.
SHA-256
no file or hash yet
Size
Your devnet key
A key made here is a free account on the devnet. It signs the stamp in this browser, and only the signatures leave it. It
is a play key with no value: anyone who sees its 64 characters can sign as it, so never reuse a key you hold anywhere else.
One key, three apps: if you tick “Keep it on this device”, the Daily Mint, the Notary and Time Capsules all load this same key, so
a stamp, a bid and a capsule signed here are linked to one account that anyone can read on the devnet. The 64 characters sit in
this browser’s local storage, which every script on pointcast.xyz can read. Leave it unticked and the key lives in this tab only.
No key yet. Make one: it is a new devnet account, free.
Use a key you already have
Only a devnet key. It stays in this tab unless you tick “Keep it on this device”.
Nothing is sent yet.
You are about to send, to the public devnet, one post on channel NOTARY:
Title:
Body, word for word:
It is public and stays on this devnet until it resets. Only the hash and size, and the name and note if you added them, go on chain; the file does not.
Result
The receipt as text
02 · CHECK · FIND A STAMP, THEN CHECK THE BLOCK IT SITS IN
Is this file stamped, and does the stamp hold?
Give the file, or its SHA-256. With the receipt the page goes straight to the stamp’s block. Without it, the page scans the
newest blocks for a stamp of that hash. It then runs the five Verify a block steps on the stamp’s block and the Notary’s own checks.
Reads the blocks it needs (GET only). Nothing is written.
A transaction signed by one key, naming this exact SHA-256, was sealed into a block by this devnet’s sequencer.
The block’s header names the hash of the block before it, is sealed under the genesis key, and commits to this transaction through its tx_root. The page checks all of that when you check a stamp.
The sequencer put a time on that block. The file’s hash existed by then, or someone who held the file stamped a hash of it.
It does not show
Who holds the key. A key is free and anonymous; a stamp from it is a claim by that key, not by a person.
Who wrote the file, or that it is genuine. It shows only that someone with the file’s bytes stamped its hash by that time.
That the time is true. It is the sequencer’s clock; one server runs this devnet and could seal whatever time it liked. A witness or a stamp is an accountable claim, not proof.
That it will last. The devnet has no value and may reset, and a reset wipes every stamp: dated and recorded, never silent. Keep the receipt, and keep the block if it matters.
Anything about the file’s content. Only its SHA-256 and its size go on chain, plus a name and a note if you chose to add them, and those are public.
The five lines of a stamp
The body of the post on channel NOTARY, in order
Line
What it is
notary/v1
the format, so a reader knows what the rest is
sha256:<64 hex>
the file’s SHA-256, lower case
bytes:<number>
the file’s size in bytes
name:<text>
optional, up to 60 characters, only if you tick the box
note:<text>
optional, up to 140 characters
04 · SAME CHECK, IN CODE
Check a stamp without this page.
Keep the SDK (pointcast-chain.js) beside this file and run it with Node 22 or
newer, giving the file, the stamp’s block and its transaction id (both are in the receipt).
notary-check.mjs · pins this devnet’s genesis
// notary-check.mjs · Node 22+ · keep pointcast-chain.js (the SDK) beside this file
// usage: node notary-check.mjs <file> <block height> <tx id>
import { readFileSync } from "node:fs";
import { createHash } from "node:crypto";
import * as pcc from "./pointcast-chain.js";
const DEVNET = "https://pointcast-devnet.mhoydich.workers.dev", GENESIS = "a720735b473383057ee11e885b2d32e1565470612364f13c0265c1a1c66f4280";
const [file, height, txid] = process.argv.slice(2);
const get = async (p) => pcc.parseJsonExact(await (await fetch(DEVNET + p)).text());
if (pcc.paramsHash(await get("/params")) !== GENESIS) throw new Error("not the pinned devnet");
const sha = createHash("sha256").update(readFileSync(file)).digest("hex");
const block = await get("/raw/block/" + height);
const stx = block.txs.find((t) => pcc.txHash(t) === txid);
const body = await (await fetch(DEVNET + "/body/" + stx.tx.body_hash)).text();
console.log("in the block, committed by tx_root:", pcc.txRoot(block.txs) === block.header.tx_root);
console.log("body hashes to the signed body_hash:", pcc.bodyHash(body) === stx.tx.body_hash);
console.log("body names your file:", body.split("\n")[1] === "sha256:" + sha);