Skip to content

improve: native iOS look with stock SwiftUI navigation, forms, chat, and talk visualizer#99231

Merged
steipete merged 8 commits into
openclaw:mainfrom
marvkr:ios-native-polish
Jul 4, 2026
Merged

improve: native iOS look with stock SwiftUI navigation, forms, chat, and talk visualizer#99231
steipete merged 8 commits into
openclaw:mainfrom
marvkr:ios-native-polish

Conversation

@marvkr

@marvkr marvkr commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Closes #99195

🤖 AI-assisted: contributor baseline built with Claude Code; maintainer repair, review, simulator proof, and landing performed with Codex.

What Problem This Solves

The iOS app mixed custom cards, hand-rolled headers, capsule controls, and bespoke settings rows with native SwiftUI navigation. The result looked inconsistent across tabs and created parallel presentation paths that were harder to keep correct on both iPhone and iPad.

Why This Change Was Made

Uses stock SwiftUI navigation bars, List, Form, Section, LabeledContent, Toggle, Picker, ContentUnavailableView, bordered controls, native Chat chrome, and a state-driven Talk waveform. The maintainer pass also:

  • keeps one Chat header on iPhone and iPad;
  • preserves OpenClaw typography and root-owned light/dark/system appearance;
  • restores the onboarding capability and trust disclosure;
  • centers the onboarding content on iPad without changing the phone layout;
  • preserves opaque gateway credential input behavior;
  • bundles the MIT notice for the adapted waveform;
  • removes obsolete Talk and Chat presentation paths; and
  • rebases over the landed Location Always, permission-prompt, and control-row improvements.

The 27-file repaired diff removes more code than it adds: 1,857 additions and 2,116 deletions, including tests and generated native-i18n inventory.

User Impact

Navigation, settings, Chat, Talk, and onboarding now use coherent native iOS structure on both phone and tablet. Settings pushes and back navigation behave normally, appearance changes apply app-wide without blanking the iPad detail pane, sensitive capability disclosure remains visible during onboarding, and Talk state remains owned by the existing state model.

Evidence

  • Focused native suite: 114/114 passed (typography, render smoke, RootTabs source/presentation, Talk state, licenses).
  • iPhone simulator UI suite: 7/7 passed.
  • iPad simulator UI suite: 3/3 passed.
  • Final onboarding-width checks: 1/1 on iPhone and 1/1 on iPad; final typography check: 9/9.
  • Simulator screenshots inspected for all five tabs on both idioms, onboarding, native Talk controls, Chat/Control return navigation, Settings back navigation, and light/dark/system appearance. Whole-screen pixel assertions guard against blank rendering.
  • pnpm native:i18n:check: 2,461 entries, unchanged. pnpm apple:i18n:check: 2 catalogs, 46 keys.
  • SwiftFormat and git diff --check pass.
  • Fresh autoreview found one gateway credential input-trait regression; it was repaired centrally. Two follow-up reviews reported no accepted/actionable findings.
  • Exact-head GitHub CI is green, including iOS build, native i18n, macOS Swift, iOS Periphery dead-code scan, QA smoke, and all shared test shards.

The Talk simulator proof validates the rendered state projection and controls; it does not claim a physical microphone/audio round-trip.

Before / after (iPhone 17 sim, iOS 26.2)

Screen Before After
Welcome
Chat
Talk
Control
Agents
Settings

@clawsweeper

clawsweeper Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed July 3, 2026, 9:10 PM ET / 01:10 UTC.

Summary
This PR replaces much of the iOS app’s custom Pro chrome with native SwiftUI navigation, lists/forms, chat chrome, a Talk waveform, appearance handling, license attribution, tests, and native i18n updates.

PR surface: Other -259. Total -259 across 27 files.

Reproducibility: not applicable. This PR implements a visual/product-direction feature rather than fixing a reproducible existing bug. The behavior is demonstrated by simulator screenshots, a Talk waveform recording, source inspection, and live PR checks.

Review metrics: none identified.

