Skip to content

Commit ef60bd0

Browse files
vveerrggclaude
andcommitted
docs: Update README, project vision, and dev docs for v1.2.0
- Add website link, release badge, and install section to README - Document security page, auto-lock, and vanilla JS migration - Check off completed phases in PROJECT-VISION.md - Update file structure to match actual codebase - Fix repo URL, tech stack (Alpine.js → vanilla JS), Node version Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 04e3ec2 commit ef60bd0

3 files changed

Lines changed: 87 additions & 74 deletions

File tree

README.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
> Cross-browser Nostr key management, encrypted document vault, and identity layer.
44
> Forked from [ursuscamp/nostore](https://github.com/ursuscamp/nostore) (archived Feb 2025).
5+
>
6+
> **Website:** [nostrkey.com](https://nostrkey.com) · **Current release:** [v1.2.0](https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src/releases/tag/v1.2.0)
57
68
## What It Does
79

@@ -53,6 +55,9 @@ See [docs/PROJECT-VISION.md](docs/PROJECT-VISION.md) for the full roadmap.
5355
- [x] Modern permission page styling
5456
- [x] Options pages open in same tab (no tab clutter)
5557
- [x] Close buttons on all options pages
58+
- [x] Standalone security settings page (master password + auto-lock)
59+
- [x] Configurable auto-lock timeout (5/15/30/60 min or never)
60+
- [x] Alpine.js removed — all UI is vanilla JS (smaller bundles, no framework dep)
5661

5762
### Planned
5863
- [ ] P2P room sharing (NIP-59 gift wrap)
@@ -79,6 +84,16 @@ See [docs/PROJECT-VISION.md](docs/PROJECT-VISION.md) for the full roadmap.
7984
| [NIP-59](https://github.com/nostr-protocol/nips/blob/master/59.md) | Gift wrap | 🔧 Planned |
8085
| [NIP-78](https://github.com/nostr-protocol/nips/blob/master/78.md) | App-specific data ||
8186

87+
## Install
88+
89+
### From GitHub Releases (sideload)
90+
1. Download the latest zip from [Releases](https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src/releases)
91+
2. **Chrome:** Unzip → `chrome://extensions/` → Developer mode → Load unpacked → select the folder
92+
3. **Safari:** Build from source (see below)
93+
94+
### Chrome Web Store
95+
Coming soon — submission in progress.
96+
8297
## Development
8398

8499
### Prerequisites
@@ -97,13 +112,14 @@ npm install
97112
```bash
98113
npm run build # Safari: Tailwind CSS + esbuild
99114
npm run build:chrome # Chrome: dev build → distros/chrome/
115+
npm run build:all # Both targets (Chrome + Safari)
100116
npm run build:all:prod # Both targets, minified
101117
npm run watch # Watch mode (JS, Safari only)
102118
npm run watch-tailwind # Watch mode (CSS)
103119
```
104120

105121
### Chrome Development
106-
1. `npm run build:chrome` (or use Docker: `docker compose -f docker/docker-compose.dev.yml run --rm nostrkey-dev npm run build:chrome`)
122+
1. `npm run build:chrome`
107123
2. Open `chrome://extensions/`, enable **Developer mode**
108124
3. Click **Load unpacked** → select the `distros/chrome/` folder
109125
4. After rebuilding, click the reload arrow on the extension card

docs/CHROME-DEV.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## Prerequisites
44

5-
- Node.js (v18+)
5+
- Node.js (v20+)
66
- npm
77

88
## Building for Chrome

docs/PROJECT-VISION.md

Lines changed: 69 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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

Comments
 (0)