Commit Graph

38 Commits

Author SHA1 Message Date
Justin Hernandez
4934a8c2be Align WebView flow with provider-backed KYC (#1845)
* push code for wv-02 and 03

* pr feddback
2026-03-11 18:43:15 -07:00
Justin Hernandez
25e8ddda37 wv-01 work (#1844) 2026-03-11 14:09:16 -07:00
Justin Hernandez
929ef3832e kmp: Update specs to reflect paused work (#1842)
* sc-01 first commmit

* fix pipelines

* update specs

* update specs to reflect paused work

* fix build

* add missing

* pipeline fixes

* last round of feedback

* update specs
2026-03-11 13:09:02 -07:00
Justin Hernandez
73d2075ad4 Deduplicate bridge-layer fallback adapters onto engine-owned browser implementations (SC-01) (#1841)
* sc-01 first commmit

* fix pipelines

* fix build

* add missing

* pipeline fixes

* last round of feedback
2026-03-11 12:50:27 -07:00
Justin Hernandez
b53626c16b Fix lifecycle bridge result routing semantics (#1840)
* update specs

* update specs

* harden nfc apdu

* ns-05 work

* pr feedback

* updates

* fixes
2026-03-10 21:58:58 -07:00
Justin Hernandez
774fe295ca Complete RN-03 NFC hardening and stabilize RN SDK tests (#1797)
* udates

* add regression test

* feedback; remove assets

* fix pipeline

* pr feedback

* fixes

* fix pipeline

* finalize rn03 work

* fix ci

* better foramt
2026-03-10 21:40:50 -07:00
Justin Hernandez
2ab33c727a Reject raw APDU commands in KMP NFC bridge (#1839)
* update specs

* update specs

* harden nfc apdu
2026-03-10 20:31:34 -07:00
Justin Hernandez
6dcaa63de3 Audit KMP artifact readiness for MiniPay integration (#1838)
* update specs

* update specs

* pr feedback
2026-03-10 20:10:43 -07:00
Justin Hernandez
1041babc7b Stabilize iOS simulator startup and crash mitigation flow (#1836)
* save sepc

* save wip

* save pr 2wip

* save wip rd 3

* finalize ios crash fix

* pr feedback and format
2026-03-10 20:09:03 -07:00
Justin Hernandez
4f08bbfce7 update specs (#1837) 2026-03-10 17:41:26 -07:00
Justin Hernandez
d7c1556ddc Align KMP verification result contract with canonical SDK types (#1831)
* Align KMP verification result contract

* formatting

* pr feedback

* feedback
2026-03-10 09:02:12 -07:00
Justin Hernandez
6b89976758 formatting (#1829) 2026-03-09 22:10:28 -07:00
Justin Hernandez
b8b893311b rework specs rd 3 (#1827)
* rework specs

* udpate specs

* format
2026-03-09 21:01:17 -07:00
Justin Hernandez
52113786c0 update integration tests (#1826) 2026-03-06 18:26:22 -08:00
Justin Hernandez
88e28733b1 Phase 1 Native Consolidation: Extract MRZ OCR/Mapping Helpers and Thin Scanner Views (#1823)
* mrz consolidation

* consolidate mrz swift code

* update specs

* save changes

* fixes

* format

* update spec

* pr feedback

* add tests

* save prep work

* consolidate MRZ handling logic

* fixes

* format

* format

* remove giga

* pr feedback

* update spec

* update

* revert change

* pr feedback

* updates
2026-03-06 17:54:46 -08:00
Justin Hernandez
3ee9822752 Phase 0 Native Consolidation: Baseline Contracts, Bridge Tests (#1822)
* mrz consolidation

* consolidate mrz swift code

* update specs

* save changes

* fixes

* format

* update spec

* pr feedback

* add tests

* remove

* fix pipeline
2026-03-06 14:51:51 -08:00
Justin Hernandez
23ab5d8b17 Consolidate iOS build, config, and integration paths (#1821)
* mrz consolidation

* consolidate mrz swift code

* update specs

* save changes

* fixes

* format

* pr feedback
2026-03-06 13:38:55 -08:00
Justin Hernandez
be9f2d8f8b Consolidate RN test app Android MRZ scanner onto shared SDK handler (#1817)
* first pass at consolidation work

* fix gap

* update spec

* fix pipeline

* pr feedback
2026-03-06 10:10:55 -08:00
Justin Hernandez
cde591b998 feat(rn-sdk-test-app): native MRZ camera with progressive detection UX (#1816)
* save wip

* save working code

* finalize code

* pr feedback

* fix
2026-03-05 22:48:41 -08:00
Justin Hernandez
62a11cdca3 chore: rename kmp sdk test app folder (#1815)
* chore: rename kmp sdk test app folder

* update ignore

* fix path
2026-03-05 18:37:46 -08:00
Justin Hernandez
d4c52af7e3 kmp ci coverage (#1814)
* save kmp coverage work

* clean up

* move to archive

* fix ci

* update workflows

* fix build error

* fix

* ci fix
2026-03-05 18:35:35 -08:00
Justin Hernandez
536eb69538 Justin/update specs rd3 (#1813)
* update archive

* finslize specs
2026-03-05 16:25:49 -08:00
Justin Hernandez
a367e7eecb Update specs to be agentic (#1811)
* save chunk 1e work

* chunk 2f

* pr feedback

* fix pr feedback

* cr feedback

* remove dupe var

* feedback from cr

* add kmp:start dx helper

* save web consolidtion work for later

* add specs

* update

* pr fixes

* update reorg plan

* add coverage gaps spec

* pr feedback

* save current wip iteration

* finalize spec work
2026-03-05 16:20:46 -08:00
Justin Hernandez
44ded24886 Wire WebView camera adapter and harden Android SDK launch flow (#1805)
* save chunk 1e work

* chunk 2f

* pr feedback

* fix pr feedback

* cr feedback

* remove dupe var

* feedback from cr

* add kmp:start dx helper

* save web consolidtion work for later

* add specs

* update

* pr fixes

* update reorg plan
2026-03-05 12:14:02 -08:00
Justin Hernandez
d5001eef8d Add RN SDK test app harness and update spec validation scope (#1798)
* fill gps

* pr feedback

* add easy demo install script, sort package.json files

* get app running

* fix ios running

* rename app

* fix pipeline issues

* pr feedback

* fix pipelines

* fix

* update
2026-03-02 19:52:23 -08:00
Justin Hernandez
9d4f468236 add web work (#1801) 2026-03-02 07:58:09 -08:00
Justin Hernandez
a18a5ab097 update spec lists (#1800) 2026-03-02 06:41:34 -08:00
Justin Hernandez
9406bacda8 chore: convert json to lottie files (#1786)
* convert json to lottie files

* add comment for future web dotlottie usage

* fix pipelines; agent feedback

* enable ios e2e

* update lottie

* one more try

* kotlin fix

* attempt fix

* save wip fixes

* fix patch

* final pass

* fix pipelines

* attempt fix

* fix test

* feedback

* fix types
2026-02-28 18:47:25 -08:00
Justin Hernandez
408e2fa4de kmp wrap up handoff work (#1785)
* save wip

* finalize pr

* pr feedback

* update specs. feedback

* add handoff security doc
2026-02-25 17:51:43 -08:00
Justin Hernandez
63865d200d Update spec guide to improve quality (#1783)
* update specs

* updates

* feedback

* clean up docs

* fix rule
2026-02-20 11:58:14 -08:00
turnoffthiscomputer
c00241d327 Feat/person1 2 3 implementation (#1770)
* add ios swift handlers

* Add lifecycle completion and optional relay listener

* agent feedback

* save wip

* fix compiling

* finalize feedback

* agent feedback

* fix ci

* udpate specs

* feat: implement React Native adapters for authentication, documents, and networking

- Added new adapters for authentication, document management, and network communication tailored for React Native.
- Introduced `createAuthAdapter`, `createDocumentsAdapter`, and `createNetworkAdapter` to streamline integration with React Native's capabilities.
- Updated `SelfClientProvider` to utilize the new adapter factory for improved modularity and maintainability.
- Enhanced package dependencies to include necessary libraries for secure storage and hashing.

This update enhances the SDK's functionality and prepares it for better cross-platform compatibility.

* refactor: update specs to streamline documentation and remove obsolete entries

- Removed the "Keep / Modify / Delete" section from the specs to simplify the document structure.
- Updated the remaining specifications to reflect the current architecture and integration paths, including the introduction of the new `SPEC-RN-SDK.md` for the `<SelfVerification />` RN WebView wrapper component.
- This change enhances clarity and aligns the documentation with recent architectural decisions.

* prettier

* update gitignore to include swift build paths

* update gems

* address pr feedback and pipeline errors

* agent feedback. also include follow up work items

* add spec guide rules

* add markdown files to prettier formatting and update

* add status line update spec guide

* add new specs

* formatting

* format all markdown files

* more formatting

* consolidate into overview

* update spec and template guidelines

* refactor specs

* save wip

* move status up

* feat: add biometrics and camera bridge adapters

Create biometrics adapter (authenticate, isAvailable, getBiometryType) and camera adapter (scanMRZ, isAvailable) matching the native KMP handler response shapes. Wire both into webview-app SelfClientProvider. Includes 6 new tests (50 total, all passing).

* feat: add web fallback adapters and wire in SelfClientProvider

- Create IndexedDB documents adapter and console/fetch
    analytics adapter in webview-bridge (documents-web.ts,
    analytics-web.ts) per Person 1 spec Section 4
  - Create equivalent browser adapters in mobile-sdk-alpha
    per Person 4 Chunk 4F (documents, crypto, analytics,
    haptic)
  - Wire web fallbacks into SelfClientProvider — documents
    and analytics no longer cross the bridge
  - 32 new tests across both packages, all passing
  - fake-indexeddb added as devDep to both packages

* feat: remove 4 Android web-fallback handlers

  - Delete DocumentsBridgeHandler (146 LOC)
  - Delete CryptoBridgeHandler (177 LOC)
  - Delete AnalyticsBridgeHandler (94 LOC)
  - Delete HapticBridgeHandler (94 LOC)
  - Remove registrations from SelfVerificationActivity
  - Android now registers 5 handlers: NFC, Camera,
    Biometrics, SecureStorage, Lifecycle
  - Documents, crypto, analytics, and haptic are now
    handled by web fallback adapters in the WebView

* style: align DocumentsBridgeHandler param extraction

  Standardize iOS DocumentsBridgeHandler to use
  ?.jsonPrimitive?.content for parameter extraction,
  matching the convention used by all other iOS handlers.

* feat: add MiniPay sample app

  Create Compose Multiplatform sample app showing how
  third-party integrators embed Self identity verification
  via SelfSdk.launch(). Two native screens (Home, Result);
  all verification logic runs in the SDK's WebView.

  Shared Kotlin (commonMain):
  - App.kt: NavHost with home/result navigation
  - MainViewModel.kt: SDK launch + callback routing
  - HomeScreen.kt: status card + "Verify Identity" button
  - ResultScreen.kt: success/failure with error mapping
  - Theme.kt: MiniPay-style Material 3 colors

  Android:
  - MainApplication.kt: SelfSdk.configure() in onCreate
  - MainActivity.kt: passes SDK instance to Compose
  - AndroidManifest.xml: NFC, Camera, Biometric, Internet
    permissions + NFC TECH_DISCOVERED intent filter
  - res/xml/nfc_tech_filter.xml: IsoDep for passport NFC

  iOS Kotlin:
  - MainViewController.kt: ComposeUIViewController entry

  iOS Swift (iosApp/):
  - iOSApp.swift: provider registration with
    SdkProviderRegistry (same pattern as kmp-test-app)
  - ContentView.swift: UIViewControllerRepresentable
  - Xcode project with NFC/Camera entitlements

  Spec deviation — single-module vs two-module:
  The spec directory diagram (lines 88-120) shows a
  separate androidApp/ module, but the spec's own build
  config (lines 384-447) has composeApp using the
  androidApplication plugin — meaning composeApp IS the
  Android app. These contradict: you cannot have two
  androidApplication modules. The existing kmp-test-app
  uses the same single composeApp pattern. We follow the
  build config + test app precedent.

  Build verified on all targets:
  - compileDebugKotlinAndroid: BUILD SUCCESSFUL
  - compileKotlinIosArm64: BUILD SUCCESSFUL
  - compileKotlinIosSimulatorArm64: BUILD SUCCESSFUL

* style: Rename webAnalyticsAdapter to consoleAnalyticsAdapter

  Align web analytics adapter naming with updated spec
  (specs/person1-webview/SPEC.md section 4c).

  - Rename webAnalyticsAdapter → consoleAnalyticsAdapter
  - Rename WebAnalyticsOptions → ConsoleAnalyticsOptions
  - Update barrel export in adapters/index.ts
  - Update import in SelfClientProvider.tsx
  - Update all references in analytics-web.test.ts

  The new name better describes the adapter's purpose: a
  console-logging (+ optional HTTP endpoint) fallback for
  environments without a native bridge.

  Verified: webview-bridge build clean, 63/63 tests pass,
  webview-app type-check clean.

* refactor: Align Person 4 adapters with updated spec

  Rename haptic + fix crypto algo normalization per updated
  specs/person4-sdk-core/SPEC.md (Chunk 4F).

  Haptic:
  - createNoOpHapticFeedback → createNoOpHapticAdapter
  - Updated barrel export, re-export, and test references

  Crypto:
  - Replace static ALGO_MAP lookup with regex normalization:
    algo.toUpperCase().replace(/^SHA(\d)/, 'SHA-$1')
  - Handles all variants: sha256, SHA256, sha-256, SHA-256
  - Add tests for already-hyphenated and uppercase inputs

  Verified: 20/20 browser adapter tests pass, tsc clean.

* fix: resolve 7 Android device testing bugs in SDK + MiniPay

Fix issues found during physical device testing (Pixel 8
Pro) of the MiniPay sample app end-to-end flow.

SDK fixes (kmp-sdk):
- Use activityResultRegistry.register() instead of
  activity.registerForActivityResult() to avoid
  IllegalStateException when registering after onStart
- Replace FragmentActivity with ComponentActivity
  (AndroidX 1.9.x changed the class hierarchy)
- Change SelfVerificationActivity theme to
  Theme.AppCompat.NoActionBar (AppCompatActivity
  requires an AppCompat theme)
- Rewrite AndroidWebViewHost to use WebViewAssetLoader
  with custom PathHandler, serving bundled Vite assets
  under https://appassets.androidplatform.net/ to fix
  CORS, history.replaceState, and asset path resolution
- Add runtime permission requests for Camera + NFC in
  SelfVerificationActivity.onCreate()

MiniPay fixes (kmp-minipay-sample):
- Create expect/actual platformLaunch to thread Android
  Activity to SDK without leaking platform types into
  commonMain
- Set debug = false to load bundled assets instead of
  emulator dev server URL

Tested on Pixel 8 Pro: app launches, verification
WebView opens, camera scans for MRZ. Full passport
scan untested (no document available).

* feat: implement @selfxyz/rn-sdk React Native SDK

  Thin <SelfVerification /> component wrapping react-native-webview
  that embeds Self's identity verification flow. Bridges NFC, camera,
  biometrics, keychain, and lifecycle to native via MessageRouter.

  - MessageRouter: routes WebView bridge messages to domain handlers
  - 5 handlers: lifecycle, biometrics, secureStorage, nfc, camera
  - Platform.select asset loading (Android file://, iOS RNFS bundle)
  - 59 unit tests, build + typecheck clean
  - ReactNativeWebView transport detection added to webview-bridge

* fix: Remove dead code and persist verification state

Claude identified some gaps in the spec. Fixed to match:

  - Delete unused onVerificationSuccess/Failure/Cancelled methods
    from MainViewModel (sdkCallback handles all cases)
  - Add expect/actual AppStorage (SharedPreferences / NSUserDefaults)
    to persist HomeState across app restarts
  - Update homeState eagerly in sdkCallback.onSuccess() so Android
    system back button shows correct state on HomeScreen

* refactor: migrate webview-app from Tamagui to @selfxyz/euclid-web

  Replace Tamagui + react-native-web UI framework with Self's
  official euclid-web component library across all 10 screens.
  Simplify Vite config, remove RN aliases, and fix country flag
  emoji rendering with proper ISO 3166-1 alpha-3 to alpha-2
  conversion.

  - Remove tamagui, @tamagui/config, react-native-web deps
  - Add @selfxyz/euclid-web and @selfxyz/euclid-core
  - Rewrite 6 screens as euclid direct replacements
  - Compose 4 screens from euclid primitives
  - Fix fonts.css for euclid font family names
  - Add shared countryFlags utility (alpha-3 → alpha-2 lookup)
  - Clean up tsconfig.json and stale .tamagui cache

* fix pipeline

* formatting

* fix tests

* fix type error

* address feedback

* fix formatting

* update specs and create handoff doc for new pull request

---------

Co-authored-by: Justin Hernandez <justin.hernandez@self.xyz>
Co-authored-by: Tranquil-Flow <tranquil_flow@protonmail.com>
2026-02-18 21:32:20 -08:00
Justin Hernandez
3a0592c903 chore: address spec inconsistencies (#1774)
* fix spec consistencies

* update inconsistnecies

* fix: address PR review feedback on spec inconsistencies

- Fix proof type in MiniPay sample to use String? (matching canonical
  Kotlin VerificationResult), not a map
- Fix HomeState.verifiedClaims to Map<String, String> matching actual SDK
- Fix returnToHome description to not reference proof?.timestamp
- Clarify crypto domain routing: sign/generateKey/getPublicKey still use
  bridge.request('crypto', ...), native handler uses secure storage
  internally — key never leaves native
- Change crypto domain from "Deprecated" to "Native †" in domain catalog
- Fix Adapter Interface Mapping for CryptoAdapter.sign()

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: resolve remaining spec inconsistencies in SDK-OVERVIEW

- Update North Star constraint to include crypto signing/key-gen as
  native-only (was missing after crypto domain reclassification)
- Fix status checklist: "Delete 3 handlers" not 4 — crypto domain
  still routed natively for signing/key-gen
- Update iOS handler count from 3 to 4 (SecureStorage now required)
- Fix architecture diagram footnote to list SecureStorage as required
  provider, remove "managed directly by host app" language
- Remove "crypto" from Swift Providers module table (no separate
  CryptoProvider exists; crypto ops route through secure storage)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: add crypto signing/key-gen to Design Principles native list

Aligns Design Principle #2 with the updated constraint and crypto
domain note — crypto signing stays native so keys never leave
secure storage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address 3 review findings — claim type, regex, trust boundary

- Fix MiniPay sample comment: claims is Map<String, Any?>? (canonical
  target type), not Map<String, String>?
- Fix CI guard regex: add \b word boundary to "verified" pattern so it
  won't false-positive on isVerified; drop overly broad .timestamp check
- Add trust boundary statement to crypto domain note: native signing
  handler signs whatever the WebView sends, which is safe only because
  the Vite bundle is statically embedded at build time

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 18:45:20 -08:00
Justin Hernandez
f37c3e904c add prompt to enhance product spec (#1772) 2026-02-18 15:07:23 -08:00
Justin Hernandez
d5a03a6f64 refactor specs with new style (#1769)
* add new specs

* formatting

* format all markdown files

* more formatting

* consolidate into overview

* update spec and template guidelines

* refactor specs

* save wip

* move status up

* wip

* update specs with missing items, remove stale items, add wave planning

* finalize specs and formatting

* formatting

* agent feedback, reviews

* formatting and feedback

* finalize feedback

* more feedback

* pr feedback

* formatting
2026-02-17 21:31:01 -08:00
turnoffthiscomputer
21c5e9b394 Add VERIFICATION_COMPLETE event and optional relay listener for WebView mode (#1765)
* Add lifecycle completion and optional relay listener

* fix ci

* udpate specs

* feat: implement React Native adapters for authentication, documents, and networking

- Added new adapters for authentication, document management, and network communication tailored for React Native.
- Introduced `createAuthAdapter`, `createDocumentsAdapter`, and `createNetworkAdapter` to streamline integration with React Native's capabilities.
- Updated `SelfClientProvider` to utilize the new adapter factory for improved modularity and maintainability.
- Enhanced package dependencies to include necessary libraries for secure storage and hashing.

This update enhances the SDK's functionality and prepares it for better cross-platform compatibility.

* refactor: update specs to streamline documentation and remove obsolete entries

- Removed the "Keep / Modify / Delete" section from the specs to simplify the document structure.
- Updated the remaining specifications to reflect the current architecture and integration paths, including the introduction of the new `SPEC-RN-SDK.md` for the `<SelfVerification />` RN WebView wrapper component.
- This change enhances clarity and aligns the documentation with recent architectural decisions.

* prettier

* update gitignore to include swift build paths

* update gems

* address pr feedback and pipeline errors

* agent feedback. also include follow up work items

* fix ws send guard + document unresolved coderabbit review items in specs

- Add readyState guard to WsConn.send() to throw a clear error instead of
  InvalidStateError when socket is not OPEN
- Fix stale abort listener leak: clean up abort handler unconditionally on
  socket close, not only when caller registers onClose
- Add "Chunk 3F implementation notes" to SPEC-PERSON3-SDK-CORE for SHA
  algorithm name mapping and fake-indexeddb test requirement
- Add "Spec Corrections" section to SPEC-RN-SDK documenting 5 issues
  (peerDep, missing router arg, iOS source, randomUUID, RNFS) to address
  during implementation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* formatting

---------

Co-authored-by: Justin Hernandez <justin.hernandez@self.xyz>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 14:48:41 -08:00
turnoffthiscomputer
addfebe817 feat: add SDK Core Adaptation spec for @selfxyz/mobile-sdk-alpha
- Introduced a new specification document for making the mobile-sdk-alpha work in a browser/WebView context.
- Updated SPEC-OVERVIEW.md to include Person 3's role in SDK Core Adaptation.
- The new spec outlines the removal of React Native dependencies from core logic, ensuring compatibility across platforms.
- Key changes include adapting platform detection, debugging configurations, and font handling for a seamless WebView experience.
2026-02-16 18:14:37 +01:00
Justin Hernandez
466fd5d8e7 update kmp specs (#1757)
* save new specs

* rename specs
2026-02-16 00:42:06 -08:00
Justin Hernandez
9ad5388f05 feat: introduce kmp sdk & demo app (#1749)
* add kotlin debug app

* add specs

* first kmp sdk version

* add deploy script

* save working nfc implementation

* save demo app flow wip

* agent feedback

* show viewfinder on mrz

* save working scan

* add kotlin formatting

* remove mrz overlay

* fix expiry date

* add feedback to mrz san

* save improved nfc scanning

* save wip

* save gitignore and md state

* add logging and error handling. get iOS demo app working

* format

* add swift formatting

* enable iOS camera

* save ios mrz implementation

* nfc scanning works

* final optimizations

* add tests

* fixes

* better linting

* agent feedback

* bug fixes

* formatting

* agent feedback

* fix app breaking on run

* consolidate kotlin and swift clean up commands

* fix pipeline by installing swiftlint

* fix blurry scanning

* fix ci

---------

Co-authored-by: turnoffthiscomputer <colin.remi07@gmail.com>
2026-02-15 12:03:12 -08:00