Commit graph

139 commits

Author SHA1 Message Date
Silent Mode
5e3e104694 Release pages: Theseus 0.3.77
- site/releases: 0.3.77 block above 0.3.76 with the Translator engine
  radio, CF Bot Fight error page and Pithos 0.3.13 bundle, SHAs
  ab4135a9… (installer) + a01ad6b8… (portable).
- site/theseus and site-theseus-x: bump the download card to 0.3.77 and
  the fallback hashes to match. The theseus-x page already fetches the
  live manifest; the fallback stays in sync for offline reads and the
  Sia mirror.
- site/releases-manifest.json: 0.3.77 entry prepended for the main
  manifest; the dl copy was scp'd and dl-latest.sh regenerated the
  /latest/ redirects on the VPS.
2026-10-04 15:27:23 +02:00
Local Dev
071760c544 Release pages: Theseus 0.3.76
Setup 9e5c4b6b…b7e9, portable b223eb14…5c49. Pithos opens at
pithos.sia/<user>/<drive>/<folder>, music keeps playing in background
tabs, a widened left panel no longer squeezes the page; bundles Pithos
0.3.10 and Aegis 0.31.0.
2026-10-04 03:47:10 +02:00
Silent Mode
44f25133b5 site + theseus.x: Theseus 0.3.75 hashes — reconcile to the newer build
A parallel ship pass raced this one on the same version string: the
other session built 0.3.75 from 4bfef3a (Aegis 0.29.0) and scp'd its
binaries over mine. The first reconcile pass accepted the on-disk
hashes under the "both built from the same HEAD" assumption, but they
are different builds — mine includes d2ddee5 (Aegis 0.30.0) and the
master tip, theirs stops at 4bfef3a. The peer stood down, I re-scp'd
my binaries, and this commit pulls the manifest + the releases page +
theseus.x back to those hashes. The release notes already named
Aegis 0.30.0, which matches what the binaries actually bundle now.
2026-10-03 23:19:02 +02:00
Silent Mode
f76327109c site + theseus.x: Theseus 0.3.75 published 2026-10-03 23:14:40 +02:00
Local Dev
27a1fb2860 site + theseus.x: Theseus 0.3.74 published
Setup ca35382ec33458ca9ac65bc4a288f8bf1c117a329c37f8f0b965066d844605e7
portable 510fd26fce1b8977d4b5740d9ddc5ca412d681ea37d4758a88e238ca4eaa026d
2026-10-03 20:58:13 +02:00
Silent Mode
08d87218e8 site + theseus.x: Theseus 0.3.73 published 2026-10-03 19:26:10 +02:00
Local Dev
647d41e071 site + theseus.x: Theseus 0.3.72 published
Setup 8e7f0f121fdf5d549108cdd561f6295e0d461b559ae3adef14f335f055c34fb4
portable 41b3af135d63cd11d287e280245fbd3a99c6f7f2f0865f2a2740cc941e200a99
2026-10-03 19:17:21 +02:00
Silent Mode
fae6ec8b03 site + theseus.x: Theseus 0.3.71 published 2026-10-03 16:34:08 +02:00
Silent Mode
af0ec78497 site + theseus.x: Theseus 0.3.70 published 2026-10-03 14:34:37 +02:00
Silent Mode
90db129cc1 site + theseus.x: Theseus 0.3.69 published 2026-10-03 10:34:12 +02:00
Silent Mode
b27f26d47f site + theseus.x: Theseus 0.3.68 published 2026-10-03 00:14:30 +02:00
Silent Mode
c97ce7f400 site + theseus.x: Theseus 0.3.67 published 2026-10-02 23:54:10 +02:00
Silent Mode
75454f4123 site + theseus.x: Theseus 0.3.66 published 2026-10-02 23:10:28 +02:00
Silent Mode
52f82c01fd site + theseus.x: Theseus 0.3.65 published
Manifest, releases page, download pages and theseus.x fallback text all point
at 0.3.65 with the new hashes.
2026-10-02 22:50:09 +02:00
Silent Mode
9bdb4573ae site + theseus.x: Theseus 0.3.64 published
Manifest, releases page, download pages and theseus.x fallback text all point
at 0.3.64 with the new hashes.
2026-10-02 22:20:22 +02:00
Silent Mode
c954b62117 site + theseus.x: Theseus 0.3.63 published
Manifest, releases page, download pages and theseus.x fallback text all point
at 0.3.63 with the new hashes.
2026-10-02 21:56:25 +02:00
Silent Mode
cbd88bc4e3 site + theseus.x: Theseus 0.3.62 published
Manifest, releases page, download pages and theseus.x fallback text all point
at 0.3.62 with the new hashes.
2026-10-01 22:25:34 +02:00
Silent Mode
dbac10d2bd site + theseus.x: Theseus 0.3.61 published
Manifest, releases page, download pages and theseus.x fallback text all point at
0.3.61 with the new hashes. Silentmode.st serves static; silentmode.bch mirror
follows via the 5-min Sia sync.
2026-10-01 01:04:44 +02:00
Local Dev
91ed42cd04 Ariadne 0.1.13: /api/status + per-source enable toggles in policy.json
Every subsystem is now individually switchable and reports its own state.

