Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
4 changes: 2 additions & 2 deletions content/ecosystem.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion content/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ title: The Nostr protocol, natively in Zig
<h3>Notary</h3>
<span className="zn-tag zn-tag-shipped">Shipped</span>
</div>
<p>A NIP-46 remote signer for macOS. Your nsec stays in a local daemon; every request waits for your approval.</p>
<p>A native NIP-46 signer for macOS: Zig, no Electron. Your nsec stays in a local daemon, and nothing gets signed quietly.</p>
<a className="zn-applink" href="/signer">Learn more →</a>
</div>
<div className="zn-card">
Expand Down
4 changes: 2 additions & 2 deletions content/roadmap.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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).

Expand Down
40 changes: 29 additions & 11 deletions content/signer.mdx
Original file line number Diff line number Diff line change
@@ -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.

<img
src="/notary-demo.gif"
alt="Notary approving a Nostr signing request"
style={{ borderRadius: '0.7rem', maxWidth: '420px', width: '100%', marginTop: '0.5rem' }}
/>
## The whole app

Four screens, which is all of it.

<div className="zn-shots">
<figure>
<img src="/notary/setup.jpg" alt="Set up your signer: create a new key or import one you already have" />
<figcaption><strong>Set up.</strong> Create a key or bring one you have. The key is generated and stored by the daemon; the app only ever sends the passphrase.</figcaption>
</figure>
<figure>
<img src="/notary/unlock.jpg" alt="Unlock your signer with your passphrase" />
<figcaption><strong>Unlock.</strong> The key is encrypted at rest. Nothing serves until you unlock it.</figcaption>
</figure>
<figure>
<img src="/notary/serving.jpg" alt="Serving: the bunker URL to copy, and live per-relay status" />
<figcaption><strong>Serve.</strong> Copy the <code>bunker://</code> URL into any Nostr client. Each relay reports its own state, so you can see where you are reachable.</figcaption>
</figure>
<figure>
<img src="/notary/request.jpg" alt="A signing request naming itself, waiting for approve or deny" />
<figcaption><strong>Approve.</strong> Every request names itself and waits. Nothing is signed while you are not looking.</figcaption>
</figure>
</div>

## 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.
Expand Down
Binary file removed public/notary-demo.gif
Binary file not shown.
Binary file added public/notary/request.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/notary/serving.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/notary/setup.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/notary/unlock.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading