diff --git a/app/globals.css b/app/globals.css index 432af8f..b61866c 100644 --- a/app/globals.css +++ b/app/globals.css @@ -227,3 +227,34 @@ color: var(--zn-muted); font-size: 0.92rem; } + +/* The four Notary screens on /signer. Two up on a wide page, one up on a + phone, because a screenshot of a window is unreadable at half a phone's + width. The caption carries the meaning, so it stays with its picture + rather than being collected into a paragraph underneath. */ +.zn-shots { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1.25rem; + margin: 1.5rem 0; +} +.zn-shots figure { + margin: 0; +} +.zn-shots img { + width: 100%; + height: auto; + border-radius: 0.7rem; + display: block; +} +.zn-shots figcaption { + margin-top: 0.55rem; + font-size: 0.875rem; + line-height: 1.5; + opacity: 0.8; +} +@media (max-width: 640px) { + .zn-shots { + grid-template-columns: minmax(0, 1fr); + } +} diff --git a/content/ecosystem.mdx b/content/ecosystem.mdx index 180d53b..0c87a67 100644 --- a/content/ecosystem.mdx +++ b/content/ecosystem.mdx @@ -24,8 +24,8 @@ and the reason the ecosystem exists. ### Notary: shipped -A NIP-46 remote signer for macOS. Your key lives in a local daemon; every signing -request waits for your approval, and your `nsec` never leaves it. +A native NIP-46 signer for macOS: Zig, no Electron, no WebView. Your key lives in +a local daemon, nothing gets signed quietly, and your `nsec` never leaves it. → [`zig-nostr/notary`](https://github.com/zig-nostr/notary) · [read more](/signer) ### Plaza: in progress diff --git a/content/index.mdx b/content/index.mdx index c3bc385..cc821db 100644 --- a/content/index.mdx +++ b/content/index.mdx @@ -87,7 +87,7 @@ title: The Nostr protocol, natively in Zig

Notary

Shipped -

A NIP-46 remote signer for macOS. Your nsec stays in a local daemon; every request waits for your approval.

+

A native NIP-46 signer for macOS: Zig, no Electron. Your nsec stays in a local daemon, and nothing gets signed quietly.

Learn more →
diff --git a/content/roadmap.mdx b/content/roadmap.mdx index f9b005d..e9edb83 100644 --- a/content/roadmap.mdx +++ b/content/roadmap.mdx @@ -16,8 +16,8 @@ being built now, and the year ahead — roughly a milestone a month. store grows. - **Signer protocol** — NIP-44 v2 encryption, the NIP-46 remote-signing ("bunker") protocol, and NIP-42 client authentication. -- **[Notary](/signer)**: the native remote signer. Your key lives in a local daemon and - every request waits for your approval. A downloadable macOS app. +- **[Notary](/signer)**: the native remote signer, Zig with no Electron. Your key lives in a + local daemon and nothing gets signed quietly. A downloadable macOS app. - **Docs & benchmarks** — this site, the [NIP-support table](/nips), and reproducible [performance numbers](/performance). diff --git a/content/signer.mdx b/content/signer.mdx index d4e8173..9370a6b 100644 --- a/content/signer.mdx +++ b/content/signer.mdx @@ -1,22 +1,40 @@ # Notary: the native remote signer -**Notary** is a native macOS remote signer built on `zig-nostr`. It implements -the NIP-46 "bunker" protocol: your `nsec` lives in a local daemon on a machine -you control, and every signing request from a client waits for your explicit -approval. The key never leaves the daemon. +**Notary** is a native macOS remote signer built on `zig-nostr`: Zig throughout, +drawing its own pixels, with no Electron and no WebView anywhere. It implements +the NIP-46 "bunker" protocol, so your `nsec` lives in a local daemon on a machine +you control. Nothing gets signed quietly: you see what a client is asking for +before it happens, and the key never leaves the daemon. -Notary approving a Nostr signing request +## The whole app + +Four screens, which is all of it. + +
+
+ Set up your signer: create a new key or import one you already have +
Set up. Create a key or bring one you have. The key is generated and stored by the daemon; the app only ever sends the passphrase.
+
+
+ Unlock your signer with your passphrase +
Unlock. The key is encrypted at rest. Nothing serves until you unlock it.
+
+
+ Serving: the bunker URL to copy, and live per-relay status +
Serve. Copy the bunker:// URL into any Nostr client. Each relay reports its own state, so you can see where you are reachable.
+
+
+ A signing request naming itself, waiting for approve or deny +
Approve. Every request names itself and waits. Nothing is signed while you are not looking.
+
+
## How it works - A headless **daemon** holds the key (encrypted at rest with NIP-49) and speaks NIP-46 over relays. -- A native **approval GUI** shows each incoming request — `sign_event`, - `nip44_encrypt`, and so on — and forwards your approve/deny decision over a +- A native **approval GUI** shows each incoming request (`sign_event`, + `nip44_encrypt`, and so on) and forwards your approve/deny decision over a loopback channel. The GUI never sees the key. - Clients connect with a `bunker://` URL. It works end-to-end over public relays, including those that require NIP-42 authentication. diff --git a/public/notary-demo.gif b/public/notary-demo.gif deleted file mode 100644 index 3af7580..0000000 Binary files a/public/notary-demo.gif and /dev/null differ diff --git a/public/notary/request.jpg b/public/notary/request.jpg new file mode 100644 index 0000000..f09aca9 Binary files /dev/null and b/public/notary/request.jpg differ diff --git a/public/notary/serving.jpg b/public/notary/serving.jpg new file mode 100644 index 0000000..aa2acee Binary files /dev/null and b/public/notary/serving.jpg differ diff --git a/public/notary/setup.jpg b/public/notary/setup.jpg new file mode 100644 index 0000000..9f55f74 Binary files /dev/null and b/public/notary/setup.jpg differ diff --git a/public/notary/unlock.jpg b/public/notary/unlock.jpg new file mode 100644 index 0000000..9bf6f36 Binary files /dev/null and b/public/notary/unlock.jpg differ