PATINA docs

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.

What you will know after this page
  • 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.

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

Read this before you mint

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.

The full list of limits

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.

The four kinds of page, and what each one is for.
KindWhat it means
IntroductoryOrientation. Correct, but it explains rather than binds. Start here if the words are new.
OperationalA procedure to follow, with what to check at each step and what to do when it fails.
NormativeThe rule as the specification states it. If a page and the specification disagree, the specification wins and the page is a bug.
GeneratedEvery 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.mjs and 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.md in 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
What each script does. All of them use the Node standard library and nothing else.
ScriptChecks
vectors.mjsComputes every byte example printed in these pages
build-search-index.mjsRegenerates the search index from the pages
stamp-meta.mjsWrites the sharing metadata into every page from its own title and section
check-html.mjsTag balance, duplicate ids, heading order, labels, captions, page metadata
check-links.mjsEvery link and fragment resolves, in these pages or on the public site
check-style.mjsNo em dashes, no version labels, no hype words, no external resources
check-vectors.mjsEvery hex string on every page is part of a computed value
check-contrast.mjsColour contrast in both themes, in both stylesheets
check-shell.mjsRuns the browser scripts headless and asserts what they build
serve.mjsServes this directory locally for preview