Commit graph

161 commits

Author SHA1 Message Date
Local Dev
c4d8a39ad4 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
b44ba8a53a 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
cc0bf815c9 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
c3b9956873 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
2d9f8c9f43 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
3c0f157719 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
905bb68339 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
ee47d0055a 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
bce93ef949 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
b7cb432a62 site-theseus-x: reword "BCH" -> "Bitcoin Cash" + red-N compass bearing
Copy: two spots in the landing (meta description and the 'What it is'
lede) said "BCH" - reworded to "Bitcoin Cash" so first-time visitors
don't have to know the ticker to understand what this browses.

Branding: north half of the compass diamond is now red (#e04e4e), like
every real compass needle; south stays acid green, east-west arm stays
softened acid. Reads clearly which way is 'north' even at 16x16, and
adds the second brand accent color without diluting the acid identity.
Updated inline SVG copies in nav + hero, plus favicon.svg and logo.svg.

Also on-chain: theseus.x registered on BCNR (chipnet) via
`node src/register.js theseus.x '{"s3":"bns/theseus/","u":"..."}'`
Txid: b9f42ae73131a0c97b9d421aa560a1d44ce355f5ec51a5c3d0a11e5b3f8799a6
Verified: the VPS gateway (127.0.0.1:8700/bns/theseus.x/) now serves
the page 200 OK, content matches the new copy + palette.
2026-08-31 04:45:50 +02:00
Local Dev
f2b6ad66bf site-theseus-x: standalone landing page for the theseus.x BCNR name
Standalone dir alongside site-sirius-x. Same brand family (dark bg + acid
green, sticky nav, rounded-square favicon in the sibling shape) with a
compass-diamond mark specific to Theseus Navigator = ship metaphor.

Contents:
- assets/favicon.svg  — 64x64 rounded dark square + acid compass diamond
- assets/logo.svg     — same mark + wordmark for OpenGraph previews
- index.html          — hero, what-it-is, features grid, download panels
                        for Windows setup / portable and Ariadne Android,
                        SHA-256 verify block, footer

Live hashes match releases-manifest.json (0.0.9 Windows + 0.11 APK).

Uploaded to Sia bucket bns/theseus/ (sia-upload.js output records the
canonical `{"s3":"bns/theseus/"}` value). Not resolvable via
silentmode.bch gateway yet — the on-chain BCNR record for theseus.x is
the user's wallet action (see the follow-up register instructions).
2026-08-31 04:33:09 +02:00