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.
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.
-
+## The whole app
+
+Four screens, which is all of it.
+
+
+
+
+ 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. The key is encrypted at rest. Nothing serves until you unlock it.
+
+
+
+ Serve. Copy the bunker:// URL into any Nostr client. Each relay reports its own state, so you can see where you are reachable.
+
+
+
+ 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