What PATINA is
PATINA is a Bitcoin artifact whose state deepens for every block its carrier output stays unspent, resets to zero the moment that output moves, and permanently engraves each completed holding stretch as a ring.
- How depth is computed, and why nobody has to be trusted to compute it.
- What a ring is, and which part of an artifact a move can never take back.
- What a Firstlight Seal is and what it costs.
- Which of these pages binds, which explains, and which is generated from the vectors.
Start where you actually are
These pages hold the whole protocol, the API, the operator procedures and the conformance material. Rather than reading them in order, pick the sentence you would have said out loud before you arrived.
- I want to understand PATINA What an artifact is, what you own, and where the honest edges are. Start here, four pages
- I want a Firstlight Seal The founding cohort, the window, and what the free mint actually costs. Start here, then Using it
- I already own an artifact Every field on the artifact page, what resets depth, and how to prove the key is alive. Using it, seven pages
- I want to verify an artifact Recompute the id, decode the marker, and check the bytes against the vectors. Protocol reference, ten pages
- I want to integrate PATINA Types, cursors, every endpoint with examples, and the error taxonomy. Indexer and API, four pages
- I want to build an indexer The steps in order, the golden vectors, and how to compare state roots. Build a compatible implementation, three pages
- I want to operate infrastructure Deploy, sync, verify, back up, and what an incident can and cannot reach. Operator guide, five pages
- I want to create deterministic artwork Same inputs, same picture, everywhere, and the rules that keep a render honest. Creator guide, three pages
Looking for the shorter version, with the pictures? The public site explains the same protocol at a different depth.
The longer explanation
Every PATINA artifact rides on one specific unspent transaction output. That output is called the carrier. The artifact has one number that matters, its depth, and the number is computed the same way by everyone:
depth = current_block_height - carrier_creation_height
Nothing accrues off chain. Nothing is minted per block. There is no staking contract, no lockup, and no counterparty. The chain already records when an output was created, so depth is a subtraction that any observer can redo from a block explorer.
Spending the carrier resets depth to zero. This rule is not enforced by code that could be patched or bribed. It is inherited from how Bitcoin works. Spending an output destroys it, and a destroyed output has no age. The artifact follows the money into a successor output, and the successor is brand new, so its depth starts at zero.
When a stretch ends, it is not erased. The indexer engraves it as a ring: a permanent record of the height the stretch started, the height it ended, how deep it got, and how many sats it carried. An artifact accumulates rings the way a cut tree shows growth. A long ring completed years ago stays legible today, even if the artifact is sitting at depth 40 right now.
Depth is bucketed into eight named tiers so that a number becomes a thing you can say out loud. Raw is where everything starts. Elder is 210000 blocks, roughly four years at ten minutes a block.
- Raw0
- Sheen1008
- Cast4032
- Verdigris12960
- Umber26280
- Bronze52560
- Oxide105120
- Elder210000
The full table, with elapsed time for each tier and the exact rule for choosing one, is on Depth and tiers.
The genesis asset
The first PATINA asset is the Firstlight Seals. It is the founding cohort, and it opens once.
- Minting is free. You pay Bitcoin network fees to the miners and nothing to anyone else.
- The commit window is 4032 blocks long, about 28 days. It opens once and does not reopen.
- Every Seal is sealed over at least 100000 sats of your own bitcoin. That is the endowment. It stays yours, inside the artifact, spendable by your key at any time.
- Zero team allocation. Zero reserve. Zero price. No supply cap. No race for a low number.
Minting is a two step aged commit and reveal. You publish a commit output, wait at least 144 blocks, then reveal. Because only the committer can spend the commit output, nobody can watch your reveal and jump in front of it. Details are on Firstlight Seals and the step by step is in the mint walkthrough.
What this is not
Depth proves that an outpoint has not moved. Paired with a signed attestation it also shows the key is still alive. It does not prove that the same person held it the whole time, because keys can be sold off chain and nothing on chain would look different.
Founding membership can be concentrated. Anyone willing to park real bitcoin can mint many Seals, and we publish live concentration statistics during the window instead of hiding them.
Buying an artifact from someone else moves it, and moving it resets depth to zero. There is no transfer that preserves depth. The rings survive; the current stretch does not.
How to read these docs
Every page carries a badge at the top saying what kind of page it is. The kind decides how much weight a sentence carries, so it is worth a glance before you argue with one.
| Kind | What it means |
|---|---|
| Introductory | Orientation. Correct, but it explains rather than binds. Start here if the words are new. |
| Operational | A procedure to follow, with what to check at each step and what to do when it fails. |
| Normative | The rule as the specification states it. If a page and the specification disagree, the specification wins and the page is a bug. |
| Generated | Every printed value was computed by docs/tools/vectors.mjs and is checked digit by digit on every run. |
- Constants
- Every number in these pages comes from the frozen implementation baseline. If a page and the baseline disagree, the baseline wins and the page is a bug.
- Byte examples
- Every hex string was computed by
docs/tools/vectors.mjsand pasted from that script's output. You can rerun it and diff. - Statistics
- These pages contain no counts, no totals, and no charts. Numbers about the live network belong to the indexer, and you can point the endpoint reference at your own instance to read them.
- Deviations
- Anything an implementation does differently from the baseline is recorded in
docs/deviations.mdin this repo, not quietly in prose.
How this site is built
Hand written HTML, one stylesheet, and three small browser scripts. No framework, no bundler, no fonts or
scripts loaded from anyone else's server. It works served from GitHub Pages and it works when you open
index.html straight off a disk.
Search runs against assets/search-index.json, which is generated by
docs/tools/build-search-index.mjs. The same data is written to
assets/search-index.js as well, because a browser blocks a page opened from disk from
fetching a local file, and search has to work from disk too.
The colour tokens in assets/style.css are the same names and the same values as the ones in
site/assets/site.css. The public site and these pages are one product at two depths, and
site/tools/check-site.mjs fails if the two files ever drift apart.
Run every check before publishing. It regenerates the search index and fails on a broken link, a bad byte example, a contrast regression, or a house style slip.
node docs/tools/verify.mjs
| Script | Checks |
|---|---|
vectors.mjs | Computes every byte example printed in these pages |
build-search-index.mjs | Regenerates the search index from the pages |
stamp-meta.mjs | Writes the sharing metadata into every page from its own title and section |
check-html.mjs | Tag balance, duplicate ids, heading order, labels, captions, page metadata |
check-links.mjs | Every link and fragment resolves, in these pages or on the public site |
check-style.mjs | No em dashes, no version labels, no hype words, no external resources |
check-vectors.mjs | Every hex string on every page is part of a computed value |
check-contrast.mjs | Colour contrast in both themes, in both stylesheets |
check-shell.mjs | Runs the browser scripts headless and asserts what they build |
serve.mjs | Serves this directory locally for preview |