Skip to content

Commit 87f9891

Browse files
vveerrggclaude
andcommitted
fix: Safari version display using typeof checks for browser API detection
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 3782c1e commit 87f9891

2 files changed

Lines changed: 312 additions & 1 deletion

File tree

Lines changed: 309 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,309 @@
1+
# Firefox Add-on Store (AMO) Submission Guide
2+
3+
This document contains all the information needed to submit NostrKey to the Firefox Add-on Store (addons.mozilla.org).
4+
5+
## Status
6+
7+
**Submitted:** v1.5.7 — Awaiting Review (March 7, 2026)
8+
**Add-on UUID:** nostrkey@nostrkey.com
9+
**Author:** vergel@humanjava.com (Owner)
10+
11+
## Prerequisites
12+
13+
- [x] Firefox Account (free)
14+
- [x] Built Firefox extension (ZIP file ready)
15+
- [x] Source code ZIP (required for bundled extensions)
16+
- [ ] Screenshots (at least 1) — **TODO: add screenshots**
17+
- [x] Icon images (included in manifest)
18+
- [x] Privacy Policy URL
19+
20+
## AMO Submission URL
21+
22+
https://addons.mozilla.org/en-US/developers/
23+
24+
## Add-on Details
25+
26+
### Name
27+
**NostrKey**
28+
29+
### Add-on URL
30+
https://addons.mozilla.org/…/nostrkey
31+
32+
### Summary (250 characters max)
33+
**Nostr key manager and signer. Store your private keys securely and sign events without exposing them.**
34+
35+
### Description
36+
37+
```
38+
NostrKey — Secure Nostr Key Management for Your Browser
39+
40+
NostrKey is a browser extension that safely manages your Nostr private keys and signs events for Nostr-enabled web applications. Your keys never leave your device and are never exposed to websites.
41+
42+
Key Features:
43+
44+
🔐 Secure Key Storage
45+
- Store multiple Nostr profiles with nsec or hex private keys
46+
- Optional master password encryption for keys at rest
47+
- NIP-49 encrypted key import/export (ncryptsec)
48+
- QR code generation for easy key sharing
49+
50+
🔗 Remote Signer Support
51+
- Connect to nsecBunker via NIP-46
52+
- Use remote signing without storing keys locally
53+
54+
⚙️ Granular Permissions
55+
- Control which websites can access your keys
56+
- Set permissions per app and per action type
57+
- Choose "Allow", "Deny", or "Ask" for each request
58+
59+
📡 Relay Management
60+
- Configure relay preferences per profile
61+
- Set read/write permissions for each relay
62+
- Recommended relay suggestions included
63+
64+
🔑 Encrypted Vault
65+
- Store sensitive documents and API keys
66+
- End-to-end encrypted with your master password
67+
- Cross-device sync via Nostr relays
68+
69+
🔒 Privacy & Security
70+
- Keys are stored locally in your browser
71+
- No data sent to external servers
72+
- Open source and auditable
73+
- Support for nostr: protocol links
74+
75+
Supports: NIP-01, NIP-04, NIP-07, NIP-44, NIP-46, NIP-49
76+
```
77+
78+
### Experimental Add-on
79+
**No** — This add-on is not experimental.
80+
81+
### Requires Payment
82+
**No** — This add-on does not require payment, non-free services or software, or additional hardware.
83+
84+
### Categories (up to 3)
85+
1. **Privacy & Security** — Primary category (key management and encryption)
86+
2. **Social & Communication** — Secondary (Nostr is a social protocol)
87+
88+
### Support Email
89+
support@nostrkey.com
90+
91+
### Support Website
92+
https://nostrkey.com/support.html
93+
94+
### Tags
95+
password manager, privacy, security, social media
96+
97+
### License
98+
**MIT License**
99+
100+
## Firefox Manifest Configuration
101+
102+
### Gecko-Specific Settings
103+
```json
104+
"browser_specific_settings": {
105+
"gecko": {
106+
"id": "nostrkey@nostrkey.com",
107+
"strict_min_version": "140.0",
108+
"data_collection_permissions": {
109+
"required": ["none"]
110+
}
111+
}
112+
}
113+
```
114+
115+
### Key Differences from Chrome
116+
- **Background scripts** use `"scripts": ["background.build.js"]` instead of service worker
117+
- **No side panel** — Firefox lacks the sidePanel API; popup used instead (`default_popup: "sidepanel.html"`)
118+
- **No sidePanel permission** — not available in Firefox
119+
- **Gecko add-on ID**`nostrkey@nostrkey.com` (permanent, cannot change after submission)
120+
- **Minimum version** — Firefox 140.0 (MV3 support)
121+
- **Data collection** — Declared as `"none"` via `data_collection_permissions`
122+
123+
## Permission Justifications
124+
125+
### Storage Permission
126+
127+
**Justification:**
128+
```
129+
Storage permission is required to securely save user's Nostr private keys, relay configurations, multi-profile settings, and per-application permissions locally in the browser. All cryptographic key material and user preferences must persist between browser sessions to maintain functionality.
130+
```
131+
132+
**What we store:**
133+
- Private keys (optionally encrypted with master password)
134+
- User profiles (multiple identity support)
135+
- Relay configurations
136+
- Per-application permission settings
137+
- Encrypted vault data
138+
- Encrypted API keys
139+
140+
### ClipboardWrite Permission
141+
142+
**Justification:**
143+
```
144+
Clipboard write permission is required to allow users to copy their Nostr public keys (npub), relay URLs, and encrypted key exports to their clipboard for easy sharing and backup. This is a core user convenience feature that enables users to quickly copy their public identity information and configuration data. Only writes to clipboard when user clicks "Copy" buttons — no automatic or background clipboard access.
145+
```
146+
147+
### Host Permissions (All URLs)
148+
149+
**Justification:**
150+
```
151+
Host permissions are required to inject the NIP-07 window.nostr API into web pages, enabling Nostr-compatible websites to request cryptographic signing operations. The extension must communicate with web pages to receive signing requests and return signed events, which is the core functionality of a Nostr key management extension. Access is only used for providing the standard Nostr browser extension API — no data collection or tracking occurs.
152+
```
153+
154+
## Privacy Policy
155+
156+
**Required:** Yes (we handle sensitive cryptographic keys)
157+
158+
**Has Privacy Policy:** Yes
159+
160+
**URL:** https://nostrkey.com/privacy.html
161+
162+
**Privacy Policy Content (for AMO field):**
163+
```
164+
NostrKey does not collect, transmit, or share any user data. All private keys, profiles, and settings are stored locally in the browser using the browser's storage API. The extension only connects to user-configured Nostr relays for signing and syncing operations initiated by the user. No analytics, tracking, or third-party services are used. Full privacy policy at https://nostrkey.com/privacy.html
165+
```
166+
167+
## Notes to Reviewer
168+
169+
```
170+
NostrKey is a Nostr protocol key management extension, similar to how MetaMask manages Ethereum keys. It implements the NIP-07 standard (https://github.com/nostr-protocol/nips/blob/master/07.md) which defines how browser extensions provide signing capabilities to Nostr web applications.
171+
172+
The extension injects a window.nostr API into web pages, allowing Nostr-compatible sites to request event signing. Users must explicitly approve each signing request through the extension's permission system.
173+
174+
Key technical details:
175+
- All cryptographic operations happen locally in the browser
176+
- Private keys never leave the extension's storage context
177+
- WebSocket connections (wss://) are used solely for communicating with user-configured Nostr relays
178+
- The host_permissions (<all_urls>) are required because the NIP-07 API must be available on any website the user visits — we cannot predict which domains will be Nostr-enabled
179+
- Source code is open source: https://github.com/HumanjavaEnterprises/nostrkey.browser.plugin.src
180+
181+
Build instructions for source code review:
182+
1. npm install
183+
2. npm run build:firefox:prod
184+
3. Output is in distros/firefox/
185+
```
186+
187+
## Source Code Submission
188+
189+
AMO requires source code upload for bundled/minified extensions so reviewers can verify the build output matches the source.
190+
191+
### What to Include in Source ZIP
192+
- `src/` — All source files
193+
- `build.js` — Build script
194+
- `package.json` — Dependencies
195+
- `package-lock.json` — Dependency lock file
196+
- `tailwind.config.js` — Tailwind CSS config
197+
- `.env.example` — Environment template (NOT `.env`)
198+
199+
### Build Instructions (include in submission)
200+
```
201+
1. Ensure Node.js 18+ is installed
202+
2. Run: npm install
203+
3. Run: npm run build:firefox:prod
204+
4. Built extension is in: distros/firefox/
205+
5. AMO-ready ZIP is at: distros/nostrkey-firefox-v{version}.zip
206+
```
207+
208+
### What NOT to Include
209+
- `node_modules/`
210+
- `.env` (contains secrets)
211+
- `distros/` (build output)
212+
- `.git/`
213+
214+
## Required Assets
215+
216+
### Icons (already in manifest)
217+
- 16x16px — `images/toolbar-16.png`
218+
- 48x48px — `images/icon-48.png`
219+
- 96x96px — `images/icon-96.png`
220+
- 128x128px — `images/icon-128.png`
221+
- 256x256px — `images/icon-256.png`
222+
- 512x512px — `images/icon-512.png`
223+
224+
### Screenshots
225+
- [ ] At least 1 screenshot
226+
- [ ] Show key features: profile management, signing requests, vault
227+
- [ ] Recommended: 3-5 screenshots showing different features
228+
- [ ] AMO recommended dimensions: 1280x800 or similar
229+
230+
## Build & Upload Steps
231+
232+
1. Build the Firefox production ZIP:
233+
```
234+
npm run build:firefox:prod
235+
```
236+
Output: `distros/nostrkey-firefox-v1.5.7.zip`
237+
238+
2. Prepare source code ZIP:
239+
```
240+
zip -r nostrkey-source.zip src/ build.js package.json package-lock.json tailwind.config.js .env.example -x '*.DS_Store'
241+
```
242+
243+
3. Go to https://addons.mozilla.org/en-US/developers/
244+
4. Click "Submit a New Add-on"
245+
5. Upload `distros/nostrkey-firefox-v1.5.7.zip`
246+
6. When prompted, upload `nostrkey-source.zip` with build instructions
247+
7. Fill in the "Describe Add-on" form using the details above
248+
8. Submit for review
249+
250+
## Submission Checklist
251+
252+
- [x] Create Firefox Account at addons.mozilla.org
253+
- [x] Build production ZIP (`npm run build:firefox:prod`)
254+
- [x] Prepare source code ZIP (exclude node_modules, .env, distros, .git)
255+
- [ ] Prepare screenshots (minimum 1, recommended 3-5) — **TODO**
256+
- [x] Verify privacy policy is live at https://nostrkey.com/privacy.html
257+
- [x] Upload extension ZIP to AMO
258+
- [x] Upload source code ZIP with build instructions
259+
- [x] Fill out listing: name, summary, description
260+
- [x] Select categories: Privacy & Security, Social & Communication
261+
- [x] Select license: MIT License
262+
- [x] Add privacy policy URL and inline policy text
263+
- [x] Add developer comments / technical notes
264+
- [x] Add tags: password manager, privacy, security, social media
265+
- [x] Submit for review (v1.5.7 — Awaiting Review)
266+
267+
## Review Timeline
268+
269+
- Automated scan: immediate
270+
- Human review: typically 1-14 days
271+
- Extensions with `<all_urls>` and cryptographic functionality may take longer
272+
- Be prepared to answer follow-up questions from reviewers
273+
274+
## Post-Submission
275+
276+
### If Approved
277+
- Extension will be published on AMO
278+
- Update README.md with AMO link
279+
- Update nostrkey.com with Firefox install link
280+
- Announce on social media / Nostr
281+
282+
### If Rejected
283+
- Review feedback carefully
284+
- Address any concerns (common: justification for host permissions)
285+
- Update and resubmit
286+
- Consider security audit if cryptographic concerns raised
287+
288+
## Ongoing Maintenance
289+
290+
### Updates
291+
- Build new version: `npm run build:firefox:prod`
292+
- Upload new ZIP through AMO developer dashboard
293+
- Source code re-upload required for each update
294+
- Updates go through review process (usually faster than initial)
295+
296+
### Useful Tools
297+
- **web-ext** — Mozilla's CLI for local testing and AMO uploads
298+
- `npx web-ext run -s distros/firefox/` — Load extension temporarily in Firefox
299+
- `npx web-ext lint -s distros/firefox/` — Validate extension before upload
300+
- `npx web-ext sign` — Sign and upload via CLI (requires API credentials)
301+
302+
## Additional Resources
303+
304+
- [AMO Developer Hub](https://addons.mozilla.org/en-US/developers/)
305+
- [Extension Workshop](https://extensionworkshop.com/)
306+
- [Add-on Policies](https://extensionworkshop.com/documentation/publish/add-on-policies/)
307+
- [Source Code Submission](https://extensionworkshop.com/documentation/publish/source-code-submission/)
308+
- [web-ext CLI](https://extensionworkshop.com/documentation/develop/getting-started-with-web-ext/)
309+
- [NIP-07 Specification](https://github.com/nostr-protocol/nips/blob/master/07.md)

src/sidepanel.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
<script>
99
document.addEventListener('DOMContentLoaded', function() {
1010
try {
11-
var v = 'v' + (browser || chrome).runtime.getManifest().version;
11+
var api = (typeof browser !== 'undefined' && browser.runtime) ? browser : (typeof chrome !== 'undefined' && chrome.runtime) ? chrome : null;
12+
if (!api) return;
13+
var v = 'v' + api.runtime.getManifest().version;
1214
var els = document.querySelectorAll('#locked-version, #settings-version');
1315
for (var i = 0; i < els.length; i++) els[i].textContent = v;
1416
} catch(e) {}

0 commit comments

Comments
 (0)