| Crates.io | notepack |
| lib.rs | notepack |
| version | 0.3.0 |
| created_at | 2025-07-30 18:20:08.384805+00 |
| updated_at | 2025-07-30 22:54:07.634771+00 |
| description | A compact binary format and Rust library for encoding and decoding Nostr notes |
| homepage | https://github.com/jb55/notepack |
| repository | https://github.com/jb55/notepack |
| max_upload_size | |
| id | 1773880 |
| size | 81,362 |
notepack is a Rust library and CLI for encoding and decoding nostr notes into a compact binary format.
It ships with:
notepack_β¦ strings in scripts.π See SPEC.md for the full format specification.
notepack_ + Base64 (RFC 4648, no padding).$ notepack <<<'{"id": "f1e7bc2a9756453fcc0e80ecf62183fa95b9a1278a01281dbc310b6777320e80","pubkey": "7fe437db5884ee013f701a75f8d1a84ecb434e997f2a31411685551ffff1b841","created_at": 1753900182,"kind": 1,"tags": [],"content": "hi","sig": "75507f84d78211a68f2f964221f5587aa957a66c1941d01125caa07b9aabdf5a98c3e63d1fe1e307cbf01b74b0a1b95ffe636eb6746c00167e0d48e5b11032d5"}'
notepack_AfHnvCqXVkU/zA6A7PYhg/qVuaEnigEoHbwxC2d3Mg6Af+Q321iE7gE/cBp1+NGoTstDTpl/KjFBFoVVH//xuEF1UH+E14IRpo8vlkIh9Vh6qVembBlB0BElyqB7mqvfWpjD5j0f4eMHy/AbdLChuV/+Y262dGwAFn4NSOWxEDLVlsmpxAYBAmhpAA
For large contact lists, you can crunch them down from 74kb to about 36kb.
use notepack::{Note, pack_note_to_string};
let note = Note {
id: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa".into(),
pubkey: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb".into(),
created_at: 1753898766,
kind: 1,
tags: vec![vec!["tag".into(), "value".into()]],
content: "Hello, world!".into(),
sig: "cccc...".into(),
};
let encoded = pack_note_to_string(¬e).unwrap();
println!("{encoded}"); // => notepack_AAECAw...
use notepack::{NoteParser, ParsedField};
let b64 = "notepack_..."; // from wire
let bytes = NoteParser::decode(b64).unwrap();
let parser = NoteParser::new(&bytes);
for field in parser {
match field.unwrap() {
ParsedField::Id(id) => println!("id: {}", hex::encode(id)),
ParsedField::Content(c) => println!("content: {}", c),
_ => {}
}
}
The binary is also called notepack.
echo '{"id":"...","pubkey":"...","created_at":123,"kind":1,"tags":[],"content":"Hi","sig":"..."}' \
| notepack
echo 'notepack_AAECA...' | notepack
src
βββ SPEC.md # Full binary format spec
βββ error.rs # Unified error type for encoding/decoding
βββ lib.rs # Crate entrypoint
βββ main.rs # CLI tool: JSON β notepack
βββ note.rs # `Note` struct (Nostr event model)
βββ parser.rs # Streaming `NoteParser`
βββ stringtype.rs # String vs raw byte tags
βββ varint.rs # LEB128 varint helpers
MIT β do whatever you want, but attribution is appreciated.