Implement the Preferences tab for the iPhone- and Watch-specific choices in this milestone.
Scope
Use Gotcha-style inset-grouped native settings sections in the fourth tab.
Present non-secret repository/server identity, application-token replacement/removal, default GPG key identity, authentication inactivity timeout, biometric unlock toggle/status, appearance where supported, manual Lock, and Apple Watch pairing/sync status.
Read and persist ordinary settings through the shared config.toml contract owned by crates/storage; store tokens and key passphrases only through secure-secret APIs.
Enabling biometric unlock must perform capability checks and credential enrollment before the switch becomes active; disabling it removes the protected credential.
Provide entry points to QR key transfer and initial/recovery setup without displaying secret material in settings rows.
Validate changes in Rust and report errors without partially applying dependent settings.
Acceptance criteria
Settings remain consistent with CLI/TUI/shared configuration where the values overlap.
Secret values are never shown or persisted as ordinary settings.
Biometric, token, timeout, lock, key-transfer, and Watch status controls accurately reflect storage/platform state.
Settings are fully navigable with Dynamic Type and VoiceOver.
## Goal
Implement the Preferences tab for the iPhone- and Watch-specific choices in this milestone.
## Scope
- Use Gotcha-style inset-grouped native settings sections in the fourth tab.
- Present non-secret repository/server identity, application-token replacement/removal, default GPG key identity, authentication inactivity timeout, biometric unlock toggle/status, appearance where supported, manual Lock, and Apple Watch pairing/sync status.
- Read and persist ordinary settings through the shared `config.toml` contract owned by `crates/storage`; store tokens and key passphrases only through secure-secret APIs.
- Enabling biometric unlock must perform capability checks and credential enrollment before the switch becomes active; disabling it removes the protected credential.
- Provide entry points to QR key transfer and initial/recovery setup without displaying secret material in settings rows.
- Validate changes in Rust and report errors without partially applying dependent settings.
## Acceptance criteria
- Settings remain consistent with CLI/TUI/shared configuration where the values overlap.
- Secret values are never shown or persisted as ordinary settings.
- Biometric, token, timeout, lock, key-transfer, and Watch status controls accurately reflect storage/platform state.
- Settings are fully navigable with Dynamic Type and VoiceOver.
hugo
added this to the 04 - iPhone and Apple Watch apps milestone 2026-08-09 20:00:45 +00:00
Added Rust-owned mobile preferences/config for repository and server identity, protected token status/removal, default GPG identity, inactivity timeout, appearance, authentication/lock, and typed Watch pairing/install/sync state.
Rebuilt the native inset-grouped accessible iPhone preferences and embedded an installable Watch companion.
Made iPhone and Watch derive their icons from the same canonical AppIcon.png asset.
Verified in isolation: cargo fmt/check/clippy/test; xcodegen; iPhone and Watch simulator builds; Xcode Analyze; biometric Lock -> Unlock -> Matching Face; Watch Not Paired -> App Not Installed -> Ready lifecycle; shared Watch AppIcon in the compiled asset catalog; signed Release deployed to the paired iPhone.
Implemented in affdb55.
- Added Rust-owned mobile preferences/config for repository and server identity, protected token status/removal, default GPG identity, inactivity timeout, appearance, authentication/lock, and typed Watch pairing/install/sync state.
- Rebuilt the native inset-grouped accessible iPhone preferences and embedded an installable Watch companion.
- Made iPhone and Watch derive their icons from the same canonical AppIcon.png asset.
Verified in isolation: cargo fmt/check/clippy/test; xcodegen; iPhone and Watch simulator builds; Xcode Analyze; biometric Lock -> Unlock -> Matching Face; Watch Not Paired -> App Not Installed -> Ready lifecycle; shared Watch AppIcon in the compiled asset catalog; signed Release deployed to the paired iPhone.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Goal
Implement the Preferences tab for the iPhone- and Watch-specific choices in this milestone.
Scope
config.tomlcontract owned bycrates/storage; store tokens and key passphrases only through secure-secret APIs.Acceptance criteria
Implemented in
affdb55.Verified in isolation: cargo fmt/check/clippy/test; xcodegen; iPhone and Watch simulator builds; Xcode Analyze; biometric Lock -> Unlock -> Matching Face; Watch Not Paired -> App Not Installed -> Ready lifecycle; shared Watch AppIcon in the compiled asset catalog; signed Release deployed to the paired iPhone.