From f73b35c34980724da4ff843b8822370d622398ae Mon Sep 17 00:00:00 2001 From: Local Dev Date: Wed, 21 Oct 2026 02:19:58 +0300 Subject: [PATCH] hermes.x: standalone site + sidebar addon side:left + mark v2 (tapered trails) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New site-hermes-x/ — standalone .x site (own nav, own assets, own OG tags), sibling to site-theseus-x and site-sirius-x. Internal nav stays on hermes.x: Overview, Messenger (preview + UI mockup), Branding (brand kit). The only cross-link is 'Get Theseus' pointing at theseus.x where appropriate. Mark redesigned: tilted winged envelope with three tapered speed-trails on the back-left (top longest, bottom shortest). Default colour sky #38BDF8 — swappable via --sky in site-hermes-x/assets/shared.css. Alternate orange palette documented but not applied by default. Mark propagated to: - site-hermes-x/assets/mark.svg + mark-stroke.svg (16-20px variant) - site/hermes/{index.html, branding/{index.html, mark.svg, mark-stroke.svg}} - TheseusNavigator/bundled-addons/hermes/{addon.json, panel.html} Theseus addon moves out of the top-right extensions dock and into the left-strip sidebar: panels[].side = 'left' + registerSidebarPanel({side:'left'}). Appears alongside Mail/Pithos/Telegram, excluded from rightPanels() so the extensions dock no longer lists it. Verified via sidebarState() CDP query — hermes:main is no longer in the right-panels list. site/hermes/ (the nested silentmode.st/hermes page) also updated to the new mark for consistency; both the sovereign hermes.x and the silentmode-nested page now show the same winged envelope. --- assets/favicon.svg | 7 ++ assets/mark-stroke.svg | 8 ++ assets/mark.svg | 10 ++ assets/shared.css | 112 +++++++++++++++++++ branding/index.html | 193 ++++++++++++++++++++++++++++++++ index.html | 173 +++++++++++++++++++++++++++++ messenger/index.html | 242 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 745 insertions(+) create mode 100644 assets/favicon.svg create mode 100644 assets/mark-stroke.svg create mode 100644 assets/mark.svg create mode 100644 assets/shared.css create mode 100644 branding/index.html create mode 100644 index.html create mode 100644 messenger/index.html diff --git a/assets/favicon.svg b/assets/favicon.svg new file mode 100644 index 0000000..b9a2784 --- /dev/null +++ b/assets/favicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/mark-stroke.svg b/assets/mark-stroke.svg new file mode 100644 index 0000000..4a2b9e0 --- /dev/null +++ b/assets/mark-stroke.svg @@ -0,0 +1,8 @@ + + Hermes + + + + + + diff --git a/assets/mark.svg b/assets/mark.svg new file mode 100644 index 0000000..ee889b1 --- /dev/null +++ b/assets/mark.svg @@ -0,0 +1,10 @@ + + Hermes + + + + + + + + diff --git a/assets/shared.css b/assets/shared.css new file mode 100644 index 0000000..dbc732d --- /dev/null +++ b/assets/shared.css @@ -0,0 +1,112 @@ +/* hermes.x — standalone brand site, not derived from silentmode.st shared.css. + Primary accent is sky-mid #38BDF8 (default; swap --sky in :root to re-skin). */ +:root{ + --bg:#0b0e14; + --panel:#141a24; + --panel2:#18202c; + --panel3:#1d2634; + --line:rgba(255,255,255,.09); + --line2:rgba(255,255,255,.14); + --ink:#e7eaf1; + --mut:#8b98a9; + --dim:#5e6678; + --sky:#38BDF8; /* primary accent — the Hermes mark colour */ + --sky-soft:#60A5FA; + --sky-deep:#0EA5E9; + --warn:#ffc75f; + --ok:#4fd1a5; + --err:#f6768a; +} +*{box-sizing:border-box} +html{scroll-behavior:smooth} +body{ + margin:0; + background:radial-gradient(1100px 560px at 50% -12%,#121a26,var(--bg)); + color:var(--ink); + font:16px/1.65 system-ui,-apple-system,Segoe UI,Roboto,sans-serif; + min-height:100vh; +} +a{color:var(--sky)} +a:hover{color:var(--sky-soft)} + +/* ---- top nav ---- */ +.topnav{ + position:sticky;top:0;z-index:20; + display:flex;gap:2px;align-items:center;flex-wrap:wrap; + padding:10px 1.2rem; + background:rgba(11,14,20,.85); + backdrop-filter:blur(10px); + border-bottom:1px solid var(--line); +} +.topnav .brand{ + font-weight:600;color:var(--ink);text-decoration:none; + margin-right:14px;font-size:15px;letter-spacing:.2px; + display:inline-flex;align-items:center;gap:8px; +} +.topnav .brand svg{width:20px;height:20px;color:var(--sky)} +.topnav .brand .x{color:var(--sky)} +.topnav a{ + color:var(--mut);text-decoration:none; + padding:6px 12px;border-radius:8px;font-size:14px; +} +.topnav a:hover{color:var(--ink);background:var(--panel)} +.topnav a.here{color:var(--sky);background:rgba(56,189,248,.08)} +.topnav .get{margin-left:auto;background:rgba(56,189,248,.14);color:var(--sky);font-weight:500} +.topnav .get:hover{background:rgba(56,189,248,.22)} + +/* ---- layout ---- */ +.wrap{max-width:980px;margin:0 auto;padding:0 1.2rem} +.wrap.narrow{max-width:780px} + +header.hero{text-align:center;padding:4.5rem 1.2rem 2.4rem} +header.hero .mark{display:inline-flex;color:var(--sky);line-height:0} +header.hero .mark svg{width:120px;height:120px} +h1{font-size:clamp(2.2rem,5vw,3.2rem);margin:.8rem 0 .3rem;letter-spacing:.4px;font-weight:600} +h1 .x{color:var(--sky)} +.tag{color:var(--mut);font-size:1.1rem;max-width:660px;margin:.4rem auto 0} +.tag kbd{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:4px;padding:1px 7px;font-family:ui-monospace,monospace;font-size:13px;color:var(--ink)} + +section{padding:2.8rem 0;border-top:1px solid var(--line)} +section.plain{border-top:none} +h2{font-size:1.55rem;margin:0 0 .4rem;font-weight:600} +h3{font-size:1.05rem;margin:0 0 .3rem;font-weight:600} +.lede{color:var(--mut);margin:0 0 1.6rem;max-width:680px} + +/* ---- cards ---- */ +.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px} +.card{ + background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px; +} +.card h3{display:flex;align-items:center;gap:8px;margin-bottom:.5rem} +.card p{margin:0;color:var(--mut);font-size:14px;line-height:1.55} +.src{display:inline-block;font-size:11px;padding:1px 7px;border-radius:999px;background:var(--panel2);color:var(--mut);text-transform:uppercase;letter-spacing:.4px;font-weight:600} +.src.ok{color:var(--ok);background:rgba(79,209,165,.12)} +.src.next{color:var(--sky);background:rgba(56,189,248,.12)} +.src.plan{color:var(--mut)} + +/* ---- notes ---- */ +.note{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;font-size:14px;color:var(--mut)} +.note b{color:var(--ink)} +.note.warn{background:rgba(255,199,95,.06);border-color:rgba(255,199,95,.22);color:var(--ink)} +.note.warn b{color:var(--warn)} + +/* ---- buttons / CTAs ---- */ +.cta{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:1.7rem} +.btn{display:inline-flex;align-items:center;gap:8px;text-decoration:none;padding:11px 20px;border-radius:999px;font-weight:600;font-size:14px} +.btn.primary{background:var(--sky);color:#06111a} +.btn.primary:hover{filter:brightness(1.08)} +.btn.ghost{background:var(--panel);color:var(--ink);border:1px solid var(--line)} +.btn.ghost:hover{background:var(--panel2);border-color:var(--line2)} + +code.inline{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;background:rgba(255,255,255,.05);padding:1px 6px;border-radius:5px;font-size:.92em} + +/* ---- steps list ---- */ +.steps{list-style:none;padding:0;margin:0;counter-reset:step} +.steps li{display:flex;gap:14px;padding:14px 0;border-top:1px solid var(--line)} +.steps li:first-child{border-top:none;padding-top:0} +.steps li::before{counter-increment:step;content:counter(step);flex-shrink:0;width:28px;height:28px;border-radius:50%;background:rgba(56,189,248,.12);color:var(--sky);display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600} +.steps li b{display:block;margin-bottom:4px} +.steps li span{color:var(--mut);font-size:14px} + +footer{text-align:center;padding:2.5rem 1.2rem 3rem;color:var(--mut);font-size:13px;border-top:1px solid var(--line)} +footer .fine{color:var(--dim);font-size:12px;margin-top:.5rem} diff --git a/branding/index.html b/branding/index.html new file mode 100644 index 0000000..409e004 --- /dev/null +++ b/branding/index.html @@ -0,0 +1,193 @@ + + + + + +hermes.x — brand kit + + + + + + + + + +
+ +

