site: download buttons use dl.silentmode.st/latest/ links

The tools page and the Theseus page pointed at versioned files; the Theseus
page still linked 0.3.44, archived long ago, and showed 0.0.9 as the latest
version. Both now use the stable /latest/ redirects, and the Theseus page is
rebuilt from the theseus.x source (versions and hashes refreshed from the
releases manifest at load, current values baked in as fallback). The
releases ledger keeps versioned filenames, since each entry pairs a file
with its hash.
This commit is contained in:
Local Dev 2026-09-16 22:56:56 +02:00
parent cbb0f5fcfc
commit cdd2dc9ac4
2 changed files with 48 additions and 17 deletions

View file

@ -225,7 +225,7 @@
<section id="download"> <section id="download">
<h2>Download</h2> <h2>Download</h2>
<p class="lede">Latest is <b>0.0.9</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> Android build (Ariadne mobile — same brand, phone form factor).</p>
<div class="plats"> <div class="plats">
@ -235,14 +235,14 @@
<h3>Theseus for Windows</h3> <h3>Theseus for Windows</h3>
<p>Full-window desktop browser with Tor toggle and the multi-source BNS <p>Full-window desktop browser with Tor toggle and the multi-source BNS
warm-start.</p> 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"> <div class="btns">
<a class="btn acid" href="https://dl.silentmode.st/TheseusNavigator-Setup-0.3.44.exe">Installer</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/TheseusNavigator-0.3.44-portable.exe">Portable .exe</a> <a class="btn ghost" href="https://dl.silentmode.st/latest/TheseusNavigator-portable.exe">Portable .exe</a>
</div> </div>
<div class="hashes" id="hashes-win"> <div class="hashes" id="hashes-win">
<div class="h"><b>Installer</b><code>6dd510184a3c1488ac93b7fd0194ddd239fe4e31083705afcc3c7bde0f530107</code></div> <div class="h"><b>Installer</b><code data-live="theseus-setup-sha">ce5064decdd796e560e11f161d2e9271d3cd7de3bd231c942ebc2de407d0c9f7</code></div>
<div class="h"><b>Portable</b><code>346be24804db0d8a00cd76a2c89cd3bd2b9af17e5505b25ec326f30c3ceec6ad</code></div> <div class="h"><b>Portable</b><code data-live="theseus-portable-sha">e758c1f9a9ec376c029856fd81ed3cee4b2c848a4cf9f94d07ed74f2096ad621</code></div>
</div> </div>
</div> </div>
@ -251,12 +251,12 @@
<h3>Ariadne for Android</h3> <h3>Ariadne for Android</h3>
<p>Phone-sized browser with tap-to-verify provenance — the block and <p>Phone-sized browser with tap-to-verify provenance — the block and
transaction behind each name are one tap away.</p> transaction behind each name are one tap away.</p>
<div class="meta">v0.18 · ~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"> <div class="btns">
<a class="btn acid" href="https://dl.silentmode.st/ariadne-v0.18.apk">Download APK</a> <a class="btn acid" href="https://dl.silentmode.st/latest/ariadne.apk">Download APK</a>
</div> </div>
<div class="hashes" id="hashes-android"> <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 class="h"><b>Signing key</b><code>46ebbbe5dc73148d66410fd0337b1e6683472128c983e8e2578200b9e3ca548c</code></div>
</div> </div>
</div> </div>
@ -264,7 +264,9 @@
</div> </div>
<div class="note"><b>Nothing is signed by an authority your device trusts</b> <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 manifest is at
<a href="https://dl.silentmode.st/releases-manifest.json">releases-manifest.json</a>.</div> <a href="https://dl.silentmode.st/releases-manifest.json">releases-manifest.json</a>.</div>
</section> </section>
@ -277,13 +279,13 @@
<code>releases.silentmode.bch</code> pointer. Three independent surfaces — <code>releases.silentmode.bch</code> pointer. Three independent surfaces —
they should all agree.</p> they should all agree.</p>
<pre>Windows PowerShell: <pre>Windows PowerShell:
Get-FileHash TheseusNavigator-Setup-0.0.9.exe -Algorithm SHA256 Get-FileHash <span data-live="theseus-setup-file">TheseusNavigator-Setup-0.3.48.exe</span> -Algorithm SHA256
macOS / Linux: macOS / Linux:
sha256sum TheseusNavigator-Setup-0.0.9.exe sha256sum <span data-live="theseus-setup-file">TheseusNavigator-Setup-0.3.48.exe</span>
Expected: Expected:
5452a34f211176cf04b7ea77a70fb838f0031b6ea0faed2cd270eae989b20c60</pre> <span data-live="theseus-setup-sha">ce5064decdd796e560e11f161d2e9271d3cd7de3bd231c942ebc2de407d0c9f7</span></pre>
</section> </section>
<footer> <footer>
@ -294,5 +296,34 @@ Expected:
</div> </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> </body>
</html> </html>

View file

@ -123,8 +123,8 @@
macOS and Linux not yet packaged.</p> macOS and Linux not yet packaged.</p>
<div class="meta">v0.3.48 · installer ~99 MB · portable ~99 MB · unsigned</div> <div class="meta">v0.3.48 · installer ~99 MB · portable ~99 MB · unsigned</div>
<div class="buttons"> <div class="buttons">
<a class="btn acid" href="https://dl.silentmode.st/TheseusNavigator-Setup-0.3.48.exe">Installer</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/TheseusNavigator-0.3.48-portable.exe">Portable .exe</a> <a class="btn ghost" href="https://dl.silentmode.st/latest/TheseusNavigator-portable.exe">Portable .exe</a>
</div> </div>
<div class="verifybox"> <div class="verifybox">
<div class="lbl">SHA-256 — verify before running</div> <div class="lbl">SHA-256 — verify before running</div>
@ -140,7 +140,7 @@
and transaction behind each name are one tap away.</p> and transaction behind each name are one tap away.</p>
<div class="meta">v0.18 · ~146 KB · self-signed release key · in-app auto-update</div> <div class="meta">v0.18 · ~146 KB · self-signed release key · in-app auto-update</div>
<div class="buttons"> <div class="buttons">
<a class="btn acid" href="https://dl.silentmode.st/ariadne-v0.18.apk">Download APK</a> <a class="btn acid" href="https://dl.silentmode.st/latest/ariadne.apk">Download APK</a>
</div> </div>
<div class="verifybox"> <div class="verifybox">
<div class="lbl">SHA-256 — verify before installing</div> <div class="lbl">SHA-256 — verify before installing</div>
@ -248,7 +248,7 @@
<div class="meta">Windows 64-bit · v0.1.2 · bundled Node runtime · unsigned build</div> <div class="meta">Windows 64-bit · v0.1.2 · bundled Node runtime · unsigned build</div>
</div> </div>
<div class="act"> <div class="act">
<a class="btn" href="https://dl.silentmode.st/AriadneResolver-Setup-0.1.2.exe">Installer</a> <a class="btn" href="https://dl.silentmode.st/latest/AriadneResolver-Setup.exe">Installer</a>
</div> </div>
<div class="hashes"> <div class="hashes">
<div style="color:var(--mut);font-size:12.5px">SHA-256 — verify before elevating:</div> <div style="color:var(--mut);font-size:12.5px">SHA-256 — verify before elevating:</div>