Skip to content

Commit 4ec2089

Browse files
committed
feat: NostrKeep Signer rebrand + v2 native UI + PKPass wallet support
Rebrand from NostrKey to NostrKeep Signer (com.nostrkeep.signer). Native SwiftUI v2 with identity cards, relay management, QR scanner, deep link handling, and PKPass wallet integration. Updated entitlements, App Groups, shared keychain, and CI workflow.
1 parent 4998778 commit 4ec2089

40 files changed

Lines changed: 670 additions & 439 deletions

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ jobs:
1616
- name: Build
1717
run: |
1818
xcodebuild build \
19-
-project NostrKey.xcodeproj \
20-
-scheme NostrKey \
19+
-project NostrKeepSigner.xcodeproj \
20+
-scheme NostrKeepSigner \
2121
-configuration Debug \
2222
-destination 'generic/platform=iOS Simulator' \
2323
CODE_SIGN_IDENTITY="" \

APP-STORE-SUBMISSION.md

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# App Store Submission — NostrKey Authenticator for iOS
1+
# App Store Submission — NostrKeep Signer Authenticator for iOS
22

3-
This document contains all the information needed to submit the NostrKey Authenticator for iOS to the Apple App Store.
3+
This document contains all the information needed to submit the NostrKeep Signer Authenticator for iOS to the Apple App Store.
44

5-
> **Two-Product Strategy:** This is the standalone **Authenticator** app (`com.nostrkey.authenticator`), distinct from the Safari Web Extension companion app at `nostrkey.browser.plugin.src/apple/` (`com.nostrkey.extension`). The two apps share a Keychain via App Groups but serve different primary functions and target different App Store categories. See "Relationship to Safari Extension" below.
5+
> **Two-Product Strategy:** This is the standalone **Authenticator** app (`com.nostrkeep.signer`), distinct from the Safari Web Extension companion app at `nostrkey.browser.plugin.src/apple/` (`com.nostrkeep.signer.extension`). The two apps share a Keychain via App Groups but serve different primary functions and target different App Store categories. See "Relationship to Safari Extension" below.
66
77
## Prerequisites
88

@@ -11,13 +11,13 @@ This document contains all the information needed to submit the NostrKey Authent
1111
- [x] App Store Connect access
1212
- [x] App icon (1024x1024px, SVG-rendered)
1313
- [ ] Screenshots for iPhone (6.9" / 6.7")
14-
- [ ] Privacy Policy URL live at nostrkey.com/privacy.html
14+
- [ ] Privacy Policy URL live at nostrkeep.com/privacy.html
1515
- [ ] Archive build uploaded
1616

1717
## App Store Listing
1818

1919
### App Name (30 chars max)
20-
**NostrKey**
20+
**NostrKeep Signer**
2121

2222
### Subtitle (30 chars max)
2323
**Nostr Identity Authenticator**
@@ -34,16 +34,16 @@ nostr,authenticator,identity,keys,qr,scanner,secure-enclave,nip-46,signing,npub,
3434

