sirius/docs/index.html
Local Dev 1f331a298b sirius.x: pull the sign-in link to the far right of the top nav
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).
2026-08-29 22:22:37 +02:00

282 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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 &amp; hosting</a>
<a href="#resolver">Resolver / gateway</a>
<a href="#pricing">Pricing (mainnet)</a>
<a href="#tracker">Tracker &amp; 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 &amp; 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/&lt;name&gt;/</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>58 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 &amp; 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://&lt;name&gt;/</code> (requires local resolver + CA)</li>
<li>Public gateway: <code>https://navigate.st/bns/&lt;name&gt;/</code></li>
<li>silentmode.st mirror: <code>https://silentmode.st/bns/&lt;name&gt;/</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>