CustID, now with NIP-55 support!
v0.2.0-beta brings native NIP-55 support and lots of UX improvements.
🎉 Here, finally, is the v0.2.0-beta release !
This is a big one 📦:
- NIP-55 support ! Long overdue! Obvious reasons. 🤓
- Lots of UX improvements. Both in terms of usability and signature requests processing reliability, for both NIP-46 and NIP-55, as well as NIP-42 authentication requests.
- 🌸 Support for Blossom to upload a profile picture, and more reliable options for managing NIP-65 relay lists and profile metadata. This is just the first step towards an application that would serve as a comprehensive Nostr identity management tool, including the management of various types of Nostr relays.
- Approve signature requests from a modal window, or directly from the notification, whichever you prefer. Alternatively, require biometric authentication for your most important identities. 🛂
- And tons of other improvements. See full changelog below.
This project took much longer than expected, for several reasons. The first is that CustID was initially launched as a proof-of-concept demonstrator, and to save development time, we chose to use Capacitor (webviews written in Preact). This turned out to be a significant technical debt.
Showing NIP-55 approvals natively on top of the calling app, and answering background requests even when CustID is closed, was not possible with a web view. It would also have put the signing path within reach of the web layer.
So we had to rewrite that part of the core in Kotlin. But the good news is that the rest of the application can now be gradually migrated to native code more easily.
One small thing to know: some apps connected before the update will ask you to approve them again. CustID tells you once right after the update, and each app asks for a fresh approval the next time you use it.
If signature requests appear to be arriving late for some of your previously connected apps, simply disconnecting and reconnecting them should resolve the issue. If you constantly see an orange dot 🟠 next to one of your apps, it means that one of the relays is probably no longer reachable. Reconnecting the app by generating the bunker:// URL yourself (Identity → “Connected apps” → “+”) and selecting your trusted relays is sometimes more reliable.
We have also decided to drop support for Android 13 and earlier versions. Every build and test now targets Android 14 and above. This allowed us to simplify our code base and remove a lot of legacy code.
📱 CustID is exclusively distributed trough nostr:nprofile1qqs83nn04fezvsu89p8xg7axjwye2u67errat3dx2um725fs7qnrqlgpp4mhxue69uhkummn9ekx7mqpz3mhxue69uhhyetvv9ujuerpd46hxtnfduq3vamnwvaz7tmjv4kxz7fwwpexjmtpdshxuet5lq2tdg
Update or install it from there.Or if you prefer, you can find the APK directly on the releases page here.
There are obviously still many improvement to be done, but we hope you'll like what we've done in the past few months, and start using CustID more as your main ID vault app for the Internetz, and soon™ for the World ! :)
Full changelog for v0.2.0-beta
- Android Nostr apps installed on the same device can now ask CustID to sign, encrypt or decrypt for them directly (NIP-55): no QR code, no relays, no connection setup. Compatible clients like Amethyst discover CustID automatically and open the exact same approval screen used for connected apps, with identical remembered permissions.
- Open a local (NIP-55) Android app's settings to edit its remembered permissions and per-relay authentication lists, just like for relay-based (NIP-46) connected apps.
- CustID now requires Android 14 (API 34) or newer: the minimum supported Android version was raised, and every build, test rig and qualification run now targets Android 14 and above only.
- Apps that were connected before this upgrade without a verifiable identity are asked to reconnect: CustID tells you once, right after the update, and each affected app requests a fresh approval the next time you use it.
- Show which relay is asking for NIP-42 authentication directly on the request card, with the relay address displayed prominently instead of hidden in the raw event details.
- Relays from your identity's relay lists and favorites, private and DM lists are now authenticated automatically without asking, blocked relays are always refused, and a switch per identity (Profile Settings) controls the behaviour; the inherited relays are shown read-only in the app settings of every connected app.
- Deleting an identity now also removes its connected-app pairings and remembered permissions in the same operation, so nothing authorized by a deleted identity remains listed or usable.
- Local Android apps such as Amethyst can now ask CustID to decrypt private zaps (NIP-57): the hidden message inside a private zap request is revealed to the asking app after the usual approval, and one remembered decryption permission covers both private zaps and messages.
- Signing requests from local Android apps now show the caller's app icon and name next to the identity it wants to use, with the requested action and event kind on the same card language as relay-based requests.
- Your identities and the permissions of local Android apps are now stored in a tamper-resistant native vault on the device instead of the app's web storage: connected apps survive app updates and their remembered permissions can no longer be altered from the web layer.
- Review the complete event JSON of a local app's signing request in a details view: pretty-printed, colour-highlighted, scrollable and copyable to the clipboard, mirroring the connected-apps details view.
- The first time a local Android app asks to connect (NIP-55), CustID now asks which identity it may use when your vault holds several, and shows exactly what the app requests before anything is remembered.
- The identity picker for a first local-app connection now asks for an explicit choice before confirming (Confirm stays disabled until you pick an identity), shows the app's requested default permissions, and offers the same Allow / Ask-each-time choice as before.
- The Android back gesture now closes the event details view first without cancelling the request; backing out of a pending approval still rejects it cleanly, exactly as before.
- Accessibility of local-app approvals: icon-only buttons carry screen-reader descriptions, the selected connection choice is announced, and every control keeps a comfortable touch target.
- Connecting a local Android app is now fully confirmed before anything is remembered: the permission review happens while the connection is still provisional, and closing it cancels the connection outright instead of silently keeping a half-approved app.
- One local Android app can now be connected to several of your identities: each request is answered with exactly the identity the app asks for, and the connection picker marks the identities already connected to it.
- Local Android apps such as Amethyst can now use CustID for private messages and drafts: encryption and decryption requests are recognised and approved (or remembered) like any other request.
- Requests a local app may answer silently (remembered approvals and rejections, identity look-ups) no longer briefly bring CustID to the foreground: they are handled completely in the background, and CustID only opens when your decision is actually needed.
- Local Android apps now appear in Connected Apps next to relay-based apps: see what each app is allowed to do, change its remembered permissions at any time, or revoke its access entirely.
- Local Android apps you already connected can now use your remembered permissions silently in the background (NIP-55 ContentResolver): compatible clients like Amethyst decrypt chat history without opening CustID, always-rejected requests are answered directly, and anything you never chose to remember falls back to the usual approval screen instead of hanging.
- Remembered permissions now answer background requests (NIP-55) entirely on their own, even when CustID was never opened or has been completely closed: signing, encryption and decryption with remembered approvals run natively on the device with no web layer involved, a client that cancels or goes away mid-request gets an honest refusal instead of a hang, and nothing is ever silently answered beyond what you chose to remember.
- Signing requests arriving from a local Android app are handled safely alongside relay-based requests: they are presented one at a time, work while CustID is locked (after unlock), and cancelling the signer screen cleanly rejects the request instead of leaving anything pending.
- Signing requests from connected apps are no longer blocked or delayed by a backlog of stale or flooding requests: expired requests are cleared automatically and new ones are always accepted.
- Fix profile photo uploads failing on device: CustID now understands the response format public Blossom servers actually use, treats an already-stored photo as a success, and verifies the published picture is really downloadable before saving it.
- Keep your profile picture available offline: it is cached on the device right after upload and still displays when the image server is unreachable.
- If your photo cannot be uploaded while creating an identity, CustID now publishes your generated avatar instead and clearly tells you, so you can retry with your own photo from the profile settings.
- Profile settings now leave the screen as soon as an update is saved and published, keep the Update buttons disabled until something actually changed, and allow an immediate retry when a publish fails.
- Set a profile picture when creating an identity or change it later from profile settings: photos are uploaded to public Blossom servers and referenced by your Nostr profile, and new identities publish their generated robot avatar the same way.
- New identities now include a default banner in their Nostr profile; a banner set from another client is always preserved.
- Editing your profile no longer erases metadata managed by other Nostr clients (website, bot flag, custom fields…): CustID now re-publishes your profile with every original field preserved.
- Deliver identity and relay-list updates to public profile search relays more reliably, with quiet automatic retries.
- Publish identity, relay-list and badge updates without waiting for the slowest relay: confirmation now arrives as soon as enough relays have accepted, and unreachable relays keep retrying quietly in the background.
- Identity import no longer waits for badge discovery — badges now load in the background as soon as your identity is ready.
- Support the CustID developers with a "Zap the devs" donation from any of your identities: the zap request is signed on the device and sent only to the donation service, the invoice opens in your lightning wallet (or is copied with instructions when none is installed), and a notification thanks you once the payment is detected.
#custid #sistr #nostr #sovereign #did