Skip to content

Add native L@tr.link apps and system share targets - #75

Draft
CountableNewt wants to merge 20 commits into
devfrom
sam/ltr-18-bring-chrome-and-firefox-extension-quick-save-up-to-date
Draft

CountableNewt wants to merge 20 commits into
devfrom
sam/ltr-18-bring-chrome-and-firefox-extension-quick-save-up-to-date

Conversation

@CountableNewt

@CountableNewt CountableNewt commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator

Adds native SwiftUI iPhone/iPad and Kotlin Compose Android apps so links shared from other apps can be reviewed with tags, retained offline, and saved through the existing credential-injecting web proxy. The apps include library/archive browsing, bookmark and tag management, pending saves, appearance settings, complete JSON export, migration, and native public-feedback forms.

Apple uses a Share Extension, App Group SQLite, atomic shared Keychain sessions, and process locks. Android uses a share Activity, Room, DataStore, and Keystore-protected sessions. Both implement native ATProto OAuth with PAR/PKCE/ES256 DPoP, strict callback/account validation, environment-specific metadata, and fresh proof pools on nonce retries. Their login fields now query the public WAOW Tech actor typeahead after a cancellable 200 ms debounce, using the same normalization and six-result contract as web; native avatar/name/handle rows fill the selected handle without starting OAuth. Gateway application credentials remain server-side. The deployed PATCH state adapter is explicit pending LTR-19.

Both apps use the shared L@tr.link vector mark. Apple compiles a native Icon Composer document for default/dark/clear/tinted appearances and generates iOS18 fallback icons; CI checks the compiled layers and iPhone/iPad renditions. Android supplies adaptive foreground/background and API33+ monochrome layers for themed icons; an installed-resource instrumentation test verifies rendering and safe-area bounds. Apple swipe actions use SF Symbols with indigo Archive/Restore, orange Tags, and red destructive Delete treatments; Android uses the equivalent Material icons and error color.

Local validation:

  • Apple: 33 core tests with warnings-as-errors; 8 iPhone UI tests now include typeahead selection/cancellation and rendered SF Symbol swipe actions; the original 4-test iPhone/iPad matrix, Debug, and Release simulator builds were already green. Real Safari share tests retain unassigned drafts in shared SQLite; a core test verifies locking against another process.
  • Android: 19 unit tests, 23 API 35 emulator tests, lint, Development debug APK, and unsigned Production release APK. Includes mocked Compose UI, OAuth/rotation/nonce, queue/account, migration, and feedback tests.
  • Existing Bun workspace typecheck/lint/tests/build and gateway 104 XCTest plus 32 Swift Testing tests/release build pass. Final web suite: 162 tests. Nine shared-contract tests pass; all four OAuth metadata files return local HTTP 200 JSON without redirects.
  • Icon validation: Apple Release build and all six native renderer appearances; the outlined L now keeps an explicit white vector fill in default, dark, and tinted appearances, preserving its counters and contrast at launcher size. The generated asset has a distinct l-mark-outlined.svg name, and validation rejects the raw-stroke geometry that Icon Composer can close into a disk. Android adaptive and themed light/dark previews, installed icon assertions, and both APK variants. Safari compact-toolbar and Android replacement-intent test timing fixes pass locally on both Apple device families and the Android emulator.
  • Native CI jobs join the required aggregate check and retain test artifacts. LTR-27 fixes an existing leaked browser global that the first Linux CI run exposed.

This remains a draft for authenticated acceptance. The Development Web service is live from commit 04d3b5a in Railway deployment 1e0f983c-bfa0-45b7-8410-28e5aeacf202; the iOS metadata, logo, and gateway proxy return HTTP 200 from testing.latr.link, and CI run 34800231756 is fully green. Live authentication, reauthentication, app/extension contention with an authenticated account, and cross-client saves remain to be exercised on a real account/device. No Production deployment, TestFlight, store release, or public feedback test submission is included. LTR-26 tracks an existing upstream Unicode tag equality mismatch; native clients preserve authored UTF-8 tags.

Tracking: LTR-23, LTR-24 (Android), LTR-25 (Apple), LTR-27 (test isolation). Setup, behavior, and acceptance checklist: docs/apps/native.md.

Keep mobile scopes and upstream proof plans aligned with the pinned bookmark API without distributing gateway credentials. Tracks LTR-23.
Add platform build and device-test entry points with OAuth setup and release verification documentation for LTR-23.
…e-and-firefox-extension-quick-save-up-to-date
Establish Compose, Room, Keystore-backed OAuth and gateway transport with durable account-bound saves, library management, export, and public feedback UI. Add contract and device tests for subsequent acceptance.
Use SwiftUI with a shared LatrKit core, atomic Keychain sessions, coordinated SQLite pending saves, and native account, library, tags, settings, and feedback flows. Add simulator and core regression coverage.
@linear-code

linear-code Bot commented Sep 14, 2026

Copy link
Copy Markdown

LTR-18

LTR-25

LTR-24

LTR-23

Fix LTR-27: Linux test ordering exposed a leaked window mock that caused Next server-component imports to require a nonexistent document.
Verify issuer discovery after OAuth return, keep review-account binding and byte-exact tags, expose global-tag progress, and cover gateway nonce regeneration, feedback serialization, and interprocess queue coordination. Preserve native CI test reports.
…e checks

Keep feedback and queued operations bound to the reviewed account, persist rotated tokens before exposing them, retry fresh nonce proof pools, and recover migration/share state. Add tablet navigation, explicit archive sorting, native reading fallback, and mocked UI and transport regressions.
Use the shared L@tr.link vector with native adaptive masks and monochrome wallpaper tinting. Verify installed icon layers and wait for actual replacement intent delivery in share tests.
Compile the Icon Composer mark for default, dark, clear and tinted modes, with generated iOS18 iPhone and iPad fallbacks verified in CI. Correct Safari compact-toolbar selection in the share acceptance test.
Prevent the iPad acceptance test from tapping Safari Share while navigation still disables it, and assert the activity sheet before scrolling its actions.
Keeps the outlined L mark white across default, dark, and tinted Icon Composer appearances so the system cannot collapse it into the background.
Renames the generated foreground asset so stale raw-stroke caches cannot recreate the blue disk, and verifies the SVG is a closed white fill path.
Keeps the real Safari share acceptance test reliable when a clean simulator displays the toolbar onboarding overlay.
Matches the existing WAOW actor lookup while keeping public discovery separate from OAuth. Color-coded Material actions make archive, tag, and destructive delete behavior clear.
Uses the public WAOW actor lookup with cancellable SwiftUI search. Explicit SF Symbols and system tints distinguish archive, tag, and destructive delete actions.
Keeps the native share-extension acceptance test reliable when Safari minimizes both Share and More after navigation.
Avoids XCTest's invalid accessibility hit point while retaining the full production share-extension acceptance path.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant