site-theseus-x: stable /latest/ download links, current versions, theseus.x/dl

The Download buttons pointed at TheseusNavigator-Setup-0.3.44.exe, which the
ship process had long since archived off dl.silentmode.st — a 404 for anyone
arriving from theseus.x. Buttons now use dl.silentmode.st/latest/<name>,
which the download host redirects to the current versioned file, so the page
cannot go stale again. Versions and hashes are refreshed from the releases
manifest at load (the baked-in 0.3.48 / 0.18 values are the fallback), and
theseus.x/dl is a memorable landing that carries only the stable links.
This commit is contained in:
Local Dev 2026-09-16 22:30:51 +02:00
parent 74617748aa
commit b17eb01f86
2 changed files with 90 additions and 13 deletions

46
dl/index.html Normal file
View file

@ -0,0 +1,46 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>theseus.x/dl — downloads</title>
<meta name="robots" content="noindex">
<link rel="icon" href="/assets/favicon.svg" type="image/svg+xml">
<style>
:root{--bg:#0b0e14;--panel:#141a24;--line:rgba(255,255,255,.09);--ink:#e7eaf1;--mut:#8b98a9;--acid:#d6ff3d}
*{box-sizing:border-box}
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;display:grid;place-items:center;padding:1.2rem}
a{color:var(--acid)}
.card{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:1.6rem 1.8rem;max-width:560px;width:100%}
h1{margin:0 0 .3rem;font-size:1.5rem}
.mut{color:var(--mut);font-size:.95rem;margin:0 0 1.2rem}
.row{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.7rem 0;border-top:1px solid var(--line)}
.row b{display:block}.row small{color:var(--mut)}
.btn{display:inline-block;padding:.5rem .9rem;border-radius:10px;background:var(--acid);color:#0b0e14;font-weight:650;text-decoration:none;white-space:nowrap}
.btn.ghost{background:transparent;color:var(--ink);border:1px solid var(--line)}
.foot{margin-top:1.2rem;font-size:.9rem;color:var(--mut)}
</style>
</head>
<body>
<div class="card">
<h1>Downloads</h1>
<p class="mut">These links always point at the current build. Verify the SHA-256 on <a href="/#verify">theseus.x</a> before running.</p>
<div class="row"><div><b>Theseus Navigator for Windows</b><small>installer · v<span data-live="theseus-version">0.3.48</span></small></div><a class="btn" href="https://dl.silentmode.st/latest/TheseusNavigator-Setup.exe">Installer</a></div>
<div class="row"><div><b>Theseus Navigator, portable</b><small>single .exe, no install</small></div><a class="btn ghost" href="https://dl.silentmode.st/latest/TheseusNavigator-portable.exe">Portable</a></div>
<div class="row"><div><b>Ariadne for Android</b><small>APK · v<span data-live="android-version">0.18</span></small></div><a class="btn ghost" href="https://dl.silentmode.st/latest/ariadne.apk">APK</a></div>
<div class="row"><div><b>Ariadne's Thread for Windows</b><small>system-wide resolver, installed by Theseus's setup by default</small></div><a class="btn ghost" href="https://dl.silentmode.st/latest/AriadneResolver-Setup.exe">Installer</a></div>
<p class="foot">Machine-readable: <a href="https://dl.silentmode.st/releases-manifest.json">releases-manifest.json</a> · all releases: <a href="https://silentmode.st/releases/">silentmode.st/releases</a></p>
</div>
<script>
(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 g = (id) => (m.releases || []).find((x) => x.id === id);
const set = (k, v) => { if (v) document.querySelectorAll('[data-live="' + k + '"]').forEach((el) => el.textContent = v); };
set("theseus-version", g("theseus-navigator")?.version); set("android-version", g("ariadne-android")?.version);
} catch {}
})();
</script>
</body>
</html>

View file

@ -224,7 +224,7 @@
<section id="download">
<h2>Download</h2>
<p class="lede">Latest is <b>0.3.15</b>. Windows installer + portable, and an
<p class="lede">Latest is <b data-live="theseus-version">0.3.48</b>. Windows installer + portable, and an
Android build (Ariadne mobile — same brand, phone form factor).</p>
<div class="plats">
@ -234,14 +234,14 @@
<h3>Theseus for Windows</h3>
<p>Full-window desktop browser with Tor toggle and the multi-source BNS
warm-start.</p>
<div class="meta">v0.3.44 · installer ~118 MB (bundles Ariadne's Thread) · portable ~117 MB · unsigned</div>
<div class="meta">v<span data-live="theseus-version">0.3.48</span> · installer ~99 MB · portable ~99 MB · unsigned</div>
<div class="btns">
<a class="btn acid" href="https://dl.silentmode.st/TheseusNavigator-Setup-0.3.44.exe">Installer</a>
<a class="btn ghost" href="https://dl.silentmode.st/TheseusNavigator-0.3.44-portable.exe">Portable .exe</a>
<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">
<div class="h"><b>Installer</b><code>6dd510184a3c1488ac93b7fd0194ddd239fe4e31083705afcc3c7bde0f530107</code></div>
<div class="h"><b>Portable</b><code>346be24804db0d8a00cd76a2c89cd3bd2b9af17e5505b25ec326f30c3ceec6ad</code></div>
<div class="h"><b>Installer</b><code data-live="theseus-setup-sha">ce5064decdd796e560e11f161d2e9271d3cd7de3bd231c942ebc2de407d0c9f7</code></div>
<div class="h"><b>Portable</b><code data-live="theseus-portable-sha">e758c1f9a9ec376c029856fd81ed3cee4b2c848a4cf9f94d07ed74f2096ad621</code></div>
</div>
</div>
@ -250,12 +250,12 @@
<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">v0.17 · ~146 KB · self-signed release key · in-app auto-update</div>
<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/ariadne-v0.17.apk">Download APK</a>
<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>8a655081782ecc17a50a7fcd67c28625ccb0c905cf6b583bdd703a128b2b9b10</code></div>
<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>
@ -263,7 +263,9 @@
</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 machine-readable
— 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>
@ -276,13 +278,13 @@
<code>releases.silentmode.bch</code> pointer. Three independent surfaces —
they should all agree.</p>
<pre>Windows PowerShell:
Get-FileHash TheseusNavigator-Setup-0.3.15.exe -Algorithm SHA256
Get-FileHash <span data-live="theseus-setup-file">TheseusNavigator-Setup-0.3.48.exe</span> -Algorithm SHA256
macOS / Linux:
sha256sum TheseusNavigator-Setup-0.3.15.exe
sha256sum <span data-live="theseus-setup-file">TheseusNavigator-Setup-0.3.48.exe</span>
Expected:
5452a34f211176cf04b7ea77a70fb838f0031b6ea0faed2cd270eae989b20c60</pre>
<span data-live="theseus-setup-sha">ce5064decdd796e560e11f161d2e9271d3cd7de3bd231c942ebc2de407d0c9f7</span></pre>
</section>
<footer>
@ -293,5 +295,34 @@ Expected:
</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 {}
})();
</script>
</body>
</html>