3535
### Description (4000 chars max)
3636
```
37-
NostrKey is the authenticator for the Nostr protocol. Scan a QR code, and you're signed in. Your private keys live in the Secure Enclave — hardware-isolated, biometric-protected, never extractable.
37+
NostrKeep Signer is the authenticator for the Nostr protocol. Scan a QR code, and you're signed in. Your private keys live in the Secure Enclave — hardware-isolated, biometric-protected, never extractable.
3838
39-
Think of NostrKey as the 1Password or Authy for Nostr. Websites and apps show you a QR code, you scan it with NostrKey, and you're authenticated — your private key never leaves your device.
39+
Think of NostrKeep Signer as the 1Password or Authy for Nostr. Websites and apps show you a QR code, you scan it with NostrKeep Signer, and you're authenticated — your private key never leaves your device.
4040
4141
HOW IT WORKS
4242
4343
1. Create or import your Nostr identity
4444
2. Your private key is stored in the Secure Enclave with Face ID protection
4545
3. When a Nostr app needs you to sign in, it shows a QR code
46-
4. Scan the QR code with NostrKey — authentication happens instantly
46+
4. Scan the QR code with NostrKeep Signer — authentication happens instantly
4747
5. Your key never touches the browser or the app you're signing into
4848
4949
KEY FEATURES
@@ -55,12 +55,12 @@ KEY FEATURES
5555
• One-Tap Relay Management — add relays by scanning a QR code or tapping a deep link
5656
• Identity Card — your npub as a shareable QR code with copy and share actions
5757
• Apple Wallet Integration — add your Nostr identity as a Wallet pass for meetups and events
58-
• Deep Link Support — nostrkey:// URLs for add-relay, connect, import-keys, and wallet-pass
59-
• Dark Theme — Monokai color scheme matching the NostrKey browser extension
58+
• Deep Link Support — nostrkeepsigner:// URLs for add-relay, connect, import-keys, and wallet-pass
59+
• Dark Theme — NostrKeep teal-on-navy color scheme matching the NostrKeep Signer browser extension
6060
61-
WORKS WITH THE NOSTRKEY SAFARI EXTENSION
61+
WORKS WITH THE NOSTRKEEP SIGNER SAFARI EXTENSION
6262
63-
NostrKey Authenticator and the NostrKey Safari Web Extension share a secure Keychain via App Groups. When both are installed:
63+
NostrKeep Signer Authenticator and the NostrKeep Signer Safari Web Extension share a secure Keychain via App Groups. When both are installed:
6464
6565
• The Safari extension detects your Secure Enclave keys automatically
6666
• Browser signing is upgraded from software keys to hardware-secured keys
@@ -71,7 +71,7 @@ You don't need both — each works independently — but together they form a tw
7171
7272
SECURITY
7373
74-
All private key material stays on your device. Keys are stored in the Secure Enclave with biometric access control — every signing operation requires Face ID or Touch ID. No data is collected, no analytics, no tracking. NostrKey is fully open source under the MIT license.
74+
All private key material stays on your device. Keys are stored in the Secure Enclave with biometric access control — every signing operation requires Face ID or Touch ID. No data is collected, no analytics, no tracking. NostrKeep Signer is fully open source under the MIT license.
7575
7676
SUPPORTED NIPS
7777
@@ -94,7 +94,7 @@ Completely rebuilt from the ground up as a native SwiftUI authenticator.
9494
• New: One-tap relay management via QR codes and deep links
9595
• New: Identity card with shareable npub QR code
9696
• New: Camera permission handling with Settings redirect
97-
• New: Monokai dark theme matching the browser extension
97+
• New: NostrKeep teal-on-navy dark theme
9898
• New: Shared Keychain bridge with Safari extension
9999
```
100100

@@ -112,21 +112,21 @@ Completely rebuilt from the ground up as a native SwiftUI authenticator.
112112

113113
## Relationship to Safari Extension
114114

115-
NostrKey exists as two complementary products on the App Store:
115+
NostrKeep Signer exists as two complementary products on the App Store:
116116

117-
| | NostrKey Authenticator | NostrKey Web Extension |
117+
| | NostrKeep Signer Authenticator | NostrKeep Signer Web Extension |
118118
|---|---|---|
119-
| **Bundle ID** | `com.nostrkey.authenticator` | `com.nostrkey.extension` |
119+
| **Bundle ID** | `com.nostrkeep.signer` | `com.nostrkeep.signer.extension` |
120120
| **Category** | Utilities | Safari Extensions |
121121
| **Primary UI** | Camera / QR scanner + dashboard | Browser toolbar popup |
122122
| **Key Storage** | Secure Enclave (hardware) | Keychain (software) |
123123
| **Authentication** | Face ID / Touch ID per operation | Master password + auto-lock |
124124
| **Primary Function** | QR-based identity authentication | NIP-07 browser signing injection |
125-
| **App Groups** | `group.com.nostrkey` (shared) | `group.com.nostrkey` (shared) |
125+
| **App Groups** | `group.com.nostrkeep.signer` (shared) | `group.com.nostrkeep.signer` (shared) |
126126

127127
**Why two apps?** The Safari extension injects `window.nostr` into web pages for seamless browser-based signing. The authenticator app provides hardware-secured key storage and QR-based authentication that works with any Nostr client, not just browsers. Different app categories, different primary interfaces, different use cases — like how 1Password has both a Safari extension and a standalone app.
128128

129-
**Bridge behavior:** When both apps are installed, the Safari extension automatically detects Secure Enclave keys stored by the authenticator via the shared App Group Keychain (`H48PW6TC25.group.com.nostrkey`). It upgrades its signing operations from software keys to hardware-secured keys transparently.
129+
**Bridge behavior:** When both apps are installed, the Safari extension automatically detects Secure Enclave keys stored by the authenticator via the shared App Group Keychain (`H48PW6TC25.group.com.nostrkeep.signer`). It upgrades its signing operations from software keys to hardware-secured keys transparently.
130130

131131
## Privacy Details (App Store Connect)
132132

@@ -136,7 +136,7 @@ NostrKey exists as two complementary products on the App Store:
136136
Select: **Data Not Collected**
137137

138138
### Privacy Policy URL
139-
**https://nostrkey.com/privacy.html**
139+
**https://nostrkeep.com/privacy.html**
140140

141141
### Privacy Nutrition Label
142142
| Data Type | Collected | Linked to Identity | Tracking |
@@ -146,8 +146,8 @@ Select: **Data Not Collected**
146146
## Required Assets
147147

148148
### App Icon
149-
- 1024x1024px PNG (rendered from NostrKey-logo.svg)
150-
- Located: `NostrKey/Assets.xcassets/AppIcon.appiconset/icon-1024.png`
149+
- 1024x1024px PNG (rendered from NostrKeepSigner-logo.svg)
150+
- Located: `NostrKeepSigner/Assets.xcassets/AppIcon.appiconset/icon-1024.png`
151151

152152
### Screenshots
153153

@@ -169,13 +169,13 @@ Select: **Data Not Collected**
169169
## App Review Information
170170

171171
### Demo Account
172-
Not applicable — NostrKey generates keys locally. No account, server, or subscription needed.
172+
Not applicable — NostrKeep Signer generates keys locally. No account, server, or subscription needed.
173173

174174
### Review Notes
175175
```
176-
NostrKey Authenticator is a native SwiftUI app that provides QR-based Nostr identity authentication with Secure Enclave key storage. It is NOT a browser extension wrapper — it is a standalone authenticator built with AVFoundation (camera), Security framework (Keychain/Secure Enclave), LocalAuthentication (Face ID), and CoreImage (QR generation).
176+
NostrKeep Signer Authenticator is a native SwiftUI app that provides QR-based Nostr identity authentication with Secure Enclave key storage. It is NOT a browser extension wrapper — it is a standalone authenticator built with AVFoundation (camera), Security framework (Keychain/Secure Enclave), LocalAuthentication (Face ID), and CoreImage (QR generation).
177177
178-
This app is distinct from our NostrKey Safari Web Extension (com.nostrkey.extension). The web extension injects window.nostr into Safari for browser-based signing. This authenticator app provides hardware-secured key storage and QR-based authentication — a different app category, different primary interface, and different use case. They share a Keychain via App Groups so users who install both get upgraded security automatically.
178+
This app is distinct from our NostrKeep Signer Safari Web Extension (com.nostrkeep.signer.extension). The web extension injects window.nostr into Safari for browser-based signing. This authenticator app provides hardware-secured key storage and QR-based authentication — a different app category, different primary interface, and different use case. They share a Keychain via App Groups so users who install both get upgraded security automatically.
179179
180180
Key functionality:
181181
1. Generate or import Nostr private keys (nsec bech32 format)
@@ -185,14 +185,14 @@ Key functionality:
185185
5. View public key (npub) as a QR code for sharing
186186
6. Manage multiple Nostr identities with profile switching
187187
7. Configure relay connections with NIP-11 metadata fetching
188-
8. Deep link support for nostrkey:// and nostrconnect:// URI schemes
188+
8. Deep link support for nostrkeepsigner:// and nostrconnect:// URI schemes
189189
190190
To test:
191191
1. Launch the app — tap "Create New Identity" on the onboarding screen
192192
2. The Home tab shows your active profile with npub QR code
193193
3. Tap profiles in the list to switch active identity
194194
4. Go to the Scanner tab — grant camera permission when prompted
195-
5. Visit nostrkey.com/test-qr-codes on another device to get test QR codes
195+
5. Visit nostrkeep.com/test-qr-codes on another device to get test QR codes
196196
6. Scan a relay URL QR (wss://relay.damus.io) — the app offers to add it
197197
7. Scan an npub QR — the app shows the profile view
198198
8. View the Identity tab for your full npub QR with copy/share actions
@@ -209,17 +209,17 @@ Precedent: This two-product model (browser extension + standalone authenticator)
209209
```
210210

211211
### Contact Information
212-
- **Website:** https://nostrkey.com
213-
- **Support URL:** https://nostrkey.com/support.html
214-
- **Marketing URL:** https://nostrkey.com
212+
- **Website:** https://nostrkeep.com
213+
- **Support URL:** https://nostrkeep.com/support.html
214+
- **Marketing URL:** https://nostrkeep.com
215215
- **GitHub:** https://github.com/HumanjavaEnterprises/nostrkey.app.ios.src
216216

217217
## Build & Archive
218218

219219
### Version
220220
- `MARKETING_VERSION`: 2.0.0
221221
- `CURRENT_PROJECT_VERSION`: 1
222-
- Bundle ID: `com.nostrkey.authenticator`
222+
- Bundle ID: `com.nostrkeep.signer`
223223
- Minimum iOS: 17.0
224224
- Swift: 5.9
225225
- Xcode: 16.0+
@@ -231,14 +231,14 @@ cd nostrkey.app.ios.src
231231
xcodegen generate
232232

233233
# 2. Open in Xcode
234-
open NostrKey.xcodeproj
234+
open NostrKeepSigner.xcodeproj
235235

236236
# 3. Select signing team in project settings
237-
# Xcode → NostrKey target → Signing & Capabilities → Team
237+
# Xcode → NostrKeepSigner target → Signing & Capabilities → Team
238238

239239
# 4. Verify entitlements
240-
# - App Groups: group.com.nostrkey
241-
# - Keychain Sharing: $(AppIdentifierPrefix)group.com.nostrkey
240+
# - App Groups: group.com.nostrkeep.signer
241+
# - Keychain Sharing: $(AppIdentifierPrefix)group.com.nostrkeep.signer
242242

243243
# 5. Archive
244244
# Product → Archive (requires "Any iOS Device" destination)
@@ -250,24 +250,24 @@ open NostrKey.xcodeproj
250250
### Archive from command line
251251
```bash
252252
# Archive
253-
xcodebuild -project NostrKey.xcodeproj \
254-
-scheme NostrKey \
253+
xcodebuild -project NostrKeepSigner.xcodeproj \
254+
-scheme NostrKeepSigner \
255255
-destination 'generic/platform=iOS' \
256256
-configuration Release \
257-
-archivePath build/NostrKey.xcarchive \
257+
-archivePath build/NostrKeepSigner.xcarchive \
258258
archive
259259

260260
# Export for App Store
261261
xcodebuild -exportArchive \
262-
-archivePath build/NostrKey.xcarchive \
262+
-archivePath build/NostrKeepSigner.xcarchive \
263263
-exportOptionsPlist ExportOptions.plist \
264264
-exportPath build/AppStore
265265
```
266266

267267
## Submission Checklist
268268

269269
- [ ] Apple Developer account active
270-
- [ ] App Store Connect entry created for "NostrKey" (com.nostrkey.authenticator)
270+
- [ ] App Store Connect entry created for "NostrKeep Signer" (com.nostrkeep.signer)
271271
- [ ] Fill out app description, subtitle, keywords
272272
- [ ] Upload promotional text
273273
- [ ] Set categories (Utilities + Productivity)
@@ -295,7 +295,7 @@ xcodebuild -exportArchive \
295295

296296
### If Approved
297297
- Update README.md with App Store link and badge
298-
- Update nostrkey.com with iOS authenticator download link
298+
- Update nostrkeep.com with iOS authenticator download link
299299
- Add deep link from Safari extension to App Store listing
300300
- Announce on Nostr
301301

@@ -308,5 +308,5 @@ xcodebuild -exportArchive \
308308

309309
---
310310

311-
*Last updated: March 5, 2026*
311+
*Last updated: March 9, 2026*
312312
*Published by Humanjava Enterprises Inc.*

CLAUDE.md

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
# CLAUDE.md — nostrkey.app.ios.src
22

33
## What This Is
4-
NostrKey iOS app — a native SwiftUI Nostr identity authenticator. QR scanner as primary interface, Secure Enclave key storage, NIP-46 remote signing, Apple Wallet integration, and deep link relay management.
4+
NostrKeep Signer iOS app — a native SwiftUI Nostr identity authenticator. QR scanner as primary interface, Secure Enclave key storage, NIP-46 remote signing, Apple Wallet integration, and deep link relay management.
55

66
## Architecture (v2 — March 2026 Rebuild)
77
Complete rewrite from WebView-wrapper to native SwiftUI. No more bundled browser extension. The app is a standalone authenticator that holds keys and signs on behalf of any Nostr client.
88

9-
### Source: `NostrKey-v2/`
9+
### Source: `NostrKeepSigner-v2/`
1010
```
11-
NostrKey-v2/
12-
├── App/ # SwiftUI app entry, AppState, ContentView, DeepLinkHandler
11+
NostrKeepSigner-v2/
12+
├── App/ # SwiftUI app entry (NostrKeepSignerApp.swift), AppState, ContentView, DeepLinkHandler
1313
├── Scanner/ # AVFoundation QR camera view
1414
├── Identity/ # KeyManager (Secure Enclave), NostrProfile, ProfileManager
1515
├── Relay/ # RelayManager, RelayInfo, NIP-11 metadata
1616
├── NIP46/ # NIP-46 remote signing session management
1717
├── Crypto/ # Bech32, NostrCrypto (nsec/npub encoding), event hashing
18-
├── UI/ # IdentityCardView, RelayListView, SettingsView
18+
├── UI/ # IdentityCardView, RelayListView, SettingsView (NostrKeepSignerTheme colors)
1919
├── Info.plist # App config (camera + Face ID permissions, deep link schemes)
20-
└── NostrKey.entitlements # App Groups + Keychain sharing
20+
└── NostrKeepSigner.entitlements # App Groups + Keychain sharing
2121
```
2222

