Introduces PublicKey and SecretKey as distinct type-safe wrappers around secp256k1, with hex and NIP-19 bech32 (npub/nsec) encoding. SecretKey has a redacted Debug impl and no Display to reduce accidental leakage; it exposes material only through explicit to_hex / to_nsec. FromStr on both types auto-detects hex vs. bech32. Eight round-trip tests cover encoding, auto-detection, prefix validation, debug redaction, and generation.
2.5 KiB
Introduction
Nostr is a simple, open protocol for decentralized social networking. Unlike traditional platforms, nostr has no central server. Instead, users publish signed messages called events to a network of relays — simple WebSocket servers that store and forward events.
The protocol's power comes from its simplicity. At its core, nostr defines just one data structure (the event) and a handful of message types for communicating with relays. Everything else — social graphs, encrypted messaging, long-form content, marketplace listings — is built on top of this foundation through a system of NIPs (Nostr Implementation Possibilities), which are community-authored specifications.
What this book covers
This book is the source code for the coracle family of Rust crates:
- coracle-lib — Core types and stateless utilities: events, keys, tags, filters, and serialization. Everything you need to understand and manipulate nostr data.
- coracle-net — Networking: connecting to relays, managing subscriptions, publishing events, and relay discovery.
- coracle-signer — Signing abstractions: local key signing, NIP-46 remote signing, and browser extension integration.
- coracle-domain — Domain types: profiles, follows, relay selections, reactions, zaps, and other higher-level nostr concepts built on top of events.
- coracle-content — Content handling: parsing note text, rendering mentions, handling media links, and working with NIP-27 references.
- coracle-storage — Persistence: storing and querying events locally across different platforms and backends.
The chapters are ordered so that each concept builds on what came before. Code blocks marked with a file path are tangled — extracted and assembled into Rust source files that form the actual library. What you're reading is the source code.
How literate programming works here
Throughout this book, you'll see code blocks annotated with an output file path like this:
```rust {file=coracle-lib/src/lib.rs}
pub mod event;
These blocks are the real source code. The `coracle-tangle` tool extracts them in document
order and writes them to the indicated file paths. Multiple blocks targeting the same file are
concatenated, so a struct can be introduced in one section and have methods added later in the
narrative.
Code blocks *without* a file annotation are illustrative — they show examples, intermediate
states, or protocol concepts without contributing to the compiled output.