Hermes: Ermis shortcut (Ctrl+Shift+E), sidebar add-on, vCard import, brand kit

Shortcut: Ctrl+Shift+M -> Ctrl+Shift+E. Chrome owns Ctrl+Shift+M as
'switch profile' and E matches the Greek spelling (Ermis).

Sidebar discoverability: new bundled add-on at bundled-addons/hermes/
registers a left-strip icon + launcher panel. The panel is a thin chrome
(mark + 'Open Messages' + shortcut hint) that forwards clicks through
api.onMessage -> ipcMain.emit('hermes-open-request') -> openHermesWindow.
All real messaging code stays in main.js — add-on is purely for discovery.

Address book: opt-in vCard (.vcf) import. Dialog in the Add Contact modal
lets the user pick a file; main.js parses BEGIN:VCARD blocks for X-BNS-NAME
/ X-NOSTR-NPUB / X-NOSTR-PUBKEY plus .bch names and npubs mentioned in
NOTE fields. Candidates are previewed per-contact with checkboxes; nothing
is added until the user confirms. Non-matching vCards are returned too (so
the user can still add manually) rather than silently dropped. Nothing is
uploaded; parsing is local.

site/hermes: status badge flipped from 'designed - not yet built' to
'MVP - desktop'. New 'What ships today' grid covers threaded chat, send by
name, address book, local history (all live) and mobile + Tor (next /
planned). Hero carries the new Ctrl+Shift+E shortcut and a link to
/hermes/branding.

site/hermes/branding: new page. Mark SVG (winged envelope, two variants
for 16-20px and 24-160px display sizes), palette (reuses Silent Mode
tokens + an amber accent that's distinctly warm-yellow, not Hermes-orange
— so it never collides with Hermès the fashion house), name explanation
(English Hermes / Greek Ermis), voice notes, do/don't table, MPL-2.0
attribution.

Hermes/MOBILE-RECOMMENDATION.md: analysis of three mobile paths (inside
Ariadne / standalone / hybrid). Recommendation is Option 1: ship as a
screen inside Ariadne. Reuses the wallet seed, aligns with the design
doc's 'one seed many purposes' architecture, lowest total cost.
This commit is contained in:
Local Dev 2026-10-21 00:45:25 +03:00
parent 6d7ce365d4
commit 81082c0c4e
4 changed files with 269 additions and 1 deletions

188
hermes/branding/index.html Normal file
View file

