diff --git a/content/ecosystem.mdx b/content/ecosystem.mdx
index 9b0238f..d044403 100644
--- a/content/ecosystem.mdx
+++ b/content/ecosystem.mdx
@@ -28,7 +28,7 @@ A native NIP-46 signer for macOS: Zig, no Electron, no WebView. Your key lives i
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
+### Plaza: shipped
The flagship client: browse and post within two minutes, with the feed rendered
from disk and reconciled in the background. Your key lives in Notary, a separate
@@ -37,11 +37,12 @@ process, or in your own signer.
### On the roadmap
-- **A private messenger**: NIP-17 gift-wrapped DMs, signing through Notary.
-- **A document app**: Nostr-native notes and long-form (NIP-23).
-- **More NIPs, payments, and platforms**: the ecosystem expands across desktop and mobile.
+Both apps are downloadable and both keep growing. What comes next lands inside
+them rather than as new apps: private messages, zaps and a wallet, groups, search
+and media all belong to the client people already have.
-See the [roadmap](/roadmap) for the full sequence.
+See the [roadmap](/roadmap) for the order, and for what is deliberately not being
+built.
---
diff --git a/content/getting-started.mdx b/content/getting-started.mdx
index 58fb491..ba94b54 100644
--- a/content/getting-started.mdx
+++ b/content/getting-started.mdx
@@ -1,14 +1,14 @@
# Getting Started
`zig-nostr` is a Nostr protocol library for [Zig](https://ziglang.org). It
-targets Zig **0.16** and is **pre-alpha** (`v0.3.5`).
+targets Zig **0.16** and is **early** (`v0.3.8`).
## Install
Fetch the library into your project's `build.zig.zon`:
```sh
-zig fetch --save https://github.com/zig-nostr/nostr/archive/refs/tags/v0.3.5.tar.gz
+zig fetch --save https://github.com/zig-nostr/nostr/archive/refs/tags/v0.3.8.tar.gz
```
Then wire the module in `build.zig`:
diff --git a/content/index.mdx b/content/index.mdx
index 0f37314..5d85601 100644
--- a/content/index.mdx
+++ b/content/index.mdx
@@ -40,7 +40,7 @@ title: The Nostr protocol, natively in Zig
๐ฅ๏ธ
Native apps
-
Notary ships today, Plaza is the flagship client in progress, and a messenger and more are on the way across desktop and mobile. Real products, all on one core.
+
Notary and Plaza both ship today: a remote signer and a local-first client you can download and use. Private messages, zaps and groups land inside them. Real products, all on one core.
@@ -93,21 +93,21 @@ title: The Nostr protocol, natively in Zig
Plaza
- Building
+ Shipped
-
A fast, local-first client: browse and post within two minutes, with the feed rendered from disk.
+
A fast, local-first client: browse and post within two minutes, with the feed rendered from disk. A downloadable macOS app.
Learn more โ
-
Messenger
+ Private messages
Planned
-
A private DM app: NIP-17 gift-wrapped messages, signing through Notary, rendering instantly from the local store.
+
NIP-17 gift-wrapped DMs on the local store, signing through Notary. A milestone inside Plaza rather than a separate app: a messenger you have to switch to is one you stop using.
-More native apps, and more platforms, desktop and mobile, are on the roadmap.
+What comes next, and what is deliberately not being built, is on the roadmap.
Install the core
@@ -116,7 +116,7 @@ title: The Nostr protocol, natively in Zig
```sh
-zig fetch --save https://github.com/zig-nostr/nostr/archive/refs/tags/v0.3.5.tar.gz
+zig fetch --save https://github.com/zig-nostr/nostr/archive/refs/tags/v0.3.8.tar.gz
```
```zig
@@ -124,7 +124,7 @@ const nostr = b.dependency("nostr", .{ .target = target, .optimize = optimize })
your_module.addImport("nostr", nostr.module("nostr"));
```
-zig-nostr is **pre-alpha** and MIT-licensed, a library plus native showcases,
-all on one core. [Explore the docs โ](/getting-started)
+zig-nostr is **early** and MIT-licensed: a library, plus two native apps you can
+download today, all on one core. [Explore the docs โ](/getting-started)
diff --git a/content/nips.mdx b/content/nips.mdx
index 8f9a4d8..04cb5c4 100644
--- a/content/nips.mdx
+++ b/content/nips.mdx
@@ -17,9 +17,25 @@ official specification vectors.
| [46](https://github.com/nostr-protocol/nips/blob/master/46.md) | Nostr Connect, remote signing | โ
done |
| [49](https://github.com/nostr-protocol/nips/blob/master/49.md) | Private key encryption (`ncryptsec`) | โ
done |
| [65](https://github.com/nostr-protocol/nips/blob/master/65.md) | Relay list metadata (outbox) | โ
done |
-| [17](https://github.com/nostr-protocol/nips/blob/master/17.md) | Private direct messages | ๐ง planned (A6) |
-| [59](https://github.com/nostr-protocol/nips/blob/master/59.md) | Gift wrap | ๐ง planned (A6) |
-| [10](https://github.com/nostr-protocol/nips/blob/master/10.md) | Reply threading | ๐ง planned (A7) |
+| [17](https://github.com/nostr-protocol/nips/blob/master/17.md) | Private direct messages | ๐ง planned |
+| [59](https://github.com/nostr-protocol/nips/blob/master/59.md) | Gift wrap | ๐ง planned |
-The planned NIPs land with the [showcase apps](/roadmap): a NIP-17 private
-messenger (A6) and a read-only outbox client (A7).
+Private messages and gift wrap land together, in [Plaza's private messages
+milestone](/roadmap).
+
+## In the apps
+
+The library gives an app the protocol. These are implemented above it, in
+[Plaza](/plaza), and are listed separately because they are client behaviour
+rather than library surface.
+
+| NIP | Title | Where |
+|----|----|----|
+| [02](https://github.com/nostr-protocol/nips/blob/master/02.md) | Contact lists | reading and writing your follows |
+| [05](https://github.com/nostr-protocol/nips/blob/master/05.md) | DNS identifiers | the verified handle on a profile |
+| [10](https://github.com/nostr-protocol/nips/blob/master/10.md) | Reply threading | threads, and replies you post |
+| [25](https://github.com/nostr-protocol/nips/blob/master/25.md) | Reactions | likes, in the feed and notifications |
+| [27](https://github.com/nostr-protocol/nips/blob/master/27.md) | `nostr:` mentions in content | names instead of raw base32 |
+| [89](https://github.com/nostr-protocol/nips/blob/master/89.md) | Application handlers | the `client` tag on notes you post |
+| [92](https://github.com/nostr-protocol/nips/blob/master/92.md) | Media attachments | `imeta` dimensions, so an image reserves its box before it loads |
+| [57](https://github.com/nostr-protocol/nips/blob/master/57.md) | Zaps | receipts are read and shown. Sending is a milestone away |
diff --git a/content/performance.mdx b/content/performance.mdx
index a9936f2..e3d6059 100644
--- a/content/performance.mdx
+++ b/content/performance.mdx
@@ -10,13 +10,16 @@ Measured on an Apple Silicon Mac, `ReleaseFast`, warm cache, best of 50 runs.
Events are spread across 100 authors; the feed query is a 20-author, `kind:1`
home timeline returning 500 notes.
-| Store size | Feed query (500 notes) | Profile query | Ingest |
-|----|----|----|----|
-| 20,000 events | 0.26 ms | 0.09 ms | ~135k events/s |
-| 100,000 events | 0.28 ms | 0.25 ms | ~135k events/s |
+| Store size | Feed query (500 notes) | Timeline query (1 author) | Profile query | Ingest |
+|----|----|----|----|----|
+| 20,000 events | 0.25 ms | 0.09 ms | 0.007 ms | ~170k events/s |
+| 100,000 events | 0.28 ms | 0.24 ms | 0.008 ms | ~149k events/s |
The headline isn't just that a feed query takes **~0.28 ms**: it's that going
-from 20k to 100k stored events barely moves it. That's the **bounded query
+from 20k to 100k stored events barely moves it. The profile query makes the same
+point sharply: fetching one account's `kind:0` out of a hundred thousand events
+reads a single index entry, so it costs **8 microseconds** and does not care how
+much history sits behind it. That's the **bounded query
planner**: it walks the indexes newest-first and stops at `limit`, so latency
tracks the page size you ask for, not the size of the store.
diff --git a/content/plaza.mdx b/content/plaza.mdx
index a66dcc7..a55b341 100644
--- a/content/plaza.mdx
+++ b/content/plaza.mdx
@@ -114,30 +114,25 @@ See [performance](/performance) for the library numbers underneath.
## Getting it
-Plaza is not tagged for download yet. Build it from source today:
-
```sh
-git clone https://github.com/zig-nostr/plaza
-cd plaza
-npm install -g @native-sdk/cli
-native build . # a ReleaseFast binary in zig-out/bin/
-scripts/package-macos.sh # or the same artifact as Plaza.app
+curl -fsSL https://raw.githubusercontent.com/zig-nostr/plaza/main/scripts/install-macos.sh | bash
```
-macOS on Apple Silicon. A one-line installer lands with the first tagged
-release.
+macOS on Apple Silicon. The installer verifies the download's SHA-256, installs
+`Plaza.app`, clears the download-quarantine flag so it opens without a Gatekeeper
+detour, and launches it. Your key, session and local store live in `~/.plaza` and
+survive every upgrade.
Plaza is ad-hoc signed and not notarized on purpose. It signs notes with your
key, so the trust anchor is a build you can reproduce rather than an Apple
-signature you cannot inspect.
-
-Linux builds and tests in CI on every change. Windows is not in the matrix yet:
-the relay transport resolves hostnames through libc `getaddrinfo`, which Zig's
-standard library does not declare for Windows, so nothing depending on the
-library links there. That is a gap in the protocol library rather than in Plaza.
-Packaged releases for either come later anyway: the toolkit renders through a
-software rasteriser off macOS today, and shipping one now would misrepresent how
-Plaza performs.
+signature you cannot inspect. Read the
+[installer](https://github.com/zig-nostr/plaza/blob/main/scripts/install-macos.sh),
+or build the same artifact yourself:
+
+```sh
+git clone https://github.com/zig-nostr/plaza
+cd plaza && scripts/package-macos.sh
+```
## Built on the core