Brand kit

+

Mark, palette, name, voice. One page so client builds, add-on + chrome, screenshots and third-party press stay consistent.

+
+ +
+ +
+

The name

+

In English the product is Hermes — after the Greek god of + messengers, travellers, and crossings. In modern Greek the same name is + Ermis (Ἑρμῆς). Written form is always Hermes outside Greek contexts.

+

The keyboard shortcut inside Theseus is Ctrl+Shift+E + — E for Ermis, off the collision path with Chrome's own Ctrl+Shift+M.

+
Not Hermès. The French + fashion house owns the mental model for the word with the grave accent and + the orange leather. We spell it Hermes (no accent). Our mark is a + winged envelope mid-flight, not a horse-drawn carriage. If a visitor + confuses the two, the mark alone should set them straight.
+
+ +
+

The mark

+

A tilted envelope with three speed-trails on the back edge + — a letter mid-flight. Monochrome, scales from 16 px (sidebar icon) to + 160 px (hero) without legibility loss. SVG uses + currentColor so it inherits whatever text + colour it sits in.

+ +
+
+
+ 16 px — stroke variant (one trail) +
+
+
+ 32 px — standard (3 tapered trails) +
+
+
+ 64 px — in-panel +
+
+
+ on sky background +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
DoDon't
Keep the envelope tilted ~22°, trails on the back-left.Mirror the mark or tilt it the opposite direction.
Let the mark inherit text colour (currentColor).Hard-code a colour inside the SVG; it limits reuse.
Use the stroke variant below 24 px display size.Scale the standard mark below 20 px — trails merge.
Pair with the wordmark "hermes.x" when context is unclear.Pair with the Hermès logotype or any horsey mascot.
+
+ +
+

