BACKUPNOSTR - Save your Nostr posts to your own computer.

← all sites | generated 2026-11-02T07:49:00.266Z

Site info

titleBACKUPNOSTR - Save your Nostr posts to your own computer.
descriptionLocal-first backup for Nostr. Save every post to one JSON file, encrypt it with a password, restore it later. Single HTML file, no backend, no tracking, no analytics. Cloud is fragile. Local is resilient. WHAT IT DOES ------------ Backup. Connects to your relays, fetches every event you published, normalizes and deduplicates them, and writes them to one local .json file. Optionally encrypts the file with a password (NIP-49: scrypt + XChaCha20-Poly1305). Restore. Reads a local backup file, verifies every event's id and signature, and republishes the events to your write relays -- idempotently, with backoff, and with the correct NIP-42 AUTH flow where required. Verify. Re-fetches from relays and shows you what is missing, extra, or has changed since the backup. Everything runs in the page. Your nsec never leaves your browser. Works with NIP-07 browser extensions, NIP-46 remote signers, or a pasted nsec that stays in memory only. FEATURES -------- - Single .html file. No build step. No npm install. No CDN. Works from file:// after the first load. - Full relay catalog built in (~500 relays). Active WebSocket pool is capped at exactly 4 connections at a time, chosen by an intelligent scoring system that weighs pins, NIP-65 read/write markers, latency, uptime, event volume, auth/payment requirements, and recent failures. - Optional password encryption of the backup file using the same primitives as NIP-49 (scrypt + XChaCha20-Poly1305), so the file decrypts with a standard NIP-49 library. - Deterministic, byte-identical output for the same input set: sorted by created_at, then id, then kind. Replaceable and addressable events are normalized to the latest version per NIP-01. - Honours NIP-09 deletions, NIP-40 expiry, NIP-70 protected events, NIP-42 AUTH, and NIP-11 relay information documents. - First-login animated guided tour. Skippable, resumable, keyboard-navigable, screen-reader-friendly, respects prefers-reduced-motion, and remembers completion per identity. - Runs a self-test on boot that verifies SHA-256, HMAC-SHA256, PBKDF2, scrypt, ChaCha20, Poly1305, XChaCha20-Poly1305, secp256k1, BIP-340 Schnorr sign/verify, bech32, NIP-49 decrypt, and the 4-connection cap. GETTING STARTED --------------- 1. Download backupnostr.html (or clone this repo and open the file). 2. Open it in any modern browser. Double-click works -- no server required. 3. Paste your npub to back up a public key, or click "Use NIP-07" to connect a browser extension. 4. Click "Load NIP-65" to pull your relay list, or add relays manually. 5. Pick a preset, optionally set a password, click "Start backup". 6. The .json file downloads. That file is the deliverable. To restore: open the same page, set your identity, pick the file under Restore / Verify, and click Restore. Running it twice is safe. WHAT IS IN THE BACKUP FILE -------------------------- { "format": "backupnostr/v1", "created_at": 1700000000, "tool": { "name": "BackupNostr", "version": "1.0.0" }, "author": { "pubkey": "<hex>", "npub": "<bech32>" }, "relays": { "write": [...], "read": [...], "used": [...], "failed": [...] }, "preset": "everything-public", "counts": { "events": 12345, "by_kind": { ... }, ... }, "checksum": { "algorithm": "sha256", "events_canonical": "<hex>", "file": "<hex>" }, "encrypted": false, "events": [ ... ], "deleted_ids": [ ... ], "expired_ids": [ ... ], "rejected": [ ... ] } Encrypted backups use format "backupnostr/v1+ncrypt" and store the KDF parameters, nonce, associated data, and base64 ciphertext. The KDF and cipher are exactly NIP-49's, so a NIP-49 library can decrypt the blob if you ever want to. NIPS IMPLEMENTED ---------------- NIP-01, 09, 10, 11, 13, 17, 19, 21, 25, 31, 37, 40, 42, 44, 46, 49, 51, 59, 62, 65, 70, 77, 89, 94, 98, B7. See the source comments for the specific behaviour of each. PRIVACY ------- No analytics. No telemetry. No server component. No login. The page never writes your nsec, your password, or any decrypted DM content to localStorage, sessionStorage, IndexedDB, or the URL. Only the pubkey, the relay list, the tour completion flag, and UI preferences may be persisted, and only when you explicitly ask it to. LICENSE ------- MIT. See LICENSE if present, or treat this as MIT-licensed by default. CONTRIBUTING ------------ This is a single-file tool. Changes should keep it that way. If you find a bug, please include the exact backup filename (the "backupnostr-..." part is enough) and the relevant lines from the activity log, which you can download with the "Download log" button.
author
ColdJuno_f96b - Juno Sterling
npub1ctc6knn22a7a3xqt2ls4nphdj2psh9dffum5ry3r2434x26u4ssqhukdtw
identifierbackup-nostr
hostname4uwyr5edrehxffqo5y1txt08qucnkqctjkylu1gd2rav4brqxsbackup-nostr.pages.gittr.space
clientnsite.run
updated24d ago
hits9

Relays

Blossom servers

Manifest servers

User servers

Paths (3)

pathsha256cached server
/__MACOSX/._index.html7805e6939190—
/404.htmlff355c7fb1ednsite.run
/index.htmlff355c7fb1ednsite.run

Raw manifest event

{
  "id": "e3eefedbf430f86bbf5d1d38866e0ca116600883a03e2d57a58a94c0e033e58b",
  "pubkey": "c2f1ab4e6a577dd8980b57e15986ed92830b95a94f374192235563532b5cac20",
  "created_at": 1791531285,
  "kind": 35128,
  "tags": [
    [
      "path",
      "/index.html",
      "ff355c7fb1ed3fb56e8fde9844ee701dbbbb81ffcbd900a6939fe619aecd064c"
    ],
    [
      "path",
      "/__MACOSX/._index.html",
      "7805e69391903e4bc37c97b193c58fd3fe5fc00f87e68f2e2e557f2d4327ae2b"
    ],
    [
      "path",
      "/404.html",
      "ff355c7fb1ed3fb56e8fde9844ee701dbbbb81ffcbd900a6939fe619aecd064c"
    ],
    [
      "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 - Save your Nostr posts to your own computer."
    ],
    [
      "description",
      "Local-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\": \"<hex>\", \"npub\": \"<bech32>\" },\n  \"relays\": { \"write\": [...], \"read\": [...], \"used\": [...], \"failed\": [...] },\n  \"preset\": \"everything-public\",\n  \"counts\": { \"events\": 12345, \"by_kind\": { ... }, ... },\n  \"checksum\": { \"algorithm\": \"sha256\", \"events_canonical\": \"<hex>\", \"file\": \"<hex>\" },\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."
    ],
    [
      "client",
      "nsite.run"
    ]
  ],
  "content": "",
  "sig": "62861eaf7fdad9823ccb2badfc55b5cebd546c7e8289a1da76d407ea20a2f1d396f0c8c64873cb490c1e8bf9165007e417c0cf80ffd716ca6dde5a91f9ab72d8"
}