GET http://127.0.0.1/api/status returns:
- daemon: version, startedAt, uptimeSec, policy, permittedTlds, ports,
          upstream, gateway
- index:  size, nameCacheSize, warmStart {source, at, size}
- sources.snapshotHttps:  enabled, urls, lastAttempt/Success/Status/Error,
                          winnerUrl, notModified count, refreshes count, ETags
- sources.electrumWss:    enabled, lastAttempt/Success/Error, failStreak, refreshes
- sources.perQueryLookup: enabled, gateway, lastAttempt, hits/misses/errors
- sources.diskCache:      enabled, path, exists, size, mtime
- sources.localApi:       enabled, endpoints[]
- policyFile:             path, exists

policy.json schema extended with a sources.<name>.enabled block, hot-reloaded
by the existing loadPolicyOverride() on the same 5-second tick as the
collision policy. Each refresh/lookup path guards on its flag, so an operator
can isolate any subsystem without a restart:
  - snapshotHttps off  -> daemon skips dl.silentmode.st/Sia polling
  - electrumWss off    -> daemon skips chipnet WSS refresh
  - perQueryLookup off -> DNS handler misses fall straight through to forward
  - diskCache off      -> no write to and no read from bns-name-snapshot.json
  - localApi off       -> /api/* return 503 with a hint pointing at policy.json

Verified locally on port 18080: /api/status returned the full JSON with a
snapshot warm-start from dl.silentmode.st recorded in warmStart, ETag captured
in sources.snapshotHttps.etags, disk cache path/size/mtime populated.

Deployed dl.silentmode.st + Sia. sha256 a16d10759efede4412f4fdb52d59424bf56bbb258bb002ab930f4a5a5aef8a41.

The matching Theseus panel UI (source table with the toggles + a Copy-status
button that fetches /api/status) belongs in the Theseus release; not touched
here to avoid colliding with settings-preload.js work in flight from a
parallel session.
2026-10-01 00:08:57 +02:00
Silent Mode
6f8b72080b site + theseus.x: Theseus 0.3.60 published
Manifest and download pages point at the new build. Silentmode.st serves
static; silentmode.bch mirror follows via the 5-min Sia sync; theseus.x's
fallback text and hashes match the 0.3.60 binaries so the page reads correctly
before the client-side manifest fetch overwrites them.
2026-09-30 02:51:25 +02:00
Local Dev
7159c0964b Ariadne 0.1.12: orphan-safe upgrade + local BNS indexer API
- .iss pre-install hook now also kills orphan node.exe from the Ariadne
  install dir (foreground diagnostic runs, crashed processes not cleaned
  up by the scheduled task), path-scoped so no other app is affected.
  Fixes upgrades failing with "DeleteFile failed; code 5 -- Access is
  denied" on runtime/node.exe -- seen on 0.1.11 install by a user who had
  run the daemon manually per an earlier diagnostic.
- bnsd.js Express gateway now serves local BNS indexer endpoints:
  /api/tlds     -> {source, tlds: string[], count}
  /api/name/:n  -> full BNS entry (same shape as navigate.st/api/name/)
  /api/registry -> {source, count, names[]} full index dump
  CORS wide-open (matches operator behavior). Any app on the machine can
  now query BNS locally with no navigate.st round-trip. Answers off the
  daemMons in-memory index which already merges snapshot warm-start +
  ETag polling + per-query indexer fallback + electrum WSS.

Verified locally: hello.bch resolves via /api/name; unknown gives 404;
/api/tlds returns the CA-constrained set (bch p2p bit deviant nav test
bcnr on this boxs current CA); /api/registry returns 61 names.

Deployed: dl.silentmode.st + Sia. sha256 b041652a330fefb4561da7ca14fa84ddf3b6085fda6eb62831cb08ea56ec602d.
2026-09-30 01:51:57 +02:00
Local Dev
9072412012 Ariadne 0.1.11: indexer-first refresh + per-query indexer fallback
The daemon now uses the operator's live BNS indexer as the primary source of
truth, not chipnet electrum. Two changes to the resolver pipeline:

1) Background refresh is HTTPS-first with ETag. Every 30 s the daemon polls
   dl.silentmode.st/bns-name-index.json (and s3.silentmode.st:8600 as an
   independent Sia mirror) sending If-None-Match; only reparses the array
   when the operator republished, does zero work otherwise. Electrum WSS
   stays as a same-tick secondary that runs when HTTPS turned nothing up,
   so a daemon on a network that can reach chipnet but not the operator VPS
   still converges. Both broken? Keep the last-good index from warm-start.

2) Per-query indexer fallback in the DNS handler. When the in-memory index
   misses, the handler calls navigate.st/api/name/<host> directly with a
   5-second timeout and a 30-second LRU cache. Names registered AFTER the
   last snapshot poll but BEFORE the next one now answer immediately from
   the live indexer instead of falling straight through to a forward and
   returning NXDOMAIN. Cache is cleared on any successful full refresh so
   a de-registered name doesn't stay resolvable.

Net effect: on the class of failure that motivated this (chipnet electrum
timing out on blockchain.scripthash.get_history, or port 50004 filtered by
the network), the daemon just works. The operator's HTTPS indexer -- which
every other client in the ecosystem (Theseus mobile, Aegis, sirius.x, the
gateway itself) already reads from -- is now Ariadne's Thread's primary
too. Trust model unchanged: the snapshot always came from the operator.

Verified locally with the built binary on port 15353:
  bnsd index: warm-started from https://dl.silentmode.st/bns-name-index.json (61 names)
  hello.bch           -> 127.0.0.1   (snapshot hit)
  game.x              -> 127.0.0.1   (per-query /api/name fallback -- not in .bch-heavy snapshot)
  coinspectrum.x      -> 127.0.0.1   (per-query fallback)
  ariadne.x           -> 127.0.0.1   (per-query fallback)
  notregisteredxyz.x  -> NXDOMAIN    (indexer confirms not registered, forwarded to upstream)

Deployed
- dl.silentmode.st/AriadneResolver-Setup-0.1.11.exe
- s3://bns/silentmode/dl/AriadneResolver-Setup-0.1.11.exe
- silentmode.st manifest advertises 0.1.11
- sha256 58ffb06424785973d2cd656e5122061ce10b53a8dcff55605c23b5699552ee75
2026-09-30 00:51:47 +02:00
Local Dev
536b1fb41e Ariadne 0.1.10: multi-source snapshot warm-start so the daemon works on
WSS-blocked networks

Symptom on the other box (2026-09-29): task Running, port 53 bound by our
node, `Resolve-DnsName hello.bch -Server 127.0.0.1` times out. Cause: the
daemon's initial index build was a top-level `await buildIndex()` over
electrum WSS to chipnet (port 50004). Corporate/ISP networks that filter
outbound WSS let the await hang forever; the queries fell through to
`forward()` to upstream 1.1.1.1:53, which the same firewall also blocked,
so both legs died.

0.1.10 borrows Theseus's warmFromSnapshot pattern for the system-wide
daemon. On startup, in parallel with an 8 s deadline per source:

  1. HTTPS snapshot from operator VPS  https://dl.silentmode.st/bns-name-index.json
  2. HTTPS snapshot from Sia mirror     https://s3.silentmode.st:8600/bns/name-list.json
  3. On-disk cache from a previous run  C:\ProgramData\Ariadne\bns-name-snapshot.json

First non-empty result wins; on any HTTPS win the raw array is written to
the disk cache so the NEXT boot is instant even fully offline. dns.bind()
runs the moment warm-start completes, whether or not electrum was
reachable. Electrum WSS refresh continues in the background on the 30 s
timer and wins over the snapshot when it succeeds because it is strictly
newer.

Snapshot format is the pre-resolved array Android's Ariadne reader already
consumes (`[{name, category, records, txid, height, updatedTxid, owner?}]`),
so the operator maintains ONE artifact for both clients. Custom URLs go in
`ariadne.config.json`.snapshotUrls.

Verified on the dev box by running the built binary manually on port 15353:
  bnsd index: warm-started from https://dl.silentmode.st/bns-name-index.json (61 names)
  bnsd DNS: 127.0.0.1:15353 (policy=bcnr-first, upstream 1.1.1.1)
  hello.bch -> 127.0.0.1
Disk cache written: 17,674 bytes.

Deployed
- dl.silentmode.st/AriadneResolver-Setup-0.1.10.exe
- s3://bns/silentmode/dl/AriadneResolver-Setup-0.1.10.exe
- silentmode.st manifest advertises 0.1.10
- sha256 29710c4011dfe058a252f94af221c02593e728e89cc7427e3e01eaa530f8e526
2026-09-29 22:37:08 +02:00
Local Dev
30a4932221 Ariadne 0.1.9: local /search shim so bare BNS names work in the address bar
Chromium (Chrome + Edge) doesn't treat `foo.x` as a URL because `.x` isn't on
its known-TLD list -- it sends bare input to the default search engine. Only
way to intercept it without a browser extension is to make the default search
engine one that understands BNS.

The daemon now serves that. New route `app.get("/search")` before the catch-all
Express handler:

  - `q` matches <label>.<permitted-tld>  ->  301 https://q/  (any path preserved)
  - q has whitespace, unknown TLD, IP, etc.  ->  302 to `searchFallback`
    (ariadne.config.json, defaults to https://duckduckgo.com/?q=)
  - empty q  ->  400

Permitted-TLD check reuses isPermittedHost() from lib/tlds.js -- same set the
CA is constrained to and the SNI callback gates leaf minting against, so
"routable, therefore a URL" stays one decision.

Users set their browser's default search engine to
`http://127.0.0.1/search?q=%s`. Everything decided locally, no navigate.st
round trip. Works offline. Works with the same offline BNS index the DNS side
uses. Fallback engine is per-user via config, not a locked-in default.

Verified on this box after upgrade:
  "ariadne.x"       -> 301 https://ariadne.x/
  "game.x"          -> 301 https://game.x/
  "hello.bch"       -> 301 https://hello.bch/
  "ariadne.x/path"  -> 301 https://ariadne.x/path
  "Weather"         -> 302 https://duckduckgo.com/?q=Weather
  "bitcoin cash"    -> 302 https://duckduckgo.com/?q=bitcoin%20cash
  "unknown.zzz"     -> 302 https://duckduckgo.com/?q=unknown.zzz
  ""                -> 400 bnsd search: q parameter is required

Deployed
- dl.silentmode.st/AriadneResolver-Setup-0.1.9.exe
- s3://bns/silentmode/dl/AriadneResolver-Setup-0.1.9.exe
- silentmode.st manifest advertises 0.1.9
- sha256 3b973e0ae584113ad776c756b16b895fd0dfb217a02bfae6376c5abb48f9a77c
2026-09-28 22:57:59 +02:00
Local Dev
b0569c92d8 Ariadne 0.1.8: pinned-origin reverse proxy for ip+tls names
Before 0.1.8, a BNS name with an on-chain `ip` record made the daemon return
the origin's public IP directly. Browsers then hit the origin's own HTTPS
server -- and if that origin's cert was not browser-trusted (which is the
whole point of the on-chain `tls` fingerprint pin next to the `ip` record),
every browser except Theseus rejected the site with ERR_CERT_AUTHORITY_INVALID
or SEC_ERROR_UNKNOWN_ISSUER. game.x and hephaestus.x both hit this. Theseus
was fine because its in-process resolver validates against the on-chain pin.

0.1.8 answers DNS with 127.0.0.1 whenever the name has BOTH `ip` and `tls`,
terminates the browser's TLS locally with our trusted leaf, and reverse-proxies
to the origin over HTTPS while validating the origin's SHA-256 fingerprint
against the on-chain pin. Same algorithm Theseus uses (main.js:pinnedHttpsGet,
cert.fingerprint256 lower-cased, colons stripped) so a site's `tls` record
means the same thing in-Theseus and system-wide.

Names with just `ip` (no pin) keep direct routing -- unchanged. Only opts in
when the owner has published a fingerprint pin, so nothing regresses for sites
that deliberately wanted direct IP routing.

Two subtle bugs found + fixed while landing this:

1. `agent: false` on the outbound https.request. With Node's default global
   agent (keepAlive on), the second request onwards reuses the TLS socket
   and `res.socket.getPeerCertificate(false)` comes back stripped of
   fingerprint256 -- pin validation then reads "empty" and rejects with 526.
   Fresh socket per request costs a handshake but is cheap next to the
   pin-verify miss.

2. Removed `content-encoding` from the hop-by-hop strip list. Origin sends
   gzip'd bytes; my proxy streams them unchanged. If we strip
   content-encoding while forwarding compressed bytes, the browser treats the
   gzip magic as text and renders garbage. content-encoding is end-to-end
   per RFC 7230 -- keep it.

Verified on this box: game.x, hephaestus.x, theseus.x, sirius.x,
coinspectrum.x, hello.bch all load HTTPS 200 in strict IWR and Chromium; DNS
answers 127.0.0.1 for game.x + hephaestus.x (was their origin IP before),
still their origin IP for names without a tls pin.

Deployed
- dl.silentmode.st/AriadneResolver-Setup-0.1.8.exe
- s3://bns/silentmode/dl/AriadneResolver-Setup-0.1.8.exe
- silentmode.st manifest advertises 0.1.8
- sha256 47450ad4555beb04fe3b90ae5f658dc2932061d011ada9a2fb507471e2f0a0cb
2026-09-28 22:29:44 +02:00
Local Dev
612ff248d4 site: Theseus 0.3.59 — manifest, releases page, theseus pages 2026-09-28 20:57:27 +02:00
Local Dev
888013b296 site: Ariadne for Android 0.20 — manifest and releases page 2026-09-28 02:02:21 +02:00
Local Dev
1207d1f52d Ariadne 0.1.7: system-wide collision policy is runtime-switchable
Feature. The daemon now hot-reloads C:\ProgramData\Ariadne\policy.json every
5 s (fs.stat mtime check, only opens the file when it actually changed) and
flips its DNS collision policy between bcnr-first and icann-first in place.
Every browser on the machine follows within seconds -- no daemon restart,
no reinstall, no UAC. The next Ariadne panel in Theseus will edit this file
directly; a text editor works too.

install.ps1 seeds the file with the current -Policy default on FIRST install
only (an upgrade never clobbers a user's later flip) and grants BUILTIN\Users
Modify on it so an unprivileged app can rewrite it. Invalid values keep the
last good policy (logged). File deleted -> daemon falls back to the CLI
policy the scheduled task was registered with.

Also fixes an intermittent "config unreadable" on daemon startup when
ariadne.config.json had a UTF-8 BOM -- same class of PS-writes-BOM bug 0.1.6
fixed in the TLD-sync path, this time in bnsd.js's own config loader.

Verified live on this box with a second daemon running on port 15353:
  bnsd policy: bcnr-first -> icann-first (from C:\ProgramData\Ariadne\policy.json)
  bnsd policy: icann-first -> bcnr-first (from C:\ProgramData\Ariadne\policy.json)
  bnsd policy: ... has invalid policy 'cash-first' -- keeping bcnr-first
ACL check: BUILTIN\Users has Modify on policy.json, non-elevated write succeeds.

Deployed
- dl.silentmode.st/AriadneResolver-Setup-0.1.7.exe
- s3://bns/silentmode/dl/AriadneResolver-Setup-0.1.7.exe
- silentmode.st manifest advertises 0.1.7
- sha256 742f8005c2dfb47929287c009cddf7738f0d12bd56fb8f8a837df3e9b435f47f

Theseus UI wiring for this file NOT touched -- settings-preload.js has 31
lines of uncommitted work from another session; a Theseus panel selector
belongs in that session's next commit so it doesn't collide.
2026-09-28 01:18:47 +02:00
Local Dev
55383430ef site: Ariadne Resolver 0.1.6 — manifest and releases page 2026-09-27 23:47:47 +02:00
Local Dev
2af402fff6 site: Ariadne Resolver 0.1.5 — manifest and releases page 2026-09-27 23:22:48 +02:00
Local Dev
5c9fd6ca2f Ariadne 0.1.4: sweep stale BNS root CAs so browsers stop failing after upgrades
Symptom: on any machine that had been through a series of installs, one or
more older "BNS Local Root CA" certs from earlier builds could accumulate in
LocalMachine\Root -- an unconstrained root from before 2026-07, or a rotated
one -- and every install added the current constrained root ALONGSIDE the
stale ones. Two certs with the same Subject-DN defeat browser chain-builders:
Chromium/Edge/Firefox pick one candidate and refuse to try the others, so
every .bch site failed with ERR_CERT_AUTHORITY_INVALID / SEC_ERROR_BAD_SIGNATURE
in every browser EXCEPT Theseus (which trusts the on-chain tls fingerprint
directly, not the machine store).

Reproduced on the dev box: two BNS Local Root CAs present (thumbprints
EB5DBE98... constrained + 23538FD7... unconstrained), DNS answered correctly,
strict Invoke-WebRequest to https://coinspectrum.bch/ failed. Removing the
stale one and re-running the chain-build restored HTTPS 200.

Fix (install.ps1):
- Before Add(imported), enumerate the store and $store.Remove() every
  "BNS Local Root CA" whose thumbprint differs from the one we're about
  to trust. Post-condition: exactly one BNS root remains after install.

Fix (uninstall.ps1):
- Switched from `Get-ChildItem Cert:\LocalMachine\Root` to X509Store direct.
  The Cert: PSDrive is not always loaded in Inno's [UninstallRun] -NoProfile
  context, so uninstall could silently leave the CA behind on the store side
  even while it removed everything else.

Verified end-to-end on this box: 0.1.4 upgrade over 0.1.3 finished cleanly,
BNS Resolver Daemon Running, 127.0.0.1:53 open, exactly one BNS Local Root
CA in the machine store, strict HTTPS to https://coinspectrum.bch/ returned
200 (506,997 bytes) with X509Chain.Build ok=true leaf -> BNS root.

Deployed
- dl.silentmode.st/AriadneResolver-Setup-0.1.4.exe
- s3://bns/silentmode/dl/AriadneResolver-Setup-0.1.4.exe
- silentmode.st manifest advertises 0.1.4
- sha256 30ed5e3bb6d6da5325f854c97976410b4fc63067ed52c810a55e9d2e1bdc4e17
2026-09-27 22:04:00 +02:00
Local Dev
973c609148 site: Theseus 0.3.58 — manifest, releases page, theseus pages 2026-09-27 20:48:37 +02:00
Local Dev
9636198ca6 site: Theseus 0.3.57 — manifest, releases page, theseus pages 2026-09-27 11:38:13 +02:00
Local Dev
1fa0d20c23 site: releases page as published for Theseus 0.3.56
The 0.3.56 ship updated the live page but the repo copy stayed at
0.3.55; bring it in so the 0.3.57 update starts from what users see.
2026-09-27 11:27:35 +02:00
Local Dev
c957bd1936 site: Theseus 0.3.55 — manifest, releases ledger and theseus pages 2026-09-23 00:10:28 +02:00
Local Dev
f74a574dd4 site: Theseus 0.3.54 — manifest, releases ledger and theseus pages 2026-09-22 22:15:17 +02:00
Local Dev
c9182676a8 site: Theseus 0.3.53 — manifest, releases ledger and theseus pages 2026-09-22 21:45:01 +02:00
Local Dev
9d6e46026a site: Theseus 0.3.52 — manifest, releases ledger and theseus pages (repo manifest had stalled at 0.3.49 while dl served 0.3.51) 2026-09-22 00:59:35 +02:00
Local Dev
a7224b75ac site: slash-less page URLs; /theseus is the Theseus page, /tools the overview
Canonical silentmode.st URLs no longer carry a trailing slash (/tools, not
/tools/). nginx (tracked now in VPS/SilentMode/silentmode-st.nginx) 301s
the old form and serves <dir>/index.html; sub-sites deployed from other
repos with relative asset paths (deviant, sirius-x, theseus-x, hephaestus.x,
fly.x, code) keep their directory URLs. Every page's internal links are
now site-root-relative, which resolves correctly both at /x on nginx and
under the BNS gateway's injected <base href="/bns/silentmode.bch/"> — the
old ../x/ links were already broken on the gateway route.

/theseus becomes the Silent Mode-headered Theseus page (what it is, what's
inside, Windows + Android downloads with manifest hashes, verify), linking
out to the sovereign theseus.x whose VPS mirror moves to /theseus-x/, the
same split as /sirius vs /sirius-x/. /tools is repurposed as the overview:
every site, the on-chain twins, the other clients (relay, Firefox, the
standalone Ariadne Resolver) and the machine endpoints. The old tools page
carried stale APK and resolver hashes; the new pages use the manifest's,
verified against the files on dl.silentmode.st.

scripts/serve-site.mjs mirrors the nginx rules for local preview.
2026-09-20 17:21:30 +02:00
Local Dev
0f4c51725c site: publish Theseus 0.3.49 2026-09-20 16:14:05 +02:00
Local Dev
e7126dbc17 release: Ariadne for Android 0.19 and Ariadne Resolver 0.1.3 — co-sign rule on devices
Until now only the gateway, Theseus and the desktop reader applied the
TLD co-sign rule; phones and the Windows resolver still admitted every
registration under a cosign or hidden TLD, so the network disagreed
about which names exist. Both shipped builds now carry the rule.

Android 0.19: the JSON helpers in the new TLD-map code used throwing
getters inside methods that do not declare the checked exception, which
javac rejected under the real build (the earlier compile check ran
without -bootclasspath and stopped at the aapt R errors first). Switched
to the non-throwing opt* forms. Release-signed with the existing key.

Resolver 0.1.3: no source change beyond the resolver library already
committed; the installer picks up the source tree, so this is a version
bump and a rebuild.

Manifest, releases page, tools page and theseus page point at the new
files; dl.silentmode.st/latest redirects regenerated.
2026-09-19 09:13:27 +02:00
Local Dev
cbb0f5fcfc site: publish Theseus 0.3.48 2026-09-15 23:15:11 +02:00
Local Dev
0ac5ccbed9 site: publish Ariadne for Android 0.18 2026-09-14 08:04:38 +02:00
Local Dev
21cdf5a09f feat(ariadne/mobile): 0.17 — the address bar finally searches
Direct answers to the three complaints in one release.

"Doesn't load any results even if I type a keyword" — navigateTo used to
always append .bch to any bare label. So "bitcoin" became
https://bitcoin.bch/ and NXDOMAINed. Now: input with a space, or bare
label with no dot, routes to the user's chosen search engine. Input with
a dot (hello.bch, example.com) stays a URL. Matches Chrome/Firefox
omnibox behaviour exactly.

"Has no check for updates in settings" — new Updates section shows the
installed version + signing-cert SHA-256, with a "Check for updates now"
button that manually polls dl.silentmode.st and toasts the result. If a
newer version exists, the standard silent-prefetch → green-chip → tap-to
-install flow (unchanged from 0.15) kicks in.

"Looks poor compared to a regular browser" — Settings gains three more
sections beyond Resolution / Ariadne's Thread / Maintenance:

- Search: segmented picker for DuckDuckGo (default), Startpage, Brave
  Search, Google, Kagi. Persists via SharedPreferences.
- Updates: version + cert + manual check.
- Privacy: "Clear browsing data" — cookies (CookieManager), form data,
  cache, per-tab history, all in one tap. Bookmarks + tabs preserved.
- About: silentmode.st/theseus + theseus.x links, brand credit.

serveSettingsPage() signature grew to take (indexerOn, searchKey,
currentVersion) so it can render the current selection + version. Added
searchEngineSegment() helper for the picker layout.

Release: ariadne-v0.17.apk sha256
8a655081782ecc17a50a7fcd67c28625ccb0c905cf6b583bdd703a128b2b9b10
Deployed to dl.silentmode.st + silentmode.bch (Sia mirror). Site pages
bumped: silentmode.st/tools + /releases + /theseus + theseus.x.
2026-09-13 20:19:34 +02:00
Local Dev
6016677ee8 site: publish Theseus 0.3.46 2026-09-13 19:54:01 +02:00
Local Dev
be1c9279c9 feat(ariadne/mobile): 0.16 — curated start page + fresh snapshot
Users on 0.15 reported "Ariadne can't open many websites" and "start page
is full of dead links". Two independent stale-data issues, both fixed.

Start page — replaces the featured-hero + beacon-fallback grid with the
same nine curated cards navigate.st serves (hello.bch, siatest.bch,
SilentMode.X, Theseus.X, Sirius.X, Hephaestus.X, Prometheus.X, Helios.X,
Hermes.X). No more auto-iteration over every registered name on the
beacon — which is what was surfacing smtest-dc5563.bch, uitest-e20579.p2p,
qrtest-e21970.nav etc. Added product-role badges (infrastructure /
navigator / registrar / code-host / app-store / search / messaging) with
the same acid/blue/purple/green/gold/pink vocabulary Theseus uses.

Bundled snapshot at app/assets/bns-index.json regenerated from the live
chain via the resolver-web.js buildIndex path. Up from 44 entries to 54,
now including all 13 .x names (was 6 — silentmode.x, theseus.x,
hephaestus.x, prometheus.x, helios.x, hermes.x etc. were entirely
missing). So cold-start resolution finds the .x brands without waiting
for a network trip.

Also regenerated dl.silentmode.st/bns-name-index.json — same 54-entry
JSON. That file hadn't been rebuilt since 2026-08-30 and is what every
client's CDN pull path reads on cold start (mobile, extension, resolver).
There's no timer that regenerates it; scratchpad/build-snapshot.mjs is
the reproducible one-shot: node build-snapshot.mjs <cdn-path>.

Sites updated in the same commit (all four surfaces need to advertise the
same version — silentmode.st/tools + /releases + /theseus + theseus.x
were still linking 0.15). APK also mirrored to bns/silentmode/ so
silentmode.bch/ariadne-v0.16.apk serves the same bytes.

Release: ariadne-v0.16.apk sha256
fa58aa7642319faaa6b23f0f0a46c0adad2ce1f3c5957f4d527ac09241b76574
2026-09-12 19:51:00 +02:00
Local Dev
79e1bd163d site: bump Ariadne mobile to 0.15 across all download pages + add /theseus
Old links pointed users at ariadne-v0.11.apk from three separate pages
while the in-app auto-updater was already pulling 0.15. New downloaders
got 4 versions behind.

- site-theseus-x/index.html — v0.11 → v0.15, hash updated, meta noting
  in-app auto-update. Sia-uploaded to bns/theseus/ so theseus.x reflects
  it now.
- site/releases/index.html — bumps the Ariadne row from 0.11 to 0.15
  with the new hash and a release note covering the DOWNLOADING/READY/
  RETRY chip states shipped in 0.15.
- site/tools/index.html — same v0.11 → v0.15 bump. Also retitled from
  "Theseus — Silent Mode" / "Theseus — the browsers" to "Tools — Silent
  Mode" / "Silent Mode tools" because the page actually lists every
  client (Theseus Win + Android, Ariadne extension, navigate.st relay,
  Ariadne standalone Windows resolver) — a tools directory, not a
  Theseus-dedicated page. Intro now points at /theseus/ for the
  dedicated Theseus landing.
- site/theseus/ NEW — clearnet mirror of theseus.x. Same page, retitled
  "Theseus Navigator — Silent Mode" with canonical URL pointing at
  silentmode.st/theseus/. Users on the resolver reach theseus.x for the
  same content trustlessly; the /theseus/ path is the always-reachable
  fallback with a real cert. Also pushes the APK itself to
  bns/silentmode/ so silentmode.bch/ariadne-v0.15.apk works too
  (dl.silentmode.st and silentmode.bch now serve the same bytes with
  identical SHA-256).
2026-09-12 01:56:40 +02:00
Local Dev
d6c1f63043 site: cache-bust shared.css (?v=20260910) so the logo rule reaches cached browsers
Browsers held a stale shared.css (no Cache-Control on .css, weeks-old
Last-Modified → long heuristic freshness), so the .brand .logo rule added
on 2026-09-07 never applied for returning visitors and the brand wrapped
onto its own nav row on every page except Hephaestus. All 13 pages now
link shared.css?v=YYYYMMDD; bump it on every shared.css change (GOTCHAS).
2026-09-10 00:42:51 +02:00
Local Dev
089805c498 site: fix Hephaestus nav wrap; logo + OG tags on tools and releases pages
hephaestus/index.html inlines its own nav CSS instead of loading shared.css,
so the injected logo SVG had no size rule and rendered at 300x150, pushing
the brand onto its own row. Added the three .logo rules to its inline style.
tools/ and releases/ were parked during the 0.3.18 ship; now carry the same
inline logo and Open Graph tags as the rest of the site.
2026-09-10 00:32:01 +02:00
Local Dev
9e6af78e11 site: publish Theseus 0.3.45 — manifest entry, release page, tools page 2026-09-10 00:23:14 +02:00