Silent Mode Mail is no longer an extension. The 0.1.0 panel was a black
screen (iframe to mail.silentmode.st which sends X-Frame-Options: DENY;
the browser rendered the block page and still fired the iframe's load
event, so the 5-second "did it embed?" watchdog saw it as loaded and the
fallback never swapped in). The whole extension existed to put one "Open
Mail" button in a panel — that is exactly what a sidebar quicklink does,
without taking a panel slot or an Extensions row. So:
- settings.quickLinks default list gains silentmail at the top
(Silent Mode Mail → https://mail.silentmode.st/).
- migrateAegisRename grew a mail retirement block: any existing
extensions/mail/ folder on the user's box moves to
addons-backups/mail-migrated-<stamp>/ on first boot of this
Theseus, so the old extension vanishes from Settings instead of
sitting there with a broken panel.
- "mail" added to the first-party reserved-ids list so no community
add-on can claim the id after retirement.
Nostr NIP-07 signer finally ships. The bundled-addons/nostr/ folder was
sitting untracked in the main checkout, so the detached-HEAD build
worktree 0.3.130 used never saw it (same reason build/, tor/, snapshots/
have to be hand-copied into the worktree). This build committed the
folder and copied it in. Puts window.nostr on https + localhost pages;
identity is Hermes's key (one npub for DMs and public notes). Per-origin
read/sign grants; kinds 0/3/5/10002 re-prompt every time with no
remember option.
Sidebar panel apps free their render tree after idle. closeLeftPanel
used to keep the loaded page warm forever — great for fast reopen, bad
for RAM when the user docks a heavy panel (Hermes, Pithos, Aegis) once
and never comes back. A 2-minute idle timer now blanks the panel to
about:blank after close; reopen within the window still reuses the
loaded page (cancelLeftPanelIdleUnload on open), reopen after the
window reloads fresh. LEFT_PANEL_IDLE_MS = 2 * 60 * 1000. Right-side
sidebar view (webapp tabs — Telegram, X, WhatsApp, AI chat) is longer-
lived by design and untouched here.
Startpage layout:
- Game.X takes SilentMode.X's slot in the Silent Mode cards (stub
description + a built-in gamepad brand mark until game.x goes
live). SilentMode.X moves to the quick-links strip as the 5th
slot. Still TODO: push the swap into the remote home-cards.json
for existing profiles.
- Light-theme palette flip under body.light. The @media
(prefers-color-scheme: light) block only triggered on OS-level
light preference; picking the "light" background preset left --ink
white against a white page, so hero titles, card titles, slot
labels and the ".bch" extension read as pale ghosts. Added a full
body.light { --ink; --mut; --card; --line; ... } block plus
overrides for the hero + card translucent panels (dark-glass →
light-glass on light theme) and the ctx-menu / modal. Dark theme
untouched.
6.3 KiB
Pending — uncommitted Theseus changes
Working-tree state that hasn't been committed or shipped. Read this before touching the same files. Update when you land or add work.
Format: each group has a session: label so parallel sessions can see
what belongs to whom and coordinate. Naming convention:
YYYY-MM-DD:short-slug for date-bounded work, or parallel:<theme> for
work owned by a session that isn't the current one.
Last updated: 2026-10-29 (post-0.3.130 batch).
Releases are no longer recorded here: the live version and hashes are in
../site/releases-manifest.json and https://dl.silentmode.st/releases-manifest.json,
and each release commit is Theseus 0.3.x: ... in git history.
Staged for the next release (post-0.3.130)
Queue of asks for the next cut. Items marked LANDED are edited in the working tree waiting for a bump + build. Items marked TODO still need the code change.
- LANDED: Nostr NIP-07 signer — new bundled add-on
bundled-addons/nostr/(0.1.0) plus host support. Putswindow.nostron https + localhost pages so any Nostr client (Primal, Coracle, Snort, nostrudel) can sign with the identity Theseus already holds. Needs a Theseus release: it changesmain.jsand bundles a new add-on, so the extension OTA alone cannot deliver it. MISSED 0.3.130 — the folder is untracked (??in git status), so the detached-HEAD build worktree never saw it. For 0.3.131 the ship script must eithergit addthe folder first orcp -rit into the build worktree the same waybuild/,tor/,snapshots/are copied.- lib/nostr-signer.js — new. Crypto half:
getPublicKey,signEvent(BIP340 via nostr-toolsfinalizeEvent), nip04 + nip44 encrypt/decrypt. Recomputespubkey/idrather than trusting the page. - main.js —
global._nostrAPInext to_hermesAPI. - Identity is Hermes's key (
nostrKeyFromRoot(messengerRoot)); vault with no mnemonic reports no identity instead of failing obscurely. - Policy per-origin (read vs sign), kinds 0/3/5/10002 re-prompt every time with no remember option.
- Tests:
scratchpad/signer-test.mjs,nostr-policy-test.mjs,nostr-e2e.mjs.
- lib/nostr-signer.js — new. Crypto half:
- LANDED: Home — SilentMode.X moved to the quick-links strip, Game.X
takes its place in the Silent Mode cards. home.html
defaultState().sections.smand.q. Game.X entry uses a built-ingamebrand mark (new SVG inBRAND); the real description and favicon will come from the live site once game.x is up (currently a stub). SilentMode.X moves into the slots strip as the 5th quick-link. Still TODO: update the remote cache athttps://dl.silentmode.st/home-cards.jsonso existing profiles pick the swap up without resetting (localsections.smisn't reseeded bymigrateCards— only the remote fetch rewrites it for installed users). - LANDED: Mail is now a Sidebar quicklink, not an extension. The
user flagged two things in one: the Mail add-on's 0.1.0 panel was a
black screen (iframe + XFO: DENY), AND Mail conceptually belongs
under Settings → Sidebar (webapp quicklinks) rather than Settings →
Extensions. Both resolved by dropping the extension form entirely:
settings.quickLinksdefault list in main.js gains{ id: "silentmail", url: "https://mail.silentmode.st/", title: "Silent Mode Mail" }as the first entry.migrateAegisRename()grew a mail retirement block: on first boot of this Theseus, any installedextensions/mail/folder moves toaddons-backups/mail-migrated-<stamp>/. The one-offmail/directory I added underbundled-addons/earlier in this session is removed again (the quicklink + retire is the right path)."mail"added to the first-party reserved-ids list so a community add-on can't claim the id after retirement.- The quicklink does exactly what the old extension's "Open Mail"
button did (new tab at
mail.silentmode.st), without taking a panel slot or an Extensions row.
- LANDED: Left-side sidebar panels free their render tree after idle.
main.js
closeLeftPanel: closed panels used to keep their loaded page (leftPanelLoadedIdkept, webContents warm) forever — great for fast reopen, bad for RAM when the user docks a heavy app-like panel (Hermes, Pithos, mail) once and never comes back. Now a 2-minute idle timer blanks the panel toabout:blankafter close, dropping iframes/media/listeners; reopen inside the window still reuses the loaded page (cancelLeftPanelIdleUnloadon open).LEFT_PANEL_IDLE_MS = 2 * 60 * 1000. Does NOT touch the right-sidesidebarview (webapp tabs — Telegram, X, WhatsApp, AI chat) — those are longer-lived by design; follow-up decision whether to apply the same idle unload there. - LANDED: Startpage light theme palette flip under
body.light. home.html: the existing@media (prefers-color-scheme: light)block only flipped tokens when the OS preferred light. Picking the "light" background preset (body.light, set byapplyBg()) left--inkwhite against a white page, so hero title, SM card titles, slot labels and the ".bch" extension read as pale ghosts. Added a fullbody.light { --ink; --mut; --card; --line; ... }block plus overrides for the hero/card translucent panels (dark-glass → light- glass on light theme so the dark text inside reads), the ctx-menu and modal (white surfaces, dark text). Dark theme untouched.
session: parallel:collision-policy
Owner's focus: BCNR ↔ ICANN name collision handling. Not mine — leave for that session to land or bundle by explicit ask.
- Android / mobile: ../AriadneResolver/mobile/app/AndroidManifest.xml, BchFetcher.java, Bns.java, build.ps1 — mobile-side collision changes.
- Repo-wide:
.gitignoregained a/.keys/line (harmless).
Live state
Shipped hashes live at ../site/releases-manifest.json and
https://dl.silentmode.st/releases-manifest.json. On-chain pointer at
releases.silentmode.bch. See GOTCHAS.md for the release
gotchas.