Palette

+

Hermes rides on a sky-blue primary — fast, airborne, legible + on both dark and light. The deep navy background is the natural pairing; + the dim tones are for muted type.

+ +
+
bg#0b0e14 — primary surface
+
panel#141a24 — cards, sidebar
+
sky#38BDF8 — primary accent (mark)
+
sky-soft#60A5FA — hover, secondary
+
sky-deep#0EA5E9 — pressed / active
+
ink#e7eaf1 — body text
+
mut#8b98a9 — muted text
+
warn#ffc75f — warnings, unread accents
+
+ +
Alternate: Hermès-palette orange. The brand file also + carries a warm orange variant (#FF6D00, + #FF8C1A, #E65100) + for third parties who prefer the Hermes-god colour association. Pick one + or the other — never both in the same build. Sky-mid is the default.
+
+ +
+

Voice

+
    +
  • Blunt about limits. + "Relays still see recipient and timing" is the tone, not "fully + anonymous messaging". Say what the design does and does not solve.
  • +
  • No evangelism about Nostr. + Nostr is the transport, not the product. Mention it where it + matters (relays, pubkeys, NIP-17) and don't elsewhere.
  • +
  • "Message by name" is the one-line pitch. + Everything else is supporting detail.
  • +
  • Lowercase for product nouns in body copy. + hermes.x, messenger, panel. Capital Hermes for titles and the first + mention per page.
  • +
+
+ +
+

Attribution + reuse

+

Mark + palette are MPL-2.0 along with the rest of the Hermes client source. + Use for reviews, press, interoperability docs and the client's own chrome. + Don't apply to products that aren't actually Hermes (forks with different + protocols or trust models included).

+
+ +
+ + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..44c0baa --- /dev/null +++ b/index.html @@ -0,0 +1,173 @@ + + + + + +hermes.x — message anyone by their .bch name + + + + + + + + + + + + + + + + + + +
+ +

Message by name.

+

End-to-end encrypted DMs over Nostr, addressed by your + .bch name instead of a public-key string. + Your name owns your key. No email, no phone number, no company, no server + that can delete your account.

+ +
+ +
+ +
+

What ships today

+

Hermes is live inside the Theseus desktop browser. Web + messenger and Android follow.

+
+
+

Threaded chat live

+

Contact list on the left (search + unread badges), selected + conversation on the right, inline reply. Enter to send.

+
+
+

Send by name live

+

Type alice.bch. The client resolves the + name on-chain, wraps NIP-17 to the recipient's Nostr key, publishes + to their declared relays. Sealed-sender — the relay never sees who + sent what to whom.

+
+
+

Address book live

+

Local contact list — add names, nicknames, import vCards. Nothing + uploaded; the book is on your device.

+
+
+

History on your device live

+

Messages persist to disk per identity. Close and reopen the panel — + your threads are still there, unread marks included.

+
+
+

Web Messenger next

+

hermes.x/messenger — browser-side messenger + for anyone without the desktop app. Same crypto, same identity.

+
+
+

Mobile (Ariadne) planned

+

Inside the Ariadne Android app: same wallet seed, same Nostr identity, + zero extra onboarding.

+
+
+
+ +
+

The one idea that makes this different

+

Every existing Nostr client has the same wart: identity is + npub1q8s7f3k… gibberish. The human-name fix — + NIP-05 — resolves alice@example.com through a + DNS domain and a web server. That is exactly the ICANN + server chain + Bitcoin Cash names exist to escape.

+
+ The Hermes pitch.
+ alice.bch publishes her Nostr pubkey as an + on-chain record. Her name certificate is her verified, + seizure-resistant identity. Message anyone by their + .bch name — no phone number, no email, no ICANN, + no company, no server that can delete your account. +
+
+ +
+

How it works

+
    +
  1. Your name owns your key. + Register any name on the chain, publish your Nostr pubkey as an + np record. The key is derived from the + same wallet seed as the name, so one seed backs both.
  2. +
  3. Find people by name. + Type bob.bch. The client resolves + it against the chain, pulls np + (Nostr pubkey) and nr (preferred relays). + No directory server involved.
  4. +
  5. Send the message sealed. + NIP-17 gift-wrapped DMs — the relay sees neither sender nor + content, only that a wrap addressed to some pubkey exists. Route over + Tor to also hide your IP.
  6. +
  7. The name shows, not the pubkey. + Incoming messages reverse-resolve pubkey → name where possible, + so your chat list looks like a normal chat list — not a wall of hex.
  8. +
+
+ +
+

Honest boundaries

+
+
+

Messaging, not email

+

No Gmail interop — by design. A separate anonymous-mailbox product + covers "sign up on services without leaking a real address".

+
+
+

Metadata resistance is good, not perfect

+

NIP-17 hides sender and content from relays. Relays still see the + recipient pubkey, timing, and your connection IP unless you route + over Tor.

+
+
+

Relays are Nostr's soft spot

+

A message lives only while some relay keeps it. We run one relay + + write to a handful of public relays for reach and redundancy.

+
+
+
+ +
+

Try it

+

+ Open the web messenger right here, or install Theseus for the full + experience (persistent history, sidebar entry, keyboard shortcut).

+ +
+ +
+ + + + + diff --git a/messenger/index.html b/messenger/index.html new file mode 100644 index 0000000..b6a45fd --- /dev/null +++ b/messenger/index.html @@ -0,0 +1,242 @@ + + + + + +hermes.x/messenger — browser messenger (preview) + + + + + + + + + +
+ +

Messenger

+

Hermes in a browser tab — end-to-end encrypted DMs over Nostr, + addressed by .bch name. The desktop client has + the richest flavour; the web messenger meets you where you are.

+
+ +
+
+
+ Preview. The desktop messenger inside Theseus + is live today — threaded chat, persistent history, address book, keyboard + shortcut Ctrl+Shift+E. The web-only client + (what this page becomes) is in development: BIP-39 → Nostr key derivation, + BCH-name resolution via gateway, NIP-17 wrap/unwrap, WebSocket to relays, + IndexedDB inbox. Everything client-side, nothing uploaded. +
+
+ +
+
+
+
Hermes · hermes.x/messenger
+ your npub: npub1ab…z89 + 1/1 relay +
+
+ +
+
+
+
bob
+
023bf8c1…9ad2
+
+
+
+
hey, did you register your name yet?11:38
+
just now — bob.bch is live11:40
+
nice. send me the hermes.x link11:42
+
https://hermes.x/messenger11:43
+
great, send me the link11:44
+
+
+ + +
+
+
+
+
Non-interactive preview — live build pending (see roadmap below).
+ +
+ +
+

Two clients, one identity

+
+
+

Desktop (Theseus) live

+
    +
  • Full crypto in-process (NIP-17, nip44 v2)
  • +
  • Persistent inbox + read-state on disk
  • +
  • Address book (local JSON + vCard import)
  • +
  • Sidebar panel, Ctrl+Shift+E shortcut
  • +
  • Vault-bind: no re-typing the mnemonic
  • +
  • Reverse-resolve pk → .bch name
  • +
+ +
+
+

Web (this page) building

+
    +
  • Same crypto, same identity (same wallet seed derivation)
  • +
  • BCH name resolution via public gateway
  • +
  • WebSocket to Nostr relays from the browser
  • +
  • IndexedDB inbox — survives tab close, scoped to this origin
  • +
  • No download, no install, no account
  • +
  • Mnemonic entry only — never stored in plaintext
  • +
+ +
+
+
+ +
+

Why wait for the web client

+

The web messenger isn't ready yet because of three things we + want to get right before shipping:

+
    +
  1. Key handling in a tab. + A wallet mnemonic is the most sensitive bit of data a user has. In + the desktop app it lives in main-process memory; in a tab it has to + survive page reloads without ever landing in plaintext anywhere. We're + wiring a WebCrypto-backed non-extractable key path with the vault PIN + as the gate.
  2. +
  3. Resolver gateway. + The desktop talks to a chipnet Fulcrum directly. A browser can't + — it needs an HTTPS gateway that answers np + / nr for a name. The gateway is live + (navigate.st/api/dns/alice.bch) but the + client-side cache + signature-verification path still has an edge case + with lapsed names.
  4. +
  5. Relay persistence. + Desktop keeps a long-lived WebSocket to each relay. A tab doesn't, + because browsers throttle background sockets. The web client needs + offline queueing and a well-defined "catch-up" fetch on return — + otherwise you re-open the tab and the inbox feels empty.
  6. +
+

Until the three are solid, install Theseus for the real thing. + The web client will land here when the above are green.

+ +
+ +
+ + + + +