Your keychain for the Pubky ecosystem. Manage your pubkys, authorize services, and stay in control—no accounts, no passwords.
Pubky Ring is the key manager for your identity in the Pubky ecosystem. It lets you securely manage your pubkys—the public keys that power your presence across decentralized apps.
- Authorize or revoke access to services
- Organize and sync your pubkys across devices
- View and control active sessions
- Stay fully self-custodial, with no accounts or tracking
Pubky Ring accepts input via deeplinks, QR code scanning, and clipboard pasting. All parsing is handled by src/utils/inputParser.ts.
Registered URL schemes: pubkyring:// and pubkyauth://
| Action | Format | Parameters |
|---|---|---|
| Auth | pubkyauth:///?relay={url}&secret={secret}&caps={caps} |
relay: relay URL, secret: secret key, caps: comma-separated capabilities |
| Sign In | pubkyring://signin?caps=...&secret=...&relay=... |
Same as Auth (converted internally) |
| Signup | pubkyring://signup?hs={homeserver}&st={signup_token}&relay=...&secret=...&caps=... |
hs: homeserver URL, st: invite/signup token |
| Session | pubkyring://session?callback={callback_url} |
callback: URL-encoded callback URL |
| Migrate | pubkyring://migrate?index={n}&total={total}&key={key} |
index: 0-based frame index, total: frame count, key: mnemonic or secret key |
| Format | Example | Action |
|---|---|---|
| Recovery Phrase | word1 word2 word3 ... word12 (12 BIP39 words) |
Import |
| Encrypted Secret Key | Encrypted key string | Import |
| Invite Code | XXXX-XXXX-XXXX |
Invite |
| Invite URL | https://example.com/invite/XXXX-XXXX-XXXX |
Invite (code extracted) |
| Any deeplink | pubkyring://signup?... |
Same as deeplink |
Note: Pasted input is normalized—hyphens, underscores, and plus signs are converted to spaces for recovery phrases.
Accepts all deeplink and clipboard formats when encoded in a QR code. Additionally supports:
| Format | Description |
|---|---|
| Animated QR | Multi-frame QR codes cycling through migrate deeplinks for bulk key import |
When parsing input, the first matching format wins:
- Migrate deeplinks
- Signup deeplinks
- Session deeplinks
- Sign-in deeplinks
- Auth URLs (
pubkyauth:///) - Invite codes in URLs
- Standalone invite codes
- Recovery phrases (12 words)
- Encrypted secret keys
- Unknown (fallback)
- Node.js >= 20
- Yarn 1.x
git clone https://github.com/pubky/pubky-ring && cd pubky-ringyarn install
# For iOS you may also need the following:
cd ios && pod install && cd ..For iOS:
yarn iosFor Android:
yarn androidIf everything is set up correctly, you should see your new app running in your Android Emulator or iOS Simulator shortly provided you have set up your emulator/simulator correctly.
This is one way to run your app — you can also run it directly from within Android Studio and Xcode respectively.
If you can't get this to work, see the Troubleshooting page.
Ensure the APK you downloaded is authentic and untampered by verifying its GPG signature and SHA256 checksum. Android releases may include a universal APK (for example, app-universal-release.apk) and/or ABI-specific APKs (for example, app-arm64-v8a-release.apk).
gpg --import public-key.ascgpg --verify <apk-file>.asc <apk-file>gpg --verify SHA256SUMS.asc
sha256sum -c SHA256SUMSE2E tests use Maestro. See .maestro/README.md for local and CI usage.