Commit graph

66 commits

Author SHA1 Message Date
Local Dev
6cbb43c18a Ship Theseus 0.3.4 3d6d3d6a (address-picker delete X, Enter picks highlight, URL bar override)
Setup    3d6d3d6aeacf482284707f50d129315d07a593e09b5d68af852abe5aa0ed4c92
Portable 6c8c5ef212bfccb377e17404e83a18cf2f09771d0eb3e0ec86a85587efdcfc9e

Three address-bar suggestion fixes.

Per-row ✕ delete on hover. Clicks on the X call address-forget instead
of address-pick; the row disappears optimistically in the picker and
main drops the entry from history + persists. Sender-URL gated to the
picker's own file:// origin.

Enter with a highlighted suggestion now navigates to THAT url. The
URL input handler tracks a pickerHasCursor flag that flips true on
ArrowDown/ArrowUp and false on any input; Enter with cursor forwards
to the picker's own submit path via addressCursor("enter") — before
this fix, Enter always ran goURL against the typed letters, which
submitted them as a web search instead of opening the selected url.

Address bar reliably shows the picked URL. onAddressPicked now arms
an overrideUrlBarUntil = now+1500ms flag; the onTabs handler treats
that window as "force write the url", bypassing the focus-guard that
was leaving the bar blank when blur() hadn't landed yet.

Deployed: scp + sia-upload of both trees, verified LIVE 0.3.4.
2026-09-02 04:28:54 +02:00
Local Dev
58712e77da site: add favicon link to every silentmode.st HTML page
Bulk-inserts <link rel="icon" type="image/svg+xml" href="/favicon.svg"> before
the </head> tag on every silentmode.st page that was missing it. All 36 site
HTML pages now advertise the chain-links favicon; browsers show it in tabs
and bookmarks across the whole umbrella site.

