feat: share Pubky identities with Bitkit - #342
Draft
Jasonvdb wants to merge 8 commits into
Draft
Conversation
Jasonvdb
force-pushed
the
release/legacy-android-sunset
branch
from
July 21, 2026 13:44
d9617a3 to
369b704
Compare
Jasonvdb
force-pushed
the
feat/android-shared-pubky-relaunch
branch
from
July 24, 2026 13:26
fa2f0ae to
5b6eac8
Compare
This was referenced Jul 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Important
Dependencies and merge/release order
#342 is blocked by the v1.17 publication and its Apple/Play release gates. The Bitkit consumer branches are stacked on their own parent PRs. At runtime, #342 and #643/#1109 are counterparts: Ring-to-Bitkit becomes available when Ring ships first and the consumers then ship; Ring's reverse “Use from Bitkit” flow becomes available only after the corresponding consumer ships its Bitkit-owned provider.
Summary
app.pubkyringversion 2.0 after the legacy sunset release.Protocol and security
signaturepermissions, enforce exact package/UID ownership, and verify matching signing certificates at runtime.WhenUnlockedThisDeviceOnlyin$(AppIdentifierPrefix)pubky.sharedand never synchronize through iCloud.Migration and source ownership
The app-private Ring keychain remains the canonical source. Migration and reconciliation never delete it: Ring writes the shared mirror only after the private write succeeds, reads the mirror back for verification, and prunes stale Ring-owned mirrors only after the current record is valid. Explicit destructive flows delete and verify the shared mirror before deleting private identity state, and stop if shared cleanup fails.
The released-user migration is safe because no prior public Ring build shipped this sharing model. The v7 migration therefore treats legacy Ring state as Ring-owned. Old draft or proof-of-concept builds may have copied a Bitkit key without durable provenance; anyone who installed those private drafts must uninstall/wipe Ring before testing this PR. If any such build was distributed externally, its state needs provenance quarantine rather than automatic ownership inference.
Borrowed Bitkit identities retain only a source reference and a local session. Ring never silently promotes a borrowed identity to owned state, never replaces an active/recoverable identity, and drops local access when the source identity is no longer available.
Release gates
Android
Release packaging requires all five production signing inputs, validates the keystore/key and pinned certificate, rejects the debug certificate, and verifies the final APK/AAB signer. Debug Ring and all Bitkit debug variants currently use the same checked-in certificate:
Production release remains blocked until Play Console confirms whether Bitkit's CI keystore certificate is the installed app-signing certificate or only an upload certificate. If Play uses a distinct app-signing key, keep a separate Ring upload-certificate check, pin the installed Bitkit certificate independently, and verify the Play-generated Ring APK against the installed Bitkit artifact.
iOS
Code and simulator work can proceed before App Store Connect access is available. Shipping remains blocked until
pubky.sharedis created and attached to both App IDs, provisioning profiles are regenerated, and signed two-app physical-device interoperability passes. Missing entitlements fail closed and leave the canonical private source untouched.Verification
yarn typecheckyarn format:checkyarn lint— 0 errors; existing non-blocking warnings remainyarn test --runInBand— 5 suites, 45 testsassets/index.android.bundle.PubkyBox-StagingTestPubky-0; this is not an APK assembly, installation, or JavaScript-packaging failure, but it remains an open integration gate rather than being waived.git diff --checkAndroid application unit tests are
NO-SOURCE. Android lint currently crashes inside thereact-native-workletsdependency withCannot find a KaModule for the VirtualFile; an isolated retry reproduces the dependency failure without a Ring diagnostic.QA