feat(mobile): themes with appearance override and custom import - #6617

Closed
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405
Closed

feat(mobile): themes with appearance override and custom import#6617
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405

Conversation

@amanthanvi

@amanthanviamanthanvi commented Aug 14, 2026

Copy link
Copy Markdown

Current main already includes the six built-in themes from #6619. This refreshed branch extends that architecture with mobile ThemeFile v1 import/removal, shared web/mobile parsing and canonicalization, independent cross-client synchronization for appearance mode plus light and dark theme selections, native-surface theming, and the CSS alpha-decoder fixes. Custom theme libraries remain device-local by design; synced selections fall back safely when a referenced custom theme is unavailable on another device.

The refresh preserves main's shared palettes, per-appearance theme-pair model, ThemeAppearanceSection, and atomic layout-effect application instead of carrying the original duplicate palette, parser, and single-theme state model.

Depends on #6614 for the synced-preferences transport and durability foundation; this branch contains its refreshed commits.

Closes#6405

Import and native-surface examples: themed native terminal · paste-import sheet · imported theme applied.

Implemented by GPT-5.6 Sol (xhigh) via the Codex CLI, orchestrated and reviewed by Claude Fable 5 (Claude Code), with Claude Opus 5 run monitoring.


Note

Medium Risk
Synced preference reconciliation and composer gating affect send/start timing and cross-device plan mode; incorrect merge logic could flash wrong modes or block submission until hydration.

Overview
Extends mobile theming with ThemeFile v1 import (paste JSON, device-local library, remove with selection fallback) and wires imported palettes through appearance, terminal, review diff, and source views. Theme IDs are no longer limited to built-ins; resolution checks per-appearance availability for imported variants.

Synced client preferences on mobile now reconcile plan mode, appearance mode, and light/dark theme selections against connected environments using per-field LWW stamps, optimistic updates, and persistReconciledPreferences so stale server patches do not overwrite newer local writes. Settings appearance changes publish through synced preference hooks instead of only local themeMode / theme pair patches.

Legacy Plan Mode moves from a purely local toggle to the synced planModeEnabled flag. Composers gain shared slash-command handling (/plan, /default when enabled), submit-time mode switching, and send/start gating until reconciliation completes (useLegacyPlanModeState). New-task and thread composers use extracted helpers for eligibility and trigger replacement.

