|
3 | 3 | > Cross-browser Nostr key management, encrypted document vault, and identity layer. |
4 | 4 | > Forked from [ursuscamp/nostore](https://github.com/ursuscamp/nostore) (archived Feb 2025). |
5 | 5 | > |
6 | | -> **Website:** [nostrkey.com](https://nostrkey.com) · **Current release:** [v1.5.5](https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src/releases/tag/v1.5.5) |
| 6 | +> **Website:** [nostrkey.com](https://nostrkey.com) · **Current release:** [v1.5.5](https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src/releases/tag/v1.5.5) · **License:** MIT |
7 | 7 |
|
8 | 8 | > **NostrKey and Humanjava Enterprises Inc. do not have a cryptocurrency, token, or coin. Nor will there be one.** If anyone suggests or sells a cryptocurrency associated with this project, they are acting fraudulently. [Report scams](https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src/issues). |
9 | 9 |
|
10 | 10 | ## What It Does |
11 | 11 |
|
| 12 | +NostrKey is a free, open-source browser extension that manages your Nostr private keys so they never touch the websites you use. It signs events, encrypts messages, and stores documents — all client-side. |
| 13 | + |
12 | 14 | - **NIP-07 signing** — `window.nostr` API for any Nostr web app (Chrome + Safari) |
13 | 15 | - **NIP-46 nsecBunker** — remote signing, your private key never touches the browser |
14 | 16 | - **NIP-44 encryption** — modern ChaCha20-Poly1305 (replaces deprecated NIP-04) |
15 | 17 | - **Zero-knowledge .md vault** — encrypted documents stored on Nostr relays, unreadable by relay operators |
16 | | -- **API key vault** — encrypted secret storage |
| 18 | +- **API key vault** — encrypted secret storage, relay-synced |
17 | 19 | - **Cross-device sync** — profiles, vault, and settings sync via Google account (Chrome) or iCloud (Safari 16+) |
18 | | -- **Master password** — keys encrypted at rest with configurable auto-lock |
19 | | -- **P2P document sharing** — send encrypted files to chat rooms with temporary access (planned) |
20 | | -- **Login with Nostr** — NIP-42 authentication for web apps (planned) |
| 20 | +- **Master password** — keys encrypted at rest with configurable auto-lock (5/15/30/60 min or never) |
| 21 | +- **NIP-49 export/import** — ncryptsec encrypted key backup and restore |
| 22 | +- **Multi-profile** — manage multiple Nostr identities with per-site permissions |
| 23 | + |
| 24 | +## Get NostrKey |
| 25 | + |
| 26 | +| Platform | Install | Status | |
| 27 | +|----------|---------|--------| |
| 28 | +| **Chrome / Brave / Edge** | [Chrome Web Store](https://chromewebstore.google.com/detail/nostrkey/cggakcmbihnpmcddkkfmoglgaocnmaop) | Live | |
| 29 | +| **Android** | [Google Play](https://play.google.com/store/apps/details?id=com.nostrkey.app) | Live | |
| 30 | +| **Safari (macOS + iOS)** | App Store | Submission in progress | |
| 31 | +| **iOS** | App Store | Submission in progress | |
21 | 32 |
|
22 | 33 | ## Architecture |
23 | 34 |
|
|
36 | 47 |
|
37 | 48 | Documents are encrypted client-side before publishing. Relays store ciphertext. Only your key can decrypt. |
38 | 49 |
|
39 | | -## Status |
40 | | - |
41 | | -See [docs_project_info/PROJECT-VISION.md](docs_project_info/PROJECT-VISION.md) for the full roadmap. |
42 | | - |
43 | | -### Working |
44 | | -- [x] NIP-07 `window.nostr` (getPublicKey, signEvent) |
45 | | -- [x] NIP-04 encrypt/decrypt (deprecated, kept for compat) |
46 | | -- [x] NIP-19 bech32 key encoding |
47 | | -- [x] Multi-profile management |
48 | | -- [x] Per-site permissions (allow/deny/ask) |
49 | | -- [x] Event history + audit log |
50 | | -- [x] Safari extension (iOS + macOS) |
51 | | -- [x] Chrome extension (Manifest V3) |
52 | | -- [x] NIP-44 encryption (ChaCha20-Poly1305) |
53 | | -- [x] NIP-46 nsecBunker client (remote signing) |
54 | | -- [x] Encrypted .md vault (NIP-78) |
55 | | -- [x] API key vault (encrypted, relay-synced) |
56 | | -- [x] Master password (keys encrypted at rest, auto-lock) |
57 | | -- [x] Profile read-only view with npub/nsec display |
58 | | -- [x] QR code generation for npub (with Copy as PNG) |
59 | | -- [x] Modern permission page styling |
60 | | -- [x] Options pages open in same tab (no tab clutter) |
61 | | -- [x] Close buttons on all options pages |
62 | | -- [x] Standalone security settings page (master password + auto-lock) |
63 | | -- [x] Configurable auto-lock timeout (5/15/30/60 min or never) |
64 | | -- [x] Alpine.js removed — all UI is vanilla JS (smaller bundles, no framework dep) |
65 | | -- [x] WCAG AA accessibility (contrast, focus, ARIA, reduced motion, semantic HTML) |
66 | | -- [x] Vault detection & restore after extension reload (three-tier: flag check → deep scan → manual) |
67 | | -- [x] Chrome MV3 message passing fix (all handlers use sendResponse callback pattern) |
68 | | -- [x] Cross-device sync via storage.sync (Google/iCloud, chunked, priority-based budget) |
69 | | -- [x] NIP-49 encrypted key export/import (ncryptsec) |
70 | | -- [x] Manage Nostr Keys page (master-detail view, export JSON, import nsec/JSON) |
71 | | -- [x] Settings page: accordion sections grouped by App / Profile / General |
72 | | -- [x] Material-style toggle switches for relay read/write (replacing checkboxes) |
73 | | -- [x] Security page: accordion layout with hash-based deep linking |
74 | | -- [x] profileScope field on vault docs and API keys (prep for per-profile scoping) |
| 50 | +## The Humanjava Ecosystem |
75 | 51 |
|
76 | | -### Planned |
77 | | -- [ ] Encrypted cloud backup (iCloud/Google Drive snapshots with periodic reminders) |
78 | | -- [ ] Firefox extension (manifest + sidebar_action or popup fallback) |
79 | | -- [ ] P2P room sharing (NIP-59 gift wrap) |
80 | | -- [ ] PWA at nostrkey.app |
81 | | -- [ ] Login with Nostr auth flow |
82 | | -- [ ] EN/FR/ES localization |
83 | | -- [ ] Bottom sheet permission UI (overlay instead of new tab) |
84 | | -- [ ] App Group + Keychain sharing for iOS native app integration |
85 | | -- [ ] Enhanced Vault integration with file attachments |
86 | | -- [ ] API key auto-fill for supported services |
87 | | -- [ ] Multiple relay sets per profile |
| 52 | +NostrKey is the key management layer for the Humanjava product stack. It connects to everything else. |
88 | 53 |
|
89 | | -## NIPs Implemented |
90 | | - |
91 | | -| NIP | Feature | Status | |
92 | | -|-----|---------|--------| |
93 | | -| [NIP-01](https://github.com/nostr-protocol/nips/blob/master/01.md) | Basic protocol | ✅ | |
94 | | -| [NIP-04](https://github.com/nostr-protocol/nips/blob/master/04.md) | Encrypted DMs v1 | ✅ (deprecated) | |
95 | | -| [NIP-07](https://github.com/nostr-protocol/nips/blob/master/07.md) | Browser extension | ✅ | |
96 | | -| [NIP-19](https://github.com/nostr-protocol/nips/blob/master/19.md) | Bech32 encoding | ✅ | |
97 | | -| [NIP-42](https://github.com/nostr-protocol/nips/blob/master/42.md) | Client auth | 🔧 Planned | |
98 | | -| [NIP-44](https://github.com/nostr-protocol/nips/blob/master/44.md) | Encrypted messaging v2 | ✅ | |
99 | | -| [NIP-46](https://github.com/nostr-protocol/nips/blob/master/46.md) | Nostr Connect (bunker) | ✅ | |
100 | | -| [NIP-49](https://github.com/nostr-protocol/nips/blob/master/49.md) | Encrypted key export | ✅ | |
101 | | -| [NIP-59](https://github.com/nostr-protocol/nips/blob/master/59.md) | Gift wrap | 🔧 Planned | |
102 | | -| [NIP-78](https://github.com/nostr-protocol/nips/blob/master/78.md) | App-specific data | ✅ | |
| 54 | +``` |
| 55 | +npub.bio ($7/year) Sovereign identity (NIP-05, Lightning, bunker) |
| 56 | + │ Uses NostrKey for NIP-07 connect |
| 57 | + ▼ |
| 58 | +NostrKeep ($5-7/month) Private relay + Blossom media server |
| 59 | + │ NostrKey points your keys at your relay |
| 60 | + ▼ |
| 61 | +NostrKey (free) ◀── You are here |
| 62 | + │ Key management, signing, vault |
| 63 | + ▼ |
| 64 | +Lx7 / Vaiku LLM.being infrastructure |
| 65 | +``` |
103 | 66 |
|
104 | | -## Get NostrKey |
| 67 | +| Product | What it does | URL | |
| 68 | +|---------|-------------|-----| |
| 69 | +| **NostrKey** | Key management browser extension (NIP-07, NIP-46, vault) | [nostrkey.com](https://nostrkey.com) | |
| 70 | +| **npub.bio** | Sovereign Nostr identity — NIP-05, Lightning address, profile pages | [npub.bio](https://npub.bio) | |
| 71 | +| **NostrKeep** | Private Nostr relay + Blossom media server (subscription) | [nostrkeep.com](https://nostrkeep.com) | |
105 | 72 |
|
106 | | -| Platform | Install | Description | |
107 | | -|----------|---------|-------------| |
108 | | -| **Chrome / Brave / Edge** | [Chrome Web Store](https://chromewebstore.google.com/detail/nostrkey/cggakcmbihnpmcddkkfmoglgaocnmaop) | Browser extension — NIP-07 signing, vault, NIP-46/44/49 | |
109 | | -| **Safari** | Coming soon | Safari extension (macOS + iOS) — App Store submission in progress | |
110 | | -| **Android** | [Google Play](https://play.google.com/store/apps/details?id=com.nostrkey.app) | Standalone app with full extension UI | |
111 | | -| **iOS** | Coming soon | Standalone app — App Store submission in progress | |
| 73 | +### How They Work Together |
112 | 74 |
|
113 | | -More info coming soon. |
| 75 | +1. **NostrKey** manages your private keys in the browser |
| 76 | +2. **npub.bio** gives you a human-readable identity (`alice@npub.bio`) — verified via NIP-07 connect through NostrKey |
| 77 | +3. **NostrKeep** gives you a private relay — NostrKey points your signing at your own infrastructure |
| 78 | +4. Your data lives on your relay, your identity resolves through npub.bio, your keys never leave NostrKey |
114 | 79 |
|
115 | | -## Install |
| 80 | +## NIPs Implemented |
116 | 81 |
|
117 | | -### From GitHub Releases (sideload) |
118 | | -1. Download the latest zip from [Releases](https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src/releases) |
119 | | -2. **Chrome:** Unzip → `chrome://extensions/` → Developer mode → Load unpacked → select the folder |
120 | | -3. **Safari:** Build from source (see below) |
| 82 | +| NIP | Feature | Status | |
| 83 | +|-----|---------|--------| |
| 84 | +| [NIP-01](https://github.com/nostr-protocol/nips/blob/master/01.md) | Basic protocol | Done | |
| 85 | +| [NIP-04](https://github.com/nostr-protocol/nips/blob/master/04.md) | Encrypted DMs v1 | Done (deprecated, kept for compat) | |
| 86 | +| [NIP-07](https://github.com/nostr-protocol/nips/blob/master/07.md) | Browser extension API | Done | |
| 87 | +| [NIP-19](https://github.com/nostr-protocol/nips/blob/master/19.md) | Bech32 encoding | Done | |
| 88 | +| [NIP-42](https://github.com/nostr-protocol/nips/blob/master/42.md) | Client auth | Planned | |
| 89 | +| [NIP-44](https://github.com/nostr-protocol/nips/blob/master/44.md) | Encrypted messaging v2 | Done | |
| 90 | +| [NIP-46](https://github.com/nostr-protocol/nips/blob/master/46.md) | Nostr Connect (bunker) | Done | |
| 91 | +| [NIP-49](https://github.com/nostr-protocol/nips/blob/master/49.md) | Encrypted key export | Done | |
| 92 | +| [NIP-59](https://github.com/nostr-protocol/nips/blob/master/59.md) | Gift wrap | Planned | |
| 93 | +| [NIP-78](https://github.com/nostr-protocol/nips/blob/master/78.md) | App-specific data | Done | |
| 94 | + |
| 95 | +## Feature Status |
| 96 | + |
| 97 | +### Shipped |
| 98 | +- NIP-07 `window.nostr` (getPublicKey, signEvent) |
| 99 | +- NIP-04 encrypt/decrypt (deprecated, kept for compat) |
| 100 | +- NIP-19 bech32 key encoding |
| 101 | +- NIP-44 encryption (ChaCha20-Poly1305) |
| 102 | +- NIP-46 nsecBunker client (remote signing) |
| 103 | +- NIP-49 encrypted key export/import (ncryptsec) |
| 104 | +- Encrypted .md vault (NIP-78) |
| 105 | +- API key vault (encrypted, relay-synced) |
| 106 | +- Multi-profile management with per-site permissions |
| 107 | +- Master password with configurable auto-lock |
| 108 | +- Event history + audit log |
| 109 | +- Cross-device sync via storage.sync (Google/iCloud, chunked, priority-based budget) |
| 110 | +- Profile read-only view with npub/nsec display |
| 111 | +- QR code generation for npub (with Copy as PNG) |
| 112 | +- Manage Nostr Keys page (master-detail, export JSON, import nsec/JSON) |
| 113 | +- Settings page: accordion sections grouped by App / Profile / General |
| 114 | +- Security page: accordion layout with hash-based deep linking |
| 115 | +- Material-style toggle switches for relay read/write |
| 116 | +- Vault detection & restore after extension reload (three-tier: flag check → deep scan → manual) |
| 117 | +- Chrome MV3 message passing fix (sendResponse callback pattern) |
| 118 | +- WCAG AA accessibility (contrast, focus, ARIA, reduced motion, semantic HTML) |
| 119 | +- Alpine.js removed — all UI is vanilla JS |
121 | 120 |
|
122 | | -### Apple App Store (Safari for macOS & iOS) |
123 | | -Coming soon — submission in progress. See [docs_project_info/APPLE-APP-STORE-SUBMISSION.md](docs_project_info/APPLE-APP-STORE-SUBMISSION.md) for details. |
| 121 | +### Planned |
| 122 | +- Encrypted cloud backup (iCloud/Google Drive snapshots) |
| 123 | +- Firefox extension |
| 124 | +- P2P room sharing (NIP-59 gift wrap) |
| 125 | +- PWA at nostrkey.app |
| 126 | +- Login with Nostr auth flow |
| 127 | +- EN/FR/ES localization |
| 128 | +- Bottom sheet permission UI (overlay instead of new tab) |
| 129 | +- App Group + Keychain sharing for iOS native app integration |
| 130 | +- Enhanced Vault with file attachments |
| 131 | +- API key auto-fill for supported services |
| 132 | +- Multiple relay sets per profile |
| 133 | + |
| 134 | +## Related Repositories |
| 135 | + |
| 136 | +| Repo | What | Status | |
| 137 | +|------|------|--------| |
| 138 | +| [nostrkey.browser.plugin.src](https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src) | Browser extension (this repo) | v1.5.5 | |
| 139 | +| [nostrkey.app.android.src](https://github.com/HumanjavaEnterprises/nostrkey.app.android.src) | Android app (WebView wrapper) | v1.1.1 | |
| 140 | +| [nostrkey.app.ios.src](https://github.com/HumanjavaEnterprises/nostrkey.app.ios.src) | iOS app (WKWebView wrapper) | v1.1.1 | |
| 141 | + |
| 142 | +Mobile apps use dual-WebView architectures (background + UI) with platform-specific bridges (`AndroidBridge.kt` / `IOSBridge.swift`) to translate Chrome extension APIs into native functionality. |
124 | 143 |
|
125 | 144 | ## Development |
126 | 145 |
|
@@ -161,18 +180,25 @@ See [docs_project_info/CHROME-DEV.md](docs_project_info/CHROME-DEV.md) for full |
161 | 180 | 4. Enable unsigned extensions: Safari → Settings → Advanced → Show Develop menu |
162 | 181 | 5. Develop → Allow Unsigned Extensions → enable NostrKey |
163 | 182 |
|
| 183 | +### Tech Stack |
| 184 | +- Vanilla JS (no framework — Alpine.js was removed) |
| 185 | +- esbuild bundler |
| 186 | +- Tailwind CSS |
| 187 | +- nostr-crypto-utils for protocol operations |
| 188 | +- Chrome Manifest V3 |
| 189 | + |
164 | 190 | ## Privacy |
165 | 191 |
|
166 | | -This extension does not collect any user data or transmit any data over a network connection except to Nostr relays you explicitly configure. All private key data is encrypted and stored locally. When using nsecBunker mode, no private key material is stored in the extension at all. |
| 192 | +NostrKey does not collect any user data or transmit any data over a network connection except to Nostr relays you explicitly configure. All private key data is encrypted and stored locally. When using nsecBunker mode, no private key material is stored in the extension at all. |
167 | 193 |
|
168 | 194 | ## Acknowledgements |
169 | 195 |
|
170 | 196 | - [ursuscamp](https://github.com/ursuscamp) — Original Nostore extension |
171 | 197 | - [fiatjaf](https://github.com/fiatjaf) — nostr-tools, nos2x, and Nostr itself |
172 | 198 | - [nostr-crypto-utils](https://github.com/HumanjavaEnterprises/nostr-crypto-utils) — Crypto foundation |
173 | | -- [nostrkey.app.android.src](https://github.com/HumanjavaEnterprises/nostrkey.app.android.src) — NostrKey Android app |
174 | | -- [nostrkey.app.ios.src](https://github.com/HumanjavaEnterprises/nostrkey.app.ios.src) — NostrKey iOS app |
175 | 199 |
|
176 | 200 | ## License |
177 | 201 |
|
178 | 202 | MIT — see [LICENSE](LICENSE) |
| 203 | + |
| 204 | +A product by [Humanjava Enterprises Inc](https://humanjava.com) · British Columbia, Canada |
0 commit comments