Root-cause cluster
Relationship: fixed_by_candidate
Canonical: #99195
Summary: This PR is the candidate implementation for the open native iOS reskin feature issue; nearby merged iOS navigation and permission PRs are prerequisites or partial overlaps, not replacements.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster ✨ media proof bonus
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • none.

Risk before merge

  • [P1] The branch changes the first-impression native iOS UI across Chat, Talk, Settings, onboarding, and shared chat surfaces; automated proof reduces correctness risk but does not replace iOS/UI owner acceptance for the product direction.

Maintainer options:

  1. Require iOS/UI owner acceptance (recommended)
    Get explicit owner acceptance for the app-wide native visual direction before merging the current head.
  2. Accept the visual direction as maintainer-owned
    Maintainers may intentionally own the app-wide visual shift if they decide the screenshots, GIF, tests, and current code review are enough.
  3. Pause the branch if the direction is not settled
    Leave or close the PR without merge if the native reskin should be narrowed or reworked before becoming the iOS baseline.

Next step before merge

  • [P2] Manual iOS/UI owner review is the remaining action; the current head fixed the prior Periphery blocker and no narrow automated repair is identified.

Security
Cleared: No concrete security or supply-chain concern found; the diff adds SwiftUI UI code, shared chat UI adjustments, tests, and a bundled MIT notice, with dependency and security-sensitive guards passing.

Review details

Best possible solution:

Have the iOS/UI owners decide whether to land this current head as the implementation for #99195 after the remaining required CI finishes cleanly.

Do we have a high-confidence way to reproduce the issue?

Not applicable: this PR implements a visual/product-direction feature rather than fixing a reproducible existing bug. The behavior is demonstrated by simulator screenshots, a Talk waveform recording, source inspection, and live PR checks.

Is this the best way to solve the issue?

Unclear until owner acceptance: the implementation is coherent and the previous mechanical blocker is fixed, but the broad iOS native-reskin direction still needs product/design approval before merge.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 87d88878787b.

Label changes

Label changes:

  • add merge-risk: 🚨 other: Merging changes the app-wide iOS visual direction, a product/design risk that tests and CI cannot settle by themselves.
  • add rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (recording): The PR body includes after-change simulator screenshots and a Talk waveform GIF; I inspected the Chat and Settings screenshots plus the waveform GIF and they directly show the changed native iOS behavior.
  • remove rating: 🦐 gold shrimp: Current PR rating is rating: 🐚 platinum hermit, so this older rating label is no longer current.
  • remove status: ⏳ waiting on author: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P2: This is a normal-priority, broad iOS app improvement with meaningful user-facing polish but limited blast radius outside the native app UI.
  • merge-risk: 🚨 other: Merging changes the app-wide iOS visual direction, a product/design risk that tests and CI cannot settle by themselves.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (recording): The PR body includes after-change simulator screenshots and a Talk waveform GIF; I inspected the Chat and Settings screenshots plus the waveform GIF and they directly show the changed native iOS behavior.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-change simulator screenshots and a Talk waveform GIF; I inspected the Chat and Settings screenshots plus the waveform GIF and they directly show the changed native iOS behavior.
  • proof: 🎥 video: Contributor real behavior proof includes video or recording evidence. The PR body includes after-change simulator screenshots and a Talk waveform GIF; I inspected the Chat and Settings screenshots plus the waveform GIF and they directly show the changed native iOS behavior.
Evidence reviewed

PR surface:

Other -259. Total -259 across 27 files.

View PR surface stats
Area Files Added Removed Net
Source 0 0 0 0
Tests 0 0 0 0
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 27 1857 2116 -259
Total 27 1857 2116 -259