@ -0,0 +1,188 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Hermes — brand — Silent Mode</title>
<meta name="description" content="Hermes brand kit: mark, palette, name, tone. Not Hermès the fashion house; Hermes the messenger god.">
<link rel="stylesheet" href="../../shared.css">
<style>
.mark-xl{color:var(--acid); line-height:0}
.mark-xl svg{width:160px; height:160px}
.mark-row{display:flex; gap:28px; align-items:center; flex-wrap:wrap; margin:1rem 0 2rem}
.mark-row .cell{display:flex; flex-direction:column; align-items:center; gap:8px; padding:16px; background:var(--panel); border:1px solid var(--line); border-radius:12px}
.mark-row .cell small{color:var(--mut); font-size:11px}
.mark-row .cell svg{display:block}
.mark-16{color:var(--ink); line-height:0}
.mark-16 svg{width:16px; height:16px}
.mark-32{color:var(--ink); line-height:0}
.mark-32 svg{width:32px; height:32px}
.mark-64{color:var(--acid); line-height:0}
.mark-64 svg{width:64px; height:64px}
.mark-neg{color:#0a0d13; line-height:0; padding:14px 18px; border-radius:12px; background:var(--acid)}
.mark-neg svg{width:48px; height:48px}
.swatches{display:grid; grid-template-columns:repeat(auto-fit,minmax(170px,1fr)); gap:12px; margin:1rem 0 2rem}
.sw{background:var(--panel); border:1px solid var(--line); border-radius:12px; overflow:hidden}
.sw .block{height:70px}
.sw .meta{padding:10px 12px; font-size:12px; color:var(--mut)}
.sw .meta b{display:block; color:var(--ink); font-size:13px; font-weight:600; margin-bottom:2px}
.sw .meta code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.tbl{width:100%; border-collapse:collapse; margin:1rem 0 2rem; font-size:14px}
.tbl th, .tbl td{text-align:left; padding:10px 12px; border-bottom:1px solid var(--line); vertical-align:top}
.tbl th{color:var(--mut); font-weight:500; font-size:12px; text-transform:uppercase; letter-spacing:.4px}
.tbl td.y{color:var(--ok)} .tbl td.n{color:var(--err)}
.dl-row{display:flex; gap:10px; flex-wrap:wrap; margin:1rem 0}
.dl-row a{display:inline-flex; align-items:center; gap:8px; text-decoration:none; padding:10px 14px; border-radius:999px; background:var(--panel); color:var(--ink); border:1px solid var(--line); font-size:13px}
.dl-row a:hover{background:var(--panel2); border-color:var(--line2)}
</style>
</head>
<body>
<nav class="topnav">
<a class="brand" href="../../">⛓️ Silent <span class="g">Mode</span></a>
<a href="../../tools/">Tools</a>
<a href="../../prometheus/">Prometheus</a>
<a href="../../sirius/">Sirius.X</a>
<a href="../../helios/">Helios</a>
<a href="../" class="here">Hermes</a>
</nav>
<header class="hero">
<div class="mark mark-xl" aria-hidden="true"><object data="mark.svg" type="image/svg+xml" width="160" height="160">Hermes</object></div>
<h1>Hermes <span class="pill p-brand" style="vertical-align:middle;font-size:12px;margin-left:.6rem;background:rgba(214,255,61,.12);color:var(--acid);padding:2px 8px;border-radius:999px">brand</span></h1>
<p class="tag">Mark, palette, name, tone. One page so client builds, add-on
chrome, screenshots and third-party press stay consistent without a
design review.</p>
</header>
<div class="wrap narrow">
<section class="plain">
<h2>The name</h2>
<p>In English the product is <b>Hermes</b> — after the Greek god of messengers,
travellers, and crossings. In modern Greek the same name is <b>Ermis</b>
(Ἑρμῆς). Both pronunciations are correct; written form is always Hermes
outside Greek contexts.</p>
<p>The keyboard shortcut inside Theseus is <code class="inline">Ctrl+Shift+E</code> —
E for Ermis, and off the collision path with Chrome's own Ctrl+Shift+M
("switch profile").</p>
<div class="note warn" style="margin-top:1rem"><b>Not Hermès.</b> The French
fashion house owns the mental model for the word with the grave accent and
the orange. We spell it <b>Hermes</b> (no accent) and we do not use that
orange. If a visitor confuses the two, the mark alone should set them
straight.</div>
</section>
<section>
<h2>The mark</h2>
<p class="lede">A winged envelope. Reads as "messenger" at a glance, works
monochrome, scales from 16 px (sidebar icon) to 160 px (hero) without
legibility loss. SVG uses <code class="inline">currentColor</code> so it
inherits whatever text colour it sits in.</p>
<div class="mark-row">
<div class="cell">
<div class="mark-16"><object data="mark-stroke.svg" type="image/svg+xml" width="16" height="16"></object></div>
<small>16 px — simplified stroke variant</small>
</div>
<div class="cell">
<div class="mark-32"><object data="mark.svg" type="image/svg+xml" width="32" height="32"></object></div>
<small>32 px — standard</small>
</div>
<div class="cell">
<div class="mark-64"><object data="mark.svg" type="image/svg+xml" width="64" height="64"></object></div>
<small>64 px — on panel</small>
</div>
<div class="cell">
<div class="mark-neg"><object data="mark.svg" type="image/svg+xml" width="48" height="48"></object></div>
<small>on acid green</small>
</div>
</div>
<div class="dl-row">
<a href="mark.svg" download>⬇️ mark.svg (standard, 3 feathers per wing)</a>
<a href="mark-stroke.svg" download>⬇️ mark-stroke.svg (16–20 px variant)</a>
</div>
<table class="tbl">
<thead><tr><th>Do</th><th>Don't</th></tr></thead>
<tbody>
<tr>
<td class="y">Keep the envelope horizontal, wings symmetrical.</td>
<td class="n">Rotate, mirror or detach the wings.</td>
</tr>
<tr>
<td class="y">Let the mark inherit text colour (currentColor).</td>
<td class="n">Hard-code a colour inside the SVG; it limits reuse.</td>
</tr>
<tr>
<td class="y">Use the stroke variant below 24 px display size.</td>
<td class="n">Scale the standard mark below 20 px — feathers merge.</td>
</tr>
<tr>
<td class="y">Pair with the wordmark "Hermes" when context is unclear.</td>
<td class="n">Pair with the Hermès logotype or any horsey mascot.</td>
</tr>
</tbody>
</table>
</section>
<section>
<h2>Palette</h2>
<p class="lede">Hermes rides on Silent Mode's colour system — same acid green,
same deep panels — so it never looks like a separate app glued on.
One extra accent, warm amber, is reserved for Hermes-specific moments
(unread badge, "winged sandals" nod). <b>Not</b> Hermès orange.</p>
<div class="swatches">
<div class="sw"><div class="block" style="background:#0b0e14"></div><div class="meta"><b>bg</b><code>#0b0e14</code> — primary surface</div></div>
<div class="sw"><div class="block" style="background:#141a24"></div><div class="meta"><b>panel</b><code>#141a24</code> — cards, sidebar</div></div>
<div class="sw"><div class="block" style="background:#d6ff3d"></div><div class="meta"><b>acid</b><code>#d6ff3d</code> — primary action</div></div>
<div class="sw"><div class="block" style="background:#f4c430"></div><div class="meta"><b>amber</b><code>#f4c430</code> — Hermes accent, unread</div></div>
<div class="sw"><div class="block" style="background:#e7eaf1"></div><div class="meta"><b>ink</b><code>#e7eaf1</code> — body text</div></div>
<div class="sw"><div class="block" style="background:#8b98a9"></div><div class="meta"><b>mut</b><code>#8b98a9</code> — muted text</div></div>
</div>
<div class="note"><b>Hermès-collision check.</b> Hermès corporate orange is
<code class="inline">#FF6D00</code>-ish. Our amber is <code class="inline">#f4c430</code>:
yellower hue, lower saturation. Side by side they are clearly different;
on their own, the amber reads as warm highlight, not luxury-brand orange.</div>
</section>
<section>
<h2>Voice</h2>
<ul class="steps">
<li><b>Blunt about limits.</b> "Relays still see recipient and timing" is the
tone, not "fully anonymous messaging". Say what the design does and does
not solve.</li>
<li><b>No evangelism about Nostr.</b> Nostr is the transport, not the
product. Mention it where it matters (relays, pubkeys, NIP-17) and don't
elsewhere.</li>
<li><b>"Message by name"</b> is the one-line pitch. Everything else is
supporting detail.</li>
<li><b>Lowercase</b> for product nouns in body copy (hermes, messages
panel). Capital <b>Hermes</b> for titles and the first mention per page.</li>
</ul>
</section>
<section>
<h2>Attribution + reuse</h2>
<p>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 not actually Hermes (that includes forks
with different protocols or trust models).</p>
</section>
</div>
<footer>
<div>Silent Mode — a Deviant project.</div>
<div class="fine">Named for the messenger of the gods. Ermis in modern Greek.
Spelled Hermes in English.</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,14 @@
<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Hermes">
<title>Hermes</title>
<!-- Monochrome stroke variant for tiny sizes (16px / 20px sidebar icons).
Thicker strokes, fewer wing feathers so each stroke stays >=1 pixel
at display size. -->
<g fill="none" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round">
<rect x="20" y="23" width="24" height="18" rx="2"/>
<path d="M20 25 L32 35 L44 25"/>
<path d="M20 30 L7 27"/>
<path d="M20 34 L8 36"/>
<path d="M44 30 L57 27"/>
<path d="M44 34 L56 36"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 625 B

20
hermes/branding/mark.svg Normal file
View file

@ -0,0 +1,20 @@
<svg viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Hermes">
<title>Hermes</title>
<!-- A winged envelope: messenger-god motif, legible at 16px, mono so it
inherits text colour via currentColor. Not Hermès-orange on purpose
(the French fashion house owns that mental model). -->
<g fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
<!-- envelope body -->
<rect x="20" y="23" width="24" height="18" rx="2"/>
<!-- flap / fold line -->
<path d="M20 25 L32 35 L44 25"/>
<!-- left wing: three tapered feathers trailing back -->
<path d="M20 28 L7 23"/>
<path d="M20 32 L6 32"/>
<path d="M20 36 L9 39"/>
<!-- right wing: mirror -->
<path d="M44 28 L57 23"/>
<path d="M44 32 L58 32"/>
<path d="M44 36 L55 39"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 867 B

View file

@ -32,15 +32,61 @@
<header class="hero">
<div class="mark">⛓️✉️</div>
<h1>Hermes <span class="pill p-designed" style="vertical-align:middle;font-size:12px;margin-left:.6rem">designed · not yet built</span></h1>
<h1>Hermes <span class="pill p-shipped" style="vertical-align:middle;font-size:12px;margin-left:.6rem;background:rgba(79,209,165,.12);color:#4fd1a5;padding:2px 10px;border-radius:999px">MVP · desktop</span></h1>
<p class="tag">End-to-end encrypted DMs over Nostr, addressed by your
<code class="inline">.bch</code> name instead of a public-key string. Same wallet
is your identity — no email, no phone number, no company, no server that can delete
your account.</p>
<p class="tag" style="font-size:.95rem;margin-top:.8rem">
Lives inside <a href="theseus"><b>Theseus</b></a>: open with the Hermes icon in the
left sidebar, or <kbd style="background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);border-radius:4px;padding:1px 6px;font-family:ui-monospace,monospace;font-size:12px">Ctrl</kbd>+<kbd style="background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);border-radius:4px;padding:1px 6px;font-family:ui-monospace,monospace;font-size:12px">Shift</kbd>+<kbd style="background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);border-radius:4px;padding:1px 6px;font-family:ui-monospace,monospace;font-size:12px">E</kbd>
(E as in <i>Ermis</i>, the Greek spelling). Brand kit at
<a href="hermes/branding"><code class="inline">/hermes/branding</code></a>.
</p>
</header>
<div class="wrap narrow">
<section class="plain">
<h2>What ships today</h2>
<p class="lede">The desktop MVP is live inside Theseus. Core messaging works
end to end; polish and mobile follow.</p>
<div class="grid">
<div class="card">
<h3>Threaded chat <span class="src s-chain">live</span></h3>
<p>Contact list on the left (search + unread badges), selected conversation
on the right with bubbles + inline reply. Enter to send, Shift-Enter for
newline.</p>
</div>
<div class="card">
<h3>Send &amp; receive by name <span class="src s-chain">live</span></h3>
<p>Type <code class="inline">alice.bch</code> — the client resolves on-chain,
wraps NIP-17, publishes to the recipient's declared relays. Sealed-sender:
the relay never sees who sent what to whom.</p>
</div>
<div class="card">
<h3>Address book <span class="src s-chain">live</span></h3>
<p>Named contacts stored locally. Optional vCard import for existing
address books — opt-in, nothing uploaded, you preview who gets added.</p>
</div>
<div class="card">
<h3>History on your device <span class="src s-chain">live</span></h3>
<p>Messages persist to disk (per identity) so close-reopen keeps your
threads. Unread marks survive restarts.</p>
</div>
<div class="card">
<h3>Mobile <span class="src s-chain">next</span></h3>
<p>Shipping inside Ariadne mobile (same wallet seed, same Nostr identity,
zero extra onboarding).</p>
</div>
<div class="card">
<h3>Tor transport <span class="src s-chain">planned</span></h3>
<p>Relay traffic over the Tor exit Theseus already runs, so even connection
IP leaves the relay.</p>
</div>
</div>
</section>
<section class="plain">
<h2>The one idea that makes this different</h2>
<p class="lede">Every existing Nostr client has the same wart: identity is