2026-09-07 21:06:25 +02:00
# site/ — gotchas
brand: PNG social/icon set + generator; Angie vhost tracked with slash-less rules
site/brand/social/ and site/brand/icon/ carry ready-to-upload PNGs at the
sizes X, LinkedIn, Facebook, Instagram, GitHub and PWA manifests want:
X header 1500x500, post 1200x675, LinkedIn 1584x396, Facebook 820x312,
Instagram 1080, avatars 400/1024, icons 512/192, favicons 64/32, plus the
Open Graph 1200x630 that every page already advertises. The brand page
gained a "Social media and icons" section with download links.
scripts/brand-assets.mjs renders the whole set from one HTML template via
scripts/render-html-png.cjs (Electron offscreen). Windows clamps even an
offscreen window to the work area, so captures taller than the screen are
rendered as strips and stitched on a canvas inside the page.
The VPS serves silentmode.st with Angie, not nginx (nginx.service is dead
there), so the URL rules now live in VPS/SilentMode/silentmode-st.angie.conf,
deployed and live. try_files lists $uri/index.html before $uri because a
bare $uri also matches a directory and would 301 to add the slash back.
GOTCHAS and the URL-scheme notes corrected accordingly.
2026-09-22 23:08:46 +02:00
Hand-authored static tree for **silentmode.st** . No build step. Served by Angie (nginx fork)
2026-09-07 21:06:25 +02:00
from `/opt/silent-mode/site/` on the VPS (ssh alias `silentmode` ), and mirrored
to Sia (`s3://bns/silentmode/` → `silentmode.bch` ) by the
`silentmode-sia-sync.timer` on the VPS every 5 minutes. Anything that lands in
`/opt/silent-mode/site/` reaches the `.bch` mirror on its own; you do not need to
run `sia-upload.js` for site files any more.
## Never `rsync --delete` (or blanket-overwrite) `site/` → the VPS
`/opt/silent-mode/site/` holds far more than this folder: `sirius-x/` ,
`deviant/` (the full Deviant site incl. `wallet/` , `artemision/` , `katalogos/` ,
`agora/` ), `apps/` , `code/` . Those are deployed from **other repos** . In
particular `site/deviant/` here is a **stale Aug-31 copy** ; the canonical
source is `D:\Dev\Deviant\site\deviant\` and the VPS already carries the newer
Sep-1 pages. Pushing this folder wholesale would roll them back.
Ship **individual files** : `scp site/<path> silentmode:/opt/silent-mode/site/<path>` .
## The release manifest lives in three places
- `https://dl.silentmode.st/releases-manifest.json` — canonical
(`/opt/silent-mode/dl/` ), what `releases.silentmode.bch` points at.
- `/opt/silent-mode/site/releases-manifest.json` — what `tools/index.html`
links as `../releases-manifest.json` , and what the Sia mirror syncs.
- `site/releases-manifest.json` — the committed source of both.
The ship checklist (`Ship Theseus …` commits) must scp it to **both** VPS
paths. It was missed for `site/` from 0.3.4 through 0.3.16 (found 2026-09-07):
the HTML pages were current while the JSON next to them still said 0.3.3.
releases: keep recent only, generate the page from the manifest; Hermes page catches up
The releases manifest had grown to 63 entries (every Theseus build back to
0.3.59) and the hand-edited page had drifted: Android was two versions
behind and Pithos was never listed. scripts/releases-page.mjs now trims the
manifest to recent versions per product (5 Theseus, 2 others) and rewrites
the page's release blocks from it. Consumers read only the first entry per
product, so nothing they see changes; older builds stay on Sia.
The Hermes subpage still said "designed, not built" and "MVP · desktop".
It now reflects what shipped: web messenger at hermes.x/messenger, three
sign-in paths incl. Theseus ID, three handle spellings, Nostr profiles,
vCard import, opt-in phone discovery, Ariadne's menu entry, and the planned
free sub-identity + Hermes TLDs (mainnet) as designed items.
2026-10-22 03:31:24 +03:00
**Keep it short, and generate the page from it.** Since 2026-10-22 the
manifest holds only recent versions (5 Theseus, 2 of everything else; the
policy table is in `scripts/releases-page.mjs` ) and `releases/index.html` 's
release blocks are generated from it. After adding a release to the manifest:
```
node scripts/releases-page.mjs # trims the manifest, rewrites the blocks
```
then scp `releases/index.html` + the manifest (both VPS paths). Do not hand-
edit the blocks; the next run overwrites them. Consumers (Theseus + Ariadne
updaters, `dl-latest.sh` ) read only the first entry per product id, so
trimming never changes what they see. Older builds live on Sia under
`dl-archive/` and every old checksum is in git history.
2026-09-07 21:06:25 +02:00
## Old Theseus builds fill the VPS disk
`scripts/theseus-vps-archive.sh <version>` moves everything older than N-1 to
Sia and deletes it from `/opt/silent-mode/dl/` . Run it after every ship; when
it is skipped the 48 GB disk climbs ~245 MB per release.
2026-09-10 00:42:51 +02:00
## Bump `shared.css?v=` whenever shared.css changes
brand: PNG social/icon set + generator; Angie vhost tracked with slash-less rules
site/brand/social/ and site/brand/icon/ carry ready-to-upload PNGs at the
sizes X, LinkedIn, Facebook, Instagram, GitHub and PWA manifests want:
X header 1500x500, post 1200x675, LinkedIn 1584x396, Facebook 820x312,
Instagram 1080, avatars 400/1024, icons 512/192, favicons 64/32, plus the
Open Graph 1200x630 that every page already advertises. The brand page
gained a "Social media and icons" section with download links.
scripts/brand-assets.mjs renders the whole set from one HTML template via
scripts/render-html-png.cjs (Electron offscreen). Windows clamps even an
offscreen window to the work area, so captures taller than the screen are
rendered as strips and stitched on a canvas inside the page.
The VPS serves silentmode.st with Angie, not nginx (nginx.service is dead
there), so the URL rules now live in VPS/SilentMode/silentmode-st.angie.conf,
deployed and live. try_files lists $uri/index.html before $uri because a
bare $uri also matches a directory and would 301 to add the slash back.
GOTCHAS and the URL-scheme notes corrected accordingly.
2026-09-22 23:08:46 +02:00
Angie sends no `Cache-Control` for `.css` , so browsers cache `shared.css`
2026-09-10 00:42:51 +02:00
heuristically (10% of its age since `Last-Modified` ; it sat unchanged for
weeks, so returning visitors kept the old copy for days). When the logo rule
was added on 2026-09-07 every page except Hephaestus (inline nav CSS) showed
the brand wrapped onto its own row for anyone with a cached sheet. Every page
now links `shared.css?v=YYYYMMDD` ; change the value on every page (one `sed` )
each time the file changes. Same applies to the Sia mirror via the gateway.
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
## URLs have no trailing slash; links are site-root-relative
Since 2026-09-20 the canonical URL of every silentmode.st page is `/tools` ,
brand: PNG social/icon set + generator; Angie vhost tracked with slash-less rules
site/brand/social/ and site/brand/icon/ carry ready-to-upload PNGs at the
sizes X, LinkedIn, Facebook, Instagram, GitHub and PWA manifests want:
X header 1500x500, post 1200x675, LinkedIn 1584x396, Facebook 820x312,
Instagram 1080, avatars 400/1024, icons 512/192, favicons 64/32, plus the
Open Graph 1200x630 that every page already advertises. The brand page
gained a "Social media and icons" section with download links.
scripts/brand-assets.mjs renders the whole set from one HTML template via
scripts/render-html-png.cjs (Electron offscreen). Windows clamps even an
offscreen window to the work area, so captures taller than the screen are
rendered as strips and stitched on a canvas inside the page.
The VPS serves silentmode.st with Angie, not nginx (nginx.service is dead
there), so the URL rules now live in VPS/SilentMode/silentmode-st.angie.conf,
deployed and live. try_files lists $uri/index.html before $uri because a
bare $uri also matches a directory and would 301 to add the slash back.
GOTCHAS and the URL-scheme notes corrected accordingly.
2026-09-22 23:08:46 +02:00
`/sirius` , `/choose/free` — Angie 301s `/tools/` → `/tools` and serves
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
`/tools/index.html` from it. Consequences for authors:
- A page at `/x/index.html` is viewed at `/x` , so the browser's directory is `/` .
Write links **relative to the site root** : `sirius` , `theseus/img/foo.png` ,
`shared.css?v=…` , `favicon.svg` , and `./` for home. Never `../sirius/` (goes
above the root) and never `img/foo.png` (resolves to `/img/` ).
- Site-root-relative also works under the BNS gateway, which injects
`<base href="/bns/silentmode.bch/">` on every page. Root-absolute (`/sirius` )
breaks there, so use it only for the sub-sites listed below.
- Nested pages (`choose/free` …) use root-absolute links without a trailing slash.
- `scripts/serve-site.mjs` applies the same rules locally; check with
`node scratch/linkcheck` logic: resolve each link from `/` and require a file,
`<path>.html` , or `<path>/index.html` .
**Sub-sites deployed from other repos keep their trailing-slash URLs** because
their asset paths are relative: `deviant/` , `sirius-x/` , `theseus-x/` ,
brand: PNG social/icon set + generator; Angie vhost tracked with slash-less rules
site/brand/social/ and site/brand/icon/ carry ready-to-upload PNGs at the
sizes X, LinkedIn, Facebook, Instagram, GitHub and PWA manifests want:
X header 1500x500, post 1200x675, LinkedIn 1584x396, Facebook 820x312,
Instagram 1080, avatars 400/1024, icons 512/192, favicons 64/32, plus the
Open Graph 1200x630 that every page already advertises. The brand page
gained a "Social media and icons" section with download links.
scripts/brand-assets.mjs renders the whole set from one HTML template via
scripts/render-html-png.cjs (Electron offscreen). Windows clamps even an
offscreen window to the work area, so captures taller than the screen are
rendered as strips and stitched on a canvas inside the page.
The VPS serves silentmode.st with Angie, not nginx (nginx.service is dead
there), so the URL rules now live in VPS/SilentMode/silentmode-st.angie.conf,
deployed and live. try_files lists $uri/index.html before $uri because a
bare $uri also matches a directory and would 301 to add the slash back.
GOTCHAS and the URL-scheme notes corrected accordingly.
2026-09-22 23:08:46 +02:00
`hephaestus.x/` , `fly.x/` , `code/` . The list lives in the Angie vhost
(`location ~ ^/(deviant|sirius-x|theseus-x|…)` in `VPS/SilentMode/silentmode-st.angie.conf` ) and in `serve-site.mjs` ; add
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
any new foreign mirror to both.
## `/theseus` vs `/theseus-x/` (and `/sirius` vs `/sirius-x/`)
`/theseus` and `/sirius` are silentmode.st pages with the shared header that
link out to the sovereign sites. The sovereign sites' VPS mirrors are
`/theseus-x/` and `/sirius-x/` , deployed by `scripts/mirror-bcnr-site.sh` from
`site-theseus-x/` and `site-sirius-x/` . Do not mirror a sovereign site onto
`/theseus/` or `/sirius/` again — that is what made the nav tabs swap headers.
`/tools` is the overview/docs page (sites, sovereign twins, other clients,
endpoints); Theseus downloads live on `/theseus` .
2026-09-07 21:06:25 +02:00
## Pages that are not silentmode.st pages
`hephaestus.x/` is the landing for the `.x` name and is served from Sia via the
gateway (`navigate.st/bns/hephaestus.x/` ); the copy under `/opt/silent-mode/site/`
is just parity. `choose/` has no top nav on purpose.
2026-09-08 12:43:30 +02:00
## CORS on `/js/*.js` — required for BCNR pages
The shared bundles (`bns-register.js` , `libauth.js` , `wizardconnect.js` ) live
under `silentmode.st/js/` and are `import` ed cross-origin by pages served on
their own origin: `sirius.x` , `theseus.x` , any BCNR-served site opened in
Theseus (origin `bns://<name>` ). Without CORS the browser refuses to load the
module and every wallet/register/mint flow silently breaks — the launcher
click does nothing.
brand: PNG social/icon set + generator; Angie vhost tracked with slash-less rules
site/brand/social/ and site/brand/icon/ carry ready-to-upload PNGs at the
sizes X, LinkedIn, Facebook, Instagram, GitHub and PWA manifests want:
X header 1500x500, post 1200x675, LinkedIn 1584x396, Facebook 820x312,
Instagram 1080, avatars 400/1024, icons 512/192, favicons 64/32, plus the
Open Graph 1200x630 that every page already advertises. The brand page
gained a "Social media and icons" section with download links.
scripts/brand-assets.mjs renders the whole set from one HTML template via
scripts/render-html-png.cjs (Electron offscreen). Windows clamps even an
offscreen window to the work area, so captures taller than the screen are
rendered as strips and stitched on a canvas inside the page.
The VPS serves silentmode.st with Angie, not nginx (nginx.service is dead
there), so the URL rules now live in VPS/SilentMode/silentmode-st.angie.conf,
deployed and live. try_files lists $uri/index.html before $uri because a
bare $uri also matches a directory and would 301 to add the slash back.
GOTCHAS and the URL-scheme notes corrected accordingly.
2026-09-22 23:08:46 +02:00
The vhost on the VPS is **Angie** at `/etc/angie/http.d/silentmode-st.conf` (nginx is installed but dead there; `/etc/nginx/sites-enabled/silentmode-st` is ignored). It is tracked at `VPS/SilentMode/silentmode-st.angie.conf` ; deploy with scp + `angie -t && systemctl reload angie` . It MUST carry:
2026-09-08 12:43:30 +02:00
```
location ~ ^/js/.*\.js$ {
add_header Cache-Control "no-cache, must-revalidate" always;
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
}
```
Added 2026-09-08 after Theseus reported "CORS blocked" from origin
brand: PNG social/icon set + generator; Angie vhost tracked with slash-less rules
site/brand/social/ and site/brand/icon/ carry ready-to-upload PNGs at the
sizes X, LinkedIn, Facebook, Instagram, GitHub and PWA manifests want:
X header 1500x500, post 1200x675, LinkedIn 1584x396, Facebook 820x312,
Instagram 1080, avatars 400/1024, icons 512/192, favicons 64/32, plus the
Open Graph 1200x630 that every page already advertises. The brand page
gained a "Social media and icons" section with download links.
scripts/brand-assets.mjs renders the whole set from one HTML template via
scripts/render-html-png.cjs (Electron offscreen). Windows clamps even an
offscreen window to the work area, so captures taller than the screen are
rendered as strips and stitched on a canvas inside the page.
The VPS serves silentmode.st with Angie, not nginx (nginx.service is dead
there), so the URL rules now live in VPS/SilentMode/silentmode-st.angie.conf,
deployed and live. try_files lists $uri/index.html before $uri because a
bare $uri also matches a directory and would 301 to add the slash back.
GOTCHAS and the URL-scheme notes corrected accordingly.
2026-09-22 23:08:46 +02:00
`bns://sirius.x` . If a future vhost rebuild drops the `add_header
2026-09-08 12:43:30 +02:00
Access-Control-*` lines, every non-silentmode.st page that imports the bundle
starts failing again with "No 'Access-Control-Allow-Origin' header".