What I checked:

  • Repository policy read: Read the full root AGENTS.md and the scoped iOS AGENTS.md; the review applied the iOS typography, license, visual proof, and owner-review guidance for broad app UI work. (AGENTS.md:1, 87d88878787b)
  • iOS scoped policy read: The iOS guide requires branded text handling and license-screen care when touching SwiftUI text and bundled acknowledgements, which guided the Settings, Chat, Talk, and waveform-license review. (apps/ios/AGENTS.md:1, 87d88878787b)
  • Current main still has the old custom Chat surface: Current main still renders Chat through OpenClawProBackground, custom header content, and hidden navigation, so the branch is not obsolete or implemented on main. (apps/ios/Sources/Design/ChatProTab.swift:64, 87d88878787b)
  • PR head moves Chat to native navigation chrome: At current PR head, ChatProTab renders a system-background chat surface with navigationTitle, inline title mode, toolbar items, and the gateway status toolbar button rather than the old custom header stack. (apps/ios/Sources/Design/ChatProTab.swift:62, f084b131f706)
  • PR head keeps native Settings structure and preserves sensitive credential fields: SettingsProTabSections uses native sections, LabeledContent, toggles, and a custom gatewaySecureField that keeps opaque credential entry with accessibility labels and no autocorrection/autocapitalization. (apps/ios/Sources/Design/SettingsProTabSections.swift:831, f084b131f706)
  • PR head adds state-driven Talk waveform: TalkSiriWaveView maps Talk runtime modes to still, indeterminate, level, input-speech, and speaking waveform power while respecting Reduce Motion. (apps/ios/Sources/Design/TalkSiriWave.swift:30, f084b131f706)

Likely related people:

  • steipete: Authored the maintainer repair commits on this branch and recent merged iOS visual, Chat, Talk, Liquid Glass, and navigation work that this PR builds on. (role: recent iOS visual and navigation contributor; confidence: high; commits: 36690214c06b, e10d3a2724f3, 5c2917002793; files: apps/ios/Sources/Design/ChatProTab.swift, apps/ios/Sources/Design/TalkProTab.swift, apps/ios/Sources/RootTabs.swift)
  • joshavant: Recent GitHub history for the sampled iOS Settings, Chat, and shared chat files shows branded typography and license-related work overlapping this PR’s scoped iOS policy surface. (role: recent iOS typography and Settings contributor; confidence: medium; commits: d3848d39f28e, 25c8fbb5e7fc, b5f754b63d1e; files: apps/ios/Sources/Design/SettingsProTabSections.swift, apps/ios/Sources/Design/ChatProTab.swift, apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatComposer.swift)
  • mbelinky: CONTRIBUTING.md lists this handle for the iOS app area, which matches the broad iOS app visual-direction decision still needed here. (role: listed iOS app area owner; confidence: medium; files: CONTRIBUTING.md, apps/ios/Sources/Design/SettingsProTabSections.swift)
  • ngutman: CONTRIBUTING.md lists this handle for iOS and macOS app ownership, relevant to native companion-app UX and navigation changes. (role: listed iOS and macOS app area owner; confidence: medium; files: CONTRIBUTING.md, apps/ios/Sources/RootTabs.swift)
  • BunsDev: CONTRIBUTING.md lists this handle for UI/UX, matching the remaining visual-direction acceptance question for the app-wide native reskin. (role: listed UI/UX area owner; confidence: medium; files: CONTRIBUTING.md, apps/ios/DESIGN.md)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels Jul 2, 2026
@marvkr
marvkr force-pushed the ios-native-polish branch from 1eaf180 to c617e2a Compare July 2, 2026 21:17
@clawsweeper clawsweeper Bot added status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains. and removed status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jul 2, 2026
@marvkr
marvkr force-pushed the ios-native-polish branch 2 times, most recently from 11a5bb6 to ac7a523 Compare July 2, 2026 21:25
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed status: 🛠️ actively grinding The PR author has acted after the latest ClawSweeper review and work remains. labels Jul 2, 2026
@marvkr
marvkr force-pushed the ios-native-polish branch from ac7a523 to 6b11de8 Compare July 2, 2026 21:36
@marvkr

marvkr commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

