sirius/docs/index.html

431 lines
26 KiB
HTML
Raw Normal View History

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal Three things from one review pass: 1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all sirius.x pages (titles, meta, nav wordmark, headings, prose, footer). Also flipped the pantheon headings to Title.X form: Silentmode.X, Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X. Domain literals, URLs, and code samples stay lowercase (sirius.x is the actual on-chain name; only prose changes). Logo/avatar SVG wordmarks and aria-labels updated to match. 2. Banner (brand/banner.svg) redesigned around a centered layout: 'Sirius.X' wordmark above, the star's horizontal arm extended edge-to-edge as a divider line, tagline lines below. Left tip at (0,315), right tip at (1200,315) so the arm crosses the full 1200px banner width; vertical body compact around center. Old layout had the star crammed into the right half and the wordmark on the left. 3. WizardConnect wired up on portal.html: - The 'Connect wallet' button now opens a real WC session via wizardconnect.js, shows the WIZ:// URI (copyable) and waits for the wallet to approve. - Successful connection builds a wallet-shaped wrapper with source: 'wc' and a WC session for signing; siriusProfile now carries the source so the nav dropdown can differentiate. - Record editor dispatches to setRecordsWithExternalWallet when source === 'wc' (bundle already ships the adapter), else stays on setRecordsWithBuiltInWallet. - TLD Register submit is gated off for WC users with a tooltip — no external-wallet variant of registerTld is exported yet, so TLD mint still needs a built-in wallet. - Sign-out disconnects the WC session before dropping the wallet. - toTokenAddress used to derive the tokenAddress for WC users so the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
<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.">
sirius.x portal: /api/holdings endpoint + favicon paths + roadmap link gateway/public-gateway.mjs: * GET /api/holdings/<scripthash> and POST /api/holdings {scripthashes:[…]} — server-side wallet-holdings lookup for the portal. Bns-indexer is beacon-only so it can't answer listunspent for arbitrary addresses; the gateway does the electrum roundtrip and cross-joins with the cached BCNR index. Client posts scripthashes (no libauth needed on the server) and gets back the names owned. * elConnect now falls through to whole-buffer JSON.parse when a Fulcrum response lacks a trailing newline — chipnet.bch.ninja does this and otherwise every elCall to it times out. Same tolerance pattern as bns-indexer.test.mjs's tiny electrum client. * verifyElectrum picks a full electrum with a 3s server.version probe so a hung server fails over to the next in seconds instead of stalling 20. * Skips silentmode.st/electrum and coinspectrum.duckdns.org:50011 for /api/holdings — both are bns-indexer routes that don't do listunspent. web/register-entry.js: export addressToScripthash so the portal can derive the scripthash for each of its wallet's watched addresses before POSTing. Browser bundle rebuilt. site-sirius-x pages: * favicon + logo hrefs made relative (./assets/… on index/portal, ../assets/… on docs/theseus). Absolute /sirius-x/… broke on the sirius.x BCNR route where the site is served from root instead of under /sirius-x/. * Roadmap nav link added back to portal, docs, theseus — the landing has an anchor to a section on itself, so subpages now link to it explicitly. * portal.html: loadNames rewritten to POST scripthashes to /api/holdings instead of doing client-side electrum. Works on browsers whose networks block chipnet electrum ports; same-origin HTTPS on 443. * portal.html: bundle import ?v= bumped so Chrome's in-memory ES module map picks up the new bundle instead of a stale cached copy.
2026-08-31 05:40:47 +02:00
<link rel="icon" href="../assets/favicon.svg" type="image/svg+xml">
<link rel="mask-icon" href="../assets/favicon.svg" color="#d6ff3d">
<meta property="og:type" content="website">
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal Three things from one review pass: 1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all sirius.x pages (titles, meta, nav wordmark, headings, prose, footer). Also flipped the pantheon headings to Title.X form: Silentmode.X, Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X. Domain literals, URLs, and code samples stay lowercase (sirius.x is the actual on-chain name; only prose changes). Logo/avatar SVG wordmarks and aria-labels updated to match. 2. Banner (brand/banner.svg) redesigned around a centered layout: 'Sirius.X' wordmark above, the star's horizontal arm extended edge-to-edge as a divider line, tagline lines below. Left tip at (0,315), right tip at (1200,315) so the arm crosses the full 1200px banner width; vertical body compact around center. Old layout had the star crammed into the right half and the wordmark on the left. 3. WizardConnect wired up on portal.html: - The 'Connect wallet' button now opens a real WC session via wizardconnect.js, shows the WIZ:// URI (copyable) and waits for the wallet to approve. - Successful connection builds a wallet-shaped wrapper with source: 'wc' and a WC session for signing; siriusProfile now carries the source so the nav dropdown can differentiate. - Record editor dispatches to setRecordsWithExternalWallet when source === 'wc' (bundle already ships the adapter), else stays on setRecordsWithBuiltInWallet. - TLD Register submit is gated off for WC users with a tooltip — no external-wallet variant of registerTld is exported yet, so TLD mint still needs a built-in wallet. - Sign-out disconnects the WC session before dropping the wallet. - toTokenAddress used to derive the tokenAddress for WC users so the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
<meta property="og:site_name" content="Sirius.X">
<meta property="og:title" content="Sirius.X docs — how BCNR works">
<meta property="og:description" content="The TLD registry, name registration, records, resolver, mainnet pricing, and how to verify anything against the chain.">
<meta property="og:url" content="https://silentmode.st/sirius-x/docs/">
<meta property="og:image" content="https://silentmode.st/sirius-x/brand/banner.svg">
<meta name="twitter:card" content="summary">
<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>
feat(sirius-x): inline wallet dropdown — no navigation, no portal detour Wallet dropdown items (New / Import / WizardConnect) were navigating to portal.html?mode=X and asking the user to click again on arrival. That is 'the sign in landing page which is not functioning' from the user's perspective — a whole redirect for one form. Now every dropdown item opens the mint modal (register-flow.js) inline at the matching step, on whatever page the user is on: New -> stepCreate ('Create your wallet' — password + generate) Import -> stepImport ('Import a recovery phrase' — textarea) WizardConnect -> stepExternal ('Open your wallet' — QR/URI) register-flow.js grew a signInOnly mode: state.name is null, the step Back buttons close instead of going to a wallet-choice step there is no context for, and on wallet-loaded the flow writes siriusProfile and shows a 'Signed in' confirmation instead of Fund -> Confirm -> Mint. WC signInOnly keeps the session alive (state.session) so a later record edit can reuse it without a fresh QR handshake. profile-menu.js: menu items became <a data-action='new|import|wc'> and the click handler lazy-loads register-flow.js on demand — the docs/brand/theseus pages don't ship it in their initial payload, so their nav pill loads it the first time a wallet button is clicked and caches it for subsequent opens. Falls back to portal.html?mode=X if the module can't load. Cache-buster bumped so cached copies pick up the new behavior. Importmap for @bitauth/libauth added to docs/, brand/, theseus/ so the bundle's bare specifier resolves when register-flow.js is lazy-loaded from those pages. Verified end-to-end on the live docs page: all three dropdown items open the modal inline at the correct step, no console errors, no navigation.
2026-09-07 23:52:12 +02:00
<script type="importmap">
{ "imports": { "@bitauth/libauth": "https://silentmode.st/js/libauth.js" } }
</script>
</head>
<body>
<nav class="topnav">
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal Three things from one review pass: 1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all sirius.x pages (titles, meta, nav wordmark, headings, prose, footer). Also flipped the pantheon headings to Title.X form: Silentmode.X, Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X. Domain literals, URLs, and code samples stay lowercase (sirius.x is the actual on-chain name; only prose changes). Logo/avatar SVG wordmarks and aria-labels updated to match. 2. Banner (brand/banner.svg) redesigned around a centered layout: 'Sirius.X' wordmark above, the star's horizontal arm extended edge-to-edge as a divider line, tagline lines below. Left tip at (0,315), right tip at (1200,315) so the arm crosses the full 1200px banner width; vertical body compact around center. Old layout had the star crammed into the right half and the wordmark on the left. 3. WizardConnect wired up on portal.html: - The 'Connect wallet' button now opens a real WC session via wizardconnect.js, shows the WIZ:// URI (copyable) and waits for the wallet to approve. - Successful connection builds a wallet-shaped wrapper with source: 'wc' and a WC session for signing; siriusProfile now carries the source so the nav dropdown can differentiate. - Record editor dispatches to setRecordsWithExternalWallet when source === 'wc' (bundle already ships the adapter), else stays on setRecordsWithBuiltInWallet. - TLD Register submit is gated off for WC users with a tooltip — no external-wallet variant of registerTld is exported yet, so TLD mint still needs a built-in wallet. - Sign-out disconnects the WC session before dropping the wallet. - toTokenAddress used to derive the tokenAddress for WC users so the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
<a class="brand" href="../"><span class="g">Sirius.X</span></a>
<a href="../#try">Try it</a>
feat(sirius-x): merge register.html into landing via shared mint flow Register.html and the landing were running duplicate name-search UIs. The register one was reported broken; the landing one already works inline. Merged both into the landing: - New js/register-flow.js — the full mint modal + wallet setup (Create / Import / Unlock / WizardConnect / Fund / Confirm / Register / Point it somewhere) extracted from register.html's <script type='module'> and turned into a shared module. Injects its own scoped modal HTML + CSS into the host page on load and exposes window.siriusRegisterName(fullName) as its public entry point. - Landing search results now have Register buttons that call the shared flow directly. The whole 'search -> pick name -> mint' journey stays on one page, no redirects, no duplicate search UI to maintain. - register.html reduced to a redirect stub: preserves ?q= if present, refreshes/JS-forwards to './' (landing), and shows a one-line 'Name search moved to the home page' fallback for JS-off users. Old links keep working; no /register.html deep links are broken. - All nav 'Register' entries now point at './#search-input' (or '../#search-input' on subpages), scrolling straight to the landing search box. Footer injector and every internal href updated the same way. Zero live href='.../register.html' left in the tree. Verified: register.html?q=hello redirects to /?q=hello; landing search 'fresh42abc' -> Register button -> modal opens with 'Register fresh42abc.bch' at the wallet-choice step.
2026-09-07 22:36:02 +02:00
<a href="../#search-input">🪪 Register</a>
<a href="../tld.html">🌐 TLD</a>
<a href="../theseus/"><svg width="14" height="14" viewBox="0 0 64 64" style="vertical-align:-2px;margin-right:4px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 6 L38 32 L26 32 Z" fill="#e04e4e"/><path d="M38 32 L32 58 L26 32 Z" fill="#d6ff3d"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus</a>
<a href="../portal.html" class="portal">🔑 Sign in</a>
</nav>
<header class="hero">
<div class="mark">📚</div>
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal Three things from one review pass: 1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all sirius.x pages (titles, meta, nav wordmark, headings, prose, footer). Also flipped the pantheon headings to Title.X form: Silentmode.X, Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X. Domain literals, URLs, and code samples stay lowercase (sirius.x is the actual on-chain name; only prose changes). Logo/avatar SVG wordmarks and aria-labels updated to match. 2. Banner (brand/banner.svg) redesigned around a centered layout: 'Sirius.X' wordmark above, the star's horizontal arm extended edge-to-edge as a divider line, tagline lines below. Left tip at (0,315), right tip at (1200,315) so the arm crosses the full 1200px banner width; vertical body compact around center. Old layout had the star crammed into the right half and the wordmark on the left. 3. WizardConnect wired up on portal.html: - The 'Connect wallet' button now opens a real WC session via wizardconnect.js, shows the WIZ:// URI (copyable) and waits for the wallet to approve. - Successful connection builds a wallet-shaped wrapper with source: 'wc' and a WC session for signing; siriusProfile now carries the source so the nav dropdown can differentiate. - Record editor dispatches to setRecordsWithExternalWallet when source === 'wc' (bundle already ships the adapter), else stays on setRecordsWithBuiltInWallet. - TLD Register submit is gated off for WC users with a tooltip — no external-wallet variant of registerTld is exported yet, so TLD mint still needs a built-in wallet. - Sign-out disconnects the WC session before dropping the wallet. - toTokenAddress used to derive the tokenAddress for WC users so the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
<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="#host">Host your name</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="host">
<h2>Host your name</h2>
<p class="lede">The end-to-end recipe for putting a static site under a BCNR name. Chipnet
today, mainnet later — the shape is the same. Three ways to host, most people combine
two of them (Sia + VPS mirror) so the site keeps serving if either mirror goes down.</p>
<h3>Pattern A — Sia only</h3>
<p class="lede">Simplest. Site lives on the Sia storage network, name's <code>s3</code> record
points at the bucket key, gateways (navigate.st, silentmode.st, any BCNR-aware browser)
fetch it on demand. Same pattern <code>silentmode.bch</code> uses.</p>
<pre># From a checkout with sia-s3.json credentials:
node Argus/src/lib/sia-upload.js ./my-site bns/myname/
# Set the chain record (once). Note the trailing slash — enables auto-index
# so /myname/ serves myname/index.html and /myname/about/ serves .../about/index.html.
node Argus/src/update.js myname.x '{"s3":"bns/myname/"}'</pre>
<p class="lede">Bucket-path convention: <code>bns/&lt;label&gt;/</code> (no TLD; the label is
unique enough within our Sia namespace and keeps game.x + game.bch from colliding). Files
update by re-running sia-upload; the chain record only changes when the bucket path does.</p>
<h3>Pattern B — Your own server (VPS + <code>ip</code>)</h3>
<p class="lede">Point the name at an IP; every request goes directly to your box. Add a
<code>tls</code> record with the SHA-256 of the leaf certificate so browsers verify the
connection against the chain instead of the OS trust store.</p>
<pre># On your VPS: nginx serves your site over TLS. Then, on chain:
node Argus/src/update.js myname.x '{"ip":"1.2.3.4","tls":"&lt;sha256-of-leaf-cert&gt;"}'</pre>
<h3>Pattern C — Dual host (Sia primary, VPS mirror)</h3>
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal Three things from one review pass: 1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all sirius.x pages (titles, meta, nav wordmark, headings, prose, footer). Also flipped the pantheon headings to Title.X form: Silentmode.X, Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X. Domain literals, URLs, and code samples stay lowercase (sirius.x is the actual on-chain name; only prose changes). Logo/avatar SVG wordmarks and aria-labels updated to match. 2. Banner (brand/banner.svg) redesigned around a centered layout: 'Sirius.X' wordmark above, the star's horizontal arm extended edge-to-edge as a divider line, tagline lines below. Left tip at (0,315), right tip at (1200,315) so the arm crosses the full 1200px banner width; vertical body compact around center. Old layout had the star crammed into the right half and the wordmark on the left. 3. WizardConnect wired up on portal.html: - The 'Connect wallet' button now opens a real WC session via wizardconnect.js, shows the WIZ:// URI (copyable) and waits for the wallet to approve. - Successful connection builds a wallet-shaped wrapper with source: 'wc' and a WC session for signing; siriusProfile now carries the source so the nav dropdown can differentiate. - Record editor dispatches to setRecordsWithExternalWallet when source === 'wc' (bundle already ships the adapter), else stays on setRecordsWithBuiltInWallet. - TLD Register submit is gated off for WC users with a tooltip — no external-wallet variant of registerTld is exported yet, so TLD mint still needs a built-in wallet. - Sign-out disconnects the WC session before dropping the wallet. - toTokenAddress used to derive the tokenAddress for WC users so the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
<p class="lede">What Sirius.X itself uses. Sia is the chain-authoritative source (survives
if the VPS is down); the VPS serves the same content on <code>silentmode.st/&lt;path&gt;</code>
for users without a BCNR resolver installed. On the VPS side, extend the nginx vhost
serving <code>silentmode.st</code> with a new <code>location</code> block that aliases
straight from disk:</p>
<pre>location /myname-x/ {
alias /opt/silent-mode/site-myname-x/;
index index.html;
try_files $uri $uri/ =404;
}</pre>
<p class="lede">Then rsync / scp your site tree to <code>silentmode:/opt/silent-mode/site-myname-x/</code>
and reload nginx. This gives you two URLs for the same content:
<code>https://silentmode.st/myname-x/</code> (VPS-direct) and the chain-authoritative
<code>https://myname.x/</code> via any BCNR resolver.</p>
<h3>The dual-host recipe, end to end</h3>
feat(sirius-x): Sirius.X brand rebrand, banner star-divider, WC on portal Three things from one review pass: 1. Rebrand text 'sirius.x' -> 'Sirius.X' as the brand style across all sirius.x pages (titles, meta, nav wordmark, headings, prose, footer). Also flipped the pantheon headings to Title.X form: Silentmode.X, Sirius.X, Theseus.X, Hephaestus.X, Prometheus.X, Helios.X, Hermes.X. Domain literals, URLs, and code samples stay lowercase (sirius.x is the actual on-chain name; only prose changes). Logo/avatar SVG wordmarks and aria-labels updated to match. 2. Banner (brand/banner.svg) redesigned around a centered layout: 'Sirius.X' wordmark above, the star's horizontal arm extended edge-to-edge as a divider line, tagline lines below. Left tip at (0,315), right tip at (1200,315) so the arm crosses the full 1200px banner width; vertical body compact around center. Old layout had the star crammed into the right half and the wordmark on the left. 3. WizardConnect wired up on portal.html: - The 'Connect wallet' button now opens a real WC session via wizardconnect.js, shows the WIZ:// URI (copyable) and waits for the wallet to approve. - Successful connection builds a wallet-shaped wrapper with source: 'wc' and a WC session for signing; siriusProfile now carries the source so the nav dropdown can differentiate. - Record editor dispatches to setRecordsWithExternalWallet when source === 'wc' (bundle already ships the adapter), else stays on setRecordsWithBuiltInWallet. - TLD Register submit is gated off for WC users with a tooltip — no external-wallet variant of registerTld is exported yet, so TLD mint still needs a built-in wallet. - Sign-out disconnects the WC session before dropping the wallet. - toTokenAddress used to derive the tokenAddress for WC users so the 'Signed in' card shows both forms.
2026-09-07 01:35:35 +02:00
<p class="lede">This is the exact sequence Sirius.X itself uses on every publish. The
chain record stays constant; only file contents change, so no per-publish UPD is
needed.</p>
<ol class="steps">
<li><b>Edit locally.</b>
<span>Site source lives at <code>site-myname-x/</code> in your working repo. Any
static generator works (or plain HTML) — the deploy is content-agnostic.</span></li>
<li><b>Push VPS mirror (fast path).</b>
<span>Serves at <code>silentmode.st/myname-x/</code> within seconds. Users without a
BCNR resolver hit this route.
<pre>scp -r site-myname-x/* silentmode:/opt/silent-mode/site-myname-x/</pre></span></li>
<li><b>Push Sia mirror (durable copy).</b>
<span>Serves at <code>sirius.x/</code> via any BCNR gateway. Survives VPS outage.
<pre>node Argus/src/lib/sia-upload.js site-myname-x/ bns/myname/</pre></span></li>
<li><b>Verify both.</b>
<span><code>curl -so /dev/null -w "%{http_code}\n" https://silentmode.st/myname-x/</code>
and <code>curl -so /dev/null -w "%{http_code}\n" https://silentmode.st/bns/myname.x/</code>
— both should return 200.</span></li>
</ol>
<h3>Auto-backup: one command, both mirrors</h3>
<p class="lede">Wrap the two commands into a script so every publish reaches both mirrors
without extra thought. This is exactly what a two-liner deploy hook looks like:</p>
<pre># scripts/deploy-myname-x.sh
#!/usr/bin/env bash
set -eu
SRC="$(dirname "$0")/../site-myname-x"
VPS_DEST="silentmode:/opt/silent-mode/site-myname-x/"
SIA_BUCKET="bns/myname/"
echo "→ VPS mirror"
scp -qr "$SRC"/. "$VPS_DEST"
echo "→ Sia mirror"
node "$(dirname "$0")/../Argus/src/lib/sia-upload.js" "$SRC" "$SIA_BUCKET"
echo "✓ deployed; verifying"
for url in "https://silentmode.st/myname-x/" "https://silentmode.st/bns/myname.x/"; do
code=$(curl -so /dev/null -w '%{http_code}' "$url")
printf ' %s → %s\n' "$url" "$code"
done</pre>
<p class="lede">Wire it into git: <code>chmod +x scripts/deploy-myname-x.sh</code>, add a
<code>.git/hooks/post-commit</code> that runs it if the site subtree changed, or invoke
manually. Sia uploads that fail (network hiccup, quota) leave the VPS mirror ahead until
the next run — same failure mode as any staged deploy.</p>
<h3>Automate the reverse — VPS → Sia periodic backup</h3>
<p class="lede">If your primary publish path is straight-to-VPS (nginx-direct, no Sia
step per publish), a cron job can pull the VPS state and push to Sia on a schedule:</p>
<pre># /etc/cron.d/sirius-x-sia-backup (on the operator's VPS)
17 * * * * root cd /opt/silent-mode && node Argus/src/lib/sia-upload.js \
/opt/silent-mode/site-myname-x/ bns/myname/ &gt;/var/log/sia-backup.log 2&gt;&amp;1</pre>
<p class="lede">Runs hourly at :17 (offset from the top of the hour so it doesn't collide
with everyone else's cron traffic). The tradeoff: up to an hour of drift between VPS
and Sia after a publish — usually fine, since the chain record still resolves
correctly either way and BCNR gateways cache Sia content.</p>
<div class="note"><b>Which mirror is authoritative?</b> The one your chain record points
at. If <code>s3</code> is set, gateways fetch from Sia; the VPS mirror is just a
convenience URL. If only <code>ip</code> is set, gateways fetch from the VPS; Sia is
just backup. If BOTH are set, gateways pick per the priority in the "Records" section
(subdomain-aware; see <code>record-picker.js</code>). Set both for durability, but be
deliberate about which is primary.</div>
<h3>Verify records changed correctly</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, 'myname.x'));
process.exit(0);"</pre>
<div class="note"><b>Credentials.</b> Sia upload needs <code>Argus/sia-s3.json</code>. VPS
deploy needs SSH to the operator's box. Neither is in the repo — a session that isn't
run by the operator will need those handed over out-of-band. Full command reference is in
<a href="INSTRUCTIONS.md">INSTRUCTIONS.md</a>, especially §5 (Sia storage) and §6
(deploy).</div>
</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>. Three ways to read it, in order of "how much do I already
have installed":</p>
<ol class="steps">
<li><b>Just read it in the browser</b>
<span>Served straight from the docs directory:
<a href="INSTRUCTIONS.md">/sirius-x/docs/INSTRUCTIONS.md</a>. Plain text; every
browser renders it.</span></li>
<li><b>Clone the git remote</b>
<span><code>git clone https://silentmode.st/sirius-x/repo/silent-mode.git</code> — dumb-HTTP,
no auth. Get the whole tree, browse offline, run the scripts.</span></li>
<li><b>Browse the Forgejo mirror</b>
<span>Repo lives at
<a href="https://code.silentmode.st/silentmode/sirius">code.silentmode.st/silentmode/sirius</a>
on the Silent Mode Hephaestus forge. Rendered runbook:
<a href="https://code.silentmode.st/silentmode/sirius/src/branch/master/docs/INSTRUCTIONS.md">docs/INSTRUCTIONS.md</a>.
Clone: <code>git clone https://code.silentmode.st/silentmode/sirius.git</code> — public,
no auth.</span></li>
</ol>
<p class="lede">The runbook covers CLI name registration, TLD-registry seeding, record
updates, Sia upload, VPS deploy, tests, and the historically-costly gotchas.</p>
</section>
</div>
</div>
</div>
feat(sirius-x): footer everywhere, redesigned wallet button, dropdown auto-acts Three UX fixes: 1. Beautiful footer on every page. Extracted the 4-column landing footer into js/site-footer.js — reads the nav brand link to derive per-page base ('./' at root, '../' in subdirs) so links resolve from any depth without duplicating the HTML across 8 pages. Every page now ships an empty <footer id="site-footer"></footer> and includes the injector; inline footer + its CSS block removed from landing too so the source stays in one place. 2. Wallet button redesign. Pill now shows a state dot (dim when not signed in, green with subtle glow when signed in), a monospace short address label when signed in ('qra6rs…7yl2') OR 'Wallet' when not, a WC/seed badge on signed-in state, and a subtle caret. Full border and hover states, proper aria-expanded/aria-label wiring. Dropdown menu itself upgraded: grid layout per item (icon column + title + hint), heavier backdrop blur, larger min-width, clearer typography. 3. Dropdown options actually do something. Removed the redundant 'Open sign-in page →' item — the other three all land on portal too, so listing 'open the page' as a fourth option was noise. On portal arrival, the ?mode= handler now AUTO-TRIGGERS the primary action for each mode: new -> click Generate a phrase (12 words appear immediately) import -> focus the seed textarea (cursor ready to paste) wc -> click Connect wallet (WC session starts, URI shown) No extra clicks between dropdown choice and the flow it names. Cache-buster on the profile-menu.js include bumped to ?v=20260907wallet so cached copies pick up the new design; footer injector at ?v=20260907rel.
2026-09-07 22:00:21 +02:00
<footer id="site-footer"></footer>
<script defer src="../js/site-footer.js?v=20260907rel"></script>
feat(sirius-x): inline wallet dropdown — no navigation, no portal detour Wallet dropdown items (New / Import / WizardConnect) were navigating to portal.html?mode=X and asking the user to click again on arrival. That is 'the sign in landing page which is not functioning' from the user's perspective — a whole redirect for one form. Now every dropdown item opens the mint modal (register-flow.js) inline at the matching step, on whatever page the user is on: New -> stepCreate ('Create your wallet' — password + generate) Import -> stepImport ('Import a recovery phrase' — textarea) WizardConnect -> stepExternal ('Open your wallet' — QR/URI) register-flow.js grew a signInOnly mode: state.name is null, the step Back buttons close instead of going to a wallet-choice step there is no context for, and on wallet-loaded the flow writes siriusProfile and shows a 'Signed in' confirmation instead of Fund -> Confirm -> Mint. WC signInOnly keeps the session alive (state.session) so a later record edit can reuse it without a fresh QR handshake. profile-menu.js: menu items became <a data-action='new|import|wc'> and the click handler lazy-loads register-flow.js on demand — the docs/brand/theseus pages don't ship it in their initial payload, so their nav pill loads it the first time a wallet button is clicked and caches it for subsequent opens. Falls back to portal.html?mode=X if the module can't load. Cache-buster bumped so cached copies pick up the new behavior. Importmap for @bitauth/libauth added to docs/, brand/, theseus/ so the bundle's bare specifier resolves when register-flow.js is lazy-loaded from those pages. Verified end-to-end on the live docs page: all three dropdown items open the modal inline at the correct step, no console errors, no navigation.
2026-09-07 23:52:12 +02:00
<script defer src="../js/profile-menu.js?v=20260907inline"></script>
</body>
</html>