|
| 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) |
0 commit comments