Native CSS hex parsing (#RRGGBB / #RRGGBBAA) is added for terminal and review-diff on Android/iOS. iOS splash uses a scheme-neutral background plus a config plugin that inlines Expo’s generated storyboard color. Markdown CSS adds dedicated inline-code text tokens for light/dark.

Reviewed by Cursor Bugbot for commit 83c4f0e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add syncedClientPreferencesPatch RPC and mobile custom theme imports

  • Adds synced client preferences (plan mode, appearance mode, theme IDs) using the new WebSocket RPC, server decider, projector, and migration 041
  • Adds mobile custom theme importing from JSON and applies imported themes to terminal, review diff, and settings surfaces
  • Moves mobile and web plan mode toggles to the synced preferences system and defers composer actions until the preference loads
  • Behavioral Change: RpcAuthorization requires AuthOrchestrationOperateScope for syncedClientPreferencesPatch; invalid backgroundColorHex assignments on iOS T3TerminalView are rejected and reverted instead of defaulting to 0
  • Risk: New database migration 041_ProjectionSyncedClientPreferences creates projection_synced_client_preferences and seeds its projection state

Macroscope summarized 9c3877a.

CopilotAI lite review requested due to automatic review settings August 14, 2026 15:00
@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 14, 2026
@coderabbitai

coderabbitaiBot commented Aug 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a8d51415-caaa-47a7-9fcc-763320f3c4ad

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:XXL 1,000+ changed lines (additions + deletions). label Aug 14, 2026
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/mobile/src/state/use-thread-outbox-drain.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a mobile theming system with an Appearance override (System/Light/Dark), built-in theme picker, and device-local custom theme import, while introducing a synced-client-preferences contract + server plumbing so appearance mode + selected theme id (and legacy plan mode) can converge across web/desktop/mobile per environment.

Changes:

  • Introduces SyncedClientPreferences (schema + RPCs) and threads it through orchestration read models, shell stream, receipts, event store, projector, and a new SQLite projection/migration.
  • Implements mobile Appearance “Color scheme” UI with built-in themes, ThemeFile v1 JSON paste-import, device-local theme library persistence, and theming applied across markdown/review/source/terminal surfaces.
  • Fixes native CSS hex alpha decoding (iOS/Android) and switches to a scheme-neutral splash configuration.

Reviewed changes

Copilot reviewed 86 out of 86 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
packages/contracts/src/syncedClientPreferences.tsNew schemas for synced client preferences + patch requests
packages/contracts/src/settings.test.tsContract tests for synced preferences decoding/patch rules
packages/contracts/src/rpc.tsAdds syncedClientPreferences get/patch WS RPCs
packages/contracts/src/orchestration.tsExtends orchestration models/events/commands for preferences
packages/contracts/src/orchestration.test.tsEnsures legacy shell decoding + patch validation
packages/contracts/src/index.tsRe-exports syncedClientPreferences
packages/client-runtime/src/state/shellReducer.tsApplies client-preferences shell stream updates
packages/client-runtime/src/state/shellReducer.test.tsTests shellReducer preference updates
packages/client-runtime/src/state/server.tsAdds environment RPC command for patching preferences
docs/user/plan-mode.mdNew user doc for Plan Mode (Legacy) sync behavior
docs/user/appearance.mdNew user doc for appearance + themes + import limits
docs/README.mdLinks new appearance doc from docs index
apps/web/src/components/settings/ThemeEditorHost.tsxSwitches web theme editor to synced-theme hook
apps/web/src/components/settings/SettingsPanels.tsxSwitches appearance panel/restore to synced-theme hook
apps/server/src/ws.tsStreams preference updates incrementally + adds RPC handlers
apps/server/src/serverRuntimeStartup.test.tsUpdates projection snapshot query seam shape
apps/server/src/server.test.tsTests incremental preference patch streaming behavior
apps/server/src/provider/Layers/ProviderSessionReaper.test.tsUpdates projection snapshot query seam shape
apps/server/src/project/ProjectSetupScriptRunner.test.tsUpdates projection snapshot query seam shape
apps/server/src/persistence/Services/OrchestrationCommandReceipts.tsExpands receipt aggregateId union for preferences
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.tsNew projection table + projector cursor seed
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.test.tsTests migration creates projection + seeds cursor
apps/server/src/persistence/Migrations.tsRegisters migration 041
apps/server/src/persistence/Layers/OrchestrationEventStore.tsExpands event store streamId/aggregateId unions
apps/server/src/orchestration/Services/ProjectionSnapshotQuery.tsAdds getSyncedClientPreferences to query interface
apps/server/src/orchestration/projector.tsProjects LWW preferences into read model
apps/server/src/orchestration/Normalizer.tsClamps future-skewed preference stamps
apps/server/src/orchestration/Normalizer.test.tsTests future-skew clamp logic
apps/server/src/orchestration/Layers/ProjectionPipeline.tsAdds SQL projector for preferences singleton
apps/server/src/orchestration/Layers/ProjectionPipeline.test.tsTests deterministic rebuild/out-of-order handling
apps/server/src/orchestration/Layers/OrchestrationEngine.tsRoutes preference commands to singleton aggregate
apps/server/src/orchestration/Layers/OrchestrationEngine.test.tsEnd-to-end receipts/projection behavior for preferences
apps/server/src/orchestration/decider.tsEmits client-preferences.patched events
apps/server/src/checkpointing/CheckpointDiffQuery.test.tsUpdates projection snapshot query seam shape
apps/server/src/auth/RpcAuthorization.tsAdds auth scopes for new preference RPCs
apps/mobile/src/state/use-thread-outbox-drain.tsReads live plan-mode preference during outbox drain
apps/mobile/src/state/use-thread-composer-state.tsForces interactionMode default when plan mode disabled
apps/mobile/src/state/thread-outbox.test.tsUpdates tests for plan-mode-aware queued sends
apps/mobile/src/state/thread-outbox-model.tsAdds plan-mode-aware queued settings + send decision helper
apps/mobile/src/state/synced-client-preferences.tsMobile worker to reconcile/fan-out synced preferences
apps/mobile/src/state/synced-client-preferences.test.tsTests reconciliation + fan-out + normalization behaviors
apps/mobile/src/state/synced-client-preferences-model.tsPure reconciliation/write helpers for mobile preferences
apps/mobile/src/Stack.tsxAdds synced-preferences worker; simplifies header styling
apps/mobile/src/persistence/mobile-preferences.tsPersists appearance/theme/imported themes + LWW stamp
apps/mobile/src/lib/storage.test.tsTests preference persistence + imported theme removal fallback
apps/mobile/src/lib/splashConfig.tsScheme-neutral splash config helper
apps/mobile/src/lib/splashConfig.test.tsTests scheme-neutral splash config
apps/mobile/src/lib/mobileThemeFile.test.tsTests ThemeFile parsing/caps/normalization
apps/mobile/src/lib/mobileTheme.test.tsTests token mapping + built-in parity with global.css
apps/mobile/src/features/threads/use-plan-mode-enabled.tsHook for resolved plan-mode preference state
apps/mobile/src/features/threads/ThreadFeed.tsxSwitches markdown/review theming to appearance preferences
apps/mobile/src/features/threads/ThreadComposer.tsxPlan-mode slash gating + submit-time parsing + safer replacement
apps/mobile/src/features/threads/plan-mode.tsShared plan-mode helpers (slash/menu/submit/interactionMode)
apps/mobile/src/features/threads/plan-mode.test.tsTests plan-mode helper behaviors
apps/mobile/src/features/threads/NewTaskDraftScreen.tsxAdds plan-mode slash popover + submit parsing + in-flight guard
apps/mobile/src/features/threads/new-task-submit.tsExtracts new-task submit eligibility/selection helpers
apps/mobile/src/features/threads/new-task-submit.test.tsTests new-task submit helpers
apps/mobile/src/features/threads/new-task-flow-provider.tsxUses new plan-mode preference hook + interactionMode resolver
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsxThemes terminal via nativeSurfaceColors + correct alpha
apps/mobile/src/features/terminal/terminalTheme.tsAdds optional native-surface overrides to terminal theme
apps/mobile/src/features/terminal/terminalTheme.test.tsTests terminal overrides + alpha ordering stability
apps/mobile/src/features/terminal/NativeTerminalSurface.tsxAllows appearanceScheme override for fallback/native surface
apps/mobile/src/features/settings/SettingsRouteScreen.tsxPlan mode toggle now uses synced preference updates
apps/mobile/src/features/settings/SettingsAppearanceRouteScreen.tsxAdds ColorSchemeAppearanceSection to Appearance screen
apps/mobile/src/features/settings/appearance/sections/ColorSchemeAppearanceSection.tsxNew UI: mode picker, theme cards, import/remove flows
apps/mobile/src/features/settings/appearance/AppearancePreferencesProvider.tsxApplies theme variables + supports import/remove + syncing
apps/mobile/src/features/review/useNativeReviewDiffBridge.tsThemes native review diff via nativeSurfaceColors
apps/mobile/src/features/review/ReviewSheet.tsxUses effectiveColorScheme instead of system scheme
apps/mobile/src/features/review/nativeReviewDiffAdapter.tsAdds native theme overrides application helper
apps/mobile/src/features/review/nativeReviewDiffAdapter.test.tsTests stable defaults + override behavior + alpha serialization
apps/mobile/src/features/files/SourceFileSurface.tsxThemes native source surface via shared theme helper
apps/mobile/src/features/files/nativeSourceFileAdapter.tsReuses review theme creation for source surfaces
apps/mobile/src/features/files/nativeSourceFileAdapter.test.tsTests stable defaults + override passthrough
apps/mobile/src/components/AppSymbol.tsxAdds Android mapping for “hammer” symbol
apps/mobile/src/App.tsxNavigation theme + status bar driven by appearance preferences
apps/mobile/plugins/withIosSplashScreenInlineBackground.cjsInlines storyboard splash background color on iOS
apps/mobile/modules/t3-terminal/ios/T3TerminalView.swiftFixes CSS #RRGGBBAA parsing for iOS terminal colors
apps/mobile/modules/t3-terminal/android/.../T3TerminalView.ktFixes CSS #RRGGBBAA parsing for Android terminal colors
apps/mobile/modules/t3-review-diff/android/.../T3ReviewDiffView.ktFixes CSS #RRGGBBAA parsing for Android review colors
apps/mobile/global.cssAdds missing markdown inline-code token variables
apps/mobile/app.config.tsSwitches to scheme-neutral splash + iOS storyboard mod

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threaddocs/README.md
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
@macroscopeapp

macroscopeappBot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Skipped

Macroscope did not run approvability analysis for this PR. Diff is too large for automated approval analysis, so this PR cannot be approved automatically.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadpackages/contracts/src/orchestration.ts
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/mobile/src/features/threads/ThreadComposer.tsx Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/Stack.tsx
Comment threadapps/web/src/hooks/useSettings.ts
Comment threadapps/mobile/plugins/withIosSplashScreenInlineBackground.cjs Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts
Comment threadapps/mobile/src/Stack.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts
Comment threadapps/web/src/components/settings/ThemeEditorHost.tsx
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/web/src/hooks/synced-client-preferences.ts Outdated

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 83c4f0e. Configure here.

Comment threadapps/web/src/hooks/synced-client-preferences.ts
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The author acknowledges that built-in mobile themes already shipped in #6619. The remaining proposal changes 110 files.

@t3dotggt3dotgg closed this Aug 23, 2026
@amanthanvi
amanthanvi deleted the t3code/feat-6405 branch August 26, 2026 23:09
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Mobile: themes and custom themes — parity with the desktop theme system

3 participants

@amanthanvi@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(mobile): themes with appearance override and custom import - #6617

Closed
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405
Closed

feat(mobile): themes with appearance override and custom import#6617
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405

Conversation

@amanthanvi

@amanthanviamanthanvi commented Aug 14, 2026

Copy link
Copy Markdown

Current main already includes the six built-in themes from #6619. This refreshed branch extends that architecture with mobile ThemeFile v1 import/removal, shared web/mobile parsing and canonicalization, independent cross-client synchronization for appearance mode plus light and dark theme selections, native-surface theming, and the CSS alpha-decoder fixes. Custom theme libraries remain device-local by design; synced selections fall back safely when a referenced custom theme is unavailable on another device.

The refresh preserves main's shared palettes, per-appearance theme-pair model, ThemeAppearanceSection, and atomic layout-effect application instead of carrying the original duplicate palette, parser, and single-theme state model.

Depends on #6614 for the synced-preferences transport and durability foundation; this branch contains its refreshed commits.

Closes#6405

Import and native-surface examples: themed native terminal · paste-import sheet · imported theme applied.

Implemented by GPT-5.6 Sol (xhigh) via the Codex CLI, orchestrated and reviewed by Claude Fable 5 (Claude Code), with Claude Opus 5 run monitoring.


Note

Medium Risk
Synced preference reconciliation and composer gating affect send/start timing and cross-device plan mode; incorrect merge logic could flash wrong modes or block submission until hydration.

Overview
Extends mobile theming with ThemeFile v1 import (paste JSON, device-local library, remove with selection fallback) and wires imported palettes through appearance, terminal, review diff, and source views. Theme IDs are no longer limited to built-ins; resolution checks per-appearance availability for imported variants.

Synced client preferences on mobile now reconcile plan mode, appearance mode, and light/dark theme selections against connected environments using per-field LWW stamps, optimistic updates, and persistReconciledPreferences so stale server patches do not overwrite newer local writes. Settings appearance changes publish through synced preference hooks instead of only local themeMode / theme pair patches.

Legacy Plan Mode moves from a purely local toggle to the synced planModeEnabled flag. Composers gain shared slash-command handling (/plan, /default when enabled), submit-time mode switching, and send/start gating until reconciliation completes (useLegacyPlanModeState). New-task and thread composers use extracted helpers for eligibility and trigger replacement.

Native CSS hex parsing (#RRGGBB / #RRGGBBAA) is added for terminal and review-diff on Android/iOS. iOS splash uses a scheme-neutral background plus a config plugin that inlines Expo’s generated storyboard color. Markdown CSS adds dedicated inline-code text tokens for light/dark.

Reviewed by Cursor Bugbot for commit 83c4f0e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add syncedClientPreferencesPatch RPC and mobile custom theme imports

  • Adds synced client preferences (plan mode, appearance mode, theme IDs) using the new WebSocket RPC, server decider, projector, and migration 041
  • Adds mobile custom theme importing from JSON and applies imported themes to terminal, review diff, and settings surfaces
  • Moves mobile and web plan mode toggles to the synced preferences system and defers composer actions until the preference loads
  • Behavioral Change: RpcAuthorization requires AuthOrchestrationOperateScope for syncedClientPreferencesPatch; invalid backgroundColorHex assignments on iOS T3TerminalView are rejected and reverted instead of defaulting to 0
  • Risk: New database migration 041_ProjectionSyncedClientPreferences creates projection_synced_client_preferences and seeds its projection state

Macroscope summarized 9c3877a.

CopilotAI lite review requested due to automatic review settings August 14, 2026 15:00
@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 14, 2026
@coderabbitai

coderabbitaiBot commented Aug 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a8d51415-caaa-47a7-9fcc-763320f3c4ad

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:XXL 1,000+ changed lines (additions + deletions). label Aug 14, 2026
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/mobile/src/state/use-thread-outbox-drain.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a mobile theming system with an Appearance override (System/Light/Dark), built-in theme picker, and device-local custom theme import, while introducing a synced-client-preferences contract + server plumbing so appearance mode + selected theme id (and legacy plan mode) can converge across web/desktop/mobile per environment.

Changes:

  • Introduces SyncedClientPreferences (schema + RPCs) and threads it through orchestration read models, shell stream, receipts, event store, projector, and a new SQLite projection/migration.
  • Implements mobile Appearance “Color scheme” UI with built-in themes, ThemeFile v1 JSON paste-import, device-local theme library persistence, and theming applied across markdown/review/source/terminal surfaces.
  • Fixes native CSS hex alpha decoding (iOS/Android) and switches to a scheme-neutral splash configuration.

Reviewed changes

Copilot reviewed 86 out of 86 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
packages/contracts/src/syncedClientPreferences.tsNew schemas for synced client preferences + patch requests
packages/contracts/src/settings.test.tsContract tests for synced preferences decoding/patch rules
packages/contracts/src/rpc.tsAdds syncedClientPreferences get/patch WS RPCs
packages/contracts/src/orchestration.tsExtends orchestration models/events/commands for preferences
packages/contracts/src/orchestration.test.tsEnsures legacy shell decoding + patch validation
packages/contracts/src/index.tsRe-exports syncedClientPreferences
packages/client-runtime/src/state/shellReducer.tsApplies client-preferences shell stream updates
packages/client-runtime/src/state/shellReducer.test.tsTests shellReducer preference updates
packages/client-runtime/src/state/server.tsAdds environment RPC command for patching preferences
docs/user/plan-mode.mdNew user doc for Plan Mode (Legacy) sync behavior
docs/user/appearance.mdNew user doc for appearance + themes + import limits
docs/README.mdLinks new appearance doc from docs index
apps/web/src/components/settings/ThemeEditorHost.tsxSwitches web theme editor to synced-theme hook
apps/web/src/components/settings/SettingsPanels.tsxSwitches appearance panel/restore to synced-theme hook
apps/server/src/ws.tsStreams preference updates incrementally + adds RPC handlers
apps/server/src/serverRuntimeStartup.test.tsUpdates projection snapshot query seam shape
apps/server/src/server.test.tsTests incremental preference patch streaming behavior
apps/server/src/provider/Layers/ProviderSessionReaper.test.tsUpdates projection snapshot query seam shape
apps/server/src/project/ProjectSetupScriptRunner.test.tsUpdates projection snapshot query seam shape
apps/server/src/persistence/Services/OrchestrationCommandReceipts.tsExpands receipt aggregateId union for preferences
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.tsNew projection table + projector cursor seed
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.test.tsTests migration creates projection + seeds cursor
apps/server/src/persistence/Migrations.tsRegisters migration 041
apps/server/src/persistence/Layers/OrchestrationEventStore.tsExpands event store streamId/aggregateId unions
apps/server/src/orchestration/Services/ProjectionSnapshotQuery.tsAdds getSyncedClientPreferences to query interface
apps/server/src/orchestration/projector.tsProjects LWW preferences into read model
apps/server/src/orchestration/Normalizer.tsClamps future-skewed preference stamps
apps/server/src/orchestration/Normalizer.test.tsTests future-skew clamp logic
apps/server/src/orchestration/Layers/ProjectionPipeline.tsAdds SQL projector for preferences singleton
apps/server/src/orchestration/Layers/ProjectionPipeline.test.tsTests deterministic rebuild/out-of-order handling
apps/server/src/orchestration/Layers/OrchestrationEngine.tsRoutes preference commands to singleton aggregate
apps/server/src/orchestration/Layers/OrchestrationEngine.test.tsEnd-to-end receipts/projection behavior for preferences
apps/server/src/orchestration/decider.tsEmits client-preferences.patched events
apps/server/src/checkpointing/CheckpointDiffQuery.test.tsUpdates projection snapshot query seam shape
apps/server/src/auth/RpcAuthorization.tsAdds auth scopes for new preference RPCs
apps/mobile/src/state/use-thread-outbox-drain.tsReads live plan-mode preference during outbox drain
apps/mobile/src/state/use-thread-composer-state.tsForces interactionMode default when plan mode disabled
apps/mobile/src/state/thread-outbox.test.tsUpdates tests for plan-mode-aware queued sends
apps/mobile/src/state/thread-outbox-model.tsAdds plan-mode-aware queued settings + send decision helper
apps/mobile/src/state/synced-client-preferences.tsMobile worker to reconcile/fan-out synced preferences
apps/mobile/src/state/synced-client-preferences.test.tsTests reconciliation + fan-out + normalization behaviors
apps/mobile/src/state/synced-client-preferences-model.tsPure reconciliation/write helpers for mobile preferences
apps/mobile/src/Stack.tsxAdds synced-preferences worker; simplifies header styling
apps/mobile/src/persistence/mobile-preferences.tsPersists appearance/theme/imported themes + LWW stamp
apps/mobile/src/lib/storage.test.tsTests preference persistence + imported theme removal fallback
apps/mobile/src/lib/splashConfig.tsScheme-neutral splash config helper
apps/mobile/src/lib/splashConfig.test.tsTests scheme-neutral splash config
apps/mobile/src/lib/mobileThemeFile.test.tsTests ThemeFile parsing/caps/normalization
apps/mobile/src/lib/mobileTheme.test.tsTests token mapping + built-in parity with global.css
apps/mobile/src/features/threads/use-plan-mode-enabled.tsHook for resolved plan-mode preference state
apps/mobile/src/features/threads/ThreadFeed.tsxSwitches markdown/review theming to appearance preferences
apps/mobile/src/features/threads/ThreadComposer.tsxPlan-mode slash gating + submit-time parsing + safer replacement
apps/mobile/src/features/threads/plan-mode.tsShared plan-mode helpers (slash/menu/submit/interactionMode)
apps/mobile/src/features/threads/plan-mode.test.tsTests plan-mode helper behaviors
apps/mobile/src/features/threads/NewTaskDraftScreen.tsxAdds plan-mode slash popover + submit parsing + in-flight guard
apps/mobile/src/features/threads/new-task-submit.tsExtracts new-task submit eligibility/selection helpers
apps/mobile/src/features/threads/new-task-submit.test.tsTests new-task submit helpers
apps/mobile/src/features/threads/new-task-flow-provider.tsxUses new plan-mode preference hook + interactionMode resolver
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsxThemes terminal via nativeSurfaceColors + correct alpha
apps/mobile/src/features/terminal/terminalTheme.tsAdds optional native-surface overrides to terminal theme
apps/mobile/src/features/terminal/terminalTheme.test.tsTests terminal overrides + alpha ordering stability
apps/mobile/src/features/terminal/NativeTerminalSurface.tsxAllows appearanceScheme override for fallback/native surface
apps/mobile/src/features/settings/SettingsRouteScreen.tsxPlan mode toggle now uses synced preference updates
apps/mobile/src/features/settings/SettingsAppearanceRouteScreen.tsxAdds ColorSchemeAppearanceSection to Appearance screen
apps/mobile/src/features/settings/appearance/sections/ColorSchemeAppearanceSection.tsxNew UI: mode picker, theme cards, import/remove flows
apps/mobile/src/features/settings/appearance/AppearancePreferencesProvider.tsxApplies theme variables + supports import/remove + syncing
apps/mobile/src/features/review/useNativeReviewDiffBridge.tsThemes native review diff via nativeSurfaceColors
apps/mobile/src/features/review/ReviewSheet.tsxUses effectiveColorScheme instead of system scheme
apps/mobile/src/features/review/nativeReviewDiffAdapter.tsAdds native theme overrides application helper
apps/mobile/src/features/review/nativeReviewDiffAdapter.test.tsTests stable defaults + override behavior + alpha serialization
apps/mobile/src/features/files/SourceFileSurface.tsxThemes native source surface via shared theme helper
apps/mobile/src/features/files/nativeSourceFileAdapter.tsReuses review theme creation for source surfaces
apps/mobile/src/features/files/nativeSourceFileAdapter.test.tsTests stable defaults + override passthrough
apps/mobile/src/components/AppSymbol.tsxAdds Android mapping for “hammer” symbol
apps/mobile/src/App.tsxNavigation theme + status bar driven by appearance preferences
apps/mobile/plugins/withIosSplashScreenInlineBackground.cjsInlines storyboard splash background color on iOS
apps/mobile/modules/t3-terminal/ios/T3TerminalView.swiftFixes CSS #RRGGBBAA parsing for iOS terminal colors
apps/mobile/modules/t3-terminal/android/.../T3TerminalView.ktFixes CSS #RRGGBBAA parsing for Android terminal colors
apps/mobile/modules/t3-review-diff/android/.../T3ReviewDiffView.ktFixes CSS #RRGGBBAA parsing for Android review colors
apps/mobile/global.cssAdds missing markdown inline-code token variables
apps/mobile/app.config.tsSwitches to scheme-neutral splash + iOS storyboard mod

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threaddocs/README.md
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
@macroscopeapp

macroscopeappBot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Skipped

Macroscope did not run approvability analysis for this PR. Diff is too large for automated approval analysis, so this PR cannot be approved automatically.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadpackages/contracts/src/orchestration.ts
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/mobile/src/features/threads/ThreadComposer.tsx Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/Stack.tsx
Comment threadapps/web/src/hooks/useSettings.ts
Comment threadapps/mobile/plugins/withIosSplashScreenInlineBackground.cjs Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts
Comment threadapps/mobile/src/Stack.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts
Comment threadapps/web/src/components/settings/ThemeEditorHost.tsx
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/web/src/hooks/synced-client-preferences.ts Outdated

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 83c4f0e. Configure here.

Comment threadapps/web/src/hooks/synced-client-preferences.ts
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The author acknowledges that built-in mobile themes already shipped in #6619. The remaining proposal changes 110 files.

@t3dotggt3dotgg closed this Aug 23, 2026
@amanthanvi
amanthanvi deleted the t3code/feat-6405 branch August 26, 2026 23:09
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Mobile: themes and custom themes — parity with the desktop theme system

3 participants

@amanthanvi@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mobile): themes with appearance override and custom import - #6617

Closed
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405
Closed

feat(mobile): themes with appearance override and custom import#6617
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405

Conversation

@amanthanvi

@amanthanviamanthanvi commented Aug 14, 2026

Copy link
Copy Markdown

Current main already includes the six built-in themes from #6619. This refreshed branch extends that architecture with mobile ThemeFile v1 import/removal, shared web/mobile parsing and canonicalization, independent cross-client synchronization for appearance mode plus light and dark theme selections, native-surface theming, and the CSS alpha-decoder fixes. Custom theme libraries remain device-local by design; synced selections fall back safely when a referenced custom theme is unavailable on another device.

The refresh preserves main's shared palettes, per-appearance theme-pair model, ThemeAppearanceSection, and atomic layout-effect application instead of carrying the original duplicate palette, parser, and single-theme state model.

Depends on #6614 for the synced-preferences transport and durability foundation; this branch contains its refreshed commits.

Closes#6405

Import and native-surface examples: themed native terminal · paste-import sheet · imported theme applied.

Implemented by GPT-5.6 Sol (xhigh) via the Codex CLI, orchestrated and reviewed by Claude Fable 5 (Claude Code), with Claude Opus 5 run monitoring.


Note

Medium Risk
Synced preference reconciliation and composer gating affect send/start timing and cross-device plan mode; incorrect merge logic could flash wrong modes or block submission until hydration.

Overview
Extends mobile theming with ThemeFile v1 import (paste JSON, device-local library, remove with selection fallback) and wires imported palettes through appearance, terminal, review diff, and source views. Theme IDs are no longer limited to built-ins; resolution checks per-appearance availability for imported variants.

Synced client preferences on mobile now reconcile plan mode, appearance mode, and light/dark theme selections against connected environments using per-field LWW stamps, optimistic updates, and persistReconciledPreferences so stale server patches do not overwrite newer local writes. Settings appearance changes publish through synced preference hooks instead of only local themeMode / theme pair patches.

Legacy Plan Mode moves from a purely local toggle to the synced planModeEnabled flag. Composers gain shared slash-command handling (/plan, /default when enabled), submit-time mode switching, and send/start gating until reconciliation completes (useLegacyPlanModeState). New-task and thread composers use extracted helpers for eligibility and trigger replacement.

Native CSS hex parsing (#RRGGBB / #RRGGBBAA) is added for terminal and review-diff on Android/iOS. iOS splash uses a scheme-neutral background plus a config plugin that inlines Expo’s generated storyboard color. Markdown CSS adds dedicated inline-code text tokens for light/dark.

Reviewed by Cursor Bugbot for commit 83c4f0e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add syncedClientPreferencesPatch RPC and mobile custom theme imports

  • Adds synced client preferences (plan mode, appearance mode, theme IDs) using the new WebSocket RPC, server decider, projector, and migration 041
  • Adds mobile custom theme importing from JSON and applies imported themes to terminal, review diff, and settings surfaces
  • Moves mobile and web plan mode toggles to the synced preferences system and defers composer actions until the preference loads
  • Behavioral Change: RpcAuthorization requires AuthOrchestrationOperateScope for syncedClientPreferencesPatch; invalid backgroundColorHex assignments on iOS T3TerminalView are rejected and reverted instead of defaulting to 0
  • Risk: New database migration 041_ProjectionSyncedClientPreferences creates projection_synced_client_preferences and seeds its projection state

Macroscope summarized 9c3877a.

CopilotAI lite review requested due to automatic review settings August 14, 2026 15:00
@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 14, 2026
@coderabbitai

coderabbitaiBot commented Aug 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a8d51415-caaa-47a7-9fcc-763320f3c4ad

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:XXL 1,000+ changed lines (additions + deletions). label Aug 14, 2026
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/mobile/src/state/use-thread-outbox-drain.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a mobile theming system with an Appearance override (System/Light/Dark), built-in theme picker, and device-local custom theme import, while introducing a synced-client-preferences contract + server plumbing so appearance mode + selected theme id (and legacy plan mode) can converge across web/desktop/mobile per environment.

Changes:

  • Introduces SyncedClientPreferences (schema + RPCs) and threads it through orchestration read models, shell stream, receipts, event store, projector, and a new SQLite projection/migration.
  • Implements mobile Appearance “Color scheme” UI with built-in themes, ThemeFile v1 JSON paste-import, device-local theme library persistence, and theming applied across markdown/review/source/terminal surfaces.
  • Fixes native CSS hex alpha decoding (iOS/Android) and switches to a scheme-neutral splash configuration.

Reviewed changes

Copilot reviewed 86 out of 86 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
packages/contracts/src/syncedClientPreferences.tsNew schemas for synced client preferences + patch requests
packages/contracts/src/settings.test.tsContract tests for synced preferences decoding/patch rules
packages/contracts/src/rpc.tsAdds syncedClientPreferences get/patch WS RPCs
packages/contracts/src/orchestration.tsExtends orchestration models/events/commands for preferences
packages/contracts/src/orchestration.test.tsEnsures legacy shell decoding + patch validation
packages/contracts/src/index.tsRe-exports syncedClientPreferences
packages/client-runtime/src/state/shellReducer.tsApplies client-preferences shell stream updates
packages/client-runtime/src/state/shellReducer.test.tsTests shellReducer preference updates
packages/client-runtime/src/state/server.tsAdds environment RPC command for patching preferences
docs/user/plan-mode.mdNew user doc for Plan Mode (Legacy) sync behavior
docs/user/appearance.mdNew user doc for appearance + themes + import limits
docs/README.mdLinks new appearance doc from docs index
apps/web/src/components/settings/ThemeEditorHost.tsxSwitches web theme editor to synced-theme hook
apps/web/src/components/settings/SettingsPanels.tsxSwitches appearance panel/restore to synced-theme hook
apps/server/src/ws.tsStreams preference updates incrementally + adds RPC handlers
apps/server/src/serverRuntimeStartup.test.tsUpdates projection snapshot query seam shape
apps/server/src/server.test.tsTests incremental preference patch streaming behavior
apps/server/src/provider/Layers/ProviderSessionReaper.test.tsUpdates projection snapshot query seam shape
apps/server/src/project/ProjectSetupScriptRunner.test.tsUpdates projection snapshot query seam shape
apps/server/src/persistence/Services/OrchestrationCommandReceipts.tsExpands receipt aggregateId union for preferences
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.tsNew projection table + projector cursor seed
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.test.tsTests migration creates projection + seeds cursor
apps/server/src/persistence/Migrations.tsRegisters migration 041
apps/server/src/persistence/Layers/OrchestrationEventStore.tsExpands event store streamId/aggregateId unions
apps/server/src/orchestration/Services/ProjectionSnapshotQuery.tsAdds getSyncedClientPreferences to query interface
apps/server/src/orchestration/projector.tsProjects LWW preferences into read model
apps/server/src/orchestration/Normalizer.tsClamps future-skewed preference stamps
apps/server/src/orchestration/Normalizer.test.tsTests future-skew clamp logic
apps/server/src/orchestration/Layers/ProjectionPipeline.tsAdds SQL projector for preferences singleton
apps/server/src/orchestration/Layers/ProjectionPipeline.test.tsTests deterministic rebuild/out-of-order handling
apps/server/src/orchestration/Layers/OrchestrationEngine.tsRoutes preference commands to singleton aggregate
apps/server/src/orchestration/Layers/OrchestrationEngine.test.tsEnd-to-end receipts/projection behavior for preferences
apps/server/src/orchestration/decider.tsEmits client-preferences.patched events
apps/server/src/checkpointing/CheckpointDiffQuery.test.tsUpdates projection snapshot query seam shape
apps/server/src/auth/RpcAuthorization.tsAdds auth scopes for new preference RPCs
apps/mobile/src/state/use-thread-outbox-drain.tsReads live plan-mode preference during outbox drain
apps/mobile/src/state/use-thread-composer-state.tsForces interactionMode default when plan mode disabled
apps/mobile/src/state/thread-outbox.test.tsUpdates tests for plan-mode-aware queued sends
apps/mobile/src/state/thread-outbox-model.tsAdds plan-mode-aware queued settings + send decision helper
apps/mobile/src/state/synced-client-preferences.tsMobile worker to reconcile/fan-out synced preferences
apps/mobile/src/state/synced-client-preferences.test.tsTests reconciliation + fan-out + normalization behaviors
apps/mobile/src/state/synced-client-preferences-model.tsPure reconciliation/write helpers for mobile preferences
apps/mobile/src/Stack.tsxAdds synced-preferences worker; simplifies header styling
apps/mobile/src/persistence/mobile-preferences.tsPersists appearance/theme/imported themes + LWW stamp
apps/mobile/src/lib/storage.test.tsTests preference persistence + imported theme removal fallback
apps/mobile/src/lib/splashConfig.tsScheme-neutral splash config helper
apps/mobile/src/lib/splashConfig.test.tsTests scheme-neutral splash config
apps/mobile/src/lib/mobileThemeFile.test.tsTests ThemeFile parsing/caps/normalization
apps/mobile/src/lib/mobileTheme.test.tsTests token mapping + built-in parity with global.css
apps/mobile/src/features/threads/use-plan-mode-enabled.tsHook for resolved plan-mode preference state
apps/mobile/src/features/threads/ThreadFeed.tsxSwitches markdown/review theming to appearance preferences
apps/mobile/src/features/threads/ThreadComposer.tsxPlan-mode slash gating + submit-time parsing + safer replacement
apps/mobile/src/features/threads/plan-mode.tsShared plan-mode helpers (slash/menu/submit/interactionMode)
apps/mobile/src/features/threads/plan-mode.test.tsTests plan-mode helper behaviors
apps/mobile/src/features/threads/NewTaskDraftScreen.tsxAdds plan-mode slash popover + submit parsing + in-flight guard
apps/mobile/src/features/threads/new-task-submit.tsExtracts new-task submit eligibility/selection helpers
apps/mobile/src/features/threads/new-task-submit.test.tsTests new-task submit helpers
apps/mobile/src/features/threads/new-task-flow-provider.tsxUses new plan-mode preference hook + interactionMode resolver
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsxThemes terminal via nativeSurfaceColors + correct alpha
apps/mobile/src/features/terminal/terminalTheme.tsAdds optional native-surface overrides to terminal theme
apps/mobile/src/features/terminal/terminalTheme.test.tsTests terminal overrides + alpha ordering stability
apps/mobile/src/features/terminal/NativeTerminalSurface.tsxAllows appearanceScheme override for fallback/native surface
apps/mobile/src/features/settings/SettingsRouteScreen.tsxPlan mode toggle now uses synced preference updates
apps/mobile/src/features/settings/SettingsAppearanceRouteScreen.tsxAdds ColorSchemeAppearanceSection to Appearance screen
apps/mobile/src/features/settings/appearance/sections/ColorSchemeAppearanceSection.tsxNew UI: mode picker, theme cards, import/remove flows
apps/mobile/src/features/settings/appearance/AppearancePreferencesProvider.tsxApplies theme variables + supports import/remove + syncing
apps/mobile/src/features/review/useNativeReviewDiffBridge.tsThemes native review diff via nativeSurfaceColors
apps/mobile/src/features/review/ReviewSheet.tsxUses effectiveColorScheme instead of system scheme
apps/mobile/src/features/review/nativeReviewDiffAdapter.tsAdds native theme overrides application helper
apps/mobile/src/features/review/nativeReviewDiffAdapter.test.tsTests stable defaults + override behavior + alpha serialization
apps/mobile/src/features/files/SourceFileSurface.tsxThemes native source surface via shared theme helper
apps/mobile/src/features/files/nativeSourceFileAdapter.tsReuses review theme creation for source surfaces
apps/mobile/src/features/files/nativeSourceFileAdapter.test.tsTests stable defaults + override passthrough
apps/mobile/src/components/AppSymbol.tsxAdds Android mapping for “hammer” symbol
apps/mobile/src/App.tsxNavigation theme + status bar driven by appearance preferences
apps/mobile/plugins/withIosSplashScreenInlineBackground.cjsInlines storyboard splash background color on iOS
apps/mobile/modules/t3-terminal/ios/T3TerminalView.swiftFixes CSS #RRGGBBAA parsing for iOS terminal colors
apps/mobile/modules/t3-terminal/android/.../T3TerminalView.ktFixes CSS #RRGGBBAA parsing for Android terminal colors
apps/mobile/modules/t3-review-diff/android/.../T3ReviewDiffView.ktFixes CSS #RRGGBBAA parsing for Android review colors
apps/mobile/global.cssAdds missing markdown inline-code token variables
apps/mobile/app.config.tsSwitches to scheme-neutral splash + iOS storyboard mod

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threaddocs/README.md
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
@macroscopeapp

macroscopeappBot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Skipped

Macroscope did not run approvability analysis for this PR. Diff is too large for automated approval analysis, so this PR cannot be approved automatically.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadpackages/contracts/src/orchestration.ts
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/mobile/src/features/threads/ThreadComposer.tsx Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/Stack.tsx
Comment threadapps/web/src/hooks/useSettings.ts
Comment threadapps/mobile/plugins/withIosSplashScreenInlineBackground.cjs Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts
Comment threadapps/mobile/src/Stack.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts
Comment threadapps/web/src/components/settings/ThemeEditorHost.tsx
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/web/src/hooks/synced-client-preferences.ts Outdated

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 83c4f0e. Configure here.

Comment threadapps/web/src/hooks/synced-client-preferences.ts
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The author acknowledges that built-in mobile themes already shipped in #6619. The remaining proposal changes 110 files.

@t3dotggt3dotgg closed this Aug 23, 2026
@amanthanvi
amanthanvi deleted the t3code/feat-6405 branch August 26, 2026 23:09
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Mobile: themes and custom themes — parity with the desktop theme system

3 participants

@amanthanvi@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mobile): themes with appearance override and custom import - #6617

Closed
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405
Closed

feat(mobile): themes with appearance override and custom import#6617
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405

Conversation

@amanthanvi

@amanthanviamanthanvi commented Aug 14, 2026

Copy link
Copy Markdown

Current main already includes the six built-in themes from #6619. This refreshed branch extends that architecture with mobile ThemeFile v1 import/removal, shared web/mobile parsing and canonicalization, independent cross-client synchronization for appearance mode plus light and dark theme selections, native-surface theming, and the CSS alpha-decoder fixes. Custom theme libraries remain device-local by design; synced selections fall back safely when a referenced custom theme is unavailable on another device.

The refresh preserves main's shared palettes, per-appearance theme-pair model, ThemeAppearanceSection, and atomic layout-effect application instead of carrying the original duplicate palette, parser, and single-theme state model.

Depends on #6614 for the synced-preferences transport and durability foundation; this branch contains its refreshed commits.

Closes#6405

Import and native-surface examples: themed native terminal · paste-import sheet · imported theme applied.

Implemented by GPT-5.6 Sol (xhigh) via the Codex CLI, orchestrated and reviewed by Claude Fable 5 (Claude Code), with Claude Opus 5 run monitoring.


Note

Medium Risk
Synced preference reconciliation and composer gating affect send/start timing and cross-device plan mode; incorrect merge logic could flash wrong modes or block submission until hydration.

Overview
Extends mobile theming with ThemeFile v1 import (paste JSON, device-local library, remove with selection fallback) and wires imported palettes through appearance, terminal, review diff, and source views. Theme IDs are no longer limited to built-ins; resolution checks per-appearance availability for imported variants.

Synced client preferences on mobile now reconcile plan mode, appearance mode, and light/dark theme selections against connected environments using per-field LWW stamps, optimistic updates, and persistReconciledPreferences so stale server patches do not overwrite newer local writes. Settings appearance changes publish through synced preference hooks instead of only local themeMode / theme pair patches.

Legacy Plan Mode moves from a purely local toggle to the synced planModeEnabled flag. Composers gain shared slash-command handling (/plan, /default when enabled), submit-time mode switching, and send/start gating until reconciliation completes (useLegacyPlanModeState). New-task and thread composers use extracted helpers for eligibility and trigger replacement.

Native CSS hex parsing (#RRGGBB / #RRGGBBAA) is added for terminal and review-diff on Android/iOS. iOS splash uses a scheme-neutral background plus a config plugin that inlines Expo’s generated storyboard color. Markdown CSS adds dedicated inline-code text tokens for light/dark.

Reviewed by Cursor Bugbot for commit 83c4f0e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add syncedClientPreferencesPatch RPC and mobile custom theme imports

  • Adds synced client preferences (plan mode, appearance mode, theme IDs) using the new WebSocket RPC, server decider, projector, and migration 041
  • Adds mobile custom theme importing from JSON and applies imported themes to terminal, review diff, and settings surfaces
  • Moves mobile and web plan mode toggles to the synced preferences system and defers composer actions until the preference loads
  • Behavioral Change: RpcAuthorization requires AuthOrchestrationOperateScope for syncedClientPreferencesPatch; invalid backgroundColorHex assignments on iOS T3TerminalView are rejected and reverted instead of defaulting to 0
  • Risk: New database migration 041_ProjectionSyncedClientPreferences creates projection_synced_client_preferences and seeds its projection state

Macroscope summarized 9c3877a.

CopilotAI lite review requested due to automatic review settings August 14, 2026 15:00
@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 14, 2026
@coderabbitai

coderabbitaiBot commented Aug 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a8d51415-caaa-47a7-9fcc-763320f3c4ad

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:XXL 1,000+ changed lines (additions + deletions). label Aug 14, 2026
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/mobile/src/state/use-thread-outbox-drain.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a mobile theming system with an Appearance override (System/Light/Dark), built-in theme picker, and device-local custom theme import, while introducing a synced-client-preferences contract + server plumbing so appearance mode + selected theme id (and legacy plan mode) can converge across web/desktop/mobile per environment.

Changes:

  • Introduces SyncedClientPreferences (schema + RPCs) and threads it through orchestration read models, shell stream, receipts, event store, projector, and a new SQLite projection/migration.
  • Implements mobile Appearance “Color scheme” UI with built-in themes, ThemeFile v1 JSON paste-import, device-local theme library persistence, and theming applied across markdown/review/source/terminal surfaces.
  • Fixes native CSS hex alpha decoding (iOS/Android) and switches to a scheme-neutral splash configuration.

Reviewed changes

Copilot reviewed 86 out of 86 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
packages/contracts/src/syncedClientPreferences.tsNew schemas for synced client preferences + patch requests
packages/contracts/src/settings.test.tsContract tests for synced preferences decoding/patch rules
packages/contracts/src/rpc.tsAdds syncedClientPreferences get/patch WS RPCs
packages/contracts/src/orchestration.tsExtends orchestration models/events/commands for preferences
packages/contracts/src/orchestration.test.tsEnsures legacy shell decoding + patch validation
packages/contracts/src/index.tsRe-exports syncedClientPreferences
packages/client-runtime/src/state/shellReducer.tsApplies client-preferences shell stream updates
packages/client-runtime/src/state/shellReducer.test.tsTests shellReducer preference updates
packages/client-runtime/src/state/server.tsAdds environment RPC command for patching preferences
docs/user/plan-mode.mdNew user doc for Plan Mode (Legacy) sync behavior
docs/user/appearance.mdNew user doc for appearance + themes + import limits
docs/README.mdLinks new appearance doc from docs index
apps/web/src/components/settings/ThemeEditorHost.tsxSwitches web theme editor to synced-theme hook
apps/web/src/components/settings/SettingsPanels.tsxSwitches appearance panel/restore to synced-theme hook
apps/server/src/ws.tsStreams preference updates incrementally + adds RPC handlers
apps/server/src/serverRuntimeStartup.test.tsUpdates projection snapshot query seam shape
apps/server/src/server.test.tsTests incremental preference patch streaming behavior
apps/server/src/provider/Layers/ProviderSessionReaper.test.tsUpdates projection snapshot query seam shape
apps/server/src/project/ProjectSetupScriptRunner.test.tsUpdates projection snapshot query seam shape
apps/server/src/persistence/Services/OrchestrationCommandReceipts.tsExpands receipt aggregateId union for preferences
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.tsNew projection table + projector cursor seed
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.test.tsTests migration creates projection + seeds cursor
apps/server/src/persistence/Migrations.tsRegisters migration 041
apps/server/src/persistence/Layers/OrchestrationEventStore.tsExpands event store streamId/aggregateId unions
apps/server/src/orchestration/Services/ProjectionSnapshotQuery.tsAdds getSyncedClientPreferences to query interface
apps/server/src/orchestration/projector.tsProjects LWW preferences into read model
apps/server/src/orchestration/Normalizer.tsClamps future-skewed preference stamps
apps/server/src/orchestration/Normalizer.test.tsTests future-skew clamp logic
apps/server/src/orchestration/Layers/ProjectionPipeline.tsAdds SQL projector for preferences singleton
apps/server/src/orchestration/Layers/ProjectionPipeline.test.tsTests deterministic rebuild/out-of-order handling
apps/server/src/orchestration/Layers/OrchestrationEngine.tsRoutes preference commands to singleton aggregate
apps/server/src/orchestration/Layers/OrchestrationEngine.test.tsEnd-to-end receipts/projection behavior for preferences
apps/server/src/orchestration/decider.tsEmits client-preferences.patched events
apps/server/src/checkpointing/CheckpointDiffQuery.test.tsUpdates projection snapshot query seam shape
apps/server/src/auth/RpcAuthorization.tsAdds auth scopes for new preference RPCs
apps/mobile/src/state/use-thread-outbox-drain.tsReads live plan-mode preference during outbox drain
apps/mobile/src/state/use-thread-composer-state.tsForces interactionMode default when plan mode disabled
apps/mobile/src/state/thread-outbox.test.tsUpdates tests for plan-mode-aware queued sends
apps/mobile/src/state/thread-outbox-model.tsAdds plan-mode-aware queued settings + send decision helper
apps/mobile/src/state/synced-client-preferences.tsMobile worker to reconcile/fan-out synced preferences
apps/mobile/src/state/synced-client-preferences.test.tsTests reconciliation + fan-out + normalization behaviors
apps/mobile/src/state/synced-client-preferences-model.tsPure reconciliation/write helpers for mobile preferences
apps/mobile/src/Stack.tsxAdds synced-preferences worker; simplifies header styling
apps/mobile/src/persistence/mobile-preferences.tsPersists appearance/theme/imported themes + LWW stamp
apps/mobile/src/lib/storage.test.tsTests preference persistence + imported theme removal fallback
apps/mobile/src/lib/splashConfig.tsScheme-neutral splash config helper
apps/mobile/src/lib/splashConfig.test.tsTests scheme-neutral splash config
apps/mobile/src/lib/mobileThemeFile.test.tsTests ThemeFile parsing/caps/normalization
apps/mobile/src/lib/mobileTheme.test.tsTests token mapping + built-in parity with global.css
apps/mobile/src/features/threads/use-plan-mode-enabled.tsHook for resolved plan-mode preference state
apps/mobile/src/features/threads/ThreadFeed.tsxSwitches markdown/review theming to appearance preferences
apps/mobile/src/features/threads/ThreadComposer.tsxPlan-mode slash gating + submit-time parsing + safer replacement
apps/mobile/src/features/threads/plan-mode.tsShared plan-mode helpers (slash/menu/submit/interactionMode)
apps/mobile/src/features/threads/plan-mode.test.tsTests plan-mode helper behaviors
apps/mobile/src/features/threads/NewTaskDraftScreen.tsxAdds plan-mode slash popover + submit parsing + in-flight guard
apps/mobile/src/features/threads/new-task-submit.tsExtracts new-task submit eligibility/selection helpers
apps/mobile/src/features/threads/new-task-submit.test.tsTests new-task submit helpers
apps/mobile/src/features/threads/new-task-flow-provider.tsxUses new plan-mode preference hook + interactionMode resolver
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsxThemes terminal via nativeSurfaceColors + correct alpha
apps/mobile/src/features/terminal/terminalTheme.tsAdds optional native-surface overrides to terminal theme
apps/mobile/src/features/terminal/terminalTheme.test.tsTests terminal overrides + alpha ordering stability
apps/mobile/src/features/terminal/NativeTerminalSurface.tsxAllows appearanceScheme override for fallback/native surface
apps/mobile/src/features/settings/SettingsRouteScreen.tsxPlan mode toggle now uses synced preference updates
apps/mobile/src/features/settings/SettingsAppearanceRouteScreen.tsxAdds ColorSchemeAppearanceSection to Appearance screen
apps/mobile/src/features/settings/appearance/sections/ColorSchemeAppearanceSection.tsxNew UI: mode picker, theme cards, import/remove flows
apps/mobile/src/features/settings/appearance/AppearancePreferencesProvider.tsxApplies theme variables + supports import/remove + syncing
apps/mobile/src/features/review/useNativeReviewDiffBridge.tsThemes native review diff via nativeSurfaceColors
apps/mobile/src/features/review/ReviewSheet.tsxUses effectiveColorScheme instead of system scheme
apps/mobile/src/features/review/nativeReviewDiffAdapter.tsAdds native theme overrides application helper
apps/mobile/src/features/review/nativeReviewDiffAdapter.test.tsTests stable defaults + override behavior + alpha serialization
apps/mobile/src/features/files/SourceFileSurface.tsxThemes native source surface via shared theme helper
apps/mobile/src/features/files/nativeSourceFileAdapter.tsReuses review theme creation for source surfaces
apps/mobile/src/features/files/nativeSourceFileAdapter.test.tsTests stable defaults + override passthrough
apps/mobile/src/components/AppSymbol.tsxAdds Android mapping for “hammer” symbol
apps/mobile/src/App.tsxNavigation theme + status bar driven by appearance preferences
apps/mobile/plugins/withIosSplashScreenInlineBackground.cjsInlines storyboard splash background color on iOS
apps/mobile/modules/t3-terminal/ios/T3TerminalView.swiftFixes CSS #RRGGBBAA parsing for iOS terminal colors
apps/mobile/modules/t3-terminal/android/.../T3TerminalView.ktFixes CSS #RRGGBBAA parsing for Android terminal colors
apps/mobile/modules/t3-review-diff/android/.../T3ReviewDiffView.ktFixes CSS #RRGGBBAA parsing for Android review colors
apps/mobile/global.cssAdds missing markdown inline-code token variables
apps/mobile/app.config.tsSwitches to scheme-neutral splash + iOS storyboard mod

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threaddocs/README.md
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
@macroscopeapp

macroscopeappBot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Skipped

Macroscope did not run approvability analysis for this PR. Diff is too large for automated approval analysis, so this PR cannot be approved automatically.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadpackages/contracts/src/orchestration.ts
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/mobile/src/features/threads/ThreadComposer.tsx Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/Stack.tsx
Comment threadapps/web/src/hooks/useSettings.ts
Comment threadapps/mobile/plugins/withIosSplashScreenInlineBackground.cjs Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts
Comment threadapps/mobile/src/Stack.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts
Comment threadapps/web/src/components/settings/ThemeEditorHost.tsx
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/web/src/hooks/synced-client-preferences.ts Outdated

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 83c4f0e. Configure here.

Comment threadapps/web/src/hooks/synced-client-preferences.ts
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The author acknowledges that built-in mobile themes already shipped in #6619. The remaining proposal changes 110 files.

@t3dotggt3dotgg closed this Aug 23, 2026
@amanthanvi
amanthanvi deleted the t3code/feat-6405 branch August 26, 2026 23:09
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Mobile: themes and custom themes — parity with the desktop theme system

3 participants

@amanthanvi@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(mobile): themes with appearance override and custom import - #6617

Closed
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405
Closed

feat(mobile): themes with appearance override and custom import#6617
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405

Conversation

@amanthanvi

@amanthanviamanthanvi commented Aug 14, 2026

Copy link
Copy Markdown

Current main already includes the six built-in themes from #6619. This refreshed branch extends that architecture with mobile ThemeFile v1 import/removal, shared web/mobile parsing and canonicalization, independent cross-client synchronization for appearance mode plus light and dark theme selections, native-surface theming, and the CSS alpha-decoder fixes. Custom theme libraries remain device-local by design; synced selections fall back safely when a referenced custom theme is unavailable on another device.

The refresh preserves main's shared palettes, per-appearance theme-pair model, ThemeAppearanceSection, and atomic layout-effect application instead of carrying the original duplicate palette, parser, and single-theme state model.

Depends on #6614 for the synced-preferences transport and durability foundation; this branch contains its refreshed commits.

Closes#6405

Import and native-surface examples: themed native terminal · paste-import sheet · imported theme applied.

Implemented by GPT-5.6 Sol (xhigh) via the Codex CLI, orchestrated and reviewed by Claude Fable 5 (Claude Code), with Claude Opus 5 run monitoring.


Note

Medium Risk
Synced preference reconciliation and composer gating affect send/start timing and cross-device plan mode; incorrect merge logic could flash wrong modes or block submission until hydration.

Overview
Extends mobile theming with ThemeFile v1 import (paste JSON, device-local library, remove with selection fallback) and wires imported palettes through appearance, terminal, review diff, and source views. Theme IDs are no longer limited to built-ins; resolution checks per-appearance availability for imported variants.

Synced client preferences on mobile now reconcile plan mode, appearance mode, and light/dark theme selections against connected environments using per-field LWW stamps, optimistic updates, and persistReconciledPreferences so stale server patches do not overwrite newer local writes. Settings appearance changes publish through synced preference hooks instead of only local themeMode / theme pair patches.

Legacy Plan Mode moves from a purely local toggle to the synced planModeEnabled flag. Composers gain shared slash-command handling (/plan, /default when enabled), submit-time mode switching, and send/start gating until reconciliation completes (useLegacyPlanModeState). New-task and thread composers use extracted helpers for eligibility and trigger replacement.

Native CSS hex parsing (#RRGGBB / #RRGGBBAA) is added for terminal and review-diff on Android/iOS. iOS splash uses a scheme-neutral background plus a config plugin that inlines Expo’s generated storyboard color. Markdown CSS adds dedicated inline-code text tokens for light/dark.

Reviewed by Cursor Bugbot for commit 83c4f0e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add syncedClientPreferencesPatch RPC and mobile custom theme imports

  • Adds synced client preferences (plan mode, appearance mode, theme IDs) using the new WebSocket RPC, server decider, projector, and migration 041
  • Adds mobile custom theme importing from JSON and applies imported themes to terminal, review diff, and settings surfaces
  • Moves mobile and web plan mode toggles to the synced preferences system and defers composer actions until the preference loads
  • Behavioral Change: RpcAuthorization requires AuthOrchestrationOperateScope for syncedClientPreferencesPatch; invalid backgroundColorHex assignments on iOS T3TerminalView are rejected and reverted instead of defaulting to 0
  • Risk: New database migration 041_ProjectionSyncedClientPreferences creates projection_synced_client_preferences and seeds its projection state

Macroscope summarized 9c3877a.

CopilotAI lite review requested due to automatic review settings August 14, 2026 15:00
@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 14, 2026
@coderabbitai

coderabbitaiBot commented Aug 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a8d51415-caaa-47a7-9fcc-763320f3c4ad

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:XXL 1,000+ changed lines (additions + deletions). label Aug 14, 2026
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/mobile/src/state/use-thread-outbox-drain.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a mobile theming system with an Appearance override (System/Light/Dark), built-in theme picker, and device-local custom theme import, while introducing a synced-client-preferences contract + server plumbing so appearance mode + selected theme id (and legacy plan mode) can converge across web/desktop/mobile per environment.

Changes:

  • Introduces SyncedClientPreferences (schema + RPCs) and threads it through orchestration read models, shell stream, receipts, event store, projector, and a new SQLite projection/migration.
  • Implements mobile Appearance “Color scheme” UI with built-in themes, ThemeFile v1 JSON paste-import, device-local theme library persistence, and theming applied across markdown/review/source/terminal surfaces.
  • Fixes native CSS hex alpha decoding (iOS/Android) and switches to a scheme-neutral splash configuration.

Reviewed changes

Copilot reviewed 86 out of 86 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
packages/contracts/src/syncedClientPreferences.tsNew schemas for synced client preferences + patch requests
packages/contracts/src/settings.test.tsContract tests for synced preferences decoding/patch rules
packages/contracts/src/rpc.tsAdds syncedClientPreferences get/patch WS RPCs
packages/contracts/src/orchestration.tsExtends orchestration models/events/commands for preferences
packages/contracts/src/orchestration.test.tsEnsures legacy shell decoding + patch validation
packages/contracts/src/index.tsRe-exports syncedClientPreferences
packages/client-runtime/src/state/shellReducer.tsApplies client-preferences shell stream updates
packages/client-runtime/src/state/shellReducer.test.tsTests shellReducer preference updates
packages/client-runtime/src/state/server.tsAdds environment RPC command for patching preferences
docs/user/plan-mode.mdNew user doc for Plan Mode (Legacy) sync behavior
docs/user/appearance.mdNew user doc for appearance + themes + import limits
docs/README.mdLinks new appearance doc from docs index
apps/web/src/components/settings/ThemeEditorHost.tsxSwitches web theme editor to synced-theme hook
apps/web/src/components/settings/SettingsPanels.tsxSwitches appearance panel/restore to synced-theme hook
apps/server/src/ws.tsStreams preference updates incrementally + adds RPC handlers
apps/server/src/serverRuntimeStartup.test.tsUpdates projection snapshot query seam shape
apps/server/src/server.test.tsTests incremental preference patch streaming behavior
apps/server/src/provider/Layers/ProviderSessionReaper.test.tsUpdates projection snapshot query seam shape
apps/server/src/project/ProjectSetupScriptRunner.test.tsUpdates projection snapshot query seam shape
apps/server/src/persistence/Services/OrchestrationCommandReceipts.tsExpands receipt aggregateId union for preferences
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.tsNew projection table + projector cursor seed
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.test.tsTests migration creates projection + seeds cursor
apps/server/src/persistence/Migrations.tsRegisters migration 041
apps/server/src/persistence/Layers/OrchestrationEventStore.tsExpands event store streamId/aggregateId unions
apps/server/src/orchestration/Services/ProjectionSnapshotQuery.tsAdds getSyncedClientPreferences to query interface
apps/server/src/orchestration/projector.tsProjects LWW preferences into read model
apps/server/src/orchestration/Normalizer.tsClamps future-skewed preference stamps
apps/server/src/orchestration/Normalizer.test.tsTests future-skew clamp logic
apps/server/src/orchestration/Layers/ProjectionPipeline.tsAdds SQL projector for preferences singleton
apps/server/src/orchestration/Layers/ProjectionPipeline.test.tsTests deterministic rebuild/out-of-order handling
apps/server/src/orchestration/Layers/OrchestrationEngine.tsRoutes preference commands to singleton aggregate
apps/server/src/orchestration/Layers/OrchestrationEngine.test.tsEnd-to-end receipts/projection behavior for preferences
apps/server/src/orchestration/decider.tsEmits client-preferences.patched events
apps/server/src/checkpointing/CheckpointDiffQuery.test.tsUpdates projection snapshot query seam shape
apps/server/src/auth/RpcAuthorization.tsAdds auth scopes for new preference RPCs
apps/mobile/src/state/use-thread-outbox-drain.tsReads live plan-mode preference during outbox drain
apps/mobile/src/state/use-thread-composer-state.tsForces interactionMode default when plan mode disabled
apps/mobile/src/state/thread-outbox.test.tsUpdates tests for plan-mode-aware queued sends
apps/mobile/src/state/thread-outbox-model.tsAdds plan-mode-aware queued settings + send decision helper
apps/mobile/src/state/synced-client-preferences.tsMobile worker to reconcile/fan-out synced preferences
apps/mobile/src/state/synced-client-preferences.test.tsTests reconciliation + fan-out + normalization behaviors
apps/mobile/src/state/synced-client-preferences-model.tsPure reconciliation/write helpers for mobile preferences
apps/mobile/src/Stack.tsxAdds synced-preferences worker; simplifies header styling
apps/mobile/src/persistence/mobile-preferences.tsPersists appearance/theme/imported themes + LWW stamp
apps/mobile/src/lib/storage.test.tsTests preference persistence + imported theme removal fallback
apps/mobile/src/lib/splashConfig.tsScheme-neutral splash config helper
apps/mobile/src/lib/splashConfig.test.tsTests scheme-neutral splash config
apps/mobile/src/lib/mobileThemeFile.test.tsTests ThemeFile parsing/caps/normalization
apps/mobile/src/lib/mobileTheme.test.tsTests token mapping + built-in parity with global.css
apps/mobile/src/features/threads/use-plan-mode-enabled.tsHook for resolved plan-mode preference state
apps/mobile/src/features/threads/ThreadFeed.tsxSwitches markdown/review theming to appearance preferences
apps/mobile/src/features/threads/ThreadComposer.tsxPlan-mode slash gating + submit-time parsing + safer replacement
apps/mobile/src/features/threads/plan-mode.tsShared plan-mode helpers (slash/menu/submit/interactionMode)
apps/mobile/src/features/threads/plan-mode.test.tsTests plan-mode helper behaviors
apps/mobile/src/features/threads/NewTaskDraftScreen.tsxAdds plan-mode slash popover + submit parsing + in-flight guard
apps/mobile/src/features/threads/new-task-submit.tsExtracts new-task submit eligibility/selection helpers
apps/mobile/src/features/threads/new-task-submit.test.tsTests new-task submit helpers
apps/mobile/src/features/threads/new-task-flow-provider.tsxUses new plan-mode preference hook + interactionMode resolver
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsxThemes terminal via nativeSurfaceColors + correct alpha
apps/mobile/src/features/terminal/terminalTheme.tsAdds optional native-surface overrides to terminal theme
apps/mobile/src/features/terminal/terminalTheme.test.tsTests terminal overrides + alpha ordering stability
apps/mobile/src/features/terminal/NativeTerminalSurface.tsxAllows appearanceScheme override for fallback/native surface
apps/mobile/src/features/settings/SettingsRouteScreen.tsxPlan mode toggle now uses synced preference updates
apps/mobile/src/features/settings/SettingsAppearanceRouteScreen.tsxAdds ColorSchemeAppearanceSection to Appearance screen
apps/mobile/src/features/settings/appearance/sections/ColorSchemeAppearanceSection.tsxNew UI: mode picker, theme cards, import/remove flows
apps/mobile/src/features/settings/appearance/AppearancePreferencesProvider.tsxApplies theme variables + supports import/remove + syncing
apps/mobile/src/features/review/useNativeReviewDiffBridge.tsThemes native review diff via nativeSurfaceColors
apps/mobile/src/features/review/ReviewSheet.tsxUses effectiveColorScheme instead of system scheme
apps/mobile/src/features/review/nativeReviewDiffAdapter.tsAdds native theme overrides application helper
apps/mobile/src/features/review/nativeReviewDiffAdapter.test.tsTests stable defaults + override behavior + alpha serialization
apps/mobile/src/features/files/SourceFileSurface.tsxThemes native source surface via shared theme helper
apps/mobile/src/features/files/nativeSourceFileAdapter.tsReuses review theme creation for source surfaces
apps/mobile/src/features/files/nativeSourceFileAdapter.test.tsTests stable defaults + override passthrough
apps/mobile/src/components/AppSymbol.tsxAdds Android mapping for “hammer” symbol
apps/mobile/src/App.tsxNavigation theme + status bar driven by appearance preferences
apps/mobile/plugins/withIosSplashScreenInlineBackground.cjsInlines storyboard splash background color on iOS
apps/mobile/modules/t3-terminal/ios/T3TerminalView.swiftFixes CSS #RRGGBBAA parsing for iOS terminal colors
apps/mobile/modules/t3-terminal/android/.../T3TerminalView.ktFixes CSS #RRGGBBAA parsing for Android terminal colors
apps/mobile/modules/t3-review-diff/android/.../T3ReviewDiffView.ktFixes CSS #RRGGBBAA parsing for Android review colors
apps/mobile/global.cssAdds missing markdown inline-code token variables
apps/mobile/app.config.tsSwitches to scheme-neutral splash + iOS storyboard mod

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threaddocs/README.md
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
@macroscopeapp

macroscopeappBot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Skipped

Macroscope did not run approvability analysis for this PR. Diff is too large for automated approval analysis, so this PR cannot be approved automatically.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadpackages/contracts/src/orchestration.ts
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/mobile/src/features/threads/ThreadComposer.tsx Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/Stack.tsx
Comment threadapps/web/src/hooks/useSettings.ts
Comment threadapps/mobile/plugins/withIosSplashScreenInlineBackground.cjs Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts
Comment threadapps/mobile/src/Stack.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts
Comment threadapps/web/src/components/settings/ThemeEditorHost.tsx
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/web/src/hooks/synced-client-preferences.ts Outdated

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 83c4f0e. Configure here.

Comment threadapps/web/src/hooks/synced-client-preferences.ts
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The author acknowledges that built-in mobile themes already shipped in #6619. The remaining proposal changes 110 files.

@t3dotggt3dotgg closed this Aug 23, 2026
@amanthanvi
amanthanvi deleted the t3code/feat-6405 branch August 26, 2026 23:09
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Mobile: themes and custom themes — parity with the desktop theme system

3 participants

@amanthanvi@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mobile): themes with appearance override and custom import - #6617

Closed
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405
Closed

feat(mobile): themes with appearance override and custom import#6617
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405

Conversation

@amanthanvi

@amanthanviamanthanvi commented Aug 14, 2026

Copy link
Copy Markdown

Current main already includes the six built-in themes from #6619. This refreshed branch extends that architecture with mobile ThemeFile v1 import/removal, shared web/mobile parsing and canonicalization, independent cross-client synchronization for appearance mode plus light and dark theme selections, native-surface theming, and the CSS alpha-decoder fixes. Custom theme libraries remain device-local by design; synced selections fall back safely when a referenced custom theme is unavailable on another device.

The refresh preserves main's shared palettes, per-appearance theme-pair model, ThemeAppearanceSection, and atomic layout-effect application instead of carrying the original duplicate palette, parser, and single-theme state model.

Depends on #6614 for the synced-preferences transport and durability foundation; this branch contains its refreshed commits.

Closes#6405

Import and native-surface examples: themed native terminal · paste-import sheet · imported theme applied.

Implemented by GPT-5.6 Sol (xhigh) via the Codex CLI, orchestrated and reviewed by Claude Fable 5 (Claude Code), with Claude Opus 5 run monitoring.


Note

Medium Risk
Synced preference reconciliation and composer gating affect send/start timing and cross-device plan mode; incorrect merge logic could flash wrong modes or block submission until hydration.

Overview
Extends mobile theming with ThemeFile v1 import (paste JSON, device-local library, remove with selection fallback) and wires imported palettes through appearance, terminal, review diff, and source views. Theme IDs are no longer limited to built-ins; resolution checks per-appearance availability for imported variants.

Synced client preferences on mobile now reconcile plan mode, appearance mode, and light/dark theme selections against connected environments using per-field LWW stamps, optimistic updates, and persistReconciledPreferences so stale server patches do not overwrite newer local writes. Settings appearance changes publish through synced preference hooks instead of only local themeMode / theme pair patches.

Legacy Plan Mode moves from a purely local toggle to the synced planModeEnabled flag. Composers gain shared slash-command handling (/plan, /default when enabled), submit-time mode switching, and send/start gating until reconciliation completes (useLegacyPlanModeState). New-task and thread composers use extracted helpers for eligibility and trigger replacement.

Native CSS hex parsing (#RRGGBB / #RRGGBBAA) is added for terminal and review-diff on Android/iOS. iOS splash uses a scheme-neutral background plus a config plugin that inlines Expo’s generated storyboard color. Markdown CSS adds dedicated inline-code text tokens for light/dark.

Reviewed by Cursor Bugbot for commit 83c4f0e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add syncedClientPreferencesPatch RPC and mobile custom theme imports

  • Adds synced client preferences (plan mode, appearance mode, theme IDs) using the new WebSocket RPC, server decider, projector, and migration 041
  • Adds mobile custom theme importing from JSON and applies imported themes to terminal, review diff, and settings surfaces
  • Moves mobile and web plan mode toggles to the synced preferences system and defers composer actions until the preference loads
  • Behavioral Change: RpcAuthorization requires AuthOrchestrationOperateScope for syncedClientPreferencesPatch; invalid backgroundColorHex assignments on iOS T3TerminalView are rejected and reverted instead of defaulting to 0
  • Risk: New database migration 041_ProjectionSyncedClientPreferences creates projection_synced_client_preferences and seeds its projection state

Macroscope summarized 9c3877a.

CopilotAI lite review requested due to automatic review settings August 14, 2026 15:00
@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 14, 2026
@coderabbitai

coderabbitaiBot commented Aug 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a8d51415-caaa-47a7-9fcc-763320f3c4ad

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:XXL 1,000+ changed lines (additions + deletions). label Aug 14, 2026
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/mobile/src/state/use-thread-outbox-drain.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a mobile theming system with an Appearance override (System/Light/Dark), built-in theme picker, and device-local custom theme import, while introducing a synced-client-preferences contract + server plumbing so appearance mode + selected theme id (and legacy plan mode) can converge across web/desktop/mobile per environment.

Changes:

  • Introduces SyncedClientPreferences (schema + RPCs) and threads it through orchestration read models, shell stream, receipts, event store, projector, and a new SQLite projection/migration.
  • Implements mobile Appearance “Color scheme” UI with built-in themes, ThemeFile v1 JSON paste-import, device-local theme library persistence, and theming applied across markdown/review/source/terminal surfaces.
  • Fixes native CSS hex alpha decoding (iOS/Android) and switches to a scheme-neutral splash configuration.

Reviewed changes

Copilot reviewed 86 out of 86 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
packages/contracts/src/syncedClientPreferences.tsNew schemas for synced client preferences + patch requests
packages/contracts/src/settings.test.tsContract tests for synced preferences decoding/patch rules
packages/contracts/src/rpc.tsAdds syncedClientPreferences get/patch WS RPCs
packages/contracts/src/orchestration.tsExtends orchestration models/events/commands for preferences
packages/contracts/src/orchestration.test.tsEnsures legacy shell decoding + patch validation
packages/contracts/src/index.tsRe-exports syncedClientPreferences
packages/client-runtime/src/state/shellReducer.tsApplies client-preferences shell stream updates
packages/client-runtime/src/state/shellReducer.test.tsTests shellReducer preference updates
packages/client-runtime/src/state/server.tsAdds environment RPC command for patching preferences
docs/user/plan-mode.mdNew user doc for Plan Mode (Legacy) sync behavior
docs/user/appearance.mdNew user doc for appearance + themes + import limits
docs/README.mdLinks new appearance doc from docs index
apps/web/src/components/settings/ThemeEditorHost.tsxSwitches web theme editor to synced-theme hook
apps/web/src/components/settings/SettingsPanels.tsxSwitches appearance panel/restore to synced-theme hook
apps/server/src/ws.tsStreams preference updates incrementally + adds RPC handlers
apps/server/src/serverRuntimeStartup.test.tsUpdates projection snapshot query seam shape
apps/server/src/server.test.tsTests incremental preference patch streaming behavior
apps/server/src/provider/Layers/ProviderSessionReaper.test.tsUpdates projection snapshot query seam shape
apps/server/src/project/ProjectSetupScriptRunner.test.tsUpdates projection snapshot query seam shape
apps/server/src/persistence/Services/OrchestrationCommandReceipts.tsExpands receipt aggregateId union for preferences
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.tsNew projection table + projector cursor seed
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.test.tsTests migration creates projection + seeds cursor
apps/server/src/persistence/Migrations.tsRegisters migration 041
apps/server/src/persistence/Layers/OrchestrationEventStore.tsExpands event store streamId/aggregateId unions
apps/server/src/orchestration/Services/ProjectionSnapshotQuery.tsAdds getSyncedClientPreferences to query interface
apps/server/src/orchestration/projector.tsProjects LWW preferences into read model
apps/server/src/orchestration/Normalizer.tsClamps future-skewed preference stamps
apps/server/src/orchestration/Normalizer.test.tsTests future-skew clamp logic
apps/server/src/orchestration/Layers/ProjectionPipeline.tsAdds SQL projector for preferences singleton
apps/server/src/orchestration/Layers/ProjectionPipeline.test.tsTests deterministic rebuild/out-of-order handling
apps/server/src/orchestration/Layers/OrchestrationEngine.tsRoutes preference commands to singleton aggregate
apps/server/src/orchestration/Layers/OrchestrationEngine.test.tsEnd-to-end receipts/projection behavior for preferences
apps/server/src/orchestration/decider.tsEmits client-preferences.patched events
apps/server/src/checkpointing/CheckpointDiffQuery.test.tsUpdates projection snapshot query seam shape
apps/server/src/auth/RpcAuthorization.tsAdds auth scopes for new preference RPCs
apps/mobile/src/state/use-thread-outbox-drain.tsReads live plan-mode preference during outbox drain
apps/mobile/src/state/use-thread-composer-state.tsForces interactionMode default when plan mode disabled
apps/mobile/src/state/thread-outbox.test.tsUpdates tests for plan-mode-aware queued sends
apps/mobile/src/state/thread-outbox-model.tsAdds plan-mode-aware queued settings + send decision helper
apps/mobile/src/state/synced-client-preferences.tsMobile worker to reconcile/fan-out synced preferences
apps/mobile/src/state/synced-client-preferences.test.tsTests reconciliation + fan-out + normalization behaviors
apps/mobile/src/state/synced-client-preferences-model.tsPure reconciliation/write helpers for mobile preferences
apps/mobile/src/Stack.tsxAdds synced-preferences worker; simplifies header styling
apps/mobile/src/persistence/mobile-preferences.tsPersists appearance/theme/imported themes + LWW stamp
apps/mobile/src/lib/storage.test.tsTests preference persistence + imported theme removal fallback
apps/mobile/src/lib/splashConfig.tsScheme-neutral splash config helper
apps/mobile/src/lib/splashConfig.test.tsTests scheme-neutral splash config
apps/mobile/src/lib/mobileThemeFile.test.tsTests ThemeFile parsing/caps/normalization
apps/mobile/src/lib/mobileTheme.test.tsTests token mapping + built-in parity with global.css
apps/mobile/src/features/threads/use-plan-mode-enabled.tsHook for resolved plan-mode preference state
apps/mobile/src/features/threads/ThreadFeed.tsxSwitches markdown/review theming to appearance preferences
apps/mobile/src/features/threads/ThreadComposer.tsxPlan-mode slash gating + submit-time parsing + safer replacement
apps/mobile/src/features/threads/plan-mode.tsShared plan-mode helpers (slash/menu/submit/interactionMode)
apps/mobile/src/features/threads/plan-mode.test.tsTests plan-mode helper behaviors
apps/mobile/src/features/threads/NewTaskDraftScreen.tsxAdds plan-mode slash popover + submit parsing + in-flight guard
apps/mobile/src/features/threads/new-task-submit.tsExtracts new-task submit eligibility/selection helpers
apps/mobile/src/features/threads/new-task-submit.test.tsTests new-task submit helpers
apps/mobile/src/features/threads/new-task-flow-provider.tsxUses new plan-mode preference hook + interactionMode resolver
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsxThemes terminal via nativeSurfaceColors + correct alpha
apps/mobile/src/features/terminal/terminalTheme.tsAdds optional native-surface overrides to terminal theme
apps/mobile/src/features/terminal/terminalTheme.test.tsTests terminal overrides + alpha ordering stability
apps/mobile/src/features/terminal/NativeTerminalSurface.tsxAllows appearanceScheme override for fallback/native surface
apps/mobile/src/features/settings/SettingsRouteScreen.tsxPlan mode toggle now uses synced preference updates
apps/mobile/src/features/settings/SettingsAppearanceRouteScreen.tsxAdds ColorSchemeAppearanceSection to Appearance screen
apps/mobile/src/features/settings/appearance/sections/ColorSchemeAppearanceSection.tsxNew UI: mode picker, theme cards, import/remove flows
apps/mobile/src/features/settings/appearance/AppearancePreferencesProvider.tsxApplies theme variables + supports import/remove + syncing
apps/mobile/src/features/review/useNativeReviewDiffBridge.tsThemes native review diff via nativeSurfaceColors
apps/mobile/src/features/review/ReviewSheet.tsxUses effectiveColorScheme instead of system scheme
apps/mobile/src/features/review/nativeReviewDiffAdapter.tsAdds native theme overrides application helper
apps/mobile/src/features/review/nativeReviewDiffAdapter.test.tsTests stable defaults + override behavior + alpha serialization
apps/mobile/src/features/files/SourceFileSurface.tsxThemes native source surface via shared theme helper
apps/mobile/src/features/files/nativeSourceFileAdapter.tsReuses review theme creation for source surfaces
apps/mobile/src/features/files/nativeSourceFileAdapter.test.tsTests stable defaults + override passthrough
apps/mobile/src/components/AppSymbol.tsxAdds Android mapping for “hammer” symbol
apps/mobile/src/App.tsxNavigation theme + status bar driven by appearance preferences
apps/mobile/plugins/withIosSplashScreenInlineBackground.cjsInlines storyboard splash background color on iOS
apps/mobile/modules/t3-terminal/ios/T3TerminalView.swiftFixes CSS #RRGGBBAA parsing for iOS terminal colors
apps/mobile/modules/t3-terminal/android/.../T3TerminalView.ktFixes CSS #RRGGBBAA parsing for Android terminal colors
apps/mobile/modules/t3-review-diff/android/.../T3ReviewDiffView.ktFixes CSS #RRGGBBAA parsing for Android review colors
apps/mobile/global.cssAdds missing markdown inline-code token variables
apps/mobile/app.config.tsSwitches to scheme-neutral splash + iOS storyboard mod

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threaddocs/README.md
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
@macroscopeapp

macroscopeappBot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Skipped

Macroscope did not run approvability analysis for this PR. Diff is too large for automated approval analysis, so this PR cannot be approved automatically.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadpackages/contracts/src/orchestration.ts
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/mobile/src/features/threads/ThreadComposer.tsx Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/Stack.tsx
Comment threadapps/web/src/hooks/useSettings.ts
Comment threadapps/mobile/plugins/withIosSplashScreenInlineBackground.cjs Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts
Comment threadapps/mobile/src/Stack.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts
Comment threadapps/web/src/components/settings/ThemeEditorHost.tsx
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/web/src/hooks/synced-client-preferences.ts Outdated

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 83c4f0e. Configure here.

Comment threadapps/web/src/hooks/synced-client-preferences.ts
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The author acknowledges that built-in mobile themes already shipped in #6619. The remaining proposal changes 110 files.

@t3dotggt3dotgg closed this Aug 23, 2026
@amanthanvi
amanthanvi deleted the t3code/feat-6405 branch August 26, 2026 23:09
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Mobile: themes and custom themes — parity with the desktop theme system

3 participants

@amanthanvi@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(mobile): themes with appearance override and custom import - #6617

Closed
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405
Closed

feat(mobile): themes with appearance override and custom import#6617
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405

Conversation

@amanthanvi

@amanthanviamanthanvi commented Aug 14, 2026

Copy link
Copy Markdown

Current main already includes the six built-in themes from #6619. This refreshed branch extends that architecture with mobile ThemeFile v1 import/removal, shared web/mobile parsing and canonicalization, independent cross-client synchronization for appearance mode plus light and dark theme selections, native-surface theming, and the CSS alpha-decoder fixes. Custom theme libraries remain device-local by design; synced selections fall back safely when a referenced custom theme is unavailable on another device.

The refresh preserves main's shared palettes, per-appearance theme-pair model, ThemeAppearanceSection, and atomic layout-effect application instead of carrying the original duplicate palette, parser, and single-theme state model.

Depends on #6614 for the synced-preferences transport and durability foundation; this branch contains its refreshed commits.

Closes#6405

Import and native-surface examples: themed native terminal · paste-import sheet · imported theme applied.

Implemented by GPT-5.6 Sol (xhigh) via the Codex CLI, orchestrated and reviewed by Claude Fable 5 (Claude Code), with Claude Opus 5 run monitoring.


Note

Medium Risk
Synced preference reconciliation and composer gating affect send/start timing and cross-device plan mode; incorrect merge logic could flash wrong modes or block submission until hydration.

Overview
Extends mobile theming with ThemeFile v1 import (paste JSON, device-local library, remove with selection fallback) and wires imported palettes through appearance, terminal, review diff, and source views. Theme IDs are no longer limited to built-ins; resolution checks per-appearance availability for imported variants.

Synced client preferences on mobile now reconcile plan mode, appearance mode, and light/dark theme selections against connected environments using per-field LWW stamps, optimistic updates, and persistReconciledPreferences so stale server patches do not overwrite newer local writes. Settings appearance changes publish through synced preference hooks instead of only local themeMode / theme pair patches.

Legacy Plan Mode moves from a purely local toggle to the synced planModeEnabled flag. Composers gain shared slash-command handling (/plan, /default when enabled), submit-time mode switching, and send/start gating until reconciliation completes (useLegacyPlanModeState). New-task and thread composers use extracted helpers for eligibility and trigger replacement.

Native CSS hex parsing (#RRGGBB / #RRGGBBAA) is added for terminal and review-diff on Android/iOS. iOS splash uses a scheme-neutral background plus a config plugin that inlines Expo’s generated storyboard color. Markdown CSS adds dedicated inline-code text tokens for light/dark.

Reviewed by Cursor Bugbot for commit 83c4f0e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add syncedClientPreferencesPatch RPC and mobile custom theme imports

  • Adds synced client preferences (plan mode, appearance mode, theme IDs) using the new WebSocket RPC, server decider, projector, and migration 041
  • Adds mobile custom theme importing from JSON and applies imported themes to terminal, review diff, and settings surfaces
  • Moves mobile and web plan mode toggles to the synced preferences system and defers composer actions until the preference loads
  • Behavioral Change: RpcAuthorization requires AuthOrchestrationOperateScope for syncedClientPreferencesPatch; invalid backgroundColorHex assignments on iOS T3TerminalView are rejected and reverted instead of defaulting to 0
  • Risk: New database migration 041_ProjectionSyncedClientPreferences creates projection_synced_client_preferences and seeds its projection state

Macroscope summarized 9c3877a.

CopilotAI lite review requested due to automatic review settings August 14, 2026 15:00
@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 14, 2026
@coderabbitai

coderabbitaiBot commented Aug 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a8d51415-caaa-47a7-9fcc-763320f3c4ad

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:XXL 1,000+ changed lines (additions + deletions). label Aug 14, 2026
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/mobile/src/state/use-thread-outbox-drain.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a mobile theming system with an Appearance override (System/Light/Dark), built-in theme picker, and device-local custom theme import, while introducing a synced-client-preferences contract + server plumbing so appearance mode + selected theme id (and legacy plan mode) can converge across web/desktop/mobile per environment.

Changes:

  • Introduces SyncedClientPreferences (schema + RPCs) and threads it through orchestration read models, shell stream, receipts, event store, projector, and a new SQLite projection/migration.
  • Implements mobile Appearance “Color scheme” UI with built-in themes, ThemeFile v1 JSON paste-import, device-local theme library persistence, and theming applied across markdown/review/source/terminal surfaces.
  • Fixes native CSS hex alpha decoding (iOS/Android) and switches to a scheme-neutral splash configuration.

Reviewed changes

Copilot reviewed 86 out of 86 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
packages/contracts/src/syncedClientPreferences.tsNew schemas for synced client preferences + patch requests
packages/contracts/src/settings.test.tsContract tests for synced preferences decoding/patch rules
packages/contracts/src/rpc.tsAdds syncedClientPreferences get/patch WS RPCs
packages/contracts/src/orchestration.tsExtends orchestration models/events/commands for preferences
packages/contracts/src/orchestration.test.tsEnsures legacy shell decoding + patch validation
packages/contracts/src/index.tsRe-exports syncedClientPreferences
packages/client-runtime/src/state/shellReducer.tsApplies client-preferences shell stream updates
packages/client-runtime/src/state/shellReducer.test.tsTests shellReducer preference updates
packages/client-runtime/src/state/server.tsAdds environment RPC command for patching preferences
docs/user/plan-mode.mdNew user doc for Plan Mode (Legacy) sync behavior
docs/user/appearance.mdNew user doc for appearance + themes + import limits
docs/README.mdLinks new appearance doc from docs index
apps/web/src/components/settings/ThemeEditorHost.tsxSwitches web theme editor to synced-theme hook
apps/web/src/components/settings/SettingsPanels.tsxSwitches appearance panel/restore to synced-theme hook
apps/server/src/ws.tsStreams preference updates incrementally + adds RPC handlers
apps/server/src/serverRuntimeStartup.test.tsUpdates projection snapshot query seam shape
apps/server/src/server.test.tsTests incremental preference patch streaming behavior
apps/server/src/provider/Layers/ProviderSessionReaper.test.tsUpdates projection snapshot query seam shape
apps/server/src/project/ProjectSetupScriptRunner.test.tsUpdates projection snapshot query seam shape
apps/server/src/persistence/Services/OrchestrationCommandReceipts.tsExpands receipt aggregateId union for preferences
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.tsNew projection table + projector cursor seed
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.test.tsTests migration creates projection + seeds cursor
apps/server/src/persistence/Migrations.tsRegisters migration 041
apps/server/src/persistence/Layers/OrchestrationEventStore.tsExpands event store streamId/aggregateId unions
apps/server/src/orchestration/Services/ProjectionSnapshotQuery.tsAdds getSyncedClientPreferences to query interface
apps/server/src/orchestration/projector.tsProjects LWW preferences into read model
apps/server/src/orchestration/Normalizer.tsClamps future-skewed preference stamps
apps/server/src/orchestration/Normalizer.test.tsTests future-skew clamp logic
apps/server/src/orchestration/Layers/ProjectionPipeline.tsAdds SQL projector for preferences singleton
apps/server/src/orchestration/Layers/ProjectionPipeline.test.tsTests deterministic rebuild/out-of-order handling
apps/server/src/orchestration/Layers/OrchestrationEngine.tsRoutes preference commands to singleton aggregate
apps/server/src/orchestration/Layers/OrchestrationEngine.test.tsEnd-to-end receipts/projection behavior for preferences
apps/server/src/orchestration/decider.tsEmits client-preferences.patched events
apps/server/src/checkpointing/CheckpointDiffQuery.test.tsUpdates projection snapshot query seam shape
apps/server/src/auth/RpcAuthorization.tsAdds auth scopes for new preference RPCs
apps/mobile/src/state/use-thread-outbox-drain.tsReads live plan-mode preference during outbox drain
apps/mobile/src/state/use-thread-composer-state.tsForces interactionMode default when plan mode disabled
apps/mobile/src/state/thread-outbox.test.tsUpdates tests for plan-mode-aware queued sends
apps/mobile/src/state/thread-outbox-model.tsAdds plan-mode-aware queued settings + send decision helper
apps/mobile/src/state/synced-client-preferences.tsMobile worker to reconcile/fan-out synced preferences
apps/mobile/src/state/synced-client-preferences.test.tsTests reconciliation + fan-out + normalization behaviors
apps/mobile/src/state/synced-client-preferences-model.tsPure reconciliation/write helpers for mobile preferences
apps/mobile/src/Stack.tsxAdds synced-preferences worker; simplifies header styling
apps/mobile/src/persistence/mobile-preferences.tsPersists appearance/theme/imported themes + LWW stamp
apps/mobile/src/lib/storage.test.tsTests preference persistence + imported theme removal fallback
apps/mobile/src/lib/splashConfig.tsScheme-neutral splash config helper
apps/mobile/src/lib/splashConfig.test.tsTests scheme-neutral splash config
apps/mobile/src/lib/mobileThemeFile.test.tsTests ThemeFile parsing/caps/normalization
apps/mobile/src/lib/mobileTheme.test.tsTests token mapping + built-in parity with global.css
apps/mobile/src/features/threads/use-plan-mode-enabled.tsHook for resolved plan-mode preference state
apps/mobile/src/features/threads/ThreadFeed.tsxSwitches markdown/review theming to appearance preferences
apps/mobile/src/features/threads/ThreadComposer.tsxPlan-mode slash gating + submit-time parsing + safer replacement
apps/mobile/src/features/threads/plan-mode.tsShared plan-mode helpers (slash/menu/submit/interactionMode)
apps/mobile/src/features/threads/plan-mode.test.tsTests plan-mode helper behaviors
apps/mobile/src/features/threads/NewTaskDraftScreen.tsxAdds plan-mode slash popover + submit parsing + in-flight guard
apps/mobile/src/features/threads/new-task-submit.tsExtracts new-task submit eligibility/selection helpers
apps/mobile/src/features/threads/new-task-submit.test.tsTests new-task submit helpers
apps/mobile/src/features/threads/new-task-flow-provider.tsxUses new plan-mode preference hook + interactionMode resolver
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsxThemes terminal via nativeSurfaceColors + correct alpha
apps/mobile/src/features/terminal/terminalTheme.tsAdds optional native-surface overrides to terminal theme
apps/mobile/src/features/terminal/terminalTheme.test.tsTests terminal overrides + alpha ordering stability
apps/mobile/src/features/terminal/NativeTerminalSurface.tsxAllows appearanceScheme override for fallback/native surface
apps/mobile/src/features/settings/SettingsRouteScreen.tsxPlan mode toggle now uses synced preference updates
apps/mobile/src/features/settings/SettingsAppearanceRouteScreen.tsxAdds ColorSchemeAppearanceSection to Appearance screen
apps/mobile/src/features/settings/appearance/sections/ColorSchemeAppearanceSection.tsxNew UI: mode picker, theme cards, import/remove flows
apps/mobile/src/features/settings/appearance/AppearancePreferencesProvider.tsxApplies theme variables + supports import/remove + syncing
apps/mobile/src/features/review/useNativeReviewDiffBridge.tsThemes native review diff via nativeSurfaceColors
apps/mobile/src/features/review/ReviewSheet.tsxUses effectiveColorScheme instead of system scheme
apps/mobile/src/features/review/nativeReviewDiffAdapter.tsAdds native theme overrides application helper
apps/mobile/src/features/review/nativeReviewDiffAdapter.test.tsTests stable defaults + override behavior + alpha serialization
apps/mobile/src/features/files/SourceFileSurface.tsxThemes native source surface via shared theme helper
apps/mobile/src/features/files/nativeSourceFileAdapter.tsReuses review theme creation for source surfaces
apps/mobile/src/features/files/nativeSourceFileAdapter.test.tsTests stable defaults + override passthrough
apps/mobile/src/components/AppSymbol.tsxAdds Android mapping for “hammer” symbol
apps/mobile/src/App.tsxNavigation theme + status bar driven by appearance preferences
apps/mobile/plugins/withIosSplashScreenInlineBackground.cjsInlines storyboard splash background color on iOS
apps/mobile/modules/t3-terminal/ios/T3TerminalView.swiftFixes CSS #RRGGBBAA parsing for iOS terminal colors
apps/mobile/modules/t3-terminal/android/.../T3TerminalView.ktFixes CSS #RRGGBBAA parsing for Android terminal colors
apps/mobile/modules/t3-review-diff/android/.../T3ReviewDiffView.ktFixes CSS #RRGGBBAA parsing for Android review colors
apps/mobile/global.cssAdds missing markdown inline-code token variables
apps/mobile/app.config.tsSwitches to scheme-neutral splash + iOS storyboard mod

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threaddocs/README.md
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
@macroscopeapp

macroscopeappBot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Skipped

Macroscope did not run approvability analysis for this PR. Diff is too large for automated approval analysis, so this PR cannot be approved automatically.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadpackages/contracts/src/orchestration.ts
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/mobile/src/features/threads/ThreadComposer.tsx Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/Stack.tsx
Comment threadapps/web/src/hooks/useSettings.ts
Comment threadapps/mobile/plugins/withIosSplashScreenInlineBackground.cjs Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts
Comment threadapps/mobile/src/Stack.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts
Comment threadapps/web/src/components/settings/ThemeEditorHost.tsx
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/web/src/hooks/synced-client-preferences.ts Outdated

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 83c4f0e. Configure here.

Comment threadapps/web/src/hooks/synced-client-preferences.ts
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The author acknowledges that built-in mobile themes already shipped in #6619. The remaining proposal changes 110 files.

@t3dotggt3dotgg closed this Aug 23, 2026
@amanthanvi
amanthanvi deleted the t3code/feat-6405 branch August 26, 2026 23:09
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Mobile: themes and custom themes — parity with the desktop theme system

3 participants

@amanthanvi@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(mobile): themes with appearance override and custom import - #6617

Closed
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405
Closed

feat(mobile): themes with appearance override and custom import#6617
amanthanvi wants to merge 60 commits into
pingdotgg:mainfrom
amanthanvi:t3code/feat-6405

Conversation

@amanthanvi

@amanthanviamanthanvi commented Aug 14, 2026

Copy link
Copy Markdown

Current main already includes the six built-in themes from #6619. This refreshed branch extends that architecture with mobile ThemeFile v1 import/removal, shared web/mobile parsing and canonicalization, independent cross-client synchronization for appearance mode plus light and dark theme selections, native-surface theming, and the CSS alpha-decoder fixes. Custom theme libraries remain device-local by design; synced selections fall back safely when a referenced custom theme is unavailable on another device.

The refresh preserves main's shared palettes, per-appearance theme-pair model, ThemeAppearanceSection, and atomic layout-effect application instead of carrying the original duplicate palette, parser, and single-theme state model.

Depends on #6614 for the synced-preferences transport and durability foundation; this branch contains its refreshed commits.

Closes#6405

Import and native-surface examples: themed native terminal · paste-import sheet · imported theme applied.

Implemented by GPT-5.6 Sol (xhigh) via the Codex CLI, orchestrated and reviewed by Claude Fable 5 (Claude Code), with Claude Opus 5 run monitoring.


Note

Medium Risk
Synced preference reconciliation and composer gating affect send/start timing and cross-device plan mode; incorrect merge logic could flash wrong modes or block submission until hydration.

Overview
Extends mobile theming with ThemeFile v1 import (paste JSON, device-local library, remove with selection fallback) and wires imported palettes through appearance, terminal, review diff, and source views. Theme IDs are no longer limited to built-ins; resolution checks per-appearance availability for imported variants.

Synced client preferences on mobile now reconcile plan mode, appearance mode, and light/dark theme selections against connected environments using per-field LWW stamps, optimistic updates, and persistReconciledPreferences so stale server patches do not overwrite newer local writes. Settings appearance changes publish through synced preference hooks instead of only local themeMode / theme pair patches.

Legacy Plan Mode moves from a purely local toggle to the synced planModeEnabled flag. Composers gain shared slash-command handling (/plan, /default when enabled), submit-time mode switching, and send/start gating until reconciliation completes (useLegacyPlanModeState). New-task and thread composers use extracted helpers for eligibility and trigger replacement.

Native CSS hex parsing (#RRGGBB / #RRGGBBAA) is added for terminal and review-diff on Android/iOS. iOS splash uses a scheme-neutral background plus a config plugin that inlines Expo’s generated storyboard color. Markdown CSS adds dedicated inline-code text tokens for light/dark.

Reviewed by Cursor Bugbot for commit 83c4f0e. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Add syncedClientPreferencesPatch RPC and mobile custom theme imports

  • Adds synced client preferences (plan mode, appearance mode, theme IDs) using the new WebSocket RPC, server decider, projector, and migration 041
  • Adds mobile custom theme importing from JSON and applies imported themes to terminal, review diff, and settings surfaces
  • Moves mobile and web plan mode toggles to the synced preferences system and defers composer actions until the preference loads
  • Behavioral Change: RpcAuthorization requires AuthOrchestrationOperateScope for syncedClientPreferencesPatch; invalid backgroundColorHex assignments on iOS T3TerminalView are rejected and reverted instead of defaulting to 0
  • Risk: New database migration 041_ProjectionSyncedClientPreferences creates projection_synced_client_preferences and seeds its projection state

Macroscope summarized 9c3877a.

CopilotAI lite review requested due to automatic review settings August 14, 2026 15:00
@github-actionsgithub-actionsBot added the vouch:unvouched PR author is not yet trusted in the VOUCHED list. label Aug 14, 2026
@coderabbitai

coderabbitaiBot commented Aug 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a8d51415-caaa-47a7-9fcc-763320f3c4ad

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added the size:XXL 1,000+ changed lines (additions + deletions). label Aug 14, 2026
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/mobile/src/state/use-thread-outbox-drain.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a mobile theming system with an Appearance override (System/Light/Dark), built-in theme picker, and device-local custom theme import, while introducing a synced-client-preferences contract + server plumbing so appearance mode + selected theme id (and legacy plan mode) can converge across web/desktop/mobile per environment.

Changes:

  • Introduces SyncedClientPreferences (schema + RPCs) and threads it through orchestration read models, shell stream, receipts, event store, projector, and a new SQLite projection/migration.
  • Implements mobile Appearance “Color scheme” UI with built-in themes, ThemeFile v1 JSON paste-import, device-local theme library persistence, and theming applied across markdown/review/source/terminal surfaces.
  • Fixes native CSS hex alpha decoding (iOS/Android) and switches to a scheme-neutral splash configuration.

Reviewed changes

Copilot reviewed 86 out of 86 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
packages/contracts/src/syncedClientPreferences.tsNew schemas for synced client preferences + patch requests
packages/contracts/src/settings.test.tsContract tests for synced preferences decoding/patch rules
packages/contracts/src/rpc.tsAdds syncedClientPreferences get/patch WS RPCs
packages/contracts/src/orchestration.tsExtends orchestration models/events/commands for preferences
packages/contracts/src/orchestration.test.tsEnsures legacy shell decoding + patch validation
packages/contracts/src/index.tsRe-exports syncedClientPreferences
packages/client-runtime/src/state/shellReducer.tsApplies client-preferences shell stream updates
packages/client-runtime/src/state/shellReducer.test.tsTests shellReducer preference updates
packages/client-runtime/src/state/server.tsAdds environment RPC command for patching preferences
docs/user/plan-mode.mdNew user doc for Plan Mode (Legacy) sync behavior
docs/user/appearance.mdNew user doc for appearance + themes + import limits
docs/README.mdLinks new appearance doc from docs index
apps/web/src/components/settings/ThemeEditorHost.tsxSwitches web theme editor to synced-theme hook
apps/web/src/components/settings/SettingsPanels.tsxSwitches appearance panel/restore to synced-theme hook
apps/server/src/ws.tsStreams preference updates incrementally + adds RPC handlers
apps/server/src/serverRuntimeStartup.test.tsUpdates projection snapshot query seam shape
apps/server/src/server.test.tsTests incremental preference patch streaming behavior
apps/server/src/provider/Layers/ProviderSessionReaper.test.tsUpdates projection snapshot query seam shape
apps/server/src/project/ProjectSetupScriptRunner.test.tsUpdates projection snapshot query seam shape
apps/server/src/persistence/Services/OrchestrationCommandReceipts.tsExpands receipt aggregateId union for preferences
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.tsNew projection table + projector cursor seed
apps/server/src/persistence/Migrations/041_ProjectionSyncedClientPreferences.test.tsTests migration creates projection + seeds cursor
apps/server/src/persistence/Migrations.tsRegisters migration 041
apps/server/src/persistence/Layers/OrchestrationEventStore.tsExpands event store streamId/aggregateId unions
apps/server/src/orchestration/Services/ProjectionSnapshotQuery.tsAdds getSyncedClientPreferences to query interface
apps/server/src/orchestration/projector.tsProjects LWW preferences into read model
apps/server/src/orchestration/Normalizer.tsClamps future-skewed preference stamps
apps/server/src/orchestration/Normalizer.test.tsTests future-skew clamp logic
apps/server/src/orchestration/Layers/ProjectionPipeline.tsAdds SQL projector for preferences singleton
apps/server/src/orchestration/Layers/ProjectionPipeline.test.tsTests deterministic rebuild/out-of-order handling
apps/server/src/orchestration/Layers/OrchestrationEngine.tsRoutes preference commands to singleton aggregate
apps/server/src/orchestration/Layers/OrchestrationEngine.test.tsEnd-to-end receipts/projection behavior for preferences
apps/server/src/orchestration/decider.tsEmits client-preferences.patched events
apps/server/src/checkpointing/CheckpointDiffQuery.test.tsUpdates projection snapshot query seam shape
apps/server/src/auth/RpcAuthorization.tsAdds auth scopes for new preference RPCs
apps/mobile/src/state/use-thread-outbox-drain.tsReads live plan-mode preference during outbox drain
apps/mobile/src/state/use-thread-composer-state.tsForces interactionMode default when plan mode disabled
apps/mobile/src/state/thread-outbox.test.tsUpdates tests for plan-mode-aware queued sends
apps/mobile/src/state/thread-outbox-model.tsAdds plan-mode-aware queued settings + send decision helper
apps/mobile/src/state/synced-client-preferences.tsMobile worker to reconcile/fan-out synced preferences
apps/mobile/src/state/synced-client-preferences.test.tsTests reconciliation + fan-out + normalization behaviors
apps/mobile/src/state/synced-client-preferences-model.tsPure reconciliation/write helpers for mobile preferences
apps/mobile/src/Stack.tsxAdds synced-preferences worker; simplifies header styling
apps/mobile/src/persistence/mobile-preferences.tsPersists appearance/theme/imported themes + LWW stamp
apps/mobile/src/lib/storage.test.tsTests preference persistence + imported theme removal fallback
apps/mobile/src/lib/splashConfig.tsScheme-neutral splash config helper
apps/mobile/src/lib/splashConfig.test.tsTests scheme-neutral splash config
apps/mobile/src/lib/mobileThemeFile.test.tsTests ThemeFile parsing/caps/normalization
apps/mobile/src/lib/mobileTheme.test.tsTests token mapping + built-in parity with global.css
apps/mobile/src/features/threads/use-plan-mode-enabled.tsHook for resolved plan-mode preference state
apps/mobile/src/features/threads/ThreadFeed.tsxSwitches markdown/review theming to appearance preferences
apps/mobile/src/features/threads/ThreadComposer.tsxPlan-mode slash gating + submit-time parsing + safer replacement
apps/mobile/src/features/threads/plan-mode.tsShared plan-mode helpers (slash/menu/submit/interactionMode)
apps/mobile/src/features/threads/plan-mode.test.tsTests plan-mode helper behaviors
apps/mobile/src/features/threads/NewTaskDraftScreen.tsxAdds plan-mode slash popover + submit parsing + in-flight guard
apps/mobile/src/features/threads/new-task-submit.tsExtracts new-task submit eligibility/selection helpers
apps/mobile/src/features/threads/new-task-submit.test.tsTests new-task submit helpers
apps/mobile/src/features/threads/new-task-flow-provider.tsxUses new plan-mode preference hook + interactionMode resolver
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsxThemes terminal via nativeSurfaceColors + correct alpha
apps/mobile/src/features/terminal/terminalTheme.tsAdds optional native-surface overrides to terminal theme
apps/mobile/src/features/terminal/terminalTheme.test.tsTests terminal overrides + alpha ordering stability
apps/mobile/src/features/terminal/NativeTerminalSurface.tsxAllows appearanceScheme override for fallback/native surface
apps/mobile/src/features/settings/SettingsRouteScreen.tsxPlan mode toggle now uses synced preference updates
apps/mobile/src/features/settings/SettingsAppearanceRouteScreen.tsxAdds ColorSchemeAppearanceSection to Appearance screen
apps/mobile/src/features/settings/appearance/sections/ColorSchemeAppearanceSection.tsxNew UI: mode picker, theme cards, import/remove flows
apps/mobile/src/features/settings/appearance/AppearancePreferencesProvider.tsxApplies theme variables + supports import/remove + syncing
apps/mobile/src/features/review/useNativeReviewDiffBridge.tsThemes native review diff via nativeSurfaceColors
apps/mobile/src/features/review/ReviewSheet.tsxUses effectiveColorScheme instead of system scheme
apps/mobile/src/features/review/nativeReviewDiffAdapter.tsAdds native theme overrides application helper
apps/mobile/src/features/review/nativeReviewDiffAdapter.test.tsTests stable defaults + override behavior + alpha serialization
apps/mobile/src/features/files/SourceFileSurface.tsxThemes native source surface via shared theme helper
apps/mobile/src/features/files/nativeSourceFileAdapter.tsReuses review theme creation for source surfaces
apps/mobile/src/features/files/nativeSourceFileAdapter.test.tsTests stable defaults + override passthrough
apps/mobile/src/components/AppSymbol.tsxAdds Android mapping for “hammer” symbol
apps/mobile/src/App.tsxNavigation theme + status bar driven by appearance preferences
apps/mobile/plugins/withIosSplashScreenInlineBackground.cjsInlines storyboard splash background color on iOS
apps/mobile/modules/t3-terminal/ios/T3TerminalView.swiftFixes CSS #RRGGBBAA parsing for iOS terminal colors
apps/mobile/modules/t3-terminal/android/.../T3TerminalView.ktFixes CSS #RRGGBBAA parsing for Android terminal colors
apps/mobile/modules/t3-review-diff/android/.../T3ReviewDiffView.ktFixes CSS #RRGGBBAA parsing for Android review colors
apps/mobile/global.cssAdds missing markdown inline-code token variables
apps/mobile/app.config.tsSwitches to scheme-neutral splash + iOS storyboard mod

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment threaddocs/README.md
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
@macroscopeapp

macroscopeappBot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Skipped

Macroscope did not run approvability analysis for this PR. Diff is too large for automated approval analysis, so this PR cannot be approved automatically.

You can add or adjust custom eligibility rules. Learn more.

Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadpackages/contracts/src/orchestration.ts
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/mobile/src/features/threads/ThreadComposer.tsx Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx
Comment threadapps/mobile/src/state/synced-client-preferences.ts Outdated
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/mobile/src/Stack.tsx
Comment threadapps/web/src/hooks/useSettings.ts
Comment threadapps/mobile/plugins/withIosSplashScreenInlineBackground.cjs Outdated
Comment threadapps/mobile/src/state/use-thread-composer-state.ts
Comment threadapps/mobile/src/Stack.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts Outdated
Comment threadapps/mobile/src/lib/mobileThemeFile.ts Outdated
Comment threadapps/mobile/src/state/synced-client-preferences-model.ts
Comment threadapps/web/src/components/settings/ThemeEditorHost.tsx
Comment threadapps/mobile/src/features/threads/NewTaskDraftScreen.tsx Outdated
Comment threadapps/mobile/src/state/synced-client-preferences.ts
Comment threadapps/web/src/hooks/useSettings.ts Outdated
Comment threadapps/web/src/components/settings/SettingsPanels.tsx
Comment threadapps/web/src/hooks/synced-client-preferences.ts Outdated

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 83c4f0e. Configure here.

Comment threadapps/web/src/hooks/synced-client-preferences.ts
@t3dotgg

Copy link
Copy Markdown
Member

Note

🤖 GPT-5.6 Sol responding on behalf of Theo

Closing this PR after an automated pass over open pull requests. The author acknowledges that built-in mobile themes already shipped in #6619. The remaining proposal changes 110 files.

@t3dotggt3dotgg closed this Aug 23, 2026
@amanthanvi
amanthanvi deleted the t3code/feat-6405 branch August 26, 2026 23:09
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Mobile: themes and custom themes — parity with the desktop theme system

3 participants

@amanthanvi@t3dotgg