sirius/index.html
Local Dev 890af362b8 sites: Ubuntu everywhere; opaque bottom rail on mobile
Fraunces/Ubuntu font picker is gone. theme.js used to persist the
choice in localStorage and paint a pill in the corner; now it just
sets data-font-cmp="ubuntu" on <html> so every page that already
carries the html[data-font-cmp="ubuntu"] rules in its stylesheet
switches to Ubuntu — the Bitcoin Cash brand face — on load. Same
one-line runtime on both sirius-x and hephaestus.x theme.js.

Mobile bottom nav rail was rgba(11,14,20,.52) with no blur, so
whatever body text was scrolled behind it bled straight through the
half-transparent bar — first sentence of How it works ended up
visually merged with the sidebar icons on hephaestus.x, section
headings ran under the Sirius.x rail. Bumped to rgba(...,.94) and
added backdrop-filter:blur(12px); content underneath is now covered
instead of showing through. Same tweak on all six Sirius.X pages
plus Hephaestus.X home.
2026-09-22 19:47:52 +02:00

596 lines
36 KiB
HTML
Raw Permalink 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>Sirius.X — the home for names on Bitcoin Cash</title>
<meta name="description" content="Sirius.X is the operator-run entry point for BCNR: register a top-level domain, register a name under one, look up records, verify anything against the chain. Backed by Sia storage, mirrored on the operator's VPS, name published on the chain.">
<!-- sirius.x branding: SVG favicon at 16/32/any size (the star + dark rounded
square scales cleanly); OpenGraph + Twitter Card so shared links preview
with the right title, description, and mark. -->
<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">
<meta property="og:site_name" content="Sirius.X">
<meta property="og:title" content="Sirius.X — the home for names on Bitcoin Cash">
<meta property="og:description" content="Register a top-level domain, register a name under one, look up records, verify anything against the chain. Backed by Sia + VPS + on-chain.">
<meta property="og:url" content="https://silentmode.st/sirius-x/">
<meta property="og:image" content="https://silentmode.st/sirius-x/brand/banner.svg">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Sirius.X — the home for names on Bitcoin Cash">
<meta name="twitter:description" content="Register a TLD or a name, look up records, verify against the chain. Your keys, your names.">
<!-- Silent Mode family fonts (Fraunces editorial + DM Sans body + JetBrains
Mono for code/hashes) plus Ubuntu as the Bitcoin Cash brand alt. Toggle
between Fraunces and Ubuntu lives in the top nav (see js/theme.js). -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,300;9..144,400;9..144,500;9..144,600;9..144,700&family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&family=Ubuntu:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root{
/* Deviant "signal" sky palette — shared with silentmode.st/deviant/. */
--bg:#050810; --panel:#141a24; --panel2:#0a0f1c; --line:rgba(255,255,255,.06);
--sky-mid:#0a0f1c; --sky-rim:#131a2a;
--ink:#f1f4fa; --mut:#b8c2d4; --dim:#6a7488; --acid:#d6ff3d;
/* #0AC18E = Bitcoin Cash brand green — used for chain-native badges */
--chain-native:#0AC18E;
--chain:#d6ff3d; --sia:#b39ddb; --srv:#4fd1a5; --ok:#4fd1a5; --taken:#f6768a;
--warn:#ffc75f;
--serif:'Fraunces',Georgia,serif;
--sans:'DM Sans','Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif;
--mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;
background:radial-gradient(ellipse 1200px 600px at 50% -5%,var(--sky-rim) 0%,transparent 60%),
radial-gradient(ellipse 900px 500px at 100% 100%,var(--sky-mid) 0%,transparent 55%),
radial-gradient(ellipse 900px 500px at 0% 100%,#0c1424 0%,transparent 55%),
var(--bg);
background-attachment:fixed;
color:var(--ink);font:16px/1.6 var(--sans);min-height:100vh;
font-feature-settings:"ss01","ss02"}
h1,h2,h3{font-family:var(--serif);font-feature-settings:"ss01","ss02"}
code,.mono{font-family:var(--mono)}
/* Ubuntu reader-alt — swap when <html data-font-cmp="ubuntu"> */
html[data-font-cmp="ubuntu"] body,
html[data-font-cmp="ubuntu"] h1, html[data-font-cmp="ubuntu"] h2, html[data-font-cmp="ubuntu"] h3,
html[data-font-cmp="ubuntu"] p, html[data-font-cmp="ubuntu"] a, html[data-font-cmp="ubuntu"] button,
html[data-font-cmp="ubuntu"] span, html[data-font-cmp="ubuntu"] div,
html[data-font-cmp="ubuntu"] label, html[data-font-cmp="ubuntu"] input, html[data-font-cmp="ubuntu"] li{
font-family:'Ubuntu',system-ui,sans-serif !important
}
html[data-font-cmp="ubuntu"] code, html[data-font-cmp="ubuntu"] .mono{
font-family:var(--mono) !important
}
/* Font picker pill (lives inside .topnav) */
.font-picker{display:inline-flex;align-items:center;gap:2px;padding:2px;margin:0 10px;
background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);border-radius:999px;
font-family:var(--mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase}
.font-picker button{background:transparent;border:none;color:var(--dim);
padding:4px 10px;border-radius:999px;cursor:pointer;font-family:inherit;font-size:inherit;
letter-spacing:inherit;text-transform:inherit;transition:color .12s}
.font-picker button:hover{color:var(--ink)}
.font-picker button.active{background:var(--acid);color:var(--bg);font-weight:600}
/* .font-picker-float positioning is injected by js/theme.js */
a{color:var(--acid)}
.wrap{max-width:980px;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)}
.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)}
/* Sign-in link sits on the right so it reads as an account action, not a nav item */
.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)}
/* Adaptive side nav: overlay on top of centred content, semi-transparent.
Text on wide, icons on medium, bottom bar on mobile — same shape as
Theseus.X so both sites read as one family. */
:root{--sn-w:200px}
.sidenav{position:fixed;top:56px;left:0;bottom:0;width:var(--sn-w);z-index:15;
background:transparent;padding:32px 12px 22px 18px;
overflow-y:auto;pointer-events:none;transition:width .15s ease}
.sidenav a{display:flex;align-items:center;gap:14px;color:var(--mut);text-decoration:none;
padding:9px 12px;border-radius:10px;
font-size:14.5px;font-weight:500;opacity:.35;pointer-events:auto;
transition:opacity .12s,color .12s,background .12s,backdrop-filter .12s}
.sidenav a .ic{flex:none;width:22px;font-size:18px;line-height:1;text-align:center;
display:none;justify-content:center;align-items:center}
.sidenav a .lb{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sidenav a:hover{opacity:1;color:var(--ink);background:rgba(11,14,20,.72);backdrop-filter:blur(8px)}
.sidenav a.active{opacity:.85;color:var(--acid)}
.sidenav a.active:hover{opacity:1}
section,#search-input{scroll-margin-top:70px}
@media (max-width:1180px){
:root{--sn-w:64px}
.sidenav{padding:22px 6px}
.sidenav a{justify-content:center;padding:12px 4px;gap:0}
.sidenav a .ic{display:inline-flex}
.sidenav a .lb{display:none}
}
/* Content stays centred on the viewport; the sidenav is a pointer-events:none
overlay at opacity 0.35, so text peeking underneath the semi-transparent
rail is by design — not something to pad away. */
@media (max-width:720px){
:root{--sn-w:0}
body{padding-bottom:64px}
.sidenav{top:auto;bottom:0;left:0;right:0;width:100%;height:auto;
padding:4px;flex-direction:row;background:rgba(11,14,20,.94);backdrop-filter:blur(12px);
display:flex;justify-content:space-around;overflow-x:auto;
/* Hide horizontal scrollbar chrome; icons still swipe/scroll when they overflow. */
scrollbar-width:none;-ms-overflow-style:none}
.sidenav::-webkit-scrollbar{display:none;width:0;height:0}
.sidenav a{flex:1;min-width:44px;padding:8px 4px;justify-content:center;gap:0;opacity:.5;font-size:15px}
.sidenav a .ic{display:inline-flex}
.sidenav a .lb{display:none}
}
header.hero{text-align:center;padding:5rem 1.2rem 1rem}
.mark{font-size:56px;line-height:1}
h1{font-size:clamp(2rem,5.5vw,2.9rem);margin:.4rem 0 .3rem}
h1 .g{color:var(--acid)}
.tag{color:var(--mut);font-size:1.05rem;max-width:660px;margin:0 auto}
.cta{margin-top:1.8rem;display:flex;gap:10px;justify-content:center;flex-wrap:wrap}
.btn{display:inline-block;text-decoration:none;padding:11px 20px;border-radius:10px;background:#4b7bec;color:#fff;font-size:14px;border:none;cursor:pointer;font-family:inherit;transition:filter .1s}
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--ink)}
.btn.acid{background:var(--acid);color:#0b0e14;font-weight:600}
.btn:hover{filter:brightness(1.12)}
section{padding:2.6rem 0;border-top:1px solid var(--line);margin-top:2.5rem}
section:first-of-type{border-top:none;margin-top:1.5rem}
h2{font-size:1.5rem;margin:0 0 .4rem}
h3{font-size:1.1rem;margin:0 0 .35rem}
.lede{color:var(--mut);margin:0 0 1.6rem;max-width:720px}
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:18px 20px}
.card h3{margin:0 0 .5rem;display:flex;align-items:center;gap:8px}
.card h3 .g{color:var(--acid)}
.card h3 .lbl{display:inline-flex;align-items:center;gap:6px}
.card h3 svg.brandmk{width:20px;height:20px;flex:none;vertical-align:middle}
.card p{margin:0;color:var(--mut);font-size:14px}
.card .cta{margin-top:14px;justify-content:flex-start}
.dot{width:9px;height:9px;border-radius:50%;display:inline-block}
.d-chain{background:var(--chain)} .d-sia{background:var(--sia)} .d-srv{background:var(--srv)}
.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.4rem}
.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}
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}
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}
.pill{display:inline-block;font-size:11px;padding:2px 8px;border-radius:999px;background:rgba(255,255,255,.07);color:var(--dim);margin-left:8px;vertical-align:middle;font-weight:500}
.pill.soon{background:rgba(214,255,61,.13);color:var(--acid)}
.pill.live{background:rgba(79,209,165,.15);color:var(--ok)}
.pill.spec{background:rgba(179,157,219,.18);color:var(--sia)}
.verify dt{color:var(--mut);font-size:12.5px;text-transform:uppercase;letter-spacing:.3px;margin-top:12px}
.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:2.4rem 0 3.5rem;color:var(--dim);font-size:13px;text-align:center;margin-top:2.5rem}
</style>
<script src="./js/i18n.js?v=20260921c"></script>
</head>
<body>
<nav class="topnav">
<a class="brand" href="./"><svg width="18" height="18" viewBox="0 0 64 64" style="vertical-align:-4px;margin-right:6px" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg>Sirius<span class="g">.X</span></a>
<a href="./tld.html">🌐 TLD</a>
<!-- Trailing slash required: market/ is a subdirectory, dropping the slash
forces Angie via market.html (English redirect stub) before /market/. -->
<a href="./market/">🛒 Market</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"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus<span class="g">.X</span></a>
<a href="./portal.html" class="portal">🔑 Sign in</a>
</nav>
<aside class="sidenav" aria-label="On this page">
<a href="#search-input" title="Register a name" ><span class="ic" aria-hidden="true">✏️</span><span class="lb">Register</span></a>
<a href="#try" title="Try it" ><span class="ic" aria-hidden="true"></span><span class="lb">Try it</span></a>
<a href="#docs" title="Documentation" ><span class="ic" aria-hidden="true">📚</span><span class="lb">Docs</span></a>
<a href="#request-tld" title="Propose a new TLD" ><span class="ic" aria-hidden="true">🌐</span><span class="lb">Propose TLD</span></a>
<a href="#pantheon" title="The pantheon" ><span class="ic" aria-hidden="true">🏛</span><span class="lb">Pantheon</span></a>
<a href="#roadmap" title="What's coming" ><span class="ic" aria-hidden="true">🗺</span><span class="lb">Roadmap</span></a>
<a href="#verify" title="Verify against chain"><span class="ic" aria-hidden="true">🔐</span><span class="lb">Verify</span></a>
</aside>
<header class="hero">
<div class="mark"><svg width="56" height="56" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg></div>
<h1>Names on the <span class="g">chain</span>.</h1>
<p class="tag">Sirius.X is the entry point for BCNR — Bitcoin Cash Name Registry.
Register a top-level domain, register a name under one, look up records,
verify anything against the chain.</p>
<div style="margin:1.6rem auto 0;max-width:640px;padding:0 1rem">
<input id="search-input" type="search"
placeholder="type a name — e.g. hello"
spellcheck="false" autocomplete="off"
style="width:100%;padding:14px 18px;border-radius:12px;border:1px solid #ffffff22;background:#141a24;color:var(--ink);font-size:17px;outline:none;font-family:inherit"
aria-label="Search a name across every BCNR TLD">
<div id="search-hint" style="margin-top:8px;font-size:12.5px;color:var(--mut);text-align:center">
One search checks the label across every TLD in the registry. Available names appear first.
</div>
<div id="search-results" style="margin-top:14px;display:grid;gap:8px;text-align:left"></div>
</div>
<div class="cta" style="margin-top:1.4rem">
<a class="btn ghost" href="#try">Or browse what you can do →</a>
<a class="btn ghost" href="./docs">Read the docs</a>
</div>
</header>
<style>
/* Inline search card styling: mirrors register.html's .card look. */
#search-results .row-card{display:grid;grid-template-columns:1fr auto auto auto;gap:12px;align-items:center;
background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:11px 16px;min-height:48px}
#search-results .row-card.checking{opacity:.55}
#search-results .row-card .n{font-family:ui-monospace,monospace;font-size:15px;overflow-wrap:anywhere}
#search-results .row-card .btn{padding:6px 12px;font-size:12.5px}
#search-results .row-card .price{
color:var(--acid);font-family:ui-monospace,monospace;font-size:14px;font-weight:600;
padding:2px 8px;border-radius:6px;background:rgba(214,255,61,.10);white-space:nowrap
}
#search-results .badge{font-size:11px;padding:2px 10px;border-radius:999px;font-weight:600;white-space:nowrap}
#search-results .b-ok{background:rgba(79,209,165,.15);color:var(--ok)}
#search-results .b-taken{background:rgba(246,118,138,.15);color:var(--taken)}
#search-results .b-check{background:rgba(139,152,169,.14);color:var(--mut)}
@media (max-width:520px){
#search-results .row-card{grid-template-columns:1fr auto;gap:8px}
#search-results .row-card .btn{justify-self:start}
}
</style>
<script>
// Inline name search — same UX as register.html but no wallet dependencies.
// Hits POST-friendly /api/labels/<label> (one call, returns every taken
// match across every TLD from the gateway's cached index) and cross-checks
// against the client-side TLDS list. Register buttons hand the label off
// to register.html?q= for the full mint flow.
(function () {
// Fallback list, used until /api/tlds answers (js/pricing.js loads it).
// The live list drops TLDs their owners switched off and carries the
// owner-set prices, so it wins whenever it is available.
let TLDS = [
"bch","p2p","bit","nav","test","x","asm","neo","gt","sc",
"sia","dex","cex","nt","dea","hub","os","vpn",
];
// .com is held off the public registry (2026-08-29) regardless of what
// the API says — the operator holds it; nobody buys names under it yet.
const NEVER_SELL = new Set(["com"]);
async function liveTlds() {
const sp = window.siriusPricing;
if (!sp) return TLDS;
await sp.tldReady();
const live = sp.visibleTlds();
if (live && live.length) TLDS = live.filter((t) => !NEVER_SELL.has(t) && sp.tldSellable(t).ok);
return TLDS;
}
const $ = (id) => document.getElementById(id);
const esc = (s) => String(s).replace(/[&<>"']/g, (c) => ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[c]));
const clean = (v) => v.toLowerCase().replace(/[^a-z0-9-]/g, "").slice(0, 32);
let lastReq = 0, timer = null;
function row(full, state) {
const badge = state === "ok" ? '<span class="badge b-ok">available</span>'
: state === "taken" ? '<span class="badge b-taken">taken</span>'
: '<span class="badge b-check">checking…</span>';
// Label price (rendered only for available names). Tier logic lives in
// pricing.js so landing / tld.html / the mint modal all agree.
let price = "";
if (state === "ok" && window.siriusPricing) {
const [label, tld] = full.split(".");
const p = window.siriusPricing.priceForName(label, tld);
const why = p.ownerSet ? `price set by the .${tld} owner` : p.tier;
price = `<span class="price" title="${esc(why)}">${esc(window.siriusPricing.formatUsd(p.usd))}</span>`;
}
const btn = state === "ok"
? `<button class="btn acid" data-register="${esc(full)}">Register →</button>`
: state === "taken"
? `<a class="btn ghost" href="https://navigate.st/bns/${encodeURIComponent(full)}" target="_blank" rel="noopener">view →</a>`
: "<span></span>";
return `<div class="row-card ${state === "checking" ? "checking" : ""}"><span class="n">${esc(full)}</span>${badge}${price}${btn}</div>`;
}
async function search(label) {
const my = ++lastReq;
const out = $("search-results");
// Immediate feedback: paint one 'checking' row per TLD so the user
// sees something is happening in the ~300ms before results land.
out.innerHTML = TLDS.map((t) => row(`${label}.${t}`, "checking")).join("");
let taken = new Set();
try {
const [r] = await Promise.all([
fetch(`https://silentmode.st/api/labels/${encodeURIComponent(label)}`),
liveTlds(), // owner prices + on/off state, same round-trip
]);
if (r.ok) {
const j = await r.json();
for (const m of (j.matches || [])) taken.add(m.name);
}
} catch { /* fall through: everything shows as "checking" then flips to error-free available; a gateway blip shouldn't block the user */ }
if (my !== lastReq) return; // superseded by newer keystroke
const rows = TLDS
.map((t) => ({ full: `${label}.${t}`, state: taken.has(`${label}.${t}`) ? "taken" : "ok" }))
.sort((a, b) => (a.state === "ok" ? 0 : 1) - (b.state === "ok" ? 0 : 1));
out.innerHTML = rows.map((x) => row(x.full, x.state)).join("");
// Wire Register buttons — hand the chosen name off to the shared mint
// flow (js/register-flow.js exposes window.siriusRegisterName).
out.querySelectorAll("[data-register]").forEach((b) => {
b.onclick = () => {
const name = b.getAttribute("data-register");
if (typeof window.siriusRegisterName === "function") {
window.siriusRegisterName(name);
} else {
// Module still loading — retry once it settles.
b.textContent = "loading…"; b.disabled = true;
const t = setInterval(() => {
if (typeof window.siriusRegisterName === "function") {
clearInterval(t); b.disabled = false; b.textContent = "Register →";
window.siriusRegisterName(name);
}
}, 100);
}
};
});
}
$("search-input").addEventListener("input", () => {
clearTimeout(timer);
const v = clean($("search-input").value);
$("search-input").value = v;
if (!v) { $("search-results").innerHTML = ""; return; }
timer = setTimeout(() => search(v), 200);
});
$("search-input").addEventListener("keydown", (e) => {
if (e.key === "Enter") {
clearTimeout(timer);
const v = clean($("search-input").value);
if (v) search(v);
}
});
})();
</script>
<div class="wrap">
<section id="try">
<h2>Try it</h2>
<p class="lede">Three things you can do right now. The registrar and TLD-registry UIs live at
silentmode.st today; Sirius.X is the canonical home and will consolidate them here.</p>
<div class="grid">
<div class="card">
<h3><span class="dot d-chain"></span> Register a name</h3>
<p>Pick a label, search across every TLD in the registry at once, mint the name
certificate straight into your own wallet. Renewals are per-TLD policy set by
the owner — the price the TLD sets is what you pay.</p>
<div class="cta"><a class="btn acid" href="#search-input">Search a name →</a></div>
</div>
<div class="card">
<h3><span class="dot d-chain"></span> Register a TLD</h3>
<p>A TLD is itself a certificate on the chain. Anyone can mint one — you become the registry
operator for every second-level name under it, set the price yourself, and earn 90 % of the
fee on every name registered under it. Renewals are per-TLD policy that you control.</p>
<div class="cta">
<a class="btn acid" href="./tld.html">Search a TLD →</a>
<a class="btn ghost" href="./admin">Operator admin →</a>
</div>
</div>
<div class="card">
<h3><span class="dot d-sia"></span> Look up &amp; verify</h3>
<p>Resolve any BCNR name, compare records across mirrors, and check the TLD registry snapshot
against the chain. Everything is publicly verifiable.</p>
<div class="cta"><a class="btn ghost" href="#verify">How to verify →</a></div>
</div>
<div class="card">
<h3><span class="dot d-srv"></span> 🔑 Sign in — your names portal</h3>
<p>Import your seed phrase or connect a wallet (Cashonize / Paytaca via WizardConnect) to see
every name you own, review records, and update them. Your keys never leave your browser.</p>
<div class="cta"><a class="btn acid" href="./portal.html">Open the portal →</a></div>
</div>
<div class="card">
<h3><span class="dot d-chain"></span> 🧭 Theseus Navigator</h3>
<p>The browser that speaks BCNR natively. Open <code>hello.bch</code> in the address bar —
it just resolves. TLS verified against on-chain fingerprints, no OS trust-store install.</p>
<div class="cta"><a class="btn ghost" href="./theseus">Download →</a></div>
</div>
</div>
</section>
<section id="docs">
<h2>Documentation</h2>
<p class="lede">The full docs — TLD registry model, record types, resolver &amp; gateway paths,
mainnet pricing, verification, and the operator runbook pointer — live on their own page so
they can grow without cluttering the landing.</p>
<div class="cta" style="justify-content:flex-start;margin-top:1rem">
<a class="btn acid" href="./docs">📚 Open the docs →</a>
<a class="btn ghost" href="https://silentmode.st/tlds/">Current TLD list</a>
</div>
</section>
<section id="request-tld">
<h2>Propose a new TLD</h2>
<p class="lede">The per-TLD registry means minting a TLD is a real, paid action — not a namespace
land-grab. During the alpha, all TLD mints are operator-signed. To propose a TLD, get in touch
via the channels below. The design (mainnet) adds an on-chain covenant with countersignature +
tiered USD price floors: 1-char $100k, 2-char $50k, 3-char $15k, 4-char $5k, 58-char $1k,
9+-char $250; one-time payment (not annual). See the design doc for the full model.</p>
<div class="note warn"><b>ICANN-adjacent TLDs are not open for public mint.</b> A TLD registry is
only useful if it does not immediately collapse into an ICANN-shadow — the mainnet covenant
enforces this; on chipnet the operator's countersignature is the gate.</div>
</section>
<section id="pantheon">
<h2>The pantheon</h2>
<p class="lede">Sirius.x is one of seven sibling <b>.x</b> names — the Silent Mode pantheon.
Each project is its own on-chain certificate; each site is reachable through any BCNR
resolver, plus the silentmode.st gateway for browsers without one.</p>
<div class="grid">
<div class="card">
<h3><span class="dot d-chain"></span><span class="lbl">⛓️ Silentmode<span class="g">.X</span></span></h3>
<p>The project umbrella. Redirects to <code>silentmode.st</code> where every pillar
has its own landing page + download hub.</p>
<div class="cta"><a class="btn ghost" href="https://silentmode.x/" rel="noopener">Open →</a></div>
</div>
<div class="card">
<h3><span class="dot d-chain"></span><span class="lbl"><svg class="brandmk" viewBox="0 0 64 64" aria-hidden="true"><rect width="64" height="64" rx="12" fill="#0b0e14"/><path d="M32 4 L36.4 27.6 L60 32 L36.4 36.4 L32 60 L27.6 36.4 L4 32 L27.6 27.6 Z" fill="#d6ff3d"/></svg>Sirius<span class="g">.X</span></span><span class="pill">you're here</span></h3>
<p>Names on Bitcoin Cash — register, resolve, verify, manage. This site.</p>
<div class="cta"><a class="btn ghost" href="./">Home →</a></div>
</div>
<div class="card">
<h3><span class="dot d-chain"></span><span class="lbl"><svg class="brandmk" viewBox="0 0 64 64" 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"/><path d="M6 32 L32 27 L58 32 L32 37 Z" fill="#d6ff3d" opacity=".55"/><circle cx="32" cy="32" r="3" fill="#0b0e14"/></svg>Theseus<span class="g">.X</span></span></h3>
<p>The browser that speaks BCNR natively — Chromium build with the resolver baked in,
no OS-level daemon or root-store install.</p>
<div class="cta"><a class="btn ghost" href="https://theseus.x/" rel="noopener">Open →</a></div>
</div>
<div class="card">
<h3><span class="dot d-srv"></span><span class="lbl">⚒️ Hephaestus<span class="g">.X</span></span></h3>
<p>The forge. Forgejo instance for the ecosystem's git repos, backed by BCH wallet
auth. Sirius's own source lives here.</p>
<div class="cta"><a class="btn ghost" href="https://hephaestus.x/" rel="noopener">Open →</a></div>
</div>
<div class="card">
<h3><span class="dot d-sia"></span><span class="lbl">🔮 Prometheus<span class="g">.X</span></span></h3>
<p>Fire from the chain. The project's foresight / experimentation layer.
Redirects to <code>silentmode.st/prometheus/</code> today.</p>
<div class="cta"><a class="btn ghost" href="https://prometheus.x/" rel="noopener">Open →</a></div>
</div>
<div class="card">
<h3><span class="dot d-sia"></span><span class="lbl">☀️ Helios<span class="g">.X</span></span></h3>
<p>The public gaze. Analytics, dashboards, transparency reports.
Redirects to <code>silentmode.st/helios/</code> today.</p>
<div class="cta"><a class="btn ghost" href="https://helios.x/" rel="noopener">Open →</a></div>
</div>
<div class="card">
<h3><span class="dot d-srv"></span><span class="lbl">✉️ Hermes<span class="g">.X</span></span></h3>
<p>Messenger. Nostr-based messaging bound to a BCNR name via the <code>np</code>
+ <code>nr</code> records. Redirects to <code>silentmode.st/hermes/</code>.</p>
<div class="cta"><a class="btn ghost" href="https://hermes.x/" rel="noopener">Open →</a></div>
</div>
</div>
</section>
<section id="roadmap">
<h2>What's coming</h2>
<p class="lede">The wallet portal, Sirius Studio, signed off-chain records, and the name marketplace all shipped over the past weeks. Here's what's still on the roadmap.</p>
<div class="grid">
<div class="card">
<h3>Sirius Press <span class="pill soon">planned</span></h3>
<p>A WordPress fork with the email requirement stripped from account and publish paths, and wallet-signature login in its place. For BCNR name owners who want a dynamic backend without giving up sovereignty — self-host on any VPS and point your name's <code>p</code> or <code>ip</code> record at it.</p>
</div>
<div class="card">
<h3>Wallet-signed comments <span class="pill spec">spec ready</span></h3>
<p>Any BCH wallet can post; the name owner moderates; comments live in the name's own Sia bucket next to <code>_records.json</code>. No email, no accounts, no CAPTCHA — the wallet signature is the identity. Drops into any page as one script tag.</p>
</div>
<div class="card">
<h3>Studio: templates &amp; content collections <span class="pill soon">in progress</span></h3>
<p>Twelve new starter templates (portfolio, blog, restaurant, event, resume, agency, coming-soon and more), ten new drop-in section blocks, a card gallery picker, and a client-side CMS bolt-on for blog-shaped content — all persisting to the name's Sia bucket.</p>
</div>
<div class="card">
<h3>Mainnet migration <span class="pill soon">planned</span></h3>
<p>Chipnet today, mainnet later. The USD-pegged listing covenant, the TLD registry beacon, and every record type moves to mainnet with fee tiers by label length. The shape stays the same; only the network changes.</p>
</div>
<div class="card">
<h3>Decentralized git remote <span class="pill live">MVP live</span></h3>
<p>Silent Mode's own code lives at <a href="https://code.silentmode.st/silentmode" rel="noopener">code.silentmode.st</a> — a Forgejo forge with wallet-address logins. The Sia mirror for full offline reproducibility of every release is the next track.</p>
<pre style="margin-top:.8rem;font-size:12px">git clone https://silentmode.st/sirius-x/repo/silent-mode.git</pre>
<p style="margin-top:.5rem;font-size:12.5px">One-shot snapshot as a
downloadable git bundle (works when dumb-HTTP is blocked):</p>
<pre style="font-size:12px">curl -O https://silentmode.st/sirius-x/repo/silent-mode.bundle
git clone silent-mode.bundle silent-mode</pre>
</div>
</div>
</section>
<section id="verify">
<h2>Verify this page against the chain</h2>
<p class="lede">You do not have to trust that <code>sirius.x</code> is served by anyone specific.
The name's certificate is on the Bitcoin Cash chain; the records point to Sia; every path is
independently checkable.</p>
<h3>1. Confirm the certificate exists 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>2. Fetch the TLD-registry snapshot from Nostr</h3>
<p class="lede">The operator-signed snapshot of the TLD list is published as a Nostr replaceable
event. Any relay carries it; the event's content field carries the current snapshot root.</p>
<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>3. Reach this site via more than one route</h3>
<p class="lede">The same content should be served from at least two independent paths. If one
mirror is unavailable, the others still work. If two mirrors disagree, the on-chain record is
the tiebreaker.</p>
<ul style="color:var(--mut);font-size:14px;margin:.6rem 0 0;padding-left:1.2rem">
<li>Via any BCNR resolver: <code>https://sirius.x/</code> (requires the local root CA)</li>
<li>Via the public gateway: <code>https://navigate.st/bns/sirius.x</code></li>
<li>Via silentmode.st mirror: <code>https://silentmode.st/bns/sirius.x</code></li>
<li>Direct from Sia (content-addressed): the <code>s3</code> record on <code>sirius.x</code>
names the exact bucket key</li>
</ul>
</section>
</div>
<footer id="site-footer"></footer>
<!-- Shared mint flow — modal + wallet steps used to live in register.html.
The module injects its own modal into <body> and exposes
window.siriusRegisterName(fullName) for the search-result buttons. -->
<script type="importmap">
{ "imports": { "@bitauth/libauth": "https://silentmode.st/js/libauth.js?v=20260920usd" } }
</script>
<script type="module" src="./js/register-flow.js?v=20260920usd"></script>
<script src="./js/pricing.js?v=20260920bits"></script>
<script src="./js/session.js?v=20260917dash"></script>
<script src="./js/pin-escrow.js?v=20260909pin"></script>
<script defer src="./js/theme.js?v=20260921mob"></script>
<script defer src="./js/site-footer.js?v=20260917market"></script>
<script defer src="./js/profile-menu.js?v=20260921mob"></script>
<script>
// Sidenav scroll-spy: highlight the section currently in view.
// Uses scroll-position tracking so short sections at the end of the page
// still activate their link when the reader scrolls to them.
(() => {
const links = document.querySelectorAll(".sidenav a[href^='#']");
if (!links.length) return;
const entries = [];
links.forEach((a) => { const el = document.querySelector(a.getAttribute("href")); if (el) entries.push({ el, link: a }); });
if (!entries.length) return;
const setActive = (link) => { links.forEach((l) => l.classList.remove("active")); link.classList.add("active"); };
const update = () => {
const doc = document.documentElement;
const scrollBottom = window.scrollY + window.innerHeight;
if (scrollBottom >= (doc.scrollHeight - 4)) { setActive(entries[entries.length - 1].link); return; }
const line = window.scrollY + window.innerHeight * 0.35;
let active = entries[0].link;
for (const e of entries) {
if (e.el.getBoundingClientRect().top + window.scrollY <= line) active = e.link;
else break;
}
setActive(active);
};
window.addEventListener("scroll", update, { passive: true });
window.addEventListener("resize", update);
update();
})();
</script>
</body>
</html>