Addressed all review findings on the latest push (6b11de8):

  • Restored the Approvals → Notifications path push (Back contract from fix(ios): back from settings details returns to the originating screen #98898) with the guard comment.
  • Restored the onboarding reset observer (.onChange(of: onboardingRequestID)) so root-owned resets resync mounted Settings state; removed the redundant alert-site call.
  • Restored all 10 source-guarded accessibility identifiers on their native equivalents (chat composer/input/send/realtime/attachment/status, talk toggles + voice settings row, settings appearance menu).
  • Native i18n inventory synced; Periphery scan is clean locally ("No unused code detected").
  • Evidence: before/after table now includes an animated Talk waveform demo (state-cycle build) plus per-screen screenshots, in the PR description.

@clawsweeper

clawsweeper Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@marvkr
marvkr force-pushed the ios-native-polish branch from 6b11de8 to 4e8d2b8 Compare July 2, 2026 21:41
@clawsweeper clawsweeper Bot added proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. labels Jul 2, 2026
@marvkr
marvkr force-pushed the ios-native-polish branch from 4e8d2b8 to 13fa00d Compare July 2, 2026 21:50
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. merge-risk: 🚨 auth-provider 🚨 May break OAuth, tokens, provider routing, model choice, or credentials. labels Jul 2, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. feature: ✨ showcase ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jul 3, 2026
@steipete steipete self-assigned this Jul 3, 2026
@steipete
steipete requested a review from a team as a code owner July 4, 2026 00:49
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: discord Channel integration: discord channel: imessage Channel integration: imessage labels Jul 4, 2026
@github-actions

github-actions Bot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Dependency graph guard cleared

This PR no longer has blocked dependency graph changes. A future dependency graph change requires a fresh /allow-dependencies-change comment after the guard blocks that new head SHA.

  • Current SHA: f084b131f706296e36b239c9a29beb18aca2bd27

@steipete

steipete commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Maintainer repair and land-ready proof for exact head f084b131f706296e36b239c9a29beb18aca2bd27:

  • Rebased the contributor baseline over the landed Location Always, node-permission, and Control-row improvements; visible PR diff is 27 files, +1,857/−2,116.
  • Repaired duplicate iPad Chat navigation, restored onboarding capability/trust disclosure, bundled the waveform MIT notice, preserved branded typography and gateway credential input traits, made appearance app-wide without blanking the iPad split destination, centered iPad onboarding, and deleted obsolete Talk/Chat/design paths.
  • CI caught six remaining Periphery findings. Five dead design/typography symbols were removed; the existing gateway accessibility label is now attached to both actionable and read-only status pills.

Local proof:

  • Focused native suites: 114/114 passed before cleanup, after cleanup, and after the current-main rebase. Final bundle: /tmp/openclaw-ios-99231-post-rebase-focused.xcresult.
  • iPhone simulator UI: 7/7 passed; iPad simulator UI: 3/3 passed.
  • Final onboarding layout checks: iPhone 1/1, iPad 1/1; typography 9/9.
  • Visually inspected light/dark/system appearance, all five tabs on phone and tablet, Chat/Control return navigation, Settings back navigation, Talk controls, onboarding, and whole-screen nonblank assertions from xcresult attachments.
  • pnpm native:i18n:check: 2,461 entries, unchanged.
  • pnpm apple:i18n:check: 2 catalogs, 46 keys.
  • SwiftFormat and git diff --check: pass.
  • Fresh cleanup autoreview: no findings, overall correctness 0.98.

Exact-head hosted proof:

The public PR body retains the contributor's six-screen before/after table. Maintainer simulator screenshots were inspected locally; no new screenshot files were committed or uploaded. Talk proof covers state projection and controls, not a physical microphone/audio round-trip.

Ready to merge.

@steipete

steipete commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Merged via squash.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

app: ios App: ios merge-risk: 🚨 other 🚨 Merging this PR has meaningful risk outside the owned taxonomy. P2 Normal backlog priority with limited blast radius. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: 🎥 video Contributor real behavior proof includes video or recording evidence. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: XL status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: native iOS reskin — replace custom "Pro" chrome with stock SwiftUI (HIG)

2 participants