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
This commit is contained in:
Local Dev 2026-09-28 22:57:59 +02:00
parent b0569c92d8
commit 30a4932221
2 changed files with 7 additions and 7 deletions

View file

@ -22,14 +22,14 @@
{
"id": "ariadne-resolver",
"product": "Ariadne Resolver (Windows)",
"version": "0.1.8",
"version": "0.1.9",
"date": "2026-09-28",
"platform": "win-x64",
"signed": false,
"signingAuthority": null,
"changes": "BNS names with an `ip` record and an on-chain `tls` fingerprint pin now load cleanly in every browser -- game.x, hephaestus.x and any other site that pins its origin cert. Previously the daemon returned the raw `ip` and browsers hit the site's own server directly; if that server's cert was not browser-trusted (which is the whole point of publishing an on-chain pin), users got ERR_CERT_AUTHORITY_INVALID or SEC_ERROR_UNKNOWN_ISSUER. 0.1.8 answers DNS with 127.0.0.1 whenever `ip`+`tls` are both present, terminates the browser's TLS with a locally-trusted leaf, and reverse-proxies to the origin over HTTPS -- validating the origin cert against the on-chain fingerprint (same algorithm Theseus uses in main.js:pinnedHttpsGet, cert.fingerprint256 lower-case, colons stripped). Names with just `ip` (no pin) keep direct routing unchanged. Also carries 0.1.7 (runtime-switchable collision policy via C:\\ProgramData\\Ariadne\\policy.json) and 0.1.6 (self-syncing routing + CA). Upgrades in place.",
"changes": "Bare BNS names in the address bar now work in Chrome and Edge. The daemon exposes a local search shim at http://127.0.0.1/search?q=%s -- point your browser's default search engine at it. Typing `ariadne.x` (no scheme), which Chromium would otherwise treat as a search query because `.x` isn't in ICANN's known-TLD list, is 301'd to https://ariadne.x/; anything with whitespace, or a TLD the local CA isn't constrained to, is 302'd to your fallback (DuckDuckGo by default; set `searchFallback` in ariadne.config.json to any `https://engine.tld/?q=` URL to change it). Paths are preserved -- `ariadne.x/foo` goes to `https://ariadne.x/foo`. Works offline: no network hop through navigate.st, everything decided locally against the CA's permitted-TLD set. Includes 0.1.8 (pinned-origin proxy for `ip`+`tls` names) and 0.1.7 (runtime-switchable collision policy). Upgrades in place.",
"files": {
"AriadneResolver-Setup-0.1.8.exe": "47450ad4555beb04fe3b90ae5f658dc2932061d011ada9a2fb507471e2f0a0cb"
"AriadneResolver-Setup-0.1.9.exe": "3b973e0ae584113ad776c756b16b895fd0dfb217a02bfae6376c5abb48f9a77c"
}
},
{

View file

@ -72,12 +72,12 @@
</div>
<div class="rel">
<h2>Ariadne Resolver — Windows <span style="color:var(--acid)">0.1.8</span></h2>
<div class="meta">Windows 64-bit · unsigned · bundled Node runtime · 2026-09-28 · <b>0.1.8 — pinned-origin proxy for `ip`+`tls` names</b> — BNS names that publish an <code style="display:inline">ip</code> record with an on-chain <code style="display:inline">tls</code> fingerprint pin (game.x, hephaestus.x, and any other site that pins its origin cert) now load cleanly in every browser. Before 0.1.8 the daemon returned the raw <code style="display:inline">ip</code> and browsers hit the origin directly; if that origin's cert was not browser-trusted (which is the whole point of publishing an on-chain pin) users got <code style="display:inline">ERR_CERT_AUTHORITY_INVALID</code> / <code style="display:inline">SEC_ERROR_UNKNOWN_ISSUER</code>. 0.1.8 answers DNS with <code style="display:inline">127.0.0.1</code> whenever <code style="display:inline">ip</code>+<code style="display:inline">tls</code> are both present, terminates the browser's TLS with a locally-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 in <code style="display:inline">pinnedHttpsGet</code>. Names with just <code style="display:inline">ip</code> (no pin) keep direct routing unchanged, so nothing regresses. Includes 0.1.7 (runtime-switchable collision policy) and 0.1.6 (self-syncing routing + CA). Upgrades in place.</div>
<h2>Ariadne Resolver — Windows <span style="color:var(--acid)">0.1.9</span></h2>
<div class="meta">Windows 64-bit · unsigned · bundled Node runtime · 2026-09-28 · <b>0.1.9 — bare BNS names in the address bar</b> — Typing <code style="display:inline">ariadne.x</code> (no scheme) into Chrome or Edge would previously send you to a search engine, because <code style="display:inline">.x</code> isn't on ICANN's known-TLD list and Chromium's omnibox falls back to search on unknown TLDs. 0.1.9 adds a local search shim at <code style="display:inline">http://127.0.0.1/search?q=%s</code>. Point your browser's default search engine at it: BNS-shaped queries (<code style="display:inline">&lt;label&gt;.&lt;permitted-tld&gt;</code>) get 301'd to <code style="display:inline">https://…/</code>; anything with whitespace, or a TLD outside the CA's constrained set, gets 302'd to your fallback (DuckDuckGo by default; change with <code style="display:inline">searchFallback</code> in <code style="display:inline">ariadne.config.json</code>). Paths preserved. Zero network hop through navigate.st — everything decided locally. Includes 0.1.8 (pinned-origin proxy for <code style="display:inline">ip</code>+<code style="display:inline">tls</code> names). Upgrades in place.</div>
<div class="file">
<div class="n"><a href="https://dl.silentmode.st/AriadneResolver-Setup-0.1.8.exe">AriadneResolver-Setup-0.1.8.exe</a> — ~24 MB</div>
<code>47450ad4555beb04fe3b90ae5f658dc2932061d011ada9a2fb507471e2f0a0cb</code>
<div class="n"><a href="https://dl.silentmode.st/AriadneResolver-Setup-0.1.9.exe">AriadneResolver-Setup-0.1.9.exe</a> — ~24 MB</div>
<code>3b973e0ae584113ad776c756b16b895fd0dfb217a02bfae6376c5abb48f9a77c</code>
</div>
</div>