building a client that feels instant is mostly about not doing work. not re-reading what has not changed. not building what is off screen. not fetching what is already on disk. most of my performance work is deleting things. #plaza
View quoted note →
Sep
_@zignostr.com
npub18c55...0we7
2x opensats grantee. currently building native nostr infrastructure in zig: zig-nostr, signet, and plaza. fast local-first storage, safer remote signing, and high performance desktop client. free and open source.
numbers from #plaza's feed while scrolling hard: about a twentieth of a millisecond to work out what to draw. the frame budget is 8 milliseconds. there is a lot of room in there. here's the first demo ever:
#plaza is a nostr client written in Zig that draws its own pixels. no browser inside it, no web view, no javascript.
it opens fast, it scrolls smooth, and it stays out of your way.
opened #plaza and your notes are just there, instantly.
it reads from your own machine first and talks to relays second. no spinner while a relay decides whether to answer you.
#plaza scrolls the same whether your feed holds 20 notes or 2000.
it only ever builds the handful of cards actually on your screen. everything below the fold costs nothing until you get there.
been building a native desktop client on top of my zig-nostr library. calling it Plaza. local-first. no browser. still early, but it's already pulling live notes off a relay. nice to watch it come together.
jumble.social is in a league of its own.
gm. a small step toward bringing nostr into the zig ecosystem. zig-nostr is now listed in "Awesome Zig". still early, but the bridge between the two communities is taking shape.

GitHub
GitHub - zigcc/awesome-zig: A collaborative list of awesome Zig libraries and resources.
A collaborative list of awesome Zig libraries and resources. - zigcc/awesome-zig
Signet design choice i'll defend: two processes. a headless daemon owns the key and the relay connections. the gui is just an approval queue over a loopback-only api. if the pretty half ever gets compromised, the half with the key does not care.
View quoted note →
made a thing: Signet - a native remote signer for nostr. your key lives encrypted (NIP-49) inside a small daemon on your machine. apps request signatures over NIP-46, and every single request waits for an explicit approve/deny in a native macOS app. the key never enters the GUI, let alone a client. works over public relays, including ones behind NIP-42 auth. 
GitHub
GitHub - zig-nostr/signet: Signet — a native remote signer (NIP-46 bunker) for Nostr. Your key stays on a machine you control; every signing request waits for your approval. Built on zig-nostr/nostr.
Signet — a native remote signer (NIP-46 bunker) for Nostr. Your key stays on a machine you control; every signing request waits for your approval...
benchmarked my zig-nostr store against nostrdb and rust-nostr and found my feed query ~90x slower than it should be. i collected every match, then sorted, then truncated. nostrdb walks its indexes newest-first and stops at the limit. adopted the approach, credited the teacher: 26ms → 0.28ms for a 20-author feed over 100k events. #devstr #zignostr
gm. favorite part of the zig-nostr library so far: a local-first event store on LMDB. zero-copy reads, events stay memory-mapped, modeled openly on nostrdb. the goal is feeds that render from disk in a blink while the network reconciles in the background. never the other way around.
been writing a lot of zig these days. it stays out of your way the way C does, but the build system is a real language you can think in. comptime still bends my brain a little. i like it.
brewing
crafting
baking
cooking