2026-10-03 23:14:40 +02:00
<!doctype html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< title > theseus.x — the browser that speaks Bitcoin Cash names< / title >
< meta name = "description" content = "Theseus Navigator: a Chromium-based browser with native Bitcoin Cash name resolution built in. No OS-level daemon, no DNS shim, no root-store install. Windows + Android." >
< 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 = "theseus.x" >
< meta property = "og:title" content = "theseus.x — the browser that speaks Bitcoin Cash names" >
< meta property = "og:description" content = "Native .bch / BCNR resolution in a Chromium browser. No daemon, no root-store install. Windows + Android." >
< meta property = "og:url" content = "https://theseus.x/" >
< meta property = "og:image" content = "https://theseus.x/assets/logo.svg" >
< meta name = "twitter:card" content = "summary" >
< meta name = "twitter:title" content = "theseus.x — the browser that speaks Bitcoin Cash names" >
< meta name = "twitter:description" content = "Native BCNR resolution in a Chromium browser. No daemon, no root-store install." >
< style >
:root{
--bg:#0b0e14; --panel:#141a24; --panel2:#18202c; --line:rgba(255,255,255,.09);
--ink:#e7eaf1; --mut:#8b98a9; --dim:#5e6678; --acid:#d6ff3d;
--chain:#d6ff3d; --sia:#b39ddb; --srv:#4fd1a5; --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:980px;margin:0 auto;padding:0 1.2rem}
.topnav{position:fixed;top:0;left:0;right:0;z-index:20;display:flex;gap:2px;align-items:center;flex-wrap:wrap;
padding:10px 1.2rem;background:rgba(11,14,20,.88);backdrop-filter:blur(10px)}
.topnav .brand{font-weight:600;color:var(--ink);text-decoration:none;margin-right:14px;font-size:15px;letter-spacing:.2px;display:flex;align-items:center;gap:8px}
.topnav .brand .g{color:var(--acid)}
.topnav .brand svg{width:20px;height:20px}
.topnav a{color:var(--mut);text-decoration:none;padding:6px 12px;border-radius:8px;font-size:14px;
display:inline-flex;align-items:center;gap:6px}
.topnav a:hover{color:var(--ink);background:var(--panel)}
.topnav a.here{color:var(--acid);background:rgba(214,255,61,.08)}
.topnav a.get{margin-left:auto;background:rgba(214,255,61,.10);color:var(--acid);font-weight:500}
.topnav a.get:hover{background:rgba(214,255,61,.18)}
.topnav a .g{color:var(--acid)}
.topnav a svg.tabicon{width:15px;height:15px;flex:none}
/* Mobile menu: a native < details > /< summary > hamburger that holds the
contextual nav. Pure HTML+CSS, no JavaScript, keyboard-accessible.
Hidden on desktop (where the inline links show instead). */
.topnav .menu{display:none}
@media (max-width:720px){
.topnav{flex-wrap:nowrap;padding:10px 1rem}
.topnav .brand{margin-right:0}
/* Hide desktop inline nav + the floating Get CTA on mobile — the hero
sits one scroll away with its own download buttons. */
.topnav > a:not(.brand){display:none}
.topnav .menu{display:block;margin-left:auto;position:relative}
.topnav .menu > summary{list-style:none;cursor:pointer;padding:8px 10px;
border-radius:8px;color:var(--mut);display:inline-flex;align-items:center;gap:6px}
.topnav .menu > summary::-webkit-details-marker{display:none}
.topnav .menu > summary svg{width:22px;height:22px;display:block}
.topnav .menu > summary:hover,
.topnav .menu[open] > summary{color:var(--ink);background:var(--panel)}
.topnav .menu .menu-panel{position:absolute;top:calc(100% + 6px);right:0;
background:var(--bg);border:1px solid var(--line);border-radius:12px;
padding:6px;min-width:200px;display:flex;flex-direction:column;gap:2px;
box-shadow:0 10px 32px rgba(0,0,0,.55)}
.topnav .menu .menu-panel a{padding:10px 14px;border-radius:8px;font-size:14.5px;
color:var(--mut);text-decoration:none;display:flex;align-items:center;gap:8px}
.topnav .menu .menu-panel a:hover{color:var(--ink);background:var(--panel)}
.topnav .menu .menu-panel a svg.tabicon{width:16px;height:16px}
}
/* Adaptive edge nav: full-width panel at left edge on wide,
icon rail on medium, bottom bar with icons on mobile.
Topnav is fixed at the top spanning the full width; sidebar starts
just below it and content flows in the right column. */
:root{--sn-w:200px;--tn-h:52px}
/* Content stays centered — the sidebar overlays on top of the page. */
body{padding-top:var(--tn-h)}
.sidenav{position:fixed;top:var(--tn-h);left:0;bottom:0;width:var(--sn-w);z-index:15;
background:transparent;padding:56px 12px 22px 18px;
overflow-y:auto;transition:width .15s ease;pointer-events:none}
.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}
/* Medium: shrink to an icon rail — icons only */
@media (max-width:1180px){
:root{--sn-w:64px}
.sidenav{padding:22px 6px}
.sidenav .lbl{display:none}
.sidenav a{justify-content:center;padding:12px 4px;gap:0}
.sidenav a .ic{display:inline-flex}
.sidenav a .lb{display:none}
}
/* Mobile: bottom icon bar */
@media (max-width:720px){
:root{--sn-w:0px}
body{padding-left:0;padding-bottom:64px}
.sidenav{top:auto;bottom:0;left:0;right:0;width:100%;height:auto;
padding:4px 4px;flex-direction:row;background:rgba(11,14,20,.52);
display:flex;justify-content:space-around;overflow-x:auto}
.sidenav .lbl{display:none}
.sidenav a{flex:1;min-width:56px;padding:10px 6px;justify-content:center;gap:0}
.sidenav a .ic{display:inline-flex}
.sidenav a .lb{display:none}
}
header.hero{text-align:center;padding:5rem 1.2rem 1.5rem}
.mark{display:inline-block}
.mark svg{width:80px;height:80px;filter:drop-shadow(0 4px 24px rgba(214,255,61,.18))}
h1{font-size:clamp(2rem,5.5vw,2.9rem);margin:.9rem 0 .3rem;letter-spacing:-.5px}
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;scroll-margin-top:72px}
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 p{margin:0;color:var(--mut);font-size:14px}
.dot{width:9px;height:9px;border-radius:50%;display:inline-block;flex:none}
.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:12.5px;color:var(--ink);margin:.8rem 0}
/* Downloads: platform cards */
.plats{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:1rem}
@media (max-width:720px){.plats{grid-template-columns:1fr}}
.plat{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px 22px}
.plat .lbl{color:var(--acid);font:600 11px/1 system-ui;letter-spacing:.22em;text-transform:uppercase}
.plat h3{margin:.4rem 0 .3rem;font-size:1.15rem}
.plat p{margin:0;color:var(--mut);font-size:13.5px}
.plat .meta{color:var(--dim);font-size:12px;margin-top:.6rem}
.plat .btns{margin-top:.9rem;display:flex;gap:8px;flex-wrap:wrap}
.plat .btns .btn{padding:9px 16px;font-size:13.5px}
.plat .hashes{margin-top:.9rem;padding-top:.7rem;border-top:1px solid var(--line);font-size:11.5px;color:var(--dim)}
.plat .hashes .h{display:flex;gap:8px;flex-wrap:wrap;align-items:baseline;margin-top:4px}
.plat .hashes .h b{color:var(--mut);font-weight:600;min-width:70px}
.plat .hashes code{font-family:ui-monospace,monospace;font-size:10.5px;color:#c9d4e3;word-break:break-all;background:transparent;border:none;padding:0}
/* Deep, multi-column footer — same shape as Hephaestus.X and Sirius.X.
Brand column on the left plus three link columns; meta bar below with
licence badge and origin tag. Kept inside the .wrap so the sidenav
overlay never covers it. */
footer.deep{background:linear-gradient(180deg,transparent,rgba(255,255,255,.02));
border-top:1px solid var(--line);padding:3rem 0 2rem;margin-top:3rem;color:var(--mut);
font-size:13.5px}
footer.deep .fwrap{max-width:980px;margin:0 auto;padding:0 1.2rem;display:grid;
grid-template-columns:1.5fr repeat(3,1fr);gap:2rem}
@media (max-width:820px){footer.deep .fwrap{grid-template-columns:1fr 1fr;gap:1.6rem}}
@media (max-width:460px){footer.deep .fwrap{grid-template-columns:1fr;gap:1.4rem}}
footer.deep .brand-col{max-width:280px}
footer.deep .brand-col .brand{display:inline-flex;align-items:center;gap:8px;color:var(--ink);
text-decoration:none;font-weight:600;font-size:16px;margin-bottom:.5rem}
footer.deep .brand-col .brand .g{color:var(--acid)}
footer.deep .brand-col .brand svg{width:22px;height:22px}
footer.deep .brand-col p{margin:.3rem 0 0;color:var(--mut);font-size:13px;line-height:1.55}
footer.deep h5{color:var(--ink);font-size:12px;text-transform:uppercase;letter-spacing:.14em;
margin:0 0 .8rem;font-weight:600}
footer.deep ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:.5rem}
footer.deep ul a{color:var(--mut);text-decoration:none;font-size:13.5px;transition:color .1s}
footer.deep ul a:hover{color:var(--acid)}
footer.deep ul a .g{color:var(--acid)}
footer.deep ul a .ext{color:var(--dim);font-size:11px;margin-left:2px}
footer.deep .bar{max-width:980px;margin:2rem auto 0;padding:1rem 1.2rem 0;
border-top:1px solid var(--line);display:flex;justify-content:space-between;gap:1rem;
flex-wrap:wrap;color:var(--dim);font-size:12px}
footer.deep .bar .badge{background:rgba(214,255,61,.12);color:var(--acid);
padding:2px 8px;border-radius:5px;font:600 10px/1.4 system-ui;
letter-spacing:.14em;text-transform:uppercase;margin-right:8px}
footer.deep .bar a{color:var(--mut)}
footer.deep .bar a:hover{color:var(--acid)}
footer.deep .bar .mono{font-family:ui-monospace,monospace;font-size:11.5px}
< / style >
< / head >
< body >
< nav class = "topnav" >
< a class = "brand" href = "./" >
< svg 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 >
< span > Theseus< span class = "g" > .X< / span > < / span >
< / a >
< a href = "plug-ins/" > Plug-ins< / a >
< a href = "extensions/" > Extensions< / a >
site(ariadne.x, theseus.x): /dev/ — resolver spec and embedding guide
A developer / agent landing page on both .X sites so an LLM or a human
porting the resolver has everything in one place and does not need the
public gateway to understand how to talk to BNS.
ariadne.x/dev/ is the canonical page. Covers:
- Why: resolve names directly from the chain, with no operator in the
middle.
- BNS1 in one page: beacons, cash-token certificates, OP_RETURN payloads,
REG/UPD/REL, chipnet network constants, the six indexer rules
(including the 2026-10-04 one-message rule).
- The record-type table — u, h, a, ip, p, s3, tls, c, bl.
- A minimum viable resolver in under 100 lines of Node.js that pulls the
beacon's history, parses the OP_RETURNs, and prints a name's records.
- Pointers to every production implementation (Argus JS, Ariadne Kotlin,
the Windows Thread, the gateway) and every spec document on the forge.
- Public endpoints with a trust note: convenience, not consensus.
- Three paths for embedding Ariadne's Thread in your own app: chain-install
the Windows service, import the resolver library directly, or call the
local HTTP API; platform coverage table; MPL-2.0 licence note.
theseus.x/dev/ is a shorter page that cross-links to ariadne.x/dev/ for
the resolver work and covers Theseus-specific topics inline — the
extension publishing path (register a .x name on sirius.x, PUT signed
tarball to /api/ext, Theseus verifies the signature against the
on-chain owner before anything runs) and the first-party plug-in
surface.
Both pages are wired into the home-page topnav, mobile dropdown, and
footer Product column.
2026-10-04 17:50:30 +02:00
< a href = "dev/" > Developers< / a >
2026-10-04 19:18:32 +02:00
< a href = "//sirius.x/" title = "Register a BCNR name" > < svg class = "tabicon" 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 > < span > Sirius< span class = "g" > .X< / span > < / span > < / a >
2026-10-03 23:14:40 +02:00
< a class = "get" href = "#download" > Get Theseus< / a >
<!-- Mobile hamburger — shown only at ≤720px, holds the same contextual
nav as the inline links above. Brand book + Whitepaper intentionally
live in the footer only; Get Theseus is in the hero one scroll away. -->
< details class = "menu" >
< summary aria-label = "Open menu" >
< svg viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" stroke-width = "2" stroke-linecap = "round" aria-hidden = "true" >
< path d = "M4 7h16M4 12h16M4 17h16" / >
< / svg >
< / summary >
< div class = "menu-panel" >
< a href = "plug-ins/" > Plug-ins< / a >
< a href = "extensions/" > Extensions< / a >
site(ariadne.x, theseus.x): /dev/ — resolver spec and embedding guide
A developer / agent landing page on both .X sites so an LLM or a human
porting the resolver has everything in one place and does not need the
public gateway to understand how to talk to BNS.
ariadne.x/dev/ is the canonical page. Covers:
- Why: resolve names directly from the chain, with no operator in the
middle.
- BNS1 in one page: beacons, cash-token certificates, OP_RETURN payloads,
REG/UPD/REL, chipnet network constants, the six indexer rules
(including the 2026-10-04 one-message rule).
- The record-type table — u, h, a, ip, p, s3, tls, c, bl.
- A minimum viable resolver in under 100 lines of Node.js that pulls the
beacon's history, parses the OP_RETURNs, and prints a name's records.
- Pointers to every production implementation (Argus JS, Ariadne Kotlin,
the Windows Thread, the gateway) and every spec document on the forge.
- Public endpoints with a trust note: convenience, not consensus.
- Three paths for embedding Ariadne's Thread in your own app: chain-install
the Windows service, import the resolver library directly, or call the
local HTTP API; platform coverage table; MPL-2.0 licence note.
theseus.x/dev/ is a shorter page that cross-links to ariadne.x/dev/ for
the resolver work and covers Theseus-specific topics inline — the
extension publishing path (register a .x name on sirius.x, PUT signed
tarball to /api/ext, Theseus verifies the signature against the
on-chain owner before anything runs) and the first-party plug-in
surface.
Both pages are wired into the home-page topnav, mobile dropdown, and
footer Product column.
2026-10-04 17:50:30 +02:00
< a href = "dev/" > Developers< / a >
2026-10-04 19:18:32 +02:00
< a href = "//sirius.x/" title = "Register a BCNR name" > < svg class = "tabicon" 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 > < span > Sirius< span class = "g" > .X< / span > < / span > < / a >
2026-10-03 23:14:40 +02:00
< / div >
< / details >
< / nav >
< aside class = "sidenav" aria-label = "On this page" >
< a href = "#what" title = "What it is" > < span class = "ic" aria-hidden = "true" > 🌐< / span > < span class = "lb" > What it is< / span > < / a >
< a href = "#features" title = "Features" > < span class = "ic" aria-hidden = "true" > ⚡< / span > < span class = "lb" > Features< / span > < / a >
< a href = "#download" title = "Download" > < span class = "ic" aria-hidden = "true" > ⬇< / span > < span class = "lb" > Download< / span > < / a >
< a href = "#verify" title = "Verify" > < span class = "ic" aria-hidden = "true" > 🔐< / span > < span class = "lb" > Verify< / span > < / a >
< / aside >
< header class = "hero" >
< div class = "mark" >
< svg 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 >
< / div >
< h1 > Theseus < span class = "g" > Navigator< / span > < / h1 >
< p class = "tag" > A Chromium-based browser that resolves Bitcoin Cash names on the
device itself. No OS-level daemon, no DNS shim, no root-store install. Type
< code > silentmode.bch< / code > , get the on-chain answer, see which registry &
which storage served it.< / p >
< div class = "cta" >
< a class = "btn acid" href = "#download" > Download for Windows< / a >
< a class = "btn ghost" href = "#download" > Android APK< / a >
< a class = "btn ghost" href = "#what" > How it works< / a >
< / div >
< / header >
< div class = "wrap" >
< section id = "what" >
< h2 > What it is< / h2 >
< p class = "lede" > Theseus is a browser built around the assumption that names should
be resolved by the person using them, not by an intermediary. It ships an
embedded resolver (Ariadne) that watches the Bitcoin Cash chain directly and answers
name lookups locally — the app < i > is< / i > both the browser and the resolver.
Every page carries a badge showing which registry produced the record
(BCNR, ICANN) and which backend served the bytes (on-chain, Sia, direct IP,
or a plain HTTPS fallback).< / p >
< div class = "grid" >
< div class = "card" >
< h3 > < span class = "dot d-chain" > < / span > On-chain first< / h3 >
< p > Every dotted host is asked of BCNR before anything else. If the chain
answers, that answer wins — no matter what any DNS operator says. If
BCNR has no record, Theseus falls through to the clearnet.< / p >
< / div >
< div class = "card" >
< h3 > < span class = "dot d-sia" > < / span > Trust one thing< / h3 >
< p > The app is the trust boundary. No daemon, no root cert, no proxy in the
middle. Uninstall it and BCNR is gone from that machine — nothing lingers
in the OS.< / p >
< / div >
< div class = "card" >
< h3 > < span class = "dot d-srv" > < / span > Warm from the first click< / h3 >
< p > A bundled beacon snapshot loads before the first navigation can fire; a
background delta refresh keeps the index current every 30 s; a Sia
snapshot pull on boot catches long-idle installs up in one HTTP call.< / p >
< / div >
< / div >
< / section >
< section id = "features" >
< h2 > What's inside< / h2 >
< p class = "lede" > Everything a mainstream browser has, plus what the chain enables.< / p >
< div class = "grid" >
< div class = "card" >
< h3 > Native BCNR< / h3 >
< p > Type a name, get the on-chain record. < code > h< / code > serves from the chain,
< code > s3< / code > from Sia storage, < code > ip< / code > direct-connects, < code > u< / code >
redirects. TLS fingerprint pinning against the on-chain < code > tls< / code > record
for < code > ip< / code > hops.< / p >
< / div >
< div class = "card" >
< h3 > window.bcnr API< / h3 >
< p > Every page can call < code > window.bcnr.resolveName(…)< / code > ,
< code > isRegistered(…)< / code > , < code > getBcnrTlds()< / code > , and
< code > getRecordVersion(…)< / code > . dApps don't need to ship their own resolver.< / p >
< / div >
< div class = "card" >
< h3 > Password manager< / h3 >
< p > Local vault, deterministic derivation from a BIP-39 seed. Same seed on a
different device produces the same passwords. Autofill on demand — never
watches the page for you.< / p >
< / div >
< div class = "card" >
< h3 > Tor toggle< / h3 >
< p > One click routes everything through a bundled Tor client — pluggable
transports included for hostile networks. Off by default; nothing is
proxied without your say-so.< / p >
< / div >
< div class = "card" >
< h3 > Anti-fingerprinting< / h3 >
< p > Timezone / locale / language / geolocation can be shown, hidden, spoofed
with a plausible decoy, or set manually. Media-device labels blanked by
default so < code > enumerateDevices< / code > can't leak an audiooutput ID.< / p >
< / div >
< div class = "card" >
< h3 > Privacy by default< / h3 >
< p > Cookies, cache, storage, and history clear on quit unless you opt in.
Camera and microphone denied by default. WebRTC IP policy set to
public-only.< / p >
< / div >
< div class = "card" >
< h3 > System-wide, optional< / h3 >
< p > Theseus's resolver is in-process by default — nothing else on the
machine is touched. The Windows installer offers < b > Ariadne's Thread< / b >
as a recommended-on checkbox: one click also installs a system-wide
resolver so Chrome, Edge, and every other browser resolve BCNR too.
Uninstalling Theseus asks whether to remove it. Skip the checkbox and
Theseus is still fully self-contained.< / p >
< / div >
< div class = "card" >
< h3 > Small, auditable< / h3 >
< p > Under 100 MB, Electron + a few kilobytes of BCNR glue. Source at
< a href = "https://silentmode.st/" > silentmode.st< / a > . Reproducible builds
with < code > SOURCE_DATE_EPOCH< / code > .< / p >
< / div >
< / div >
< / section >
< section id = "download" >
< h2 > Download< / h2 >
2026-10-22 21:39:06 +03:00
< p class = "lede" > Latest is < b data-live = "theseus-version" > 0.3.105< / b > . Windows installer + portable, and an
2026-10-03 23:14:40 +02:00
Android build (Ariadne mobile — same brand, phone form factor).< / p >
< div class = "plats" >
< div class = "plat" >
< div class = "lbl" > Desktop · Windows 64-bit< / div >
< h3 > Theseus for Windows< / h3 >
< p > Full-window desktop browser with Tor toggle and the multi-source BNS
warm-start.< / p >
2026-10-22 21:39:06 +03:00
< div class = "meta" > v< span data-live = "theseus-version" > 0.3.105< / span > · installer ~137 MB · portable ~137 MB · unsigned< / div >
2026-10-03 23:14:40 +02:00
< div class = "btns" >
< a class = "btn acid" href = "https://dl.silentmode.st/latest/TheseusNavigator-Setup.exe" > Installer< / a >
< a class = "btn ghost" href = "https://dl.silentmode.st/latest/TheseusNavigator-portable.exe" > Portable .exe< / a >
< / div >
< div class = "hashes" id = "hashes-win" >
2026-10-22 19:43:19 +03:00
< div class = "h" > < b > Installer< / b > < code data-live = "theseus-setup-sha" > e9ca514df34cc057f0bda68fd3f4a212b93a50fab3798d95ed4530d091ca5cea< / code > < / div >
< div class = "h" > < b > Portable< / b > < code data-live = "theseus-portable-sha" > 529c9af549b268560c23ad3b751c4c4975188653d176ed6c3a93142958e3b757< / code > < / div >
2026-10-03 23:14:40 +02:00
< / div >
< / div >
< div class = "plat" >
< div class = "lbl" > Mobile · Android 5.0+ (API 21)< / div >
< h3 > Ariadne for Android< / h3 >
< p > Phone-sized browser with tap-to-verify provenance — the block and
transaction behind each name are one tap away.< / p >
< div class = "meta" > v< span data-live = "android-version" > 0.18< / span > · ~146 KB · self-signed release key · in-app auto-update< / div >
< div class = "btns" >
< a class = "btn acid" href = "https://dl.silentmode.st/latest/ariadne.apk" > Download APK< / a >
< / div >
< div class = "hashes" id = "hashes-android" >
< div class = "h" > < b > APK< / b > < code data-live = "android-sha" > 920272deb1ff3cb163d609882f4fdaf422c163648b96944d16670ba0ba2ac5bf< / code > < / div >
< div class = "h" > < b > Signing key< / b > < code > 46ebbbe5dc73148d66410fd0337b1e6683472128c983e8e2578200b9e3ca548c< / code > < / div >
< / div >
< / div >
< / div >
< div class = "note" > < b > Nothing is signed by an authority your device trusts< / b >
— by design. Verify the SHA-256 below before running. The download buttons point at
< code > dl.silentmode.st/latest/…< / code > , which always redirects to the current
build, so a saved link never goes stale. The machine-readable
manifest is at
< a href = "https://dl.silentmode.st/releases-manifest.json" > releases-manifest.json< / a > .< / div >
< / section >
< section id = "verify" >
< h2 > Verify what you downloaded< / h2 >
< p class = "lede" > The hashes above are the same ones published at
< a href = "https://silentmode.bch/releases/" > silentmode.bch/releases< / a > (Sia
mirror, name-anchored) and inside the on-chain
< code > releases.silentmode.bch< / code > pointer. Three independent surfaces —
they should all agree.< / p >
< pre > Windows PowerShell:
2026-10-22 21:39:06 +03:00
Get-FileHash < span data-live = "theseus-setup-file" > TheseusNavigator-Setup-0.3.105.exe< / span > -Algorithm SHA256
2026-10-03 23:14:40 +02:00
macOS / Linux:
2026-10-22 21:39:06 +03:00
sha256sum < span data-live = "theseus-setup-file" > TheseusNavigator-Setup-0.3.105.exe< / span >
2026-10-03 23:14:40 +02:00
Expected:
2026-10-22 19:43:19 +03:00
< span data-live = "theseus-setup-sha" > e9ca514df34cc057f0bda68fd3f4a212b93a50fab3798d95ed4530d091ca5cea< / span > < / pre >
2026-10-03 23:14:40 +02:00
< / section >
< footer class = "deep" >
< div class = "fwrap" >
< div class = "brand-col" >
< a class = "brand" href = "./" >
< svg 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 >
< span > Theseus< span class = "g" > .X< / span > < / span >
< / a >
< p > A Chromium-based browser that resolves Bitcoin Cash Domain Names on the device itself.
No custom DNS, no root-store install, no server between you and the chain.< / p >
< / div >
< div >
< h5 > Product< / h5 >
< ul >
< li > < a href = "./" > 🏛 Home< / a > < / li >
< li > < a href = "plug-ins/" > 🧩 Plug-ins< / a > < / li >
< li > < a href = "extensions/" > 🧱 Extensions< / a > < / li >
site(ariadne.x, theseus.x): /dev/ — resolver spec and embedding guide
A developer / agent landing page on both .X sites so an LLM or a human
porting the resolver has everything in one place and does not need the
public gateway to understand how to talk to BNS.
ariadne.x/dev/ is the canonical page. Covers:
- Why: resolve names directly from the chain, with no operator in the
middle.
- BNS1 in one page: beacons, cash-token certificates, OP_RETURN payloads,
REG/UPD/REL, chipnet network constants, the six indexer rules
(including the 2026-10-04 one-message rule).
- The record-type table — u, h, a, ip, p, s3, tls, c, bl.
- A minimum viable resolver in under 100 lines of Node.js that pulls the
beacon's history, parses the OP_RETURNs, and prints a name's records.
- Pointers to every production implementation (Argus JS, Ariadne Kotlin,
the Windows Thread, the gateway) and every spec document on the forge.
- Public endpoints with a trust note: convenience, not consensus.
- Three paths for embedding Ariadne's Thread in your own app: chain-install
the Windows service, import the resolver library directly, or call the
local HTTP API; platform coverage table; MPL-2.0 licence note.
theseus.x/dev/ is a shorter page that cross-links to ariadne.x/dev/ for
the resolver work and covers Theseus-specific topics inline — the
extension publishing path (register a .x name on sirius.x, PUT signed
tarball to /api/ext, Theseus verifies the signature against the
on-chain owner before anything runs) and the first-party plug-in
surface.
Both pages are wired into the home-page topnav, mobile dropdown, and
footer Product column.
2026-10-04 17:50:30 +02:00
< li > < a href = "dev/" > ⚙️ Developers< / a > < / li >
2026-10-03 23:14:40 +02:00
< li > < a href = "brand/" > 🎨 Brand book< / a > < / li >
< li > < a href = "whitepaper/" > 📄 Whitepaper< / a > < / li >
< / ul >
< / div >
< div >
< h5 > Download< / h5 >
< ul >
< li > < a href = "#download" > ⬇️ Windows & Android< / a > < / li >
< li > < a href = "https://silentmode.st/releases" rel = "noopener" > 📦 Release notes < span class = "ext" > ↗< / span > < / a > < / li >
< li > < a href = "https://dl.silentmode.st/" rel = "noopener" > 🔗 dl.silentmode.st < span class = "ext" > ↗< / span > < / a > < / li >
< li > < a href = "https://code.silentmode.st/silentmode/theseus" rel = "noopener" > 🛠 Source < span class = "ext" > ↗< / span > < / a > < / li >
< / ul >
< / div >
< div >
< h5 > Pantheon< / h5 >
< ul >
2026-10-04 19:18:32 +02:00
< li > < a href = "//sirius.x/" rel = "noopener" > Sirius< span class = "g" > .X< / span > — names< / a > < / li >
< li > < a href = "//ariadne.x/" rel = "noopener" > Ariadne< span class = "g" > .X< / span > — mobile< / a > < / li >
< li > < a href = "//hephaestus.x/" rel = "noopener" > Hephaestus< span class = "g" > .X< / span > — forge< / a > < / li >
2026-10-03 23:14:40 +02:00
< li > < a href = "https://silentmode.st/" rel = "noopener" > silentmode.st < span class = "ext" > ↗< / span > < / a > < / li >
< / ul >
< / div >
< / div >
< div class = "bar" >
< span > < span class = "badge" > Alpha< / span > theseus.x — a BCNR name resolving to a Sia-hosted site · one wallet, all of it< / span >
< span class = "mono" > MIT · self-hostable< / span >
< / div >
< / footer >
< / div >
< script >
// Keep versions + hashes current from the releases manifest. The text baked
// into the page is the fallback when this fetch can't run (offline, or a
// scheme that blocks cross-origin reads).
(async () => {
try {
const r = await fetch("https://dl.silentmode.st/releases-manifest.json", { cache: "no-store" });
if (!r.ok) return;
const m = await r.json();
const th = (m.releases || []).find((x) => x.id === "theseus-navigator");
const an = (m.releases || []).find((x) => x.id === "ariadne-android");
const set = (key, val) => { if (val == null) return; document.querySelectorAll('[data-live="' + key + '"]').forEach((el) => { el.textContent = String(val); }); };
if (th) {
const files = Object.keys(th.files || {});
const setup = files.find((f) => /Setup-.*\.exe$/.test(f)), portable = files.find((f) => /-portable\.exe$/.test(f));
set("theseus-version", th.version);
set("theseus-setup-file", setup);
set("theseus-setup-sha", setup & & th.files[setup]);
set("theseus-portable-sha", portable & & th.files[portable]);
}
if (an) {
const apk = Object.keys(an.files || {})[0];
set("android-version", an.version);
set("android-sha", apk & & an.files[apk]);
}
} catch {}
})();
// 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 >