Skip to content

Commit 5e6057d

Browse files
the landing page stops naming a version it cannot keep up with
A number beside the button is a promise to rebuild the site on every release, and the site had already broken it once -- v2.12.19 sat there for 30 hours after v3.0.1 shipped. Removing the label is cheaper than keeping it honest: the button says what it does, latest/ decides which bytes, and nothing on the page can drift out of date. The stamping code and the runtime label refresh go with it. The manifest is still fetched -- /get/ bakes it for the picker, and the count note still compares the catalogue against what the release publishes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 2e9778d commit 5e6057d

3 files changed

Lines changed: 30 additions & 34 deletions

File tree

website/README.md

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -206,17 +206,22 @@ resolve pinned URLs from the manifest, because reproducible installs are
206206
what make bug reports correlatable (`publish.py`, "Never publish a mutable
207207
`latest/<Package>.tox`").
208208

209-
Only the visible version **label** is stamped at build time, read from the
210-
rolling manifest at
211-
`https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/manifest.json`.
212-
A stale label is cosmetic: it sits next to a download that is still
213-
correct. Rebuild after a release if you want the number to match.
214-
215-
The page also tries to refresh label and hrefs at runtime, but **that fetch
216-
is currently blocked**: neither the r2.dev bucket nor
217-
`storage.functionstr.com` sends an `Access-Control-Allow-Origin` header.
218-
Enabling CORS on the bucket would make the label self-correcting and would
219-
upgrade the hrefs from `latest/` to the pinned release in the browser.
209+
**The landing page carries no version number at all** — the buttons say
210+
"Get FNSTools", not "Get FNSTools v3.0.1". Nothing release-shaped is
211+
stamped into it, so there is no number that can go stale and no reason to
212+
rebuild the site when a release ships.
213+
214+
`/get/` bakes the published manifest (it carries the `rails` hashes), but
215+
that is display data: the paste script it hands you re-fetches the rolling
216+
manifest *at paste time* from inside TouchDesigner via `requests`, and
217+
resolves every artifact and hash from that. A `/get/` page built months ago
218+
still installs the current release; only the picker's package list can lag.
219+
220+
The page also tries to refresh hrefs at runtime, but **that fetch is
221+
blocked**: neither the r2.dev bucket nor `storage.functionstr.com` sends an
222+
`Access-Control-Allow-Origin` header. Enabling CORS would let the browser
223+
upgrade hrefs from `latest/` to the pinned release, and would keep the
224+
picker's list current between deploys.
220225

221226
The bootstrap artifact is `FNSTools.tox`, renamed from
222227
`FunctionStore_tools_2025.tox` in the v3.0.0 redesign. The filename is a

website/index.html

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@
349349
<a href="#credits">Credits</a>
350350
<a href="https://patreon.com/function_store" target="_blank" rel="noopener">Patreon</a>
351351
<a class="btn btn-secondary" href="https://github.com/function-store/FunctionStore_tools" target="_blank" rel="noopener">GitHub</a>
352-
<a class="btn btn-primary js-fns-download" href="https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/latest/FNSTools.tox" download>Get FNSTools<span class="js-fns-ver">v3.0.1</span></a>
352+
<a class="btn btn-primary js-fns-download" href="https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/latest/FNSTools.tox" download>Get FNSTools →</a>
353353
</nav>
354354
</div>
355355
</header>
@@ -364,7 +364,7 @@ <h1 class="hero-title">TouchDesigner,<br />minus the busywork.</h1>
364364
Take the whole toolkit or pick the three tools you actually want.
365365
</p>
366366
<div class="hero-cta">
367-
<a class="btn btn-primary btn-lg js-fns-download" href="https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/latest/FNSTools.tox" download>Get FNSTools<span class="js-fns-ver">v3.0.1</span></a>
367+
<a class="btn btn-primary btn-lg js-fns-download" href="https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/latest/FNSTools.tox" download>Get FNSTools →</a>
368368
<a class="btn btn-secondary btn-lg" href="/docs/">Read the docs</a>
369369
</div>
370370
<ul class="hero-meta">
@@ -402,7 +402,7 @@ <h3>Drop one <code>.tox</code></h3>
402402
arrives empty — it carries the installer, the updater and nothing else yet.
403403
The container you drop <em>is</em> the install target.
404404
</p>
405-
<a class="btn btn-primary js-fns-download" href="https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/latest/FNSTools.tox" download>Download<span class="js-fns-ver">v3.0.1</span></a>
405+
<a class="btn btn-primary js-fns-download" href="https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/latest/FNSTools.tox" download>Download</a>
406406
<p class="path-note">Already have a toolkit container? Grab the <a class="js-fns-installer" href="https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/latest/FNS_Installer.tox" download>bare installer</a> instead (~14 KB).</p>
407407
<p class="path-note">No download at all: <a href="/get/">pick your tools online</a> and paste one line into the Textport — it fetches and verifies everything itself.</p>
408408
</div>
@@ -861,7 +861,7 @@ <h2 style="font-size: clamp(28px, 3.6vw, 36px); font-weight: 700; letter-spacing
861861
One <code>.tox</code>, then pick what you need. It is free, and it takes about a minute.
862862
</p>
863863
<div class="hero-cta">
864-
<a class="btn btn-primary btn-lg js-fns-download" href="https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/latest/FNSTools.tox" download>Get FNSTools<span class="js-fns-ver">v3.0.1</span></a>
864+
<a class="btn btn-primary btn-lg js-fns-download" href="https://pub-8001b4bd92174be7a4544571b53f23da.r2.dev/fnstools/latest/FNSTools.tox" download>Get FNSTools →</a>
865865
<a class="btn btn-secondary btn-lg" href="/docs/">Read the docs</a>
866866
</div>
867867
</div>
@@ -918,7 +918,6 @@ <h2 style="font-size: clamp(28px, 3.6vw, 36px); font-weight: 700; letter-spacing
918918
setAll('.js-fns-installer', function (a) {
919919
a.href = base + '/' + m.release + '/' + INSTALLER;
920920
});
921-
setAll('.js-fns-ver', function (s) { s.textContent = ' ' + m.release; });
922921
if (m.packages && m.packages.length) {
923922
setAll('.js-fns-count', function (s) {
924923
s.textContent = String(m.packages.length);

website/tools/build-site.mjs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -416,17 +416,14 @@ ${items}
416416
</div>`;
417417
}).filter(Boolean).join('\n');
418418

419-
// The published release, stamped into the version LABEL at build time.
419+
// The published release. NOTHING release-shaped is stamped into the landing
420+
// page any more: the download hrefs point at the mutable latest/ aliases,
421+
// and the version text next to them is gone. A release therefore cannot
422+
// leave this page stale, and does not need a rebuild to stay correct.
420423
//
421-
// The hrefs themselves are no longer stamped: they point at the mutable
422-
// latest/ aliases, so a release cannot leave them serving stale bytes even
423-
// if nobody rebuilds. Only the visible "v3.0.1" text is stamped, and it is
424-
// cosmetic — a stale label sits next to a download that is still correct.
425-
//
426-
// The page also refreshes both at runtime, but that fetch cannot be relied
427-
// on: neither the r2.dev bucket nor storage.functionstr.com serves an
428-
// Access-Control-Allow-Origin header, so the browser blocks it. Enabling
429-
// CORS on the bucket is what would make the label self-correcting too.
424+
// Still fetched because /get/ bakes the published manifest (it carries the
425+
// `rails` hashes the paste script shows), and because the count note below
426+
// compares the catalogue against what the release actually publishes.
430427
async function publishedRelease() {
431428
// CI sets this. Without it the stamped release depends on what is published
432429
// at the moment the build runs, so a release cut between commit and CI would
@@ -465,20 +462,15 @@ if (fs.existsSync(landing)) {
465462
`$1${pages.length}$2`);
466463

467464
if (live) {
468-
// Only the label. The hrefs stay on latest/ -- see publishedRelease().
469-
// No leading space: the span sits inside a .btn, which is inline-flex
470-
// with its own 8px gap, so one would render as a double space.
471-
out = out.replace(/(<span class="js-fns-ver">)[^<]*(<\/span>)/g,
472-
`$1${live.release}$2`);
473-
console.log(`stamped label ${live.release} (${live.packages?.length ?? '?'} packages published)`);
465+
console.log(`release ${live.release} published (${live.packages?.length ?? '?'} packages)`);
474466
if (live.packages && live.packages.length !== pages.length) {
475467
console.log(`note: catalog has ${pages.length} packages but ${live.release} publishes ` +
476468
`${live.packages.length} — the site lists the catalog, so these align at the next publish`);
477469
}
478470
} else if (process.env.FNSTOOLS_NO_RELEASE_FETCH) {
479-
console.log('release fetch skipped — version label keeps whatever index.html already says');
471+
console.log('release fetch skipped — landing page carries no release, so nothing to keep');
480472
} else {
481-
console.log('note: could not reach the release manifest — version label keeps whatever index.html already says');
473+
console.log('note: could not reach the release manifest — /get/ falls back to the repo manifest');
482474
}
483475
fs.writeFileSync(landing, out);
484476
} else {

0 commit comments

Comments
 (0)