23-
### Legacy Source: `NostrKey/`
24-
The original WebView-wrapper app (v1.x) is preserved in `NostrKey/` for reference. The v2 project.yml points to `NostrKey-v2/` sources but still uses `NostrKey/Assets.xcassets` for icons.
23+
### Legacy Source: `NostrKeepSigner/`
24+
The original WebView-wrapper app (v1.x) is preserved in `NostrKeepSigner/` for reference. The v2 project.yml points to `NostrKeepSigner-v2/` sources but still uses `NostrKeepSigner/Assets.xcassets` for icons.
2525

2626
## Ecosystem Position
27-
The authenticator for Nostr. Holds keys in Secure Enclave, signs via NIP-46 for any client. Shares keys with the Safari extension via App Group Keychain (`group.com.nostrkey`).
27+
The authenticator for Nostr. Holds keys in Secure Enclave, signs via NIP-46 for any client. Shares keys with the Safari extension via App Group Keychain (`group.com.nostrkeep.signer`).
2828

2929
## Current Version
3030
v2.0.0 (Build 1) — Native SwiftUI rebuild
@@ -38,19 +38,24 @@ v2.0.0 (Build 1) — Native SwiftUI rebuild
3838
- URLSessionWebSocketTask (NIP-46 relay communication)
3939
- XcodeGen for project generation
4040

41+
## Theme
42+
- Teal (#2dd4bf) on navy (#0f172a)
43+
- Color names: NostrKeepSignerTheme
44+
- Bundle ID: `com.nostrkeep.signer`
45+
4146
## Build
4247
```bash
4348
xcodegen generate
44-
open NostrKey.xcodeproj
49+
open NostrKeepSigner.xcodeproj
4550
# Build & Run in Xcode (requires physical device for camera + Secure Enclave)
4651
```
4752

4853
## Key Architecture Decisions
4954
- **SwiftUI-only** — no UIKit except for AVCaptureSession (camera requires UIKit)
5055
- **Secure Enclave via Keychain** — secp256k1 keys stored with biometric access policy
51-
- **App Group sharing**`group.com.nostrkey` shared Keychain + UserDefaults
56+
- **App Group sharing**`group.com.nostrkeep.signer` shared Keychain + UserDefaults
5257
- **NIP-46 over WebSocket** — remote signing without key exposure
53-
- **Deep links**`nostrkey://add-relay`, `nostrkey://connect`, `nostrconnect://`
58+
- **Deep links**`nostrkeepsigner://add-relay`, `nostrkeepsigner://connect`, `nostrconnect://`
5459
- **No web views** — pure native UI, no embedded browser extension
5560

5661
## TODO: Before Shipping
@@ -62,13 +67,13 @@ open NostrKey.xcodeproj
6267
- [ ] App Store screenshots for authenticator flow
6368

6469
## Deep Link Schemes
65-
- `nostrkey://add-relay?url=wss://...&name=...&paid=true`
66-
- `nostrkey://connect?pubkey=...&relay=wss://...`
67-
- `nostrkey://import-keys?nsec=nsec1...`
68-
- `nostrkey://wallet-pass?npub=npub1...`
70+
- `nostrkeepsigner://add-relay?url=wss://...&name=...&paid=true`
71+
- `nostrkeepsigner://connect?pubkey=...&relay=wss://...`
72+
- `nostrkeepsigner://import-keys?nsec=nsec1...`
73+
- `nostrkeepsigner://wallet-pass?npub=npub1...`
6974
- `nostrconnect://pubkey?relay=wss://...&secret=...`
7075

7176
## Related Repos
7277
- `nostrkey.browser.plugin.src` — Safari/Chrome extension (NIP-07)
7378
- `nostrkey.app.android.src` — Android equivalent
74-
- `nostrkey.bizdocs.src` — business strategy (see NostrKey-App-Architecture.md)
79+
- `nostrkey.bizdocs.src` — business strategy (see NostrKeep-Signer-App-Architecture.md)

0 commit comments

Comments
 (0)