Standard header pattern — brand + main nav on the left, the account action on
the right. New .portal class does margin-left:auto plus a subtle acid tint so
it reads as a button, not another nav item. Applied on all four pages
(landing, docs, portal, theseus); the label is '🔑 Sign in' everywhere
(portal.html itself still marks it .here).
282 lines
16 KiB
HTML
282 lines
16 KiB
HTML
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<title>Docs — sirius.x</title>
|
||
<meta name="description" content="How BCNR works: the TLD registry, name registration, records, resolver, and how to verify anything against the Bitcoin Cash chain.">
|
||
<style>
|
||
:root{
|
||
--bg:#0b0e14; --panel:#141a24; --panel2:#18202c; --line:rgba(255,255,255,.09);
|
||
--ink:#e7eaf1; --mut:#8b98a9; --dim:#5e6678; --acid:#d6ff3d;
|
||
--ok:#4fd1a5; --warn:#ffc75f;
|
||
}
|
||
*{box-sizing:border-box}
|
||
html{scroll-behavior:smooth}
|
||
body{margin:0;background:radial-gradient(1100px 560px at 50% -12%,#16202e,var(--bg));
|
||
color:var(--ink);font:16px/1.65 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;min-height:100vh}
|
||
a{color:var(--acid)}
|
||
.wrap{max-width:900px;margin:0 auto;padding:0 1.2rem}
|
||
.topnav{position:sticky;top:0;z-index:20;display:flex;gap:2px;align-items:center;flex-wrap:wrap;
|
||
padding:10px 1.2rem;background:rgba(11,14,20,.82);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
|
||
.topnav .brand{font-weight:600;color:var(--ink);text-decoration:none;margin-right:14px;font-size:15px;letter-spacing:.2px}
|
||
.topnav .brand .g{color:var(--acid)}
|
||
.topnav a{color:var(--mut);text-decoration:none;padding:6px 12px;border-radius:8px;font-size:14px}
|
||
.topnav a:hover{color:var(--ink);background:var(--panel)}
|
||
.topnav a.here{color:var(--acid);background:rgba(214,255,61,.08)}
|
||
.topnav a.portal{margin-left:auto;background:rgba(214,255,61,.10);color:var(--acid);font-weight:500}
|
||
.topnav a.portal:hover{background:rgba(214,255,61,.18)}
|
||
header.hero{text-align:center;padding:4rem 1.2rem 1rem}
|
||
.mark{font-size:52px;line-height:1}
|
||
h1{font-size:clamp(1.8rem,4.8vw,2.5rem);margin:.4rem 0 .3rem}
|
||
h1 .g{color:var(--acid)}
|
||
.tag{color:var(--mut);font-size:1.05rem;max-width:660px;margin:0 auto}
|
||
/* Layout: TOC on the left on wide screens, content on the right. */
|
||
.doc-grid{display:grid;grid-template-columns:220px 1fr;gap:32px;margin-top:1.5rem}
|
||
@media (max-width:820px){ .doc-grid{grid-template-columns:1fr} }
|
||
.toc{position:sticky;top:60px;align-self:start;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;font-size:14px}
|
||
.toc h4{margin:0 0 8px;color:var(--mut);font-size:12px;text-transform:uppercase;letter-spacing:.6px;font-weight:600}
|
||
.toc a{display:block;padding:5px 8px;border-radius:6px;color:var(--mut);text-decoration:none;font-size:13.5px}
|
||
.toc a:hover{background:var(--panel2);color:var(--ink)}
|
||
section{padding:1.6rem 0 2.4rem;border-top:1px solid var(--line);margin-top:1rem}
|
||
section:first-of-type{border-top:none;margin-top:0}
|
||
h2{font-size:1.35rem;margin:0 0 .5rem}
|
||
h3{font-size:1.05rem;margin:1.4rem 0 .35rem}
|
||
.lede{color:var(--mut);margin:0 0 1rem;max-width:720px}
|
||
ol.steps{counter-reset:s;list-style:none;padding:0;margin:1.2rem 0 0;display:grid;gap:10px}
|
||
ol.steps li{counter-increment:s;display:grid;grid-template-columns:30px 1fr;gap:14px;align-items:start;
|
||
background:var(--panel2);border:1px solid var(--line);border-radius:12px;padding:13px 16px}
|
||
ol.steps li::before{content:counter(s);grid-column:1;grid-row:1;
|
||
display:grid;place-items:center;width:24px;height:24px;border-radius:50%;
|
||
background:rgba(214,255,61,.14);color:var(--acid);font-size:12.5px;font-weight:700}
|
||
ol.steps li > *{grid-column:2;min-width:0}
|
||
ol.steps b{color:var(--ink)} ol.steps span{color:var(--mut);font-size:14px}
|
||
.note{background:var(--panel);border:1px solid var(--line);border-left:3px solid var(--acid);
|
||
border-radius:10px;padding:14px 18px;color:var(--mut);font-size:14px;margin-top:1.2rem}
|
||
.note.warn{border-left-color:var(--warn)}
|
||
.note b{color:var(--ink)}
|
||
code,.mono{background:#0e131b;border:1px solid var(--line);border-radius:6px;padding:1px 6px;font-family:ui-monospace,monospace;font-size:13px;word-break:break-all}
|
||
pre{background:#0e131b;border:1px solid var(--line);border-radius:10px;padding:12px 14px;overflow-x:auto;
|
||
font-family:ui-monospace,monospace;font-size:13px;color:var(--ink);margin:1rem 0}
|
||
table.pricing{width:100%;border-collapse:collapse;margin-top:1rem;font-size:14px}
|
||
table.pricing th,table.pricing td{padding:8px 12px;text-align:left;border-bottom:1px solid var(--line)}
|
||
table.pricing th{color:var(--mut);font-weight:500;font-size:12.5px;text-transform:uppercase;letter-spacing:.4px}
|
||
table.pricing td.price{font-family:ui-monospace,monospace;color:var(--acid);font-weight:600}
|
||
.verify dt{color:var(--mut);font-size:12.5px;text-transform:uppercase;letter-spacing:.3px;margin-top:10px}
|
||
.verify dt:first-of-type{margin-top:0}
|
||
.verify dd{margin:2px 0 0;font-family:ui-monospace,monospace;font-size:12.5px;word-break:break-all;color:var(--ink)}
|
||
footer{border-top:1px solid var(--line);padding:2rem 0 3rem;color:var(--dim);font-size:13px;text-align:center;margin-top:2.5rem}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
|
||
<nav class="topnav">
|
||
<a class="brand" href="../">⭐ <span class="g">sirius.x</span></a>
|
||
<a href="../#try">Try it</a>
|
||
<a href="./" class="here">📚 Docs</a>
|
||
<a href="../theseus/">🧭 Theseus</a>
|
||
<a href="https://silentmode.st/" rel="noopener">Silent Mode ↗</a>
|
||
<a href="../portal.html" class="portal">🔑 Sign in</a>
|
||
</nav>
|
||
|
||
<header class="hero">
|
||
<div class="mark">📚</div>
|
||
<h1>sirius.x <span class="g">docs</span></h1>
|
||
<p class="tag">How the pieces fit together: the TLD registry, name registration, records that
|
||
tell the resolver where a site lives, the resolver itself, and how anyone can verify anything
|
||
against the chain.</p>
|
||
</header>
|
||
|
||
<div class="wrap">
|
||
<div class="doc-grid">
|
||
|
||
<aside class="toc">
|
||
<h4>Contents</h4>
|
||
<a href="#tld-registry">TLD registry</a>
|
||
<a href="#register-name">Register a name</a>
|
||
<a href="#records">Records & hosting</a>
|
||
<a href="#resolver">Resolver / gateway</a>
|
||
<a href="#pricing">Pricing (mainnet)</a>
|
||
<a href="#tracker">Tracker & mirrors</a>
|
||
<a href="#verify">Verify anything</a>
|
||
<a href="#runbook">Operator runbook</a>
|
||
</aside>
|
||
|
||
<div>
|
||
|
||
<section id="tld-registry">
|
||
<h2>The TLD registry</h2>
|
||
<p class="lede">Every BCNR name lives under a <b>top-level domain</b> whose certificate is
|
||
itself a first-class token on the Bitcoin Cash chain — an NFT with the TLD label as its
|
||
commitment, paying dust to a dedicated TLD-registry beacon. That certificate is the
|
||
on-chain proof the TLD exists, and once enforcement ships, it is what makes any
|
||
second-level name under it valid to conforming resolvers.</p>
|
||
<p class="lede">Fourteen public TLDs on chipnet today (2026-08-29):
|
||
<code>bch p2p bit nav test x asm neo gt sc sia dex cex nt</code>. The current list and
|
||
per-TLD categories are at
|
||
<a href="https://silentmode.st/tlds/">silentmode.st/tlds/</a>.</p>
|
||
<div class="note"><b>Why per-TLD certs, not a single list.</b> Without a registry, anyone
|
||
could quietly declare a TLD against the same beacon by minting a name under it. That
|
||
leaves resolvers in silent disagreement. Per-TLD certificates make the TLD set itself
|
||
something the chain records, so every resolver sees the same list — and TLDs become
|
||
ownable assets that can carry policy, fees, and governance of their own.</div>
|
||
</section>
|
||
|
||
<section id="register-name">
|
||
<h2>Register a name — end to end</h2>
|
||
<p class="lede">The buyer's certificate mints straight to a wallet they control, in one
|
||
transaction that also publishes the initial records and pays the beacon. Nobody
|
||
including the operator can take the name back — the covenant work in progress adds an
|
||
expiry / reclaim clock but does not change who controls the key.</p>
|
||
<ol class="steps">
|
||
<li><b>Search a label across every TLD.</b>
|
||
<span>The registrar fans out to every TLD in the registry in parallel and shows
|
||
available / taken per row. Available names appear first.</span></li>
|
||
<li><b>Create or connect a wallet.</b>
|
||
<span>Built-in browser wallet (PBKDF2 → AES-GCM in localStorage) or WizardConnect to
|
||
Cashonize / Paytaca — both mint to the buyer's own key.</span></li>
|
||
<li><b>Confirm the price.</b>
|
||
<span>Miner fee + beacon dust + certificate dust + service fee. Chipnet placeholder
|
||
is 10,000 sat; real pricing is a mainnet decision.</span></li>
|
||
<li><b>The certificate lands in your wallet.</b>
|
||
<span>The name resolves the moment the transaction confirms. Records can be set or
|
||
changed later — only your key can sign a UPD.</span></li>
|
||
</ol>
|
||
</section>
|
||
|
||
<section id="records">
|
||
<h2>Records & hosting</h2>
|
||
<p class="lede">A registered name carries a small JSON records object. Every record is
|
||
optional and multiple can coexist. Priority order the gateway uses:
|
||
<code>h</code> (inline HTML) → <code>s3</code> (Sia bucket key) → <code>ip</code>
|
||
(host header served by an IP) → <code>u</code> (redirect).</p>
|
||
<table class="pricing">
|
||
<thead><tr><th>Record</th><th>Meaning</th><th>Typical use</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><code>h</code></td><td>Inline HTML in the OP_RETURN payload itself</td><td>Tiny sites, a profile, a link hub</td></tr>
|
||
<tr><td><code>s3</code></td><td>A Sia bucket key (with auto-index for directory-style)</td><td>Multi-file sites, permanent hosting</td></tr>
|
||
<tr><td><code>ip</code></td><td>An IPv4 address + optional <code>tls</code> fingerprint</td><td>Your own server, apps behind an IP</td></tr>
|
||
<tr><td><code>u</code></td><td>Redirect URL</td><td>Short-form redirects to any web host</td></tr>
|
||
<tr><td><code>tls</code></td><td>SHA-256 fingerprint of the leaf cert served at <code>ip</code></td><td>Chain-pinned TLS trust, no OS root store needed</td></tr>
|
||
<tr><td><code>np</code>, <code>nr</code></td><td>Nostr pubkey + relay list</td><td>Hermes / NIP-17 messaging bound to the name</td></tr>
|
||
<tr><td><code>el</code></td><td>Space-separated electrum server list</td><td>On-chain-updatable resolver bootstrap</td></tr>
|
||
</tbody>
|
||
</table>
|
||
<p class="lede" style="margin-top:1rem">Subdomains inherit from their parent with a slight
|
||
priority tweak: for a subdomain query, <code>ip</code> beats <code>s3</code>
|
||
(Host-header semantics). Full rule is in <code>Argus/src/lib/record-picker.js</code>.</p>
|
||
</section>
|
||
|
||
<section id="resolver">
|
||
<h2>Resolver / gateway</h2>
|
||
<p class="lede">Three paths, same chain data. Anyone can pick.</p>
|
||
<ol class="steps">
|
||
<li><b>Local — Ariadne Resolver.</b>
|
||
<span>A system-wide resolver that intercepts BCNR TLDs and answers them from the
|
||
chain. Any browser you already use starts opening <code>.bch</code> URLs directly.
|
||
Installs a local root CA for TLS.
|
||
<a href="../theseus/">Download →</a></span></li>
|
||
<li><b>In-browser — Theseus Navigator.</b>
|
||
<span>A Chromium build with the resolver baked in, plus an on-chain TLS trust anchor.
|
||
No OS trust-store install; nothing modified globally.
|
||
<a href="../theseus/">Download →</a></span></li>
|
||
<li><b>Public gateway — navigate.st.</b>
|
||
<span>For anyone without the resolver installed:
|
||
<code>https://navigate.st/bns/<name>/</code> proxies through a hosted resolver.
|
||
Same content, fewer guarantees — trust the gateway to fetch honestly, or run one of
|
||
the first two.</span></li>
|
||
</ol>
|
||
</section>
|
||
|
||
<section id="pricing">
|
||
<h2>Pricing (mainnet)</h2>
|
||
<p class="lede">On mainnet the covenant enforces USD-denominated floors, tiered by TLD
|
||
label length. This is what keeps someone from land-grabbing every ICANN TLD in one
|
||
afternoon. TLD registration is <b>one-time</b> — a TLD is closer to a domain purchase
|
||
than a lease.</p>
|
||
<table class="pricing">
|
||
<thead><tr><th>Label length</th><th>Floor (USD)</th><th>Notes</th></tr></thead>
|
||
<tbody>
|
||
<tr><td>1 char</td><td class="price">100,000</td><td>Effectively unique; ENS-like scarcity</td></tr>
|
||
<tr><td>2 char</td><td class="price">50,000</td><td>The <code>.ai</code> / <code>.io</code> tier</td></tr>
|
||
<tr><td>3 char</td><td class="price">15,000</td><td>Order of magnitude below ICANN's $185k application floor</td></tr>
|
||
<tr><td>4 char</td><td class="price">5,000</td><td>Floor for short but reasonable TLDs</td></tr>
|
||
<tr><td>5–8 char</td><td class="price">1,000</td><td>Bulk-registerable but not spam</td></tr>
|
||
<tr><td>9+ char</td><td class="price">250</td><td>Descriptive TLDs, low economic gravity</td></tr>
|
||
</tbody>
|
||
</table>
|
||
<p class="lede" style="margin-top:1rem">On <b>name registration under a TLD</b>, the TLD's
|
||
owner collects a share (<code>fee_bps</code>, default 5%, cap 50%). Chain-enforced when
|
||
the TLD's policy is <code>covenant</code>; honour-system otherwise. Name registration is
|
||
yearly and priced separately.</p>
|
||
</section>
|
||
|
||
<section id="tracker">
|
||
<h2>Tracker & mirrors</h2>
|
||
<p class="lede">A tracker publishes signed snapshots of the TLD registry to Sia and Nostr so
|
||
downstream clients don't have to walk the chain themselves. The chain is authoritative;
|
||
the tracker is speed. Every snapshot carries a <b>root</b> hash anyone can recompute
|
||
locally — a lying mirror is caught by any recipient who bothers to check.</p>
|
||
<p class="lede">A conforming client falls through: (1) fetch snapshot from a mirror,
|
||
(2) verify <code>root</code>, (3) if suspicious, walk the beacon and rebuild. All three
|
||
yield the same list for any given block height.</p>
|
||
</section>
|
||
|
||
<section id="verify">
|
||
<h2>Verify anything</h2>
|
||
<p class="lede">You do not have to trust that sirius.x, silentmode.st, or navigate.st are
|
||
serving honest content. Every name's certificate is on chain; every record is a signed
|
||
on-chain payload; every host is checkable independently.</p>
|
||
|
||
<h3>Confirm a specific name on chain</h3>
|
||
<pre>node --input-type=module -e "
|
||
import { loadWallet } from './Argus/src/lib/wallet.js';
|
||
import { resolveName } from './Argus/src/lib/bns.js';
|
||
const w = await loadWallet('main');
|
||
console.log(await resolveName(w.provider, 'sirius.x'));
|
||
process.exit(0);"</pre>
|
||
|
||
<h3>Fetch the operator-signed TLD snapshot from Nostr</h3>
|
||
<dl class="verify">
|
||
<dt>Kind / d-tag</dt>
|
||
<dd>30078 / bns-tld-list</dd>
|
||
<dt>Pubkey (x-only, hex)</dt>
|
||
<dd>f2c925194c531c7c398017e35b2396df64a61a613aa5fadebdf1f4990f2267f4</dd>
|
||
<dt>Relays</dt>
|
||
<dd>wss://nos.lol · wss://relay.damus.io</dd>
|
||
</dl>
|
||
|
||
<h3>Reach any site via more than one route</h3>
|
||
<p class="lede">Same content should be served from at least two independent paths:</p>
|
||
<ul style="color:var(--mut);font-size:14px;margin:.6rem 0 0;padding-left:1.2rem">
|
||
<li>Direct BCNR: <code>https://<name>/</code> (requires local resolver + CA)</li>
|
||
<li>Public gateway: <code>https://navigate.st/bns/<name>/</code></li>
|
||
<li>silentmode.st mirror: <code>https://silentmode.st/bns/<name>/</code></li>
|
||
<li>Direct from Sia (content-addressed) via the name's <code>s3</code> record</li>
|
||
</ul>
|
||
</section>
|
||
|
||
<section id="runbook">
|
||
<h2>Operator runbook</h2>
|
||
<p class="lede">These docs describe <i>what</i>. The <i>how</i> — exact bash commands to
|
||
register TLDs, mint names, update records, and deploy — is
|
||
<code>INSTRUCTIONS.md</code> in the project repo. Clone the repo to read it:</p>
|
||
<pre>git clone https://silentmode.st/sirius-x/repo/silent-mode.git
|
||
cat silent-mode/INSTRUCTIONS.md</pre>
|
||
<p class="lede">The runbook covers CLI name registration, TLD-registry seeding, record
|
||
updates, Sia upload, tests, and the historically-costly gotchas.</p>
|
||
</section>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<footer>
|
||
Documentation for BCNR + the sirius.x stack ·
|
||
<a href="../">back to sirius.x</a> ·
|
||
<a href="https://silentmode.st/tlds/">TLD registry snapshot</a> ·
|
||
<a href="https://silentmode.st/sirius/register.html">register a name</a>
|
||
</footer>
|
||
|
||
</body>
|
||
</html>
|