This document tracks the implementation status of every user-facing feature across the iOS and Android clients. Update it whenever a platform-specific change is made (see Contributing).
Last audited: 2026-07-27
| Symbol | Meaning |
|---|---|
| ✅ | Implemented and tested |
| Partial — works but known gaps / untested edge cases | |
| ❌ | Not implemented |
| 🚧 | In progress |
| Feature | iOS | Android | Notes |
|---|---|---|---|
| Authentication | |||
| Passkey sign-in (WebAuthn) | ✅ | ✅ | iOS: ASAuthorizationPlatformPublicKeyCredentialProvider; Android: CredentialManager |
| Passkey registration | ✅ | ✅ | |
| Sign out | ✅ | ✅ | |
| Vault management | |||
| List vaults | ✅ | ✅ | |
| Create vault | ✅ | ✅ | |
| Vault detail view | ✅ | ✅ | |
| Check-in | ✅ | ✅ | |
| Biometric confirmation for check-in | ✅ | ✅ | iOS: LocalAuthentication; Android: BiometricPrompt |
| Funds | |||
| Deposit | ✅ | ❌ | Android has no DepositScreen (#87) |
| Withdraw | ✅ | ❌ | Android has no WithdrawScreen (#87) |
| Balance display (formatted XLM) | ✅ | ✅ | |
| Beneficiary management | |||
| View beneficiary | ✅ | ✅ | |
| Update beneficiary | ✅ | ❌ | Android has no ManageBeneficiaryScreen (#87) |
| Beneficiary acceptance deep link | ✅ | Android parses the deep link but does not call acceptBeneficiary() (#87/#109) | |
| Beneficiary acceptance token forwarded | ✅ | ❌ | Android AcceptanceViewModel ignores the token param (#109) |
| Stellar address validation | |||
| StrKey / CRC16-XModem checksum | ✅ | 🚧 | Android StellarAddress utility added in #113 |
| Validated in create-vault flow | ✅ | 🚧 | Android CreateVaultDialog wired in #113 |
| Two-factor authentication | |||
| Enable 2FA (TOTP / SMS / Email) | ✅ | ✅ | |
| Disable 2FA | ✅ | ✅ | |
| Verify 2FA | ✅ | ✅ | |
| Correct copy: TOTP initial setup | ✅ | ✅ | Shows provisioning URI + secret |
| Correct copy: TOTP re-verify (no provisioning data) | ✅ | 🚧 | Fixed in #115; Android was showing "Scan URI" with no URI |
| Correct copy: SMS — "code sent to phone" | ✅ | ✅ | |
| Correct copy: Email — "code sent to email" | ✅ | ✅ | |
| Push notifications | |||
| APNs / FCM device token registration | ✅ | ✅ | |
| TTL expiry warning notification | ✅ | ✅ | |
| Check-in reminder (scaled lead time) | ✅ | ❌ | Android NotificationHelper sends a generic reminder, no lead-time scaling (#TBD) |
| Actionable "Check In" notification action | ✅ | ❌ | Android does not set up a CHECK_IN notification action (#TBD) |
| Offline support | |||
| Network connectivity monitor | ✅ | ✅ | |
| Offline read cache (SHA-256 keyed) | ✅ | ✅ | |
| Offline check-in queue + WorkManager retry | ❌ | ✅ | iOS has no persistent offline queue; mutations fail with an error banner |
| Offline queue badge / notification | ❌ | ✅ | |
| Widget | |||
| Home-screen vault TTL widget | ✅ | ✅ | iOS: WidgetKit TTLWidget; Android: VaultStatusWidget (Glance) |
| TTL-aware refresh policy | ✅ | ❌ | Android widget polls at a fixed interval; no urgency scaling (#TBD) |
| Widget urgency selection (which vault to surface) | ❌ | ❌ | Both platforms always show the first vault (#TBD) |
| WebSocket / real-time | |||
| Live vault updates via WebSocket | ❌ | ❌ | Neither client implements WebSocket yet (#TBD) |
| Background refresh | |||
| Background app refresh (TTL polling) | ✅ | ✅ | iOS: BGAppRefreshTask; Android: WorkManager |
| Universal / deep links | |||
| Vault invitation link | ✅ | ✅ | |
| Beneficiary acceptance link | ✅ | See beneficiary token gap above | |
| Vault action links (check-in, withdraw, …) | ✅ | ✅ | |
| Deep-link input validation (path traversal, length) | ✅ | ✅ | |
| iCloud / cross-device sync | |||
| iCloud KV vault ↔ credential sync | ✅ | ❌ | Android has no equivalent cloud sync |
These are the divergences identified during the audit that led to issue #116. Each gap has a tracking issue; fix it on the lagging platform and update this table.
| Gap | Platform missing feature | Tracking |
|---|---|---|
| Deposit / Withdraw screens | Android | #87 |
| Manage Beneficiary screen | Android | #87 |
| Beneficiary acceptance token forwarded in deep link | Android | #87 / #109 |
| TOTP re-verify copy ("Scan URI" shown without URI) | Android | #115 |
| Stellar address validation (StrKey + checksum) | Android | #113 / #71 |
| Check-in reminder lead-time scaling | Android | TBD |
| Actionable push notification action (CHECK_IN) | Android | TBD |
| Offline check-in queue | iOS | TBD |
| TTL-aware widget refresh policy | Android | TBD |
| Widget urgency / vault selection | Both | TBD |
| WebSocket real-time vault updates | Both | TBD |
| iCloud / cross-device sync | Android | TBD |
When you open a PR that adds, changes, or removes a user-facing feature on either platform, update the table above before requesting review:
- Find the affected row(s).
- Change the status symbol for the platform you modified.
- Add a "Notes" entry if the change is partial or has known caveats.
- If you close a gap listed in the "Known gaps" section, remove or update that row.
The PR template will prompt you to do this automatically.