kind 35128 · don't trust, verify
6b1558fbd2f07876a116e86cc849b5052155cfe0a6547acaead13978f5615a4d
{
"id": "6b1558fbd2f07876a116e86cc849b5052155cfe0a6547acaead13978f5615a4d",
"pubkey": "c2f1ab4e6a577dd8980b57e15986ed92830b95a94f374192235563532b5cac20",
"created_at": 1791528127,
"kind": 35128,
"tags": [
[
"path",
"/index.html",
"dae70a72197f5d9d1b76e321f122f584d65811f6db850a128655076fe0af293b"
],
[
"path",
"/__MACOSX/._index.html",
"a56f98663c43c49d7a3c5dc14acd8cfb55d1f04c647161ebaccaea507798122b"
],
[
"path",
"/404.html",
"dae70a72197f5d9d1b76e321f122f584d65811f6db850a128655076fe0af293b"
],
[
"server",
"https://nsite.run"
],
[
"server",
"https://nostr.download"
],
[
"server",
"https://blssm.us"
],
[
"server",
"https://blossom.yakihonne.com"
],
[
"server",
"https://zencrown.relay2aeon.quest/"
],
[
"relay",
"wss://nsite.run"
],
[
"relay",
"was://zencrown.relay2aeon.quest"
],
[
"relay",
"wss://nostr.bitcoiner.social"
],
[
"relay",
"wss://purplepag.es"
],
[
"relay",
"wss://relay.primal.net"
],
[
"relay",
"wss://zencrown.relay2aeon.quest"
],
[
"d",
"backup-nostr"
],
[
"title",
"BackupNostr \u2014 Save your Nostr posts to your own device"
],
[
"description",
"```\nBACKUPNOSTR\n===========\n\nSave your Nostr posts to your own computer.\n\nLocal-first backup for Nostr. Save every post to one JSON file, encrypt it\nwith a password, restore it later. Single HTML file, no backend, no tracking,\nno analytics.\n\nCloud is fragile. Local is resilient.\n\n\nWHAT IT DOES\n------------\n\nBackup.\n Connects to your relays, fetches every event you published, normalizes and\n deduplicates them, and writes them to one local .json file. Optionally\n encrypts the file with a password (NIP-49: scrypt + XChaCha20-Poly1305).\n\nRestore.\n Reads a local backup file, verifies every event's id and signature, and\n republishes the events to your write relays -- idempotently, with backoff,\n and with the correct NIP-42 AUTH flow where required.\n\nVerify.\n Re-fetches from relays and shows you what is missing, extra, or has changed\n since the backup.\n\nEverything runs in the page. Your nsec never leaves your browser. Works with\nNIP-07 browser extensions, NIP-46 remote signers, or a pasted nsec that stays\nin memory only.\n\n\nFEATURES\n--------\n\n- Single .html file. No build step. No npm install. No CDN. Works from\n file:// after the first load.\n\n- Full relay catalog built in (~500 relays). Active WebSocket pool is capped\n at exactly 4 connections at a time, chosen by an intelligent scoring system\n that weighs pins, NIP-65 read/write markers, latency, uptime, event volume,\n auth/payment requirements, and recent failures.\n\n- Optional password encryption of the backup file using the same primitives\n as NIP-49 (scrypt + XChaCha20-Poly1305), so the file decrypts with a\n standard NIP-49 library.\n\n- Deterministic, byte-identical output for the same input set: sorted by\n created_at, then id, then kind. Replaceable and addressable events are\n normalized to the latest version per NIP-01.\n\n- Honours NIP-09 deletions, NIP-40 expiry, NIP-70 protected events, NIP-42\n AUTH, and NIP-11 relay information documents.\n\n- First-login animated guided tour. Skippable, resumable, keyboard-navigable,\n screen-reader-friendly, respects prefers-reduced-motion, and remembers\n completion per identity.\n\n- Runs a self-test on boot that verifies SHA-256, HMAC-SHA256, PBKDF2, scrypt,\n ChaCha20, Poly1305, XChaCha20-Poly1305, secp256k1, BIP-340 Schnorr\n sign/verify, bech32, NIP-49 decrypt, and the 4-connection cap.\n\n\nGETTING STARTED\n---------------\n\n1. Download backupnostr.html (or clone this repo and open the file).\n2. Open it in any modern browser. Double-click works -- no server required.\n3. Paste your npub to back up a public key, or click \"Use NIP-07\" to connect\n a browser extension.\n4. Click \"Load NIP-65\" to pull your relay list, or add relays manually.\n5. Pick a preset, optionally set a password, click \"Start backup\".\n6. The .json file downloads. That file is the deliverable.\n\nTo restore: open the same page, set your identity, pick the file under\nRestore / Verify, and click Restore. Running it twice is safe.\n\n\nWHAT IS IN THE BACKUP FILE\n--------------------------\n\n{\n \"format\": \"backupnostr/v1\",\n \"created_at\": 1700000000,\n \"tool\": { \"name\": \"BackupNostr\", \"version\": \"1.0.0\" },\n \"author\": { \"pubkey\": \"\", \"npub\": \"\" },\n \"relays\": { \"write\": [...], \"read\": [...], \"used\": [...], \"failed\": [...] },\n \"preset\": \"everything-public\",\n \"counts\": { \"events\": 12345, \"by_kind\": { ... }, ... },\n \"checksum\": { \"algorithm\": \"sha256\", \"events_canonical\": \"\", \"file\": \"\" },\n \"encrypted\": false,\n \"events\": [ ... ],\n \"deleted_ids\": [ ... ],\n \"expired_ids\": [ ... ],\n \"rejected\": [ ... ]\n}\n\nEncrypted backups use format \"backupnostr/v1+ncrypt\" and store the KDF\nparameters, nonce, associated data, and base64 ciphertext. The KDF and cipher\nare exactly NIP-49's, so a NIP-49 library can decrypt the blob if you ever\nwant to.\n\n\nNIPS IMPLEMENTED\n----------------\n\nNIP-01, 09, 10, 11, 13, 17, 19, 21, 25, 31, 37, 40, 42, 44, 46, 49, 51, 59,\n62, 65, 70, 77, 89, 94, 98, B7. See the source comments for the specific\nbehaviour of each.\n\n\nPRIVACY\n-------\n\nNo analytics. No telemetry. No server component. No login.\n\nThe page never writes your nsec, your password, or any decrypted DM content\nto localStorage, sessionStorage, IndexedDB, or the URL. Only the pubkey, the\nrelay list, the tour completion flag, and UI preferences may be persisted,\nand only when you explicitly ask it to.\n\n\nLICENSE\n-------\n\nMIT. See LICENSE if present, or treat this as MIT-licensed by default.\n\n\nCONTRIBUTING\n------------\n\nThis is a single-file tool. Changes should keep it that way. If you find a\nbug, please include the exact backup filename (the \"backupnostr-...\" part is\nenough) and the relevant lines from the activity log, which you can download\nwith the \"Download log\" button.\n\n\n"
],
[
"client",
"nsite.run"
]
],
"content": "",
"sig": "82b7ff2216cbdea50542429af9436ab942b937a538b938e71245c359c394dea2f59201e9da788d3f230f0bb6ff3cae6ecf565ea9f45f85910f8ee909d066ccad"
}