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