11# NostrKey — Project Vision
22
33> Forked from [ ursuscamp/nostore] ( https://github.com/ursuscamp/nostore ) (archived Feb 2025).
4- > New home: [ vveerrgg /nostrkey.browser.plugin.src] ( https://github.com/vveerrgg /nostrkey.browser.plugin.src )
4+ > New home: [ HumanjavaEnterprises /nostrkey.browser.plugin.src] ( https://github.com/HumanjavaEnterprises /nostrkey.browser.plugin.src )
55
66## What Is This?
77
@@ -158,40 +158,42 @@ colab.lx7.ca verifies signature → session established
158158- Safari extension (iOS + macOS) with Swift wrapper
159159- Manifest V3 (already Chrome-compatible)
160160- esbuild + Tailwind CSS build chain
161- - Alpine.js reactive UI
161+ - Vanilla JS UI (originally Alpine.js, migrated in v1.2.0)
162162
163163### What We Need to Build
164164
165- #### Phase 1: Foundation (Week 1)
166- - [ ] Rename/rebrand to NostrKey
167- - [ ] Chrome extension target (namespace wrapper, 128px icon, manifest split)
168- - [ ] NIP-44 encryption support (replace NIP-04 as default)
169- - [ ] Update nostr-tools to latest
170- - [ ] Update Node.js requirement (16 → 20+)
171- - [ ] Enable minification for production builds
172- - [ ] Master password for local key encryption (keys at rest)
173-
174- #### Phase 2: nsecBunker (Week 1-2)
175- - [ ] NIP-46 client implementation
176- - [ ] Bunker connection string parsing (bunker://pubkey?relay=...)
177- - [ ] Remote signing flow (connect → auth → sign → disconnect)
178- - [ ] Profile type: "local key" vs "bunker connection"
179- - [ ] Bunker session persistence and reconnection
165+ #### Phase 1: Foundation ✅
166+ - [x] Rename/rebrand to NostrKey
167+ - [x] Chrome extension target (namespace wrapper, 128px icon, manifest split)
168+ - [x] NIP-44 encryption support (replace NIP-04 as default)
169+ - [x] Update nostr-tools to latest
170+ - [x] Update Node.js requirement (16 → 20+)
171+ - [x] Enable minification for production builds
172+ - [x] Master password for local key encryption (keys at rest)
173+ - [x] Security settings page (master password + auto-lock)
174+ - [x] Alpine.js → vanilla JS migration (all sub-pages)
175+
176+ #### Phase 2: nsecBunker ✅
177+ - [x] NIP-46 client implementation
178+ - [x] Bunker connection string parsing (bunker://pubkey?relay=...)
179+ - [x] Remote signing flow (connect → auth → sign → disconnect)
180+ - [x] Profile type: "local key" vs "bunker connection"
181+ - [x] Bunker session persistence and reconnection
180182- [ ] Permission model update (bunker approval vs local approval)
181183
182- #### Phase 3: Encrypted .md Vault (Week 2)
183- - [ ] NIP-78 event publishing (kind 30078, d-tag file paths)
184- - [ ] Client-side NIP-44 encryption (encrypt to self)
185- - [ ] File browser UI (list, search, organize by d-tag)
186- - [ ] .md viewer/editor in extension popup or tab
187- - [ ] Sync indicator (relay confirmation)
188- - [ ] Multi-relay redundancy (publish to N relays)
184+ #### Phase 3: Encrypted .md Vault ✅
185+ - [x ] NIP-78 event publishing (kind 30078, d-tag file paths)
186+ - [x ] Client-side NIP-44 encryption (encrypt to self)
187+ - [x ] File browser UI (list, search, organize by d-tag)
188+ - [x ] .md viewer/editor in extension popup or tab
189+ - [x ] Sync indicator (relay confirmation)
190+ - [x ] Multi-relay redundancy (publish to N relays)
189191- [ ] Conflict resolution (latest timestamp wins)
190192
191- #### Phase 4: API Key Vault (Week 2-3)
192- - [ ] Encrypted key-value store (kind 30078, d-tag: "vault/api-keys")
193- - [ ] Add/edit/delete API keys with labels
194- - [ ] Copy-to-clipboard with auto-clear (30s)
193+ #### Phase 4: API Key Vault ✅
194+ - [x ] Encrypted key-value store (kind 30078, d-tag: "vault/api-keys")
195+ - [x ] Add/edit/delete API keys with labels
196+ - [x ] Copy-to-clipboard with auto-clear (30s)
195197- [ ] Optional relay sync (or local-only mode)
196198- [ ] Import/export encrypted backup
197199
@@ -243,7 +245,7 @@ colab.lx7.ca verifies signature → session established
243245| Layer | Technology | Notes |
244246| -------| -----------| -------|
245247| Crypto | nostr-tools + @noble /* | secp256k1, ChaCha20, PBKDF2 |
246- | UI Framework | Alpine.js + @ alpinejs/csp | Lightweight , CSP-safe |
248+ | UI Framework | Vanilla JS | No framework — lightweight , CSP-safe |
247249| Styling | Tailwind CSS | Utility-first |
248250| Bundler | esbuild | Fast, zero-config |
249251| Storage | IndexedDB (via idb) | Structured, indexed |
@@ -253,57 +255,52 @@ colab.lx7.ca verifies signature → session established
253255
254256---
255257
256- ## File Structure (Planned)
258+ ## File Structure
257259
258260```
259- nostrkey/
260- ├── shared / # Cross-browser extension code
261- │ ├── background.js # Service worker (signing, NIP-46, vault)
261+ nostrkey.browser.plugin.src /
262+ ├── src / # Source code (all browsers)
263+ │ ├── background.js # Service worker / background page
262264│ ├── content.js # Page ↔ background bridge
263- │ ├── nostr-provider.js # window.nostr API injection
264- │ ├── popup/ # Toolbar popup
265- │ │ ├── popup.html
266- │ │ ├── popup.js
267- │ │ └── popup.css
268- │ ├── options/ # Settings page
269- │ │ ├── options.html
270- │ │ ├── options.js
271- │ │ └── options.css
272- │ ├── vault/ # .md vault UI
265+ │ ├── nostr.js # window.nostr API injection
266+ │ ├── sidepanel.html # Side panel UI (Chrome)
267+ │ ├── sidepanel.js # Side panel logic
268+ │ ├── popup.html # Toolbar popup (Safari)
269+ │ ├── options.js # Full settings page logic
270+ │ ├── full_settings.html # Full settings page
271+ │ ├── vault/ # .md vault
273272│ │ ├── vault.html
274- │ │ ├── vault.js
275- │ │ └── vault.css
273+ │ │ └── vault.js
274+ │ ├── api-keys/ # API key vault
275+ │ │ ├── api-keys.html
276+ │ │ └── api-keys.js
277+ │ ├── security/ # Master password + auto-lock
278+ │ │ ├── security.html
279+ │ │ └── security.js
276280│ ├── permission/ # Permission dialog
277281│ │ ├── permission.html
278282│ │ └── permission.js
279- │ ├── event-history/ # Audit log
280- │ │ ├── event-history.html
281- │ │ └── event-history.js
282- │ ├── lib/ # Shared utilities
283- │ │ ├── nip44.js # NIP-44 encrypt/decrypt
284- │ │ ├── nip46.js # NIP-46 bunker client
285- │ │ ├── nip78.js # NIP-78 file storage
286- │ │ ├── nip59.js # NIP-59 gift wrap
287- │ │ ├── storage.js # Profile/key management
288- │ │ ├── crypto.js # Master password encryption
289- │ │ └── db.js # IndexedDB wrapper
290- │ ├── manifest.chrome.json # Chrome manifest
291- │ ├── manifest.safari.json # Safari manifest
283+ │ ├── event_history/ # Audit log
284+ │ │ ├── event_history.html
285+ │ │ └── event_history.js
286+ │ ├── experimental/ # Experimental features
287+ │ │ ├── experimental.html
288+ │ │ └── experimental.js
289+ │ ├── utilities/ # Shared utilities
290+ │ │ └── browser-polyfill.js # Chrome/Safari API normalisation
291+ │ ├── chrome-manifest.json # Chrome manifest (MV3)
292+ │ ├── manifest.json # Safari manifest (MV3)
293+ │ ├── _locales/en/messages.json # i18n strings
292294│ └── images/ # Icons (16-512px)
293- ├── safari/ # Safari native wrapper
294- │ ├── App/ # SwiftUI app
295- │ └── Extension/ # Safari extension handler
296- ├── pwa/ # nostrkey.app PWA
297- │ ├── index.html
298- │ ├── sw.js # Service worker
299- │ └── app.js # NIP-46 browser client
300- ├── build.js # esbuild config
295+ ├── apple/ # Safari native wrapper (Xcode)
296+ │ └── NostrKey.xcodeproj
297+ ├── distros/ # Build output
298+ │ ├── chrome/ # Ready to load as unpacked
299+ │ └── safari/ # Ready for Xcode
300+ ├── docs/ # Website, privacy, terms, submission docs
301+ ├── build.js # esbuild + static file copy
301302├── tailwind.config.js
302- ├── package.json
303- └── docs/
304- ├── PROJECT-VISION.md # This document
305- ├── ARCHITECTURE.md # Technical deep-dive
306- └── NIP-REFERENCE.md # NIP implementation notes
303+ └── package.json
307304```
308305
309306---
@@ -327,5 +324,5 @@ ISC (inherited from original Nostore project)
327324
328325---
329326
330- * Last updated: February 18 , 2026*
327+ * Last updated: February 19 , 2026*
331328* Part of the [ Lx7 Platform] ( https://lx7.ca ) *
0 commit comments