Pages touched (29): apps/, choose/*, deviant/* (7 pages under the parent
house), hephaestus/, hephaestus.x/* (9 chain-published mirror pages),
nav/ (redirect stub), register.html (redirect stub), sirius/,
sirius/register.html, store/ (redirect stub), tlds/.

Already had favicon from earlier passes (7): index.html, brand/,
tools/, prometheus/, helios/, hermes/, releases/.

Line-ending preservation: choose/index.html and sirius/register.html were
originally stored with CRLF endings; the plain Python read/write path
normalized them to LF and produced a noisy diff. Both files re-serialized as
CRLF before the favicon insert to keep the diff to +1 line each.

Deploy: rsync-equivalent tar-pipe to /opt/silent-mode/site/, plus per-file scp
for the two CRLF-corrected files. Verified live: 7 spot-checked URLs each
report exactly one <link rel="icon"> in served HTML.
2026-08-31 21:43:25 +02:00
Local Dev
45ecfbe4fa Ship Theseus 0.3.3 e016d665 (fix tab menu clip + always-on bookmarks + real tab groups)
Setup    e016d66543976b7a4df5ac16033319d59cb0f418e54d7e838ef16de274525a83
Portable b9881a62c39ecfe22644611f5aa16a48f32f97f9ec5751b5888ccbd870338c3e

Three 0.3.2 misses fixed:

Tab context menu was clipped by the chrome view's fixed height — the
menu rendered with position:fixed inside a WebContentsView whose
bottom edge stops at CHROME_H, so items below the tab strip weren't
visible. New growChromeForMenu() measures every open menu's bounding
box and calls T.setChromeHeight(needed) so main.js grows the chrome
view to fit; closeAllMenus() calls syncHeight() to restore.

Bookmarks bar was hidden on every tab except Home, so Add-to-
Bookmarks had no on-screen feedback. Now always visible.

Tab groups now actually cluster. Assigning a color to a tab moves it
adjacent to its group-mates in the tabs array (main-side splice, no
render-only trick). The chrome renderer inserts a colored group chip
before the first tab of each group; clicking the chip toggles a
per-group collapsed state (in-memory, resets on relaunch). Collapsed
groups hide their member tabs and the chip shows the member count.
Expanded groups keep the per-tab top color stripe from 0.3.2 so the
cluster reads as one visual block.

Deployed: scp + sia-upload, verified LIVE 0.3.3 on dl.silentmode.st.
2026-08-31 21:29:14 +02:00
Local Dev
6259ccd117 Ship Theseus 0.3.2 09331b2f (tab context menu + branded installer)
Setup    09331b2fd9ccf136e2183b7cd85354cfd56e2ed50260b7aadeed63c7ea450251
Portable 21752d0fc85fb39ec1e65192920461e9ae395a22d9a68abd27f12e638d0fdd07

Right-click a tab: floating context menu with Reload, Duplicate, Group
(submenu: None / Red / Orange / Yellow / Green / Cyan / Blue / Purple),
Add to Bookmarks, Mute (also Unmute; 🔇 shows next to the title when
muted), Close. Menus close on outside click or Escape.

Group state is per-tab. A grouped tab shows a colored dot before the
title and a matching 2-px accent stripe on the top edge, so a cluster
of same-group tabs reads visually. Palette is drawn from existing
provenance colors (err/warn/acid/srv/sia/blue).

Backend IPCs are all tab-scoped (not "active tab"): tab-reload,
tab-duplicate, tab-mute (toggle or explicit boolean), tab-group,
tab-bookmark. emitTabs payload gains muted, group, and url so the
menu can read current state.

Installer wizard branding: 164×314 sidebar BMP with the compass mark
centered + "Theseus / NAVIGATOR" wordmark under it, plus a 150×57
top-strip header with a mini compass on the right. Sharp can't write
BMP directly (only png/webp/etc), so nsis/make-icons.mjs renders raw
RGB via sharp and wraps it in a hand-rolled 24-bit uncompressed BMP
header. Uninstaller reuses the same sidebar.

Silent-install fix: nsis/installer.nsh's AriadnePageCreate now checks
IfSilent BEFORE touching nsDialogs::Create. In /S mode the flag is
zeroed and the function returns cleanly, so the installer no longer
hangs waiting for a page it will never draw. This is why 0.3.2 needed
two builds — the first hung on /S install; the fixed hash is the one
that ships.

Deployed: scp + sia-upload of both trees. Verified VPS hash matches
local 09331b2f. Fresh /S install to D:\Program Files\Theseus Navigator\
placed 0.3.2 with the correct HKCU Uninstall registry entry.
2026-08-31 19:30:30 +02:00
Local Dev
7e8d182961 Ship Theseus 0.3.1 fe59105d (one-click updates: silent prefetch + install-and-restart)
Setup    fe59105d2e99a41b7000caeb86601a8e1675846d193e92204034669f5b368d60
Portable 1b6eda55b53894cf9889548116c7b6100888fb160edc84cc1592bb79f9d95b53

The update flow no longer asks the user to click Download. When
checkForUpdate detects a newer version, autoDownloadUpdate() kicks off
session.defaultSession.downloadURL against the setup URL immediately.
will-download recognises the update URL and routes the file to a
fixed %TEMP% path (bypassing the visible downloads panel entirely),
streams updateDownloadReceived/Total into the chip via
emitUpdateAvailable, and flips updateDownloadState to "ready" when
the transfer finishes.

Chip states:
  idle         first render before the fetch starts — clickable to
               trigger the manual download (kept as a fallback).
  downloading  "↓ 42% — 0.3.2" — no click, just progress.
  ready        "✓ Install 0.3.2 & restart" — one click.
  failed       fall back to the pre-0.3.1 explicit-download click.

install-update-now IPC: spawns the cached setup with /S (detached,
stdio ignored), then app.quit() 400ms later so the installer can
overwrite the running exe. Our nsis/installer.nsh detects an existing
Ariadne install via the HKLM registry and skips its Ariadne prompt on
upgrades, so the /S run is fully unattended.

The one-click flow eliminates two long-standing sources of confusion:
  - "Download opens a different browser" — Theseus's default session
    fetches the installer itself, not a URL handoff to shell.
  - "Update requires multiple wizard clicks" — /S skips them.

Extensions aren't touched by this. The framework lives in
addons-host.js + sidebar-preload.js; add-ons themselves live in
%APPDATA%\Theseus Navigator\addons\<id>\ and are a separate layer.
New extensions ship by drop-a-folder, no browser release required.

Deployed: scp + sia-upload, verified 200 + 0.3.1 in the manifest.
2026-08-31 18:47:50 +02:00
Local Dev
1314921729 Ship Theseus 0.3.0 bb9d8dec (home cards decoupled from browser release)
Setup    bb9d8dec124b8e2a976642ed77051b04edd1d03185581f99db845ef168919836
Portable 1e2d02aea13656574c374440b0c41374290f1bbf85ac6313cec075292cfc34f8

Home cards decoupled from the installer. Theseus now fetches
https://dl.silentmode.st/home-cards.json at boot and every 6h, caches
into <userData>/home-cards-remote.json, and applies it as the default
tier. Priority in loadHomeCards() is:
  1. <userData>/home-cards.json  (user edits — unchanged, always win)
  2. <userData>/home-cards-remote.json  (last successful fetch)
  3. DEFAULT_HOME_CARDS  (code fallback for offline first-boot)
On a successful refresh, main pushes the new list to every home tab
via the home-cards IPC — but only when the user has NO local edits.
The user's edit mode remains authoritative.

Content updates now happen by editing site/home-cards.json and running
scp + sia-upload. No browser build required.

Prometheus.X copy fix: "Decentralized App Marketplace" (was
"marketplace for BCDN-hosted apps" — the marketplace isn't BCDN-
specific). Applied to both DEFAULT_HOME_CARDS (fallback) and
site/home-cards.json (canonical live copy).

Deployed:
- scp installers + manifest + tools/ + releases/ + home-cards.json
  to /opt/silent-mode/dl/ and /opt/silent-mode/site/
- sia-upload of both site trees
- verified home-cards.json served 200, manifest 0.3.0 live

Existing installs of 0.2.5 will surface 0.3.0 in the update chip and
also pull the new home-cards.json — so the "Decentralized App
Marketplace" wording lands on ANY current install (0.3.0+) the moment
this commit deploys, without waiting for anyone to install 0.3.0.

Wait — 0.3.0 is what CARRIES the fetch logic. So the auto-pull benefit
only kicks in from 0.3.0 onward. Users on 0.2.5 or earlier need to
install 0.3.0 once; from then on every home-card edit reaches them
without a new browser release.
2026-08-31 18:38:09 +02:00
Local Dev
4270c6db7d Ship Theseus 0.2.5 50be20d6 (home page brand pass: .X acid + role badges)
Setup    50be20d6e3811445817e35c560dce1a4bbcc62004d6b0480848a211a654319ea
Portable 021afe629c61f2f49e95f936261649bdcff58c8b79bd0d903a8d10e6009740b0

Home page card grid gets a brand pass. Each title's TLD suffix (.X,
.bch, ...) is now styled in acid (--acid) with a soft text-shadow
glow. styledTitle() splits the domain on the last dot so capital
labels like "Theseus.X" render as ink + acid.

Card copy tightened per name:
  hello.bch         A small page on the blockchain itself.
  siatest.bch       A page with no server, backed by Sia.
  SilentMode.X      Infrastructure development for a decentralized web.
  Theseus.X         The Web Navigator - this browser's own address.
  Sirius.X          Register and manage BCDN names.
  Hephaestus.X      The forge - Silent Mode's code host.
  Prometheus.X      An app store - a marketplace for BCDN-hosted apps.
  Helios.X          Search engine for the decentralized web (in design).
  Hermes.X          Messaging - end-to-end encrypted over Nostr.

Badges: dropped the generic ".x" tag; each .X card carries its role
label instead. Palette assigns each role a distinct hue drawn from
the existing provenance colors, so the grid reads as families without
adding new brand values:
  Infrastructure / Registrar  acid
  Navigator                   blue
  Code host                   sia purple
  App store                   srv teal
  Search                      warn amber
  Messaging                   err coral

Descriptions brighten from --mut to --ink on card hover so the ink
color reads as the "acid touch" the user asked for without adding
literal green blocks to every card.

Deployed: scp installers + manifest + tools/ + releases/ pages to VPS,
sia-upload of both trees, verified HEAD 200 + manifest 0.2.5.
2026-08-31 18:03:02 +02:00
Local Dev
ff8e3abfa6 Ship Theseus 0.2.4 7fd323a8 (home cards refresh + engine-picker sync + proxy auth support)
Setup    7fd323a87bd32b780e147de18e16ecd82f89960bbd8e9a619c5d25d374597cd2
Portable 3166e64cf56badd7b26c4c793dc79bbed6f9d6c48fbd467d97f845385b91b1dd

Home cards: DEFAULT_HOME_CARDS replaced with the .x sibling grid the
user asked for -- hello.bch, siatest.bch (the "types of BCDN" pair),
then silentmode.x / theseus.x / sirius.x / hephaestus.x /
prometheus.x / helios.x / hermes.x. Existing installs with a saved
home-cards.json keep their edits (defaults only seed fresh profiles).

Search engine picker sync: user reported the toolbar dropdown listed
engines as active that Settings > Search showed differently. Root
cause: settings.searchEngine could be pointing at an id not in the
currently-enabled set (stale settings.json after DEFAULT_ENABLED
changes across versions). loadSettings now normalizes on boot -- if
searchEngine isn't enabled, fall back to enabled[0]; and
installedEngines gets unioned with enabledEngines so the two lists
can't disagree in ways that make toolbar and Settings render
different rows.

Proxy auth support in the framework: setSessionProxy accepts
`{ proxyRules, auth: { username, password } }` or an inline
`socks5://user:pass@host:port` URL. When creds are present, the
handler strips them from the URL, installs a session#login listener
on the default session that answers with them, then calls setProxy.
Chromium's SOCKS5 client doesn't consume proxy auth (known Chromium
limitation), but HTTP proxies work; SOCKS-based extensions need to
gate by IP allowlist at their server. Log line masks the password.

Update chip note: the "download opens in a different browser" was
0.2.0-era behavior. 0.2.1 rewired it to session.downloadURL. Anyone
still seeing it needs to install 0.2.1+ once.

Deployed: scp + sia-upload both trees, verified HEAD 200 + manifest
0.2.4 live.
2026-08-31 17:24:39 +02:00
Local Dev
de9ad93924 Ship Theseus 0.2.3 3abaeff7 (new brand icon + multi-panel picker + Startpage default)
Setup    3abaeff73afcecc9e4f05f749765e168a97a377890211dbae4345654c84ce2f1
Portable 71017563d6ba107cb25e24be240abcb78e34491d8f7aa42e095421edbc482a85

Brand: the red-N compass from theseus.x is now the taskbar / titlebar /
File Explorer icon everywhere. Source SVG lives at
site-theseus-x/assets/favicon.svg so brand + browser icon stay in sync.
nsis/make-icons.mjs renders it to build/icon.png (512x512) and
build/icon.ico (multi-resolution: 16/24/32/48/64/128/256). Wired into
package.json: build.win.icon, build.nsis.installerIcon + uninstaller
+ header; the ico ships as an extraResource so main.js's BrowserWindow
also uses it at runtime. Icons live in build/ which is gitignored -
run `node nsis/make-icons.mjs` when the SVG changes.

Sidebar: multi-panel picker strip. When 2+ extensions register sidebar
panels, sidebar-preload.js injects a 32-px tab strip at the top of
every panel's document. Click a tab -> ipcRenderer sidebar-open ->
loadFile switch. Preload also injects box-sizing:border-box + a
33-px body padding so height:100% panels don't overflow. Solo-panel
case is unchanged (strip only appears when panels.length >= 2).

Search: Startpage is the new default. Both the default id and the
enabled-list ordering put it first. DDG stays enabled by default too.

Deploy: scp installers + manifest + tools/ + releases/ to VPS,
sia-upload of both trees, verified HEAD 200 and manifest 0.2.3.

Icons regenerated from theseus.x's favicon.svg; the .svg itself
shipped in the 0.1.x window when the theseus.x site went live.
2026-08-31 16:32:16 +02:00
Local Dev
77a8099454 site: align two stray pages to the 6-tab pantheon nav
site/brand/index.html and site/sirius/register.html were still on the old
5-tab layout (Tools · Prometheus · Sirius · Helios · Hermes). Every other
silentmode.st page had already converged on the 6-tab pantheon
(Theseus · Prometheus · Sirius · Hephaestus · Helios · Hermes) via parallel-
session updates. Bringing these two into alignment.

No .X suffix on any label — pantheon labels are bare across the umbrella
site; the .X TLD form is reserved for the future standalone product sites
(theseus.x, sirius.x, hephaestus.x, prometheus.x, helios.x, hermes.x).

Verified live: both pages return the 6 canonical labels in order.
2026-08-31 16:15:40 +02:00
Local Dev
f8ae6982c8 Ship Theseus 0.2.2 972f6209 (Extensions rename + draggable sidebar + session-proxy)
Setup    972f6209639122f32f032d5f2f9fc5a4808e0d4a810f88ae38ec9a1275ac52ac
Portable a9771f054ec36b9aff6ddee958cecf7e84cdacd4d7932aa8385c445aab4d29be

User-visible rename: the Settings tab and its labels say "Extensions"
now instead of "Add-ons". Internal identifiers (disabledAddons, the
addons/ folder, IPC channels, capability strings) stay put — code
churn wasn't worth it, and users only see the user-facing text.

Draggable sidebar. sidebar-preload.js now injects a 5px grip strip
along the LEFT edge of every panel document. mousedown+mousemove
streams delta-x px to main via sidebar-drag IPC; main clamps to
[200, 800] and debounces a save to settings.sidebarWidth. Width is
restored on next launch. The default is still 340. Faint acid-green
highlight on hover so the affordance is discoverable.

New extension capability: session-proxy. An extension whose addon.json
declares "session-proxy" gets api.setSessionProxy(rules) which routes
to session.defaultSession.setProxy — the same primitive Tor already
uses under the hood. Rules can be a string ("socks5://host:port") or
an object matching Electron's setProxy shape; null clears. The
capability is opt-in: an extension without the declaration gets an
error if it tries to call setSessionProxy. This is the framework
surface a private 3-VPS relay extension would build on (extension
folder stays on the operator's disk only; nothing about it appears in
the public build).

Deployed: scp installers + manifest + tools/ + releases/ pages to
VPS, sia-upload of both trees, verified HEAD 200 and manifest 0.2.2.
2026-08-31 16:00:34 +02:00
Local Dev
2ea68d14e7 fix(hephaestus.x): refresh stale references in the "where it lives" spec
Fresh-browser test surfaced two staleness bugs on the standalone landing:

- Source link pointed at silentmode/silentmode — that repo was deleted last
  turn when we split into per-project repos. Point at silentmode/hephaestus
  now (which actually holds this landing page's home + the docker-compose /
  auth-proxy / Caddyfile that serves it).
- "Let's Encrypt TLS" was true for code.silentmode.st but not for hephaestus.x
  itself, which now uses a Silent Mode CA cert from Argonautica. Reword to
  reflect the dual-hostname primary/mirror architecture and the two cert
  stories.

Also mention the DR-backup relationship — the Sia bucket now mirrors the VPS
static content nightly, not the other way around.
2026-08-31 15:59:03 +02:00
Local Dev
b57cab1928 Ship Theseus 0.2.1 67e3cda1 (in-app update download + Ctrl+B sidebar)
Setup    67e3cda1b76a6dba966d91a43e78fdb52378f860c0f75a7775d11b96e1b4f5e3
Portable 415c804f75df6fab5072650fbdc3cffa4124ed02f8ff53a91281ebd2dc4775c3

Update chip: the Download button used to hand the URL to the system
browser (shell.openExternal) - user opens Theseus, gets prompted to
update, clicks Download, watches ANOTHER browser wake up and start
the transfer. That's the "why did a different browser open?" report.
Fix: session.defaultSession.downloadURL(url) - triggers the same
will-download handler our own downloads panel already listens on, so
the file lands in the user's Downloads folder AND appears in
Theseus's downloads chip with progress + Show-in-folder. Rejected
protocols unchanged; only dl.silentmode.st and silentmode.st URLs
survive the allowlist.

Ctrl+B toggles the add-on sidebar (matches VS Code). Verified end-
to-end against a fresh <userData>: bundled Notepad was seeded,
Ctrl+B opened its panel, typed text autosaved to
<userData>/addons-data/notepad.json, restart re-mounted and the
text loaded back before the append could clobber it.

Deployed: scp installers + manifest + tools/ + releases/ to VPS,
sia-upload of both trees, verified HEAD 200 and manifest 0.2.1.
2026-08-31 15:35:47 +02:00
Local Dev
941851ea0e feat(hephaestus.x): per-repo detail pages under /silentmode/*
Adds live pages for each repo without leaving hephaestus.x:

  hephaestus.x/silentmode/            → index of all silentmode/* repos
  hephaestus.x/silentmode/theseus/    → README + recent commits + clone URLs
  hephaestus.x/silentmode/sirius/     → same
  hephaestus.x/silentmode/ariadne/    → same, gated ("private, sign in to browse")
  hephaestus.x/silentmode/hephaestus/ → same, gated

Single _template.html hardcoded per repo via sed; each detail page pulls
metadata + README + last 8 commits from code.silentmode.st via the
CORS-enabled Forgejo API on load, renders README with a minimal
markdown-to-HTML pass, and gracefully falls back to a "sign in to browse"
note when the API returns 401/404 (private repo).

The URL stays on hephaestus.x while browsing — user only leaves when they
click "Browse full source →" or a specific commit link.
2026-08-31 15:29:49 +02:00
Local Dev
e4e5314704 Ship Theseus 0.2.0 c5202ddb (add-on framework + branded error pages)
Setup    c5202ddba5a4bf4cd8d71c665c72bdd996ced761f9a7aae295cb960e17988f47
Portable 9142764f78e41c6a6220960d5f7278e0abe6c1c91e5033871d95225355d8feda

0.1.x -> 0.2.x — two new subsystems land together. 0.1.3 (which had
only the error pages) is retired; those hashes never went live, so
we jump 0.1.2 -> 0.2.0 for clean version->hash 1:1.

Add-on framework:
- Discovery scans <userData>/addons/<id>/; each add-on carries an
  addon.json manifest and an activate(api) CommonJS entry. Nothing
  about a private add-on ships in the public build - drop the
  folder, restart, it's live.
- Bundled 'Notepad' reference add-on ships in resources/bundled-addons/
  and is seeded into the user's addons dir on first boot. Right-
  sidebar textarea, autosave, char/word counter.
- Extension point in this rev: sidebar-panel (WebContentsView on the
  right, SIDEBAR_W=340). Toolbar toggle appears only when at least
  one add-on registers a panel.
- Settings gains an Add-ons tab: list installed, per-add-on enable/
  disable toggle (settings.disabledAddons persists), Show folder /
  Open add-ons folder / Reload buttons, trust-model warning.
- Origin-gated per-addon storage: main derives the add-on id from the
  sender file:// URL, so a panel can only touch its own kv store
  under <userData>/addons-data/<id>.json.

Branded error page:
- did-fail-load on every tab -> error.html with kind = name-not-
  registered (BCNR host + ERR_NAME_NOT_RESOLVED) | name-unreachable
  (non-BCNR host + NAME_NOT_RESOLVED) | unreachable (conn refused/
  reset/timeout) | tls (cert range) | generic.
- Actions per kind: Retry + Home always; Search for '<host>' and
  Register-on-Sirius where a host is present; Tor guide link on
  unreachable.
- Address bar keeps the failed URL (refreshTabUrl already skips
  file://) so the user can edit and retry.
- Ignorable codes (-3 ABORTED, -20 BLOCKED_BY_CLIENT, subframe
  errors, internalNav) skipped so normal user actions don't paint
  an error page.

Deployed:
- scp installers + manifest + tools/ + releases/ pages to VPS
- sia-upload of ../site (silentmode.bch) and ../site-theseus-x
- verified HEAD 200, manifest reads 0.2.0 2026-08-31

Existing 0.0.6/0.1.2 installs will surface 0.2.0 in the update chip
on next launch.
2026-08-31 14:06:18 +02:00
Local Dev
4d1cee8197 Theseus 0.1.3: branded error page for load failures (BUILT, NOT DEPLOYED)
Setup    f2afc14efc63008cbb9dad44176e94146386db4c0afda4459f1d4eb929172b6d
Portable 5d08b1415526934db8de780949a610896064fe9567aa0e5e1702ebabd7eb7df2

Chromium's default 'This site can't be reached' replaced with a Theseus-
themed error page. did-fail-load on every tab's webContents (main frame
only, non-ignorable code) routes the tab to error.html with the
attempt URL, host, error code, and description as query params. The
page keeps t.url pointing at the failed URL so the address bar shows
what the user typed and they can edit + retry - refreshTabUrl's
existing file:// skip means the error page's own path never leaks
back into the bar.

Five kinds, chosen by pickErrorKind(code, host):
  name-not-registered  BCNR-eligible host + ERR_NAME_NOT_RESOLVED.
                       Says "no BCDN record on chain, no clearnet host
                       either." Offers Register on Sirius + Search +
                       Retry + Home.
  name-unreachable     ERR_NAME_NOT_RESOLVED on a non-BCNR host. DNS
                       failed - offers Retry + Search + Register +
                       Home.
  unreachable          CONN_REFUSED/RESET/TIMED_OUT/CLOSED/NETWORK_CHANGED.
                       Offers Retry + Tor guide + Home.
  tls                  ERR_CERT_* range (-200..-299). Offers Retry +
                       Home.
  generic              Everything else.

home-preload.js gains `window.errorpage` alongside `window.home`. Both
APIs are sender-URL-gated in main - a random page seeing the shape
can't invoke them (isErrorPageSender / isHomePageSender). The external-
open handler additionally allowlists Silent Mode domains only.

package.json build.files gets error.html + error-preload.js so
electron-builder actually bundles them (GOTCHAS rule: an unlisted
runtime-loaded file silently opens blank).

Ship pages (releases-manifest.json, tools/index.html, releases/index.html,
site-theseus-x/index.html) updated to 0.1.3 with the new hashes.

DEPLOY STATUS - blocked on VPS SSH: my IP was hit with a full-port ban
mid-turn (likely fail2ban from the burst of scp during the 0.1.0-0.1.2
iterations). Site pages/manifest/installers are committed locally but
NOT yet on dl.silentmode.st or the Sia mirror. Live still reads 0.1.2.
User needs to unban 195.184.247.106 on their end, or wait for the ban
to expire, before the ship pages match reality.
2026-08-31 13:38:05 +02:00
Local Dev
aea58e4cfd feat(hephaestus.x): /forge lists real repos instead of auto-redirecting
Previous version was a 100ms bounce to code.silentmode.st — user never saw
hephaestus.x/forge/ content, just a flash. New version is a real catalog page:

- Fetches public repo list live from Forgejo's API on page load
- Renders each repo as a card with name, owner, description, updated date,
  clickable to code.silentmode.st/<owner>/<repo> when the user chooses
- Falls back to a "browse directly at code.silentmode.st" hint on API error
- Includes the git clone URL patterns (HTTPS-with-PAT and SSH-2222) inline

Enabled CORS on Forgejo so hephaestus.x (served from a different origin)
can hit /api/v1/repos/search — Access-Control-Allow-Origin: *, methods
GET+HEAD only, no credentials. That's the minimum for public listings and
matches how the API is meant to be used.

/forgejo/ is a byte-identical alias.
2026-08-31 12:44:03 +02:00
Local Dev
96a9ac835d feat(site): standalone hephaestus.x landing + /forge /forgejo shortcuts
hephaestus.x is its own thing — not a subpage of silentmode.st. Previously
the BCNR record redirected straight to code.silentmode.st (dropping visitors
at the login screen cold) or to /hephaestus/ on silentmode.st (which
inherited the full silentmode nav bar of unrelated products).

- New standalone landing at site/hephaestus.x/index.html — its own compact
  page, no silentmode.st chrome, just a mark + tagline + three key facts +
  "where it lives" spec table, one small "A tool from Silent Mode" footer.
- /forge/index.html and /forgejo/index.html — instant redirects to
  code.silentmode.st for users who type hephaestus.x/forge in the bar.
- BCNR record updated to {"s3":"bns/hephaestus.x/"} — navigate.st gateway
  serves the content directly from the Sia bucket (same pattern deviant.x
  uses). TXID 69686a03c66cc1f661c84c50107a8660055c629f0393c9bb6802773d3c0a7108.

Docs page at silentmode.st/hephaestus/ stays put — that one lives in the
silentmode.st family with its full nav, targeting Silent Mode visitors
exploring the whole stack. hephaestus.x/ is for direct hephaestus visitors.
2026-08-31 12:29:17 +02:00
Local Dev
c63ae53988 docs(hephaestus): rename "AI sessions" section to "CLI & programmatic access"
The section content was already about running the sign-in without a real
browser — the "AI" framing was a leftover from how the misdiagnoses first
surfaced. Rename to be tool-neutral: any CLI, CI job, curl-with-cookies,
Playwright, Puppeteer, or scripted client hits the same trap and benefits
from the same URL routing table and smoke-test snippets.

Also, hephaestus.x BCNR record updated (via Argus CLI) to point at the docs
landing page instead of straight-to-forge — users typing the name now get
docs + a "Sign in with wallet" button, not the login screen cold.
TXID 2359f99b4a5c4cc2b56594ce5b7c47df4a98cb361843bc7139f3550bab43d436.
2026-08-31 12:23:06 +02:00
Local Dev
38f567b20d Ship Theseus 0.1.2 b8cc85ec (Ariadne page copy: BCDN naming)
Setup    b8cc85ec0f70844e4ce14a70b0ff89b9d9720be2f0e5568e56c51ecef706b14d
Portable 6540b4c67906046cd2c5303a9ccaa4e00a39b3daa5792b71e16c4f141f498220

Copy-only change to the installer's Ariadne page: names the mechanism
BCDN — Bitcoin Cash Domain Names — in the body text instead of listing
example TLDs. Reads more clearly to a first-time visitor who might not
know that ".bch" and ".x" are the same registry.

Everything else from 0.1.1 rides along: dedicated wizard-page checkbox
for Ariadne's Thread (pre-checked, skipped on upgrades), uninstall
symmetry, Startpage POST-form fix.

Deployed: scp installers + manifest + site pages to VPS, sia-upload of
both trees, verified 200 + manifest 0.1.2 2026-08-31.
2026-08-31 11:39:35 +02:00
Local Dev
cbad7f62c1 Ship Theseus 0.1.1 2a278494 (Ariadne checkbox page + Startpage POST fix)
Setup    2a2784943006b0c4f52e22cc2ec51a43e8007497d90da022798e739d83f805f0
Portable 1d9cfa6467d66604ef2f672969afdc288f46608913c35658f9c7466820ab01df

Ariadne install UX: promoted from an end-of-install MessageBox popup to
a dedicated wizard page. nsis/installer.nsh replaces the MessageBox
customInstall with a `Page custom` (nsDialogs) that shows FIRST in the
install flow (electron-builder's INCLUDE hook is placed above its own
MUI_PAGE_* inserts and NSIS processes page directives in file order —
that is the earliest hook we have without editing the template).
Framed as "Options" so it reads naturally as a preamble.

The page:
  Header:   "Optional add-ons"
  Body:     A 4-line explanation of Ariadne's Thread and the trade-off.
  Checkbox: "Install Ariadne's Thread (recommended)" — pre-checked.
  Footer:   Notes the UAC prompt and that Theseus install continues.

Skipped entirely (Abort) if Ariadne is already installed. State is
saved from AriadnePageLeave into $InstallAriadneFlag; customInstall
runs the chain-installer iff BST_CHECKED.

Uninstall side unchanged (still MessageBox — a full custom uninstall
page would be overkill for one Y/N during a rare event).

Also carries 1e5d670: don't re-route same-origin navigations through
navigateTab. Was silently breaking every site whose in-page form
POSTs — Startpage's search box submits to /do/search via POST, and
navigateTab -> loadURL always GETs, dropping the body. Same-origin
navigations now stay on Chromium's native path.

Deployed: scp + sia-upload of both trees. Verified HEAD 200 on the
installer, live manifest reads 0.1.1 2026-08-31, VPS hashes match.

0.1.0 (never deployed for long — same-day iteration) is preserved
in _prev/ for rollback.
2026-08-31 05:49:04 +02:00
Local Dev
81bc43e581 sirius.x portal: /api/holdings endpoint + favicon paths + roadmap link
gateway/public-gateway.mjs:
  * GET /api/holdings/<scripthash> and POST /api/holdings {scripthashes:[…]}
    — server-side wallet-holdings lookup for the portal. Bns-indexer is
    beacon-only so it can't answer listunspent for arbitrary addresses; the
    gateway does the electrum roundtrip and cross-joins with the cached BCNR
    index. Client posts scripthashes (no libauth needed on the server) and
    gets back the names owned.
  * elConnect now falls through to whole-buffer JSON.parse when a Fulcrum
    response lacks a trailing newline — chipnet.bch.ninja does this and
    otherwise every elCall to it times out. Same tolerance pattern as
    bns-indexer.test.mjs's tiny electrum client.
  * verifyElectrum picks a full electrum with a 3s server.version probe so a
    hung server fails over to the next in seconds instead of stalling 20.
  * Skips silentmode.st/electrum and coinspectrum.duckdns.org:50011 for
    /api/holdings — both are bns-indexer routes that don't do listunspent.

web/register-entry.js: export addressToScripthash so the portal can derive
the scripthash for each of its wallet's watched addresses before POSTing.
Browser bundle rebuilt.

site-sirius-x pages:
  * favicon + logo hrefs made relative (./assets/… on index/portal,
    ../assets/… on docs/theseus). Absolute /sirius-x/… broke on the sirius.x
    BCNR route where the site is served from root instead of under /sirius-x/.
  * Roadmap nav link added back to portal, docs, theseus — the landing has an
    anchor to a section on itself, so subpages now link to it explicitly.
  * portal.html: loadNames rewritten to POST scripthashes to /api/holdings
    instead of doing client-side electrum. Works on browsers whose networks
    block chipnet electrum ports; same-origin HTTPS on 443.
  * portal.html: bundle import ?v= bumped so Chrome's in-memory ES module
    map picks up the new bundle instead of a stale cached copy.
2026-08-31 05:40:47 +02:00
Local Dev
e5ed801ea7 brand: Silent Mode + navigate.st kits (logo, wordmark, avatar, banner, favicon)
Two brand kits, one design language. Each site now has a /brand/ page + a
favicon; every page I own on silentmode.st links the SVG favicon (parallel
sessions can add the same line to Sirius/Hephaestus/Choose when they touch
those files).

Silent Mode kit (site/brand/, site/favicon.svg):
  Mark   — two interlocking chain links, one muted (#8b98a9) + one acid
           (#d6ff3d). The umbrella family mark.
  Logo, wordmark, avatar (400x400 social), banner (1500x500 social header).
  Brand page shows every asset with SVG download, colour palette
  (tokens matching shared.css), usage do's and don'ts.

navigate.st kit (navigate.st/brand/, navigate.st/favicon.svg):
  Mark   — compass rose (N acid, other points muted) inside a chain-link
           ring. Ring keeps it in the Silent Mode family without cloning the
           SilentMode mark; compass says what this specific site is (the
           wayfinding front door).
  Same asset set: logo, wordmark, avatar, banner. Standalone brand page
  (no shared.css — navigate.st runs single-file).

nginx (VPS): added two locations to sites-enabled/navigate-st so /favicon.svg
and /brand/* resolve from /opt/silent-mode/navigate-brand/. Rollback point
at sites-enabled/navigate-st.bak.1788146513. silentmode.st serves both from
disk under /opt/silent-mode/site/ — no vhost change needed.

Verified live: all favicon + brand URLs return 200 on both hosts.
2026-08-31 05:22:45 +02:00
Local Dev
1a17f5fa4e Ship Theseus 0.1.0 510f81fd (bundle Ariadne's Thread)
Setup    510f81fd5e9b4287a55817aaf5080e5d46005eecb5359eb06892040cf8d10d87
Portable 96bfb469f2d9dfe11606aa10db92febdfce73df980eec475ab285f2334925158
Bundled  AriadneResolver-Setup-0.1.0.exe (9ab725be, unchanged 0.1.0)

Version 0.0.9 -> 0.1.0 marks the "Silent Mode = one install" milestone:
Theseus and the system-wide Ariadne resolver now ship together.

nsis/installer.nsh (electron-builder `nsis.include`) hooks two macros:

  customInstall     -- If Ariadne's Thread is NOT already installed,
                       MessageBox MB_YESNO|MB_DEFBUTTON1 asks whether
                       to install it now. On Yes, chain-invokes the
                       bundled Inno installer with
                         /VERYSILENT /SUPPRESSMSGBOXES /NORESTART
                       (Ariadne raises its own UAC because Inno declares
                       PrivilegesRequired=admin). Ariadne being present
                       already suppresses the prompt on upgrades.

  customUnInstall   -- Reads Ariadne's UninstallString from HKLM 64-bit
                       Uninstall\{...ARIADNERSLVR}_is1. If present,
                       symmetric MessageBox asks whether to remove it
                       too, then ExecWaits the string with the same
                       silent flags. Skips silently if Ariadne isn't
                       installed.

Registry probe uses SetRegView 64 (Ariadne installs 64-bit per
ArchitecturesInstallIn64BitMode=x64compatible in its .iss). Reset to
`lastused` after each probe to leave electron-builder's own state
unchanged.

Package changes:
- version 0.0.9 -> 0.1.0
- build.extraResources adds build/AriadneResolver-Setup-0.1.0.exe
  (unpacked to $INSTDIR/resources/); build/ stays gitignored - the
  binary is regenerated by copying from AriadneResolver's Inno output
- build.nsis.include -> nsis/installer.nsh

Size: installer 122 MB (+25 MB for bundled Ariadne), portable 122 MB.
Portable also carries the Ariadne exe as a side effect of extraResources
being global; portable can't invoke an installer, so the 25 MB is dead
weight there - future rev could scope extraResources per-target.

Site updates: tools page + releases page + theseus.x landing all
reflect the 0.1.0 hashes, sizes, and the new "Ariadne's Thread bundled"
line. tools page's "Coming to the Windows installer" footnote is
rewritten past tense because it landed.

Deployed:
- scp installers + releases-manifest.json to /opt/silent-mode/dl/
- scp tools/ + releases/ index pages to /opt/silent-mode/site/
- sia-upload of ../site and ../site-theseus-x
- verified HEAD 200, manifest reports 0.1.0 2026-08-31, VPS hashes
  match local

Existing 0.0.6 (or newer) installs will surface 0.1.0 in the update
chip on next launch.
2026-08-31 05:07:34 +02:00
Local Dev
9141b37f36 Link theseus.x from navigate.st + tools; align copy on Ariadne-bundle intent
navigate.st: the 'theseus.x' card flips from pending placeholder to a
real card with href="/bns/theseus.x" and a b-sia source badge - the
name is on-chain, records point at bns/theseus/ on Sia.

silentmode.st/tools: the relay demo table gains a theseus.x row; the
flagship footnotes gain an "Also on the chain" line pointing to
theseus.x. The 'Coming to the Windows installer' footnote also gains
the uninstall-prompt half of the flow.

theseus.x landing: the 'Nothing to install elsewhere' card is now
'System-wide, optional' and describes the intended bundled-Ariadne
flow (recommended-on checkbox during install, prompt-to-remove during
uninstall, resolver named 'Ariadne's Thread' for users). Copy no
longer contradicts the design doc.

Deployed: sia-upload of both ../site (silentmode.bch mirror) and
../site-theseus-x (Sia bucket bns/theseus/); scp of navigate-apex.html
+ tools/index.html to the VPS. Verified navigate.st shows theseus.x,
silentmode.st/tools mentions it twice, silentmode.bch/tools mirror
matches.

Bundling implementation itself (NSIS chain-install of Ariadne + the
uninstall prompt) is still TODO - copy states the finished flow.
Memory: theseus-bundles-ariadne.md captures the design so the next
session doesn't drift.
2026-08-31 04:56:11 +02:00
Local Dev
435c2a8b3e Rename Tools → Theseus, trim /tlds/ self-ref, chipnet auth + state fixes
Site:
- Rename the "Tools" nav label to "Theseus" on every subpage. URL slug
  /tools/ is kept intact so bookmarks and cross-links survive; the page's
  own title + h1 rename to Theseus; homepage product card retitled.
- Remove the /tlds/ self-nav entry so its 7-item header matches every
  other subpage (was 8 items, causing the same "header rearranges" glitch
  Hephaestus had before).

Auth-proxy (fixes reported by a concurrent session working with a chipnet
wallet):
- verify.ts now auto-detects the CashAddr prefix (bitcoincash, bchtest,
  bchreg) instead of hardcoding "bitcoincash". Chipnet wallets sign the
  same message with the same key but display bchtest: addresses; the old
  code compared their claim against a re-encoded bitcoincash: version and
  always rejected. Same key material, different envelope.
- /challenge accepts any of the three known prefixes at the input gate.
- /verify accepts an optional `state` param in the request body — used as
  a fallback if the challenge record didn't carry one (which happens when
  a scripted caller runs the /verify step without passing state through
  /challenge). Ensures RFC 6749 §4.1.2 compliance: the OAuth callback URL
  always echoes state when the client provided one.
2026-08-31 04:16:42 +02:00
Local Dev
7fd2e50583 fix(site): add Hephaestus link + normalize nav across all subpages
Every silentmode.st subpage was missing Hephaestus in its topnav, so clicking
Hephaestus from the homepage led to a page whose nav had a different item set —
looked like the header "rearranged and dropped tabs" mid-navigation.

- Add <a href="../hephaestus/">Hephaestus</a> between Sirius and Helios on:
  tools, prometheus, sirius, helios, hermes, releases, tlds
- Normalize hephaestus/index.html to use relative paths (../foo/) matching the
  convention used by every other subpage — was absolute (/foo/)
- Result: every page has 7 identical nav items in the same order, with
  class="here" on whichever section you're viewing. /hephaestus/ keeps its
  "Open forge →" CTA appended (an addition, not a reorder).
2026-08-31 04:06:28 +02:00
Local Dev
42b71c21d9 fix(site): align hephaestus/ nav bar with silentmode.st homepage
The docs page had a truncated & reordered nav (Tools, Sirius, Hermes) that
dropped Prometheus + Helios and put Hephaestus in the wrong slot. Clicking
"Hephaestus" from the homepage nav appeared to "rearrange" the header because
the destination page's nav was a different set.

Match the homepage nav 1:1 — Tools, Prometheus, Sirius, Hephaestus, Helios,
Hermes — with the "here" highlight on Hephaestus and the "Open forge" CTA
appended at the far right. Same items in the same order = stable header
across navigations.
2026-08-31 03:37:50 +02:00
Local Dev
921556f87f docs(hephaestus): mark hephaestus.x as minted
Chipnet mint via existing Argus CLI (node src/register.js hephaestus.x <url>).
TXID f9d0f72b5884996b8d55505a19ba2bde68fce556de20f98bdece2dbf57c77170.
Resolves via https://navigate.st/bns/hephaestus.x/ (302 → code.silentmode.st)
and natively at hephaestus.x in any BCNR-aware browser.
2026-08-31 03:36:17 +02:00
Local Dev
8532711563 electrum: wire wss://silentmode.st/electrum as first-choice (port 443 reachable)
Bns-indexer on VPS was only exposed on port 50011 via nginx, which corporate
firewalls, mobile carriers, and many VPNs block. Added an nginx location on
443 that proxies to the same 127.0.0.1:50010, giving us a browser-friendly
WSS endpoint on the standard HTTPS port.

  * lib/electrum.js CHIPNET_ELECTRUM: wss://silentmode.st/electrum listed
    first (used by registrar.connect() + everything that depends on it).
  * lib/resolver-web.js CHIPNET_ELECTRUM: same, kept in lockstep per the
    "change both together" comment.
  * bns-register.js bundle rebuilt to bake the new list.
  * portal.html imports the bundle with ?v= so Chrome's in-memory ES-module
    map doesn't serve a stale copy across tabs.

Portal now connects successfully; next remaining issue is that
bns-indexer only supports (server.version, get_history, transaction.get) —
`blockchain.scripthash.listunspent` for wallet address queries is not
implemented, so the "list your names" step fails there. Follow-up: add a
GET /api/holdings/<address> to public-gateway.mjs backed by the existing
BCHN electrum access, so the portal can pull holdings over plain HTTP.
2026-08-31 03:35:39 +02:00
Local Dev
3462c00188 docs(hephaestus): add "For AI sessions" section with the misdiagnoses
Someone hitting the deployed instance recently reported the wallet-auth
front-end as broken based on two mistakes:
  (a) mistook the 510-byte login shell for a stub (it's an SPA bootstrap
      that renders the UI via a JS module client-side), and
  (b) tried /static/wallet.js instead of /auth/static/wallet.js, missing
      the Caddy path-prefix routing.

Add an explicit section with:
- URL table showing exactly which service serves each path
- curl snippets for smoke-testing the flow without a browser
- Note that /api/v1/user requires an API token (not a session cookie),
  so a 401 there does not mean "not signed in"
- Guidance for headless / AI-driven browser sessions

Aims to head off the same misdiagnosis pattern from future sessions.
2026-08-31 03:30:25 +02:00
Local Dev
2cdb0ab47a sirius/registrar: add .hub, .os TLDs; portal: fix getUtxosForAddresses call
.hub and .os seeded on the chipnet TLD beacon (~2,600 sats) and added to the
public registrar. .dea (already on-chain via a concurrent session) also
surfaced in the TLDS array so its second-level names become registerable —
consistent with the "if it's on-chain, offer it" default.

portal.html: fix "t is not iterable" by passing (electrum, addresses) to
BNS.getUtxosForAddresses instead of (addresses); open one BNS.connect() and
share it across the UTXO scan and the buildIndex. Sign-in itself already
worked (wallet unlocks, address populates) — the crash was in the subsequent
names load. Ships a clearer network-blocked error too when the browser can't
reach chipnet electrum ports (50004/50011/62002).
2026-08-31 03:25:28 +02:00
Local Dev
be41efedee feat(site): add Hephaestus to silentmode.st + silentmode.bch
- Nav link between Sirius (live) and Helios (designed) — keeps live things adjacent
- Product card with p-live pill (Hephaestus is running at code.silentmode.st today)
- Meta description updated to include Hephaestus in the catalog
- New site/hephaestus/index.html — full docs (user quickstart, git push, architecture,
  wallet-auth protocol, operator self-host guide with the gotchas we hit)

Both silentmode.st and silentmode.bch serve from the same bucket path so this one
edit updates both. Files also copied into /opt/silent-mode/site/ on the silentmode VPS.
2026-08-31 03:21:39 +02:00
Local Dev
855bd6e9ce Ship Theseus 0.0.9 5452a34f (cumulative: 0.0.7 warm-start + 0.0.8 window.bcnr + address-picker + reload keys)
Setup    5452a34f211176cf04b7ea77a70fb838f0031b6ea0faed2cd270eae989b20c60
Portable ee602a016caf022452b2096ca683cf4bb4cea93ded1352192910c581a962d9ae

Version bumped 0.0.8 -> 0.0.9 because the prior 0.0.7 and 0.0.8
"Ship ..." commits (f464de6, 1a3b232, ed9ec18) never actually
deployed - the live manifest at dl.silentmode.st still served 0.0.6
until this commit. Bumping the number preserves version->hash 1:1:
this 0.0.9 is the FIRST post-0.0.6 binary that ever went public.

Cumulative content:
- 0.0.7  warm-start from bundled BNS snapshot + 30-s background delta
         refresh + Sia snapshot pull on boot (first .bch page opens
         near-instantly, index stays fresh while browser runs).
- 0.0.8  window.bcnr read-only dApp API on every page (resolveName,
         isRegistered, getBcnrTlds, getRecordVersion). Permission
         origins now scope to eTLD+1 via the Public Suffix List
         (same rule Chromium uses for cookies/storage).
- 0.0.9  Address-picker paints the picked URL in the address bar
         immediately (was leaving the typed prefix while the target
         loaded). Reload keys wired end-to-end: F5 / Ctrl+R soft,
         Ctrl+Shift+R / Ctrl+F5 hard, Shift-click the toolbar reload
         does hard too.

Deployed:
- scp installers + releases-manifest.json to /opt/silent-mode/dl/
- scp tools/ + releases/ index pages to /opt/silent-mode/site/
- sia-upload of ../site to bns/silentmode/
- verified: dl.silentmode.st HEAD 200 on the installer, manifest
  reports 0.0.9 2026-08-31, VPS hashes match, both silentmode.st and
  silentmode.bch tools pages show 0.0.9 buttons.

Existing 0.0.6 installs will surface the update chip on next launch.
2026-08-31 02:58:25 +02:00
Local Dev
b57f712109 Ship Theseus 0.0.8: window.bcnr dApp API + eTLD+1 permission origins
Merges a parallel session's work with the multi-source BNS story from 0.0.7.

The dApp side (parallel session)
--------------------------------
* bcnr-preload.js — installs `window.bcnr` on every page via contextBridge.
  Read-only surface: resolveName(name), isRegistered(name), getBcnrTlds(),
  getRecordVersion(name), plus getPermissionOrigin() for diagnostics. All
  Promises; a missing name returns null (not throw). No signing, no wallet
  unlock — that surface is designed but deliberately out of scope for 0.0.8
  (see TheseusNavigator/DESIGN-integrated-wallet.md).
* bcnr-origin.js — pure function that computes the eTLD+1 permission origin
  for a URL. ICANN suffixes via `psl` (same PSL Chromium uses, handles
  .co.uk / .github.io / etc); BNS names key off the on-chain TLD list so
  foo.wallet becomes a public suffix as soon as `wallet` appears there.
  Match browser cookie / MetaMask semantics: a grant on pay.merchant.com
  covers account.merchant.com but not evil.com.
* dev/bcnr-selftest.js, dev/origin-selftest.mjs — self-tests, no I/O.
* main.js wires bcnr-preload.js into session.defaultSession.setPreloads() so
  it runs BEFORE per-WebContentsView preloads; adds bcnr:* IPC handlers.
* preload.js + chrome.html — small hooks so the shell picks up window.bcnr
  the same way regular content does.
* package.json — psl dep, bcnr-preload.js/bcnr-origin.js in `files`.

Also included
-------------
* AriadneResolver/mobile/.../UpdateCheck.java — in-app update-check for the
  Android app; already active in the shipped 0.11 APK (build.ps1 -Recurse
  picked it up), formalising the source now.
* TheseusNavigator/snapshots/bns-name-snapshot.json — refreshed bundled
  starter (73 beacon txs, root c37b8596…c54e414ba).
* Site pages + manifest updated to point at 0.0.8.

  TheseusNavigator-Setup-0.0.8.exe    95.4 MB
    21939743eafdfe8742a6b7c4b987bd2782384d7bc41289cb80a7e08019dc9f02
  TheseusNavigator-0.0.8-portable.exe 92.7 MB
    2aa429fe39dc0fa4ac040fc6d6eb31b0f890c8a83175c49fcb50f052c480d39d
2026-08-31 01:38:55 +02:00
Local Dev
e2e478a394 Ship Ariadne 0.11: Sia CDN pull + gitignore _prev/
Mobile parity with Theseus 0.0.7's multi-source model, one source at a time.
Ships:

* Bns.pullSiaIndex() — fetches dl.silentmode.st/bns-name-index.json (the
  operator's latest published interpreted BNS snapshot) on a background
  thread. Installs the result as the current index + persists to disk cache
  when we don't already have something fresher. Best-effort: silent on
  failure, on-device electrum still runs.
* MainActivity fires the pull once per applyResolverSettings(), racing the
  bundled starter + on-device electrum. The bundled starter wins the very
  first navigation (already in memory); the Sia pull wins any subsequent
  cold start after an operator publish; electrum wins steady-state via the
  existing INDEX_TTL_MS refresh.
* publish-name-mirror.mjs now uploads three shapes to Sia (raw snapshot,
  raw immutable, mobile-shape floating, mobile-shape immutable) AND scps
  the mobile-shape floating pointer to the CDN so anonymous clients can
  actually GET it. The s3.silentmode.st bucket rejects anon reads today;
  the CDN copy is the workaround, same bytes.
* Cannot use Sia direct for now: s3d bucket policy blocks anon reads.
  Documented in Bns.SIA_INDEX_URL — swap URL when the policy changes.

Version bump: 0.10 → 0.11 (versionCode 11, versionName 0.11).

Also: .gitignore TheseusNavigator/_prev/ — the ~372 MB local rollback dir
that kept appearing as untracked in every git status.

  ariadne-v0.11.apk                    124 KB
    03c95832c16cc4763acaadbf328caa7d4bd05fc7c2994f6997a79cc6890bca44
2026-08-31 01:05:20 +02:00
Local Dev
0a734e808d Ship Theseus 0.0.7 + Ariadne 0.10 (bundled BNS index + fresh hashes)
Site + manifest updates for the two published artifacts. Both live at
dl.silentmode.st; Sia mirror updated for the operator-published snapshot
(https://s3.silentmode.st:8600/bns/name-list.json, root c37b8596…).

  TheseusNavigator-Setup-0.0.7.exe    95.4 MB
    1b0dabcd2b13067aa1fd89c3271708b35ba22dfc7a620e248b35e0487b7a104f
  TheseusNavigator-0.0.7-portable.exe 92.7 MB
    706dc01b21a88d3c2fbc3eeced0cab6ace873630bf3edc2d40915ca5be5c8cae
  ariadne-v0.10.apk                    124 KB
    ca53d8b47e9943bb73a9d0dad1f5e69a77ca01514b09d0cf15e882ca53484ebb
    (signing key sha256 46ebbbe5dc73148d66410fd0337b1e6683472128c983e8e2578200b9e3ca548c)

Fixes a partial-update bug in the previous "Ship 0.0.7" pass — the
Windows verify-box and Android section on tools/index.html still carried
the 0.0.6 / 0.8 hashes even though the download URLs had been rewritten.
2026-08-30 22:15:31 +02:00
Local Dev
85e4d15283 Ship Theseus 0.0.7 b22e7188 (multi-source BNS + continuous delta refresh)
Bundled beacon snapshot at build time (73 txs, root c37b859682…), background
delta-refresh loop every 30 s, Sia-snapshot pull on boot for the next launch,
ensureIndex fallback for very first launches.

  TheseusNavigator-Setup-0.0.7.exe    95.4 MB
    1b0dabcd2b13067aa1fd89c3271708b35ba22dfc7a620e248b35e0487b7a104f
  TheseusNavigator-0.0.7-portable.exe 92.7 MB
    706dc01b21a88d3c2fbc3eeced0cab6ace873630bf3edc2d40915ca5be5c8cae
2026-08-30 15:58:48 +02:00
Local Dev
3879b05dfb Sweep: mobile Ariadne updates, Deviant brand + sites, Hephaestus bootstrap, snappymail
Broad-scope commit sweeping in work from parallel sessions plus this session's
dev-only utilities. No single unifying theme — this is the "commit everything
that's ready" pass. Grouped by area below.

AriadneResolver / mobile
* Small updates to BchFetcher, Bns, MainActivity, AriadneVpnService, and the
  Android manifest — from a parallel mobile-resolver session.
* AriadneResolver/mobile/webpreview/ — new local dev webview (index.html +
  server.mjs) for iterating on the mobile UI without a device.

Email / SnappyMail
* Email/snappymail-plugin/silentmode-addresses — new SnappyMail plugin
  (README, CSS, PHP entry, JS) for surfacing @silentmode.st address
  management inside the webmail UI.

Hephaestus (Forgejo + auth-proxy)
* auth-proxy/src/oidc.ts + docker-compose.yml updates.
* scripts/bootstrap-auth.sh — idempotent script that registers the wallet
  auth-proxy as Forgejo's OIDC provider after `docker compose up -d`. All
  secrets read from .env — no literals in the script.

TheseusNavigator / dev tools
* dev/list-tlds.mjs — enumerate every registered BNS name grouped by TLD via
  our own indexer.
* dev/show-tlds-bch.mjs — dump the full records payload of the legacy
  tlds.bch name (kept as a diagnostic for the list-in-one-NFT era).

Deviant sites + brand
* site/deviant/ — new microsites (anthemus, potidaea, brand, mindmap, main
  index) plus the full brand kit under site/deviant/brand/ (logos, icons,
  palette, social exports as SVG source + PNG renders).
* site-sirius-x/portal.html — updates.

Coordination
* _coordination/sessions/mobile-resolver.md — parallel-session notes.

Deliberately excluded from this commit:
* scratchpad/ — this session's temp drafts (Sia doc mockups, tlds UPD payloads).
* TheseusNavigator/_prev/ — ~372 MB of prior release binaries; belongs in
  a separate artefacts store, not the git tree. Add to .gitignore next pass.
2026-08-30 10:38:49 +02:00
Local Dev
4b8d60d034 Ship Theseus 0.0.6 b740cb03 (tab favicons + image menu + tab cursor)
Setup    b740cb033173622b192701ff36f20a97e357fedebf77c3c7ead03d113a9ac229
Portable 782a2ad235a4a1e1491df6a1d16c817fa8542e363e3c6b139c7e04f40846f4c2

New:
- Tabs carry the page favicon (page-favicon-updated -> emitTabs -> the
  chrome renders it in the same slot the loading spinner uses).
- Image right-click: Open image in new tab / Save image as... / Copy
  image / Copy image address. Save-image-as uses the existing
  will-download tracker, so it also shows in the downloads chip.
- Tab cursor: default arrow at rest instead of the always-'grab' hand.
  Grab only shows while a tab is being dragged for reorder.

Deployed:
- scp installers + releases-manifest.json to /opt/silent-mode/dl/
- scp tools/ + releases/ index pages to /opt/silent-mode/site/
- sia-upload of ../site to bns/silentmode/
- verified HEAD 200 + manifest 0.0.6, VPS hashes match, tools page
  shows 0.0.6 buttons on silentmode.st AND silentmode.bch (Sia mirror).

The 0.0.5 update chip will surface 0.0.6 on existing installs at next
launch (6h manifest poll).
2026-08-29 23:34:06 +02:00
Local Dev
286db6e390 Ship Theseus 0.0.5 606529ea (search fix + link-hover status bar)
Setup   606529ea9f1de9dc1ec5012534dda31b06919245f19f934ee1b9f4f10385a5bc
Portable ed89547a155e998278beccf21f9807841ac6267f75cdcbbead81b80acfee0adc

Fixes:
- Classic form-GET search engines (Google, Brave, Bing, Startpage,
  Yandex, Ecosia, Mojeek, ...) now show results. The tab's
  will-navigate intercept was dropping the query string on every
  dotted-host navigation, so /search?q=foo landed on /search. DDG
  only appeared to work because its in-page search uses pushState +
  XHR and never triggered will-navigate.
- Address bar reflects the target URL immediately on Enter instead
  of showing the previous page's URL until did-navigate fires.

New:
- Link-hover status bar: Firefox / Chrome-style pill at the bottom-
  left of the window showing the href when the pointer is over a
  link, hidden when it leaves. Auto-sizes to text, cleared on tab
  switch, tracks window resize.

Also on-VPS: bns-gateway auto-index directory paths (f43ec61) so
silentmode.bch/tools/ returns the tools page instead of NoSuchKey.

Deployed:
- scp installers + releases-manifest.json to /opt/silent-mode/dl/
- scp tools/index.html + releases/index.html to /opt/silent-mode/site/
- sia-upload of ../site to bns/silentmode/
- verified: HEAD 200 on both installers, manifest reports 0.0.5,
  silentmode.st/tools shows the 0.0.5 buttons, Sia mirror ditto.

The 0.0.4 update-check chip should now surface itself for existing
installs on their next launch.
2026-08-29 22:30:36 +02:00
Local Dev
fbf07a37f7 sirius.x: portal (sign-in + names), Theseus subpage, drop .com public mention
* portal.html — sign in with a seed phrase (in-memory only, wiped on sign
    out), fetch owned NFT categories across all watched addresses, cross-join
    against BCNR buildIndex to show the wallet's names + records. Read-only
    for now; record edit (UPD) will piggyback on the register bundle's signing
    path. WizardConnect button stubbed with a "soon" pill — the adapter
    already exists in register.html and will be wired in the next pass.
  * theseus/index.html — download page for Theseus Navigator (v0.0.4) and
    Ariadne Resolver (Windows setup + Android APK). Same design system as the
    landing. Links to dl.silentmode.st for the actual binaries and to
    silentmode.st/releases for the manifest.
  * index.html — nav now has 🧭 Theseus and 🔑 Portal chips; "Try it" section
    adds cards for the portal and Theseus.
  * site/tlds/ — .com row removed from the public table; count updated to 14;
    supersedes the "held by operator" language per operator direction.
  * site-sirius-x/index.html — softened ICANN-adjacent note.

All routes verified live: silentmode.st/{tlds,sirius-x,sirius-x/portal.html,
sirius-x/theseus,bns/sirius.x} return 200. Sia mirror updated for all three
new/changed sirius.x pages.
2026-08-29 21:57:33 +02:00
Local Dev
92654098ab BNS: per-TLD on-chain registry, multi-beacon indexer, enforcement gate
Per-TLD certificates on a distinct TLD beacon supersede the legacy list-in-one-NFT
model. TLD label is the NFT commitment; TREG/TUPD payloads on the TLD beacon
mirror REG/UPD on the name beacon. Chipnet TLD beacon:
  bchtest:qzc4c76vtw9nd49g6x8nmvc0jz62uvk4dc7hmpmerh
  scripthash c85db10e106606273422b2733b2a6fb8b35a4d0e7dbfb20cf59bdb0833c008b8

  * config.js, resolver-web.{js,d.ts} — TLD_BEACON + TLD_BEACON_SCRIPTHASH
  * bns.js — KNOWN_OPS { REG, UPD, TREG, TUPD }, registerTld/updateTld/normalizeTld
  * bns.js + resolver-web.js — buildIndex({enforceTld:false}) drops name REGs
    whose TLD lacks a live TLD cert at their block height (mempool-friendly).
    Lockstep across both files.
  * lib/tld-index.js — buildTldSnapshot({history,txs}) → deterministic root over
    canonicalised tlds[]. Pure, importable, and stable across insertion order.
  * indexer/bns-indexer.js — BeaconIndex is multi-beacon; ws handler dispatches
    by scripthash; new HTTP endpoint GET /tld-list.json + /health behind
    BNS_HTTP_PORT; state file v1 → v2 migrates in fromJSON.
  * publish-tld-mirror.mjs — S3 (floating + immutable content-addressed) plus
    NIP-33 kind 30078 d:bns-tld-list to Nostr relays, signed via nostr-tools
    (libauth's Schnorr differs from BIP-340 and relays reject it).
  * seed-tld-beacon.mjs — idempotent chipnet seed. Current set on the beacon:
    bch p2p bit nav test x asm neo gt sc sia com dex cex nt (15). `.com` is
    held by the operator: cert on-chain, excluded from public registrar UI.

Design + docs:
  * Decentralized.DNS/DESIGN-tld-registry.md — schema, enforcement,
    operator-countersig gate, USD-tiered pricing floors, fee splits,
    tracker/mirror mechanics, migration/grandfathering.
  * INSTRUCTIONS.md §3 rewritten for the 4-step flow (TREG → UI → deploy →
    republish snapshot).
  * site/tlds/ — public docs page listing current TLDs + verification paths.
  * site/sirius/register.html — dropdown removed; parallel search across
    every TLD in the TLDS array, sorted available → taken → not-on-registry.

Config:
  * ariadne.config.json tlds → [bch, p2p, bit, nav, test, x]  (CA constraints;
    on-chain registry is now the authoritative source, config is fallback).
  * setup/install.ps1 — reads TLD list via fetchTldList (per-TLD registry)
    with fallback to fetchBcnrTlds (legacy tls.bch list-NFT) then config.

Tests:
  * test/tld-index.test.mjs — 30 self-contained checks (multi-beacon dispatch,
    state migration, ws routing, snapshot shape + root recomputability).
  * test/tld-enforcement.test.mjs — synthetic + live chipnet integration
    (with-gate correctly drops all pre-seed names).
2026-08-29 17:11:02 +02:00
Local Dev
e463c16325 site/tools: label bump 0.0.3 -> 0.0.4 (cosmetic follow-up)
Leftover from the 0.0.4 ship: the download buttons already pointed
at the 0.0.4 URLs but the meta line still said "v0.0.3 · ~92 MB".
No content change, just the label.
2026-08-29 15:49:38 +02:00
Local Dev
bde5c787fc Ship Theseus 0.0.4 2722c073 (update-check chip lives)
Rebuild + redeploy of the prior commit. Version bumped from 0.0.3 →
0.0.4 so the chip actually surfaces itself for anyone still on 0.0.3
(the versionIsNewer check requires a strict semver bump — same-version
rebuilds are intentionally silent).

  TheseusNavigator-Setup-0.0.4.exe
  sha256 2722c07317b6ab45b22bbaaacb043f0dcdb30a02a6ec1c3c9525ad94ecbd2574

  TheseusNavigator-0.0.4-portable.exe
  sha256 938505db9a9a83387387c998423925168498bc482768e23b1b888ad62069fa20

Live on dl.silentmode.st + Sia bns/silentmode/. Manifest bumped to
2026-08-08. Site pages (site/tools/index.html + site/releases/index.html)
updated with the new filenames + hashes.

Rollback points on the VPS at /opt/silent-mode/dl/_prev/ (7 versions):
- 8ab9cc3e (0.0.3, UX batch — the ship right before this one)
- 9c09955e (0.0.3, password manager phase 1)
- b62ecf52 (0.0.2, shield green)
- 418e7bba / 208b059a / 036e94c7 (0.0.1 series)
- 81831c08 (parallel-session 0.0.1)

On-chain pointer at releases.silentmode.bch unchanged — publishes the
manifest URL, so 0.0.4 is reachable via BCNR without a wallet spend.

What existing 0.0.3 users will see: on their next Theseus launch the
new update-check chip fires immediately (startup fetch of the manifest),
showing "↓ Update to 0.0.4" next to the Tor toggle. Click → downloads
the installer via the system browser. Dismiss → hidden this session,
reappears next launch until they upgrade.
2026-08-28 20:30:07 +02:00
Local Dev
ca2c052e04 Ship Theseus 0.0.3 8ab9cc3e (UX batch: tabs + address hist + autofill + home)
Rebuild + redeploy of the prior commit. New hashes live on
dl.silentmode.st + Sia bns/silentmode/:

  TheseusNavigator-Setup-0.0.3.exe
  sha256 8ab9cc3ee4b826bf60bd12b12d3efdca0966e2b9fef9a3180ef4104af4c6fef3

  TheseusNavigator-0.0.3-portable.exe
  sha256 e23be66fdfd2e165e92dcc3e1fc46b718bd574d1b03994d7a5d57c7f30606089

Version stayed 0.0.3 (no package.json bump this round). Filenames
unchanged, only the hashes rotate.

Rollback points on the VPS at /opt/silent-mode/dl/_prev/:
- 9c09955e — previous live 0.0.3 (password manager phase 1)
- 208b059a / 418e7bba / 036e94c7 / b62ecf52 — earlier 0.0.1 / 0.0.2 rebuilds

On-chain pointer at releases.silentmode.bch unchanged — publishes the
manifest URL, so this build is reachable through BCNR without a wallet
spend.
2026-08-17 02:25:03 +02:00
Local Dev
b554994c01 Ariadne 9ab725be: default installer to -Mode nrpt (surgical)
Change the Inno [Run] entry from
  install.ps1 -Mode full   ->   install.ps1 -Mode nrpt

Rationale (observed today on the operator's machine): Full mode repoints
adapter DNS at 127.0.0.1, so every DNS query goes through the daemon's
forwarder. bnsd.js's raw-dgram forwarder has a known EDNS/AAAA bug --
strict clients using getaddrinfo (Chrome, Yandex, Firefox, Node) reject
some forwarded replies with "non-recoverable error". Concretely today,
github.com / duckduckgo.com / www.coinex.com all failed in Yandex while
silentmode.bch loaded fine.

Surgical (NRPT) mode routes only activated BCNR TLDs to the daemon
(fetched from tlds.bch at install time -- currently bch, p2p, deviant,
nav, sia, dgb, nt, sm, lm). Everything else stays on the adapter's DHCP
DNS, sidestepping the forwarder bug entirely. Users still get the
"resolves any BCNR TLD in every browser" promise for the entire on-chain
activated set.

Full mode remains available for anyone who explicitly opts in by running
install.ps1 -Mode full themselves. Default flips back once the forwarder
bug is repaired (memory: silentmode-build-state.md).

- SHA-256: 9ab725bec5567625e5857a49b112c4fbc0f59dbdd623abd7110429306f5d0ddb
- Deployed to dl.silentmode.st, site pages + manifest updated, Sia
  mirror re-uploaded. Coordinates with a parallel-session build that
  briefly landed cb9e8ea0 in the site references without a matching
  binary; resolved to my build since only its bytes exist locally.
2026-08-14 23:33:29 +02:00
Local Dev
9fb72c10e8 Snapshot in-progress work: Ariadne mobile, Theseus password manager, Hephaestus
Several concurrent workstreams committed together as a checkpoint:

- Ariadne mobile resolver — BchFetcher/Bns/MainActivity resolution logic,
  AndroidManifest + build.ps1
- Theseus password manager — settings.html/chrome.html/settings-preload.js UI +
  main.js wiring + package.json resource; Argus password-vault.js, record-picker.js
  (+ tests) and resolver-web.d.ts
- Hephaestus — new BCH-wallet OIDC auth-proxy + Forgejo docker-compose and
  restic/S3 scripts (secrets referenced via env only; Hephaestus/.env is gitignored)
- Argus public-gateway.mjs updates
- Docs — root README, Email README/RUNBOOK, VPS access runbooks (Checkers/Deviant),
  site/hermes, WebsiteDev registry + faster-blocks, Failures/ AAAA-mangle writeup,
  Decentralized Storage map, coordination notes
- .gitignore — exclude /.keys/ and Hephaestus/.env
2026-08-14 23:17:18 +02:00
Local Dev
b4b7ca8ee5 Ship Theseus 0.0.3 9c09955e (v0.0.3 manifest + tools page one-panel Theseus Windows/Android)
- TheseusNavigator/package.json: 0.0.2 → 0.0.3. Address-bar fix (main.js refreshTabUrl,
  in 9b9c93c) makes silentmode.bch subpage clicks update the URL correctly.
- site/tools/index.html: collapsed the two-flagship-cards row into one Theseus
  Navigator panel with a shared description and two version sub-blocks (Windows
  + Android) inside a divider grid. Same-product-two-platforms framing.
- site/index.html: Tools card copy updated to match (Theseus Windows + Android;
  built-in Ariadne; also relay, extension, standalone resolver).
- site/releases/index.html + releases-manifest.json: Theseus 0.0.3 entry with the
  new hashes; Android section corrected to v0.8 (was previously showing v0.8
  filename with a v0.2 hash — the linter had gone half-way).
2026-08-07 20:28:25 +02:00
Local Dev
b0ee3ecbfd Ship Theseus 0.0.2 b62ecf52 (shield green + picker→Search + toggle refactor)
Rebuild + redeploy of the prior commit (9b9c93c). Version bumped from
0.0.1 to 0.0.2 (parallel-session bump in package.json). New hashes live
on dl.silentmode.st + Sia bns/silentmode/:

  TheseusNavigator-Setup-0.0.2.exe
  sha256 b62ecf528dc672a07a144af5a8bbb5772b2853b4ad5eec5926bdc6247792ad53

  TheseusNavigator-0.0.2-portable.exe
  sha256 ba80a808446bd75a6b649d93094af9e21be38476dd23980bad7ac0e228a6ce76

Also snapshotted the parallel-session 0.0.1 (81831c08 / b4807aa1) that
was live just before this ship into /opt/silent-mode/dl/_prev/ so it's
available as a rollback alongside the earlier 418e7bba / 208b059a /
036e94c7 builds.

Manifest hashes were previously updated by the parallel session to a
STALE 0.0.2 build (b3a81047 / 37679d29) that never made it live; those
have been overwritten with the actual live hashes now.

On-chain pointer at releases.silentmode.bch unchanged — publishes the
manifest URL, so BCNR clients see the new hashes automatically without
a wallet spend.

PENDING.md updated with the new rollback list.
2026-08-06 01:55:46 +02:00