fix(mobile): show loading and syncing in the working pill - #9466

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill
Sep 3, 2026
Merged

fix(mobile): show loading and syncing in the working pill#9466
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

Mobile drew two different pills above the composer: the composer's own "Loading messages…" / "Syncing messages…" pill (bold text, tappable, no glass) and the floating "Working for …" timer pill (glass, merges with the scroll-to-end button). Opening a thread that was already working faded one out and the other in, with a different shape and font each time.

The floating working control now takes a status of either syncing (spinner + label) or working (timer), so both states render in the same element and the label just swaps in place. ThreadDetailScreen derives that status from the thread sync state and the active turn, with syncing taking priority. The composer's status pill now only reports connection problems (reconnecting, offline, error, not connected). The old sync pill's tap called reconnect, but since it only ever showed while already connected, nothing is lost by making the new one non-interactive.

Same gating as the timer had: hidden while disconnected or while an approval/user-input card owns the composer slot. The feed's bottom inset already keyed off the pill's presence, so it now reserves space during loading/syncing too.

Before / after

Loading a thread (left: before, right: after):

loading

Working timer, unchanged (left: before, right: after):

working

Load transition on the new build (server delayed 3s locally to make it visible):

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6c62066b94880475/mobile-pill-loading-after.mp4

Verified on iOS Simulator (iPhone 17 Pro, iOS 26.5) against a disposable environment seeded from real data. vp run typecheck in apps/mobile passes; lint shows only pre-existing warnings.

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Mobile thread UI and status presentation only; no auth, data, or API changes. Feed inset logic already keyed off floating pill visibility, now extended to loading/syncing.

Overview
Thread loading and syncing now show in the same glass floating pill above the composer as the “Working for …” timer, instead of a separate bold composer status pill.

FloatingWorkingControl takes a status of syncing (spinner + “Loading/Syncing messages…”) or working (elapsed timer) so the label swaps in place without a second pill fading in. ThreadDetailScreen builds that status from thread sync + feed presentation, with syncing ahead of active work, and still hides the pill when disconnected or when approval/user-input owns the composer.

ThreadComposer drops threadSyncPhase and limits its status pill to connection problems (reconnecting, offline, error, not connected); when connected it shows nothing for sync.

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

Note

Show loading and syncing status in the floating working pill

  • Moves message loading and synchronization status display from the composer connection pill to the floating working control pill on the thread detail screen.
  • ThreadDetailScreen derives a floatingStatus from sync and content state, and passes it to FloatingWorkingControl. The floating pill now shows the sync label (with activity indicator) before showing the active-work timer.
  • ThreadComposer and composerConnectionStatus no longer accept or produce a syncing status; the composer pill now reports only connection/retry states.
  • Risk: ThreadComposerProps.threadSyncPhase is removed; any caller still passing it will get a type error. FloatingWorkingControl API changes from a nullable startedAt value to a nullable status object, requiring all callers to migrate.

Macroscope summarized 2317bdd.

The composer drew its own pill for "Loading messages" / "Syncing
messages" while the working timer lived in a separate floating pill
above it. Opening a thread that was already working fades one out and
the other in, with a different shape and font each time.
The floating working control now takes a status: syncing (spinner plus
label) or working (timer). ThreadDetailScreen derives that from the
thread sync state and active turn, syncing taking priority, and the
composer's status pill only reports connection problems.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.6 KiB−7 B (−0.1%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−8 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages990 (0.0%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−225 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−232 B (−3.4%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 2317bdd · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 2317bdd

Macroscope's review found this PR approvable — This is a contained mobile UI fix that consolidates existing loading, syncing, and working indicators into one floating pill while preserving connection gating and existing timer behavior. No schema, data-processing, deployment, security, billing, or product-default changes are involved.

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

@juliusmarminge
juliusmarminge merged commit de025aa into mainSep 3, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/reuse-mobile-working-pill branch September 3, 2026 19:52
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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

fix(mobile): show loading and syncing in the working pill - #9466

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill
Sep 3, 2026
Merged

fix(mobile): show loading and syncing in the working pill#9466
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

Mobile drew two different pills above the composer: the composer's own "Loading messages…" / "Syncing messages…" pill (bold text, tappable, no glass) and the floating "Working for …" timer pill (glass, merges with the scroll-to-end button). Opening a thread that was already working faded one out and the other in, with a different shape and font each time.

The floating working control now takes a status of either syncing (spinner + label) or working (timer), so both states render in the same element and the label just swaps in place. ThreadDetailScreen derives that status from the thread sync state and the active turn, with syncing taking priority. The composer's status pill now only reports connection problems (reconnecting, offline, error, not connected). The old sync pill's tap called reconnect, but since it only ever showed while already connected, nothing is lost by making the new one non-interactive.

Same gating as the timer had: hidden while disconnected or while an approval/user-input card owns the composer slot. The feed's bottom inset already keyed off the pill's presence, so it now reserves space during loading/syncing too.

Before / after

Loading a thread (left: before, right: after):

loading

Working timer, unchanged (left: before, right: after):

working

Load transition on the new build (server delayed 3s locally to make it visible):

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6c62066b94880475/mobile-pill-loading-after.mp4

Verified on iOS Simulator (iPhone 17 Pro, iOS 26.5) against a disposable environment seeded from real data. vp run typecheck in apps/mobile passes; lint shows only pre-existing warnings.

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Mobile thread UI and status presentation only; no auth, data, or API changes. Feed inset logic already keyed off floating pill visibility, now extended to loading/syncing.

Overview
Thread loading and syncing now show in the same glass floating pill above the composer as the “Working for …” timer, instead of a separate bold composer status pill.

FloatingWorkingControl takes a status of syncing (spinner + “Loading/Syncing messages…”) or working (elapsed timer) so the label swaps in place without a second pill fading in. ThreadDetailScreen builds that status from thread sync + feed presentation, with syncing ahead of active work, and still hides the pill when disconnected or when approval/user-input owns the composer.

ThreadComposer drops threadSyncPhase and limits its status pill to connection problems (reconnecting, offline, error, not connected); when connected it shows nothing for sync.

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

Note

Show loading and syncing status in the floating working pill

  • Moves message loading and synchronization status display from the composer connection pill to the floating working control pill on the thread detail screen.
  • ThreadDetailScreen derives a floatingStatus from sync and content state, and passes it to FloatingWorkingControl. The floating pill now shows the sync label (with activity indicator) before showing the active-work timer.
  • ThreadComposer and composerConnectionStatus no longer accept or produce a syncing status; the composer pill now reports only connection/retry states.
  • Risk: ThreadComposerProps.threadSyncPhase is removed; any caller still passing it will get a type error. FloatingWorkingControl API changes from a nullable startedAt value to a nullable status object, requiring all callers to migrate.

Macroscope summarized 2317bdd.

The composer drew its own pill for "Loading messages" / "Syncing
messages" while the working timer lived in a separate floating pill
above it. Opening a thread that was already working fades one out and
the other in, with a different shape and font each time.
The floating working control now takes a status: syncing (spinner plus
label) or working (timer). ThreadDetailScreen derives that from the
thread sync state and active turn, syncing taking priority, and the
composer's status pill only reports connection problems.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.6 KiB−7 B (−0.1%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−8 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages990 (0.0%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−225 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−232 B (−3.4%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 2317bdd · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 2317bdd

Macroscope's review found this PR approvable — This is a contained mobile UI fix that consolidates existing loading, syncing, and working indicators into one floating pill while preserving connection gating and existing timer behavior. No schema, data-processing, deployment, security, billing, or product-default changes are involved.

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

@juliusmarminge
juliusmarminge merged commit de025aa into mainSep 3, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/reuse-mobile-working-pill branch September 3, 2026 19:52
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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

fix(mobile): show loading and syncing in the working pill - #9466

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill
Sep 3, 2026
Merged

fix(mobile): show loading and syncing in the working pill#9466
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

Mobile drew two different pills above the composer: the composer's own "Loading messages…" / "Syncing messages…" pill (bold text, tappable, no glass) and the floating "Working for …" timer pill (glass, merges with the scroll-to-end button). Opening a thread that was already working faded one out and the other in, with a different shape and font each time.

The floating working control now takes a status of either syncing (spinner + label) or working (timer), so both states render in the same element and the label just swaps in place. ThreadDetailScreen derives that status from the thread sync state and the active turn, with syncing taking priority. The composer's status pill now only reports connection problems (reconnecting, offline, error, not connected). The old sync pill's tap called reconnect, but since it only ever showed while already connected, nothing is lost by making the new one non-interactive.

Same gating as the timer had: hidden while disconnected or while an approval/user-input card owns the composer slot. The feed's bottom inset already keyed off the pill's presence, so it now reserves space during loading/syncing too.

Before / after

Loading a thread (left: before, right: after):

loading

Working timer, unchanged (left: before, right: after):

working

Load transition on the new build (server delayed 3s locally to make it visible):

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6c62066b94880475/mobile-pill-loading-after.mp4

Verified on iOS Simulator (iPhone 17 Pro, iOS 26.5) against a disposable environment seeded from real data. vp run typecheck in apps/mobile passes; lint shows only pre-existing warnings.

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Mobile thread UI and status presentation only; no auth, data, or API changes. Feed inset logic already keyed off floating pill visibility, now extended to loading/syncing.

Overview
Thread loading and syncing now show in the same glass floating pill above the composer as the “Working for …” timer, instead of a separate bold composer status pill.

FloatingWorkingControl takes a status of syncing (spinner + “Loading/Syncing messages…”) or working (elapsed timer) so the label swaps in place without a second pill fading in. ThreadDetailScreen builds that status from thread sync + feed presentation, with syncing ahead of active work, and still hides the pill when disconnected or when approval/user-input owns the composer.

ThreadComposer drops threadSyncPhase and limits its status pill to connection problems (reconnecting, offline, error, not connected); when connected it shows nothing for sync.

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

Note

Show loading and syncing status in the floating working pill

  • Moves message loading and synchronization status display from the composer connection pill to the floating working control pill on the thread detail screen.
  • ThreadDetailScreen derives a floatingStatus from sync and content state, and passes it to FloatingWorkingControl. The floating pill now shows the sync label (with activity indicator) before showing the active-work timer.
  • ThreadComposer and composerConnectionStatus no longer accept or produce a syncing status; the composer pill now reports only connection/retry states.
  • Risk: ThreadComposerProps.threadSyncPhase is removed; any caller still passing it will get a type error. FloatingWorkingControl API changes from a nullable startedAt value to a nullable status object, requiring all callers to migrate.

Macroscope summarized 2317bdd.

The composer drew its own pill for "Loading messages" / "Syncing
messages" while the working timer lived in a separate floating pill
above it. Opening a thread that was already working fades one out and
the other in, with a different shape and font each time.
The floating working control now takes a status: syncing (spinner plus
label) or working (timer). ThreadDetailScreen derives that from the
thread sync state and active turn, syncing taking priority, and the
composer's status pill only reports connection problems.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.6 KiB−7 B (−0.1%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−8 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages990 (0.0%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−225 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−232 B (−3.4%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 2317bdd · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 2317bdd

Macroscope's review found this PR approvable — This is a contained mobile UI fix that consolidates existing loading, syncing, and working indicators into one floating pill while preserving connection gating and existing timer behavior. No schema, data-processing, deployment, security, billing, or product-default changes are involved.

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

@juliusmarminge
juliusmarminge merged commit de025aa into mainSep 3, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/reuse-mobile-working-pill branch September 3, 2026 19:52
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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

fix(mobile): show loading and syncing in the working pill - #9466

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill
Sep 3, 2026
Merged

fix(mobile): show loading and syncing in the working pill#9466
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

Mobile drew two different pills above the composer: the composer's own "Loading messages…" / "Syncing messages…" pill (bold text, tappable, no glass) and the floating "Working for …" timer pill (glass, merges with the scroll-to-end button). Opening a thread that was already working faded one out and the other in, with a different shape and font each time.

The floating working control now takes a status of either syncing (spinner + label) or working (timer), so both states render in the same element and the label just swaps in place. ThreadDetailScreen derives that status from the thread sync state and the active turn, with syncing taking priority. The composer's status pill now only reports connection problems (reconnecting, offline, error, not connected). The old sync pill's tap called reconnect, but since it only ever showed while already connected, nothing is lost by making the new one non-interactive.

Same gating as the timer had: hidden while disconnected or while an approval/user-input card owns the composer slot. The feed's bottom inset already keyed off the pill's presence, so it now reserves space during loading/syncing too.

Before / after

Loading a thread (left: before, right: after):

loading

Working timer, unchanged (left: before, right: after):

working

Load transition on the new build (server delayed 3s locally to make it visible):

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6c62066b94880475/mobile-pill-loading-after.mp4

Verified on iOS Simulator (iPhone 17 Pro, iOS 26.5) against a disposable environment seeded from real data. vp run typecheck in apps/mobile passes; lint shows only pre-existing warnings.

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Mobile thread UI and status presentation only; no auth, data, or API changes. Feed inset logic already keyed off floating pill visibility, now extended to loading/syncing.

Overview
Thread loading and syncing now show in the same glass floating pill above the composer as the “Working for …” timer, instead of a separate bold composer status pill.

FloatingWorkingControl takes a status of syncing (spinner + “Loading/Syncing messages…”) or working (elapsed timer) so the label swaps in place without a second pill fading in. ThreadDetailScreen builds that status from thread sync + feed presentation, with syncing ahead of active work, and still hides the pill when disconnected or when approval/user-input owns the composer.

ThreadComposer drops threadSyncPhase and limits its status pill to connection problems (reconnecting, offline, error, not connected); when connected it shows nothing for sync.

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

Note

Show loading and syncing status in the floating working pill

  • Moves message loading and synchronization status display from the composer connection pill to the floating working control pill on the thread detail screen.
  • ThreadDetailScreen derives a floatingStatus from sync and content state, and passes it to FloatingWorkingControl. The floating pill now shows the sync label (with activity indicator) before showing the active-work timer.
  • ThreadComposer and composerConnectionStatus no longer accept or produce a syncing status; the composer pill now reports only connection/retry states.
  • Risk: ThreadComposerProps.threadSyncPhase is removed; any caller still passing it will get a type error. FloatingWorkingControl API changes from a nullable startedAt value to a nullable status object, requiring all callers to migrate.

Macroscope summarized 2317bdd.

The composer drew its own pill for "Loading messages" / "Syncing
messages" while the working timer lived in a separate floating pill
above it. Opening a thread that was already working fades one out and
the other in, with a different shape and font each time.
The floating working control now takes a status: syncing (spinner plus
label) or working (timer). ThreadDetailScreen derives that from the
thread sync state and active turn, syncing taking priority, and the
composer's status pill only reports connection problems.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.6 KiB−7 B (−0.1%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−8 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages990 (0.0%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−225 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−232 B (−3.4%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 2317bdd · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 2317bdd

Macroscope's review found this PR approvable — This is a contained mobile UI fix that consolidates existing loading, syncing, and working indicators into one floating pill while preserving connection gating and existing timer behavior. No schema, data-processing, deployment, security, billing, or product-default changes are involved.

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

@juliusmarminge
juliusmarminge merged commit de025aa into mainSep 3, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/reuse-mobile-working-pill branch September 3, 2026 19:52
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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

fix(mobile): show loading and syncing in the working pill - #9466

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill
Sep 3, 2026
Merged

fix(mobile): show loading and syncing in the working pill#9466
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

Mobile drew two different pills above the composer: the composer's own "Loading messages…" / "Syncing messages…" pill (bold text, tappable, no glass) and the floating "Working for …" timer pill (glass, merges with the scroll-to-end button). Opening a thread that was already working faded one out and the other in, with a different shape and font each time.

The floating working control now takes a status of either syncing (spinner + label) or working (timer), so both states render in the same element and the label just swaps in place. ThreadDetailScreen derives that status from the thread sync state and the active turn, with syncing taking priority. The composer's status pill now only reports connection problems (reconnecting, offline, error, not connected). The old sync pill's tap called reconnect, but since it only ever showed while already connected, nothing is lost by making the new one non-interactive.

Same gating as the timer had: hidden while disconnected or while an approval/user-input card owns the composer slot. The feed's bottom inset already keyed off the pill's presence, so it now reserves space during loading/syncing too.

Before / after

Loading a thread (left: before, right: after):

loading

Working timer, unchanged (left: before, right: after):

working

Load transition on the new build (server delayed 3s locally to make it visible):

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6c62066b94880475/mobile-pill-loading-after.mp4

Verified on iOS Simulator (iPhone 17 Pro, iOS 26.5) against a disposable environment seeded from real data. vp run typecheck in apps/mobile passes; lint shows only pre-existing warnings.

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Mobile thread UI and status presentation only; no auth, data, or API changes. Feed inset logic already keyed off floating pill visibility, now extended to loading/syncing.

Overview
Thread loading and syncing now show in the same glass floating pill above the composer as the “Working for …” timer, instead of a separate bold composer status pill.

FloatingWorkingControl takes a status of syncing (spinner + “Loading/Syncing messages…”) or working (elapsed timer) so the label swaps in place without a second pill fading in. ThreadDetailScreen builds that status from thread sync + feed presentation, with syncing ahead of active work, and still hides the pill when disconnected or when approval/user-input owns the composer.

ThreadComposer drops threadSyncPhase and limits its status pill to connection problems (reconnecting, offline, error, not connected); when connected it shows nothing for sync.

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

Note

Show loading and syncing status in the floating working pill

  • Moves message loading and synchronization status display from the composer connection pill to the floating working control pill on the thread detail screen.
  • ThreadDetailScreen derives a floatingStatus from sync and content state, and passes it to FloatingWorkingControl. The floating pill now shows the sync label (with activity indicator) before showing the active-work timer.
  • ThreadComposer and composerConnectionStatus no longer accept or produce a syncing status; the composer pill now reports only connection/retry states.
  • Risk: ThreadComposerProps.threadSyncPhase is removed; any caller still passing it will get a type error. FloatingWorkingControl API changes from a nullable startedAt value to a nullable status object, requiring all callers to migrate.

Macroscope summarized 2317bdd.

The composer drew its own pill for "Loading messages" / "Syncing
messages" while the working timer lived in a separate floating pill
above it. Opening a thread that was already working fades one out and
the other in, with a different shape and font each time.
The floating working control now takes a status: syncing (spinner plus
label) or working (timer). ThreadDetailScreen derives that from the
thread sync state and active turn, syncing taking priority, and the
composer's status pill only reports connection problems.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.6 KiB−7 B (−0.1%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−8 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages990 (0.0%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−225 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−232 B (−3.4%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 2317bdd · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 2317bdd

Macroscope's review found this PR approvable — This is a contained mobile UI fix that consolidates existing loading, syncing, and working indicators into one floating pill while preserving connection gating and existing timer behavior. No schema, data-processing, deployment, security, billing, or product-default changes are involved.

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

@juliusmarminge
juliusmarminge merged commit de025aa into mainSep 3, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/reuse-mobile-working-pill branch September 3, 2026 19:52
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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

fix(mobile): show loading and syncing in the working pill - #9466

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill
Sep 3, 2026
Merged

fix(mobile): show loading and syncing in the working pill#9466
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

Mobile drew two different pills above the composer: the composer's own "Loading messages…" / "Syncing messages…" pill (bold text, tappable, no glass) and the floating "Working for …" timer pill (glass, merges with the scroll-to-end button). Opening a thread that was already working faded one out and the other in, with a different shape and font each time.

The floating working control now takes a status of either syncing (spinner + label) or working (timer), so both states render in the same element and the label just swaps in place. ThreadDetailScreen derives that status from the thread sync state and the active turn, with syncing taking priority. The composer's status pill now only reports connection problems (reconnecting, offline, error, not connected). The old sync pill's tap called reconnect, but since it only ever showed while already connected, nothing is lost by making the new one non-interactive.

Same gating as the timer had: hidden while disconnected or while an approval/user-input card owns the composer slot. The feed's bottom inset already keyed off the pill's presence, so it now reserves space during loading/syncing too.

Before / after

Loading a thread (left: before, right: after):

loading

Working timer, unchanged (left: before, right: after):

working

Load transition on the new build (server delayed 3s locally to make it visible):

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6c62066b94880475/mobile-pill-loading-after.mp4

Verified on iOS Simulator (iPhone 17 Pro, iOS 26.5) against a disposable environment seeded from real data. vp run typecheck in apps/mobile passes; lint shows only pre-existing warnings.

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Mobile thread UI and status presentation only; no auth, data, or API changes. Feed inset logic already keyed off floating pill visibility, now extended to loading/syncing.

Overview
Thread loading and syncing now show in the same glass floating pill above the composer as the “Working for …” timer, instead of a separate bold composer status pill.

FloatingWorkingControl takes a status of syncing (spinner + “Loading/Syncing messages…”) or working (elapsed timer) so the label swaps in place without a second pill fading in. ThreadDetailScreen builds that status from thread sync + feed presentation, with syncing ahead of active work, and still hides the pill when disconnected or when approval/user-input owns the composer.

ThreadComposer drops threadSyncPhase and limits its status pill to connection problems (reconnecting, offline, error, not connected); when connected it shows nothing for sync.

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

Note

Show loading and syncing status in the floating working pill

  • Moves message loading and synchronization status display from the composer connection pill to the floating working control pill on the thread detail screen.
  • ThreadDetailScreen derives a floatingStatus from sync and content state, and passes it to FloatingWorkingControl. The floating pill now shows the sync label (with activity indicator) before showing the active-work timer.
  • ThreadComposer and composerConnectionStatus no longer accept or produce a syncing status; the composer pill now reports only connection/retry states.
  • Risk: ThreadComposerProps.threadSyncPhase is removed; any caller still passing it will get a type error. FloatingWorkingControl API changes from a nullable startedAt value to a nullable status object, requiring all callers to migrate.

Macroscope summarized 2317bdd.

The composer drew its own pill for "Loading messages" / "Syncing
messages" while the working timer lived in a separate floating pill
above it. Opening a thread that was already working fades one out and
the other in, with a different shape and font each time.
The floating working control now takes a status: syncing (spinner plus
label) or working (timer). ThreadDetailScreen derives that from the
thread sync state and active turn, syncing taking priority, and the
composer's status pill only reports connection problems.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.6 KiB−7 B (−0.1%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−8 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages990 (0.0%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−225 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−232 B (−3.4%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 2317bdd · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 2317bdd

Macroscope's review found this PR approvable — This is a contained mobile UI fix that consolidates existing loading, syncing, and working indicators into one floating pill while preserving connection gating and existing timer behavior. No schema, data-processing, deployment, security, billing, or product-default changes are involved.

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

@juliusmarminge
juliusmarminge merged commit de025aa into mainSep 3, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/reuse-mobile-working-pill branch September 3, 2026 19:52
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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

fix(mobile): show loading and syncing in the working pill - #9466

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill
Sep 3, 2026
Merged

fix(mobile): show loading and syncing in the working pill#9466
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

Mobile drew two different pills above the composer: the composer's own "Loading messages…" / "Syncing messages…" pill (bold text, tappable, no glass) and the floating "Working for …" timer pill (glass, merges with the scroll-to-end button). Opening a thread that was already working faded one out and the other in, with a different shape and font each time.

The floating working control now takes a status of either syncing (spinner + label) or working (timer), so both states render in the same element and the label just swaps in place. ThreadDetailScreen derives that status from the thread sync state and the active turn, with syncing taking priority. The composer's status pill now only reports connection problems (reconnecting, offline, error, not connected). The old sync pill's tap called reconnect, but since it only ever showed while already connected, nothing is lost by making the new one non-interactive.

Same gating as the timer had: hidden while disconnected or while an approval/user-input card owns the composer slot. The feed's bottom inset already keyed off the pill's presence, so it now reserves space during loading/syncing too.

Before / after

Loading a thread (left: before, right: after):

loading

Working timer, unchanged (left: before, right: after):

working

Load transition on the new build (server delayed 3s locally to make it visible):

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6c62066b94880475/mobile-pill-loading-after.mp4

Verified on iOS Simulator (iPhone 17 Pro, iOS 26.5) against a disposable environment seeded from real data. vp run typecheck in apps/mobile passes; lint shows only pre-existing warnings.

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Mobile thread UI and status presentation only; no auth, data, or API changes. Feed inset logic already keyed off floating pill visibility, now extended to loading/syncing.

Overview
Thread loading and syncing now show in the same glass floating pill above the composer as the “Working for …” timer, instead of a separate bold composer status pill.

FloatingWorkingControl takes a status of syncing (spinner + “Loading/Syncing messages…”) or working (elapsed timer) so the label swaps in place without a second pill fading in. ThreadDetailScreen builds that status from thread sync + feed presentation, with syncing ahead of active work, and still hides the pill when disconnected or when approval/user-input owns the composer.

ThreadComposer drops threadSyncPhase and limits its status pill to connection problems (reconnecting, offline, error, not connected); when connected it shows nothing for sync.

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

Note

Show loading and syncing status in the floating working pill

  • Moves message loading and synchronization status display from the composer connection pill to the floating working control pill on the thread detail screen.
  • ThreadDetailScreen derives a floatingStatus from sync and content state, and passes it to FloatingWorkingControl. The floating pill now shows the sync label (with activity indicator) before showing the active-work timer.
  • ThreadComposer and composerConnectionStatus no longer accept or produce a syncing status; the composer pill now reports only connection/retry states.
  • Risk: ThreadComposerProps.threadSyncPhase is removed; any caller still passing it will get a type error. FloatingWorkingControl API changes from a nullable startedAt value to a nullable status object, requiring all callers to migrate.

Macroscope summarized 2317bdd.

The composer drew its own pill for "Loading messages" / "Syncing
messages" while the working timer lived in a separate floating pill
above it. Opening a thread that was already working fades one out and
the other in, with a different shape and font each time.
The floating working control now takes a status: syncing (spinner plus
label) or working (timer). ThreadDetailScreen derives that from the
thread sync state and active turn, syncing taking priority, and the
composer's status pill only reports connection problems.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.6 KiB−7 B (−0.1%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−8 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages990 (0.0%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−225 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−232 B (−3.4%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 2317bdd · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 2317bdd

Macroscope's review found this PR approvable — This is a contained mobile UI fix that consolidates existing loading, syncing, and working indicators into one floating pill while preserving connection gating and existing timer behavior. No schema, data-processing, deployment, security, billing, or product-default changes are involved.

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

@juliusmarminge
juliusmarminge merged commit de025aa into mainSep 3, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/reuse-mobile-working-pill branch September 3, 2026 19:52
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge
, '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

fix(mobile): show loading and syncing in the working pill - #9466

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill
Sep 3, 2026
Merged

fix(mobile): show loading and syncing in the working pill#9466
juliusmarminge merged 1 commit into
mainfrom
t3code/reuse-mobile-working-pill

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Sep 3, 2026

Copy link
Copy Markdown
Member

Mobile drew two different pills above the composer: the composer's own "Loading messages…" / "Syncing messages…" pill (bold text, tappable, no glass) and the floating "Working for …" timer pill (glass, merges with the scroll-to-end button). Opening a thread that was already working faded one out and the other in, with a different shape and font each time.

The floating working control now takes a status of either syncing (spinner + label) or working (timer), so both states render in the same element and the label just swaps in place. ThreadDetailScreen derives that status from the thread sync state and the active turn, with syncing taking priority. The composer's status pill now only reports connection problems (reconnecting, offline, error, not connected). The old sync pill's tap called reconnect, but since it only ever showed while already connected, nothing is lost by making the new one non-interactive.

Same gating as the timer had: hidden while disconnected or while an approval/user-input card owns the composer slot. The feed's bottom inset already keyed off the pill's presence, so it now reserves space during loading/syncing too.

Before / after

Loading a thread (left: before, right: after):

loading

Working timer, unchanged (left: before, right: after):

working

Load transition on the new build (server delayed 3s locally to make it visible):

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/6c62066b94880475/mobile-pill-loading-after.mp4

Verified on iOS Simulator (iPhone 17 Pro, iOS 26.5) against a disposable environment seeded from real data. vp run typecheck in apps/mobile passes; lint shows only pre-existing warnings.

Claude Fable 5 via Claude Code.

🤖 Generated with Claude Code


Note

Low Risk
Mobile thread UI and status presentation only; no auth, data, or API changes. Feed inset logic already keyed off floating pill visibility, now extended to loading/syncing.

Overview
Thread loading and syncing now show in the same glass floating pill above the composer as the “Working for …” timer, instead of a separate bold composer status pill.

FloatingWorkingControl takes a status of syncing (spinner + “Loading/Syncing messages…”) or working (elapsed timer) so the label swaps in place without a second pill fading in. ThreadDetailScreen builds that status from thread sync + feed presentation, with syncing ahead of active work, and still hides the pill when disconnected or when approval/user-input owns the composer.

ThreadComposer drops threadSyncPhase and limits its status pill to connection problems (reconnecting, offline, error, not connected); when connected it shows nothing for sync.

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

Note

Show loading and syncing status in the floating working pill

  • Moves message loading and synchronization status display from the composer connection pill to the floating working control pill on the thread detail screen.
  • ThreadDetailScreen derives a floatingStatus from sync and content state, and passes it to FloatingWorkingControl. The floating pill now shows the sync label (with activity indicator) before showing the active-work timer.
  • ThreadComposer and composerConnectionStatus no longer accept or produce a syncing status; the composer pill now reports only connection/retry states.
  • Risk: ThreadComposerProps.threadSyncPhase is removed; any caller still passing it will get a type error. FloatingWorkingControl API changes from a nullable startedAt value to a nullable status object, requiring all callers to migrate.

Macroscope summarized 2317bdd.

The composer drew its own pill for "Loading messages" / "Syncing
messages" while the working timer lived in a separate floating pill
above it. Opening a thread that was already working fades one out and
the other in, with a different shape and font each time.
The floating working control now takes a status: syncing (spinner plus
label) or working (timer). ThreadDetailScreen derives that from the
thread sync state and active turn, syncing taking priority, and the
composer's status pill only reports connection problems.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@github-actionsgithub-actionsBot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 3, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.6 KiB13.6 KiB−7 B (−0.1%)15.1 KiB
CodexThread snapshot wire7.0 KiB7.0 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.5 KiB6.5 KiB−8 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded57.0 KiB57.0 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages990 (0.0%)21
ClaudeTotal thread wire13.8 KiB13.5 KiB−225 B (−1.6%)15.1 KiB
ClaudeThread snapshot wire7.0 KiB7.0 KiB+7 B (+0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.7 KiB6.5 KiB−232 B (−3.4%)7.8 KiB
ClaudeLive turn WebSocket decoded59.3 KiB57.8 KiB−1.5 KiB (−2.5%)66.4 KiB
ClaudeLive turn messages108−2 (−20.0%)21

Baseline: d5825e1 · PR result: 2317bdd · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.8 KiB
  • Claude decoded thread snapshot: 114.5 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 2317bdd

Macroscope's review found this PR approvable — This is a contained mobile UI fix that consolidates existing loading, syncing, and working indicators into one floating pill while preserving connection gating and existing timer behavior. No schema, data-processing, deployment, security, billing, or product-default changes are involved.

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

@juliusmarminge
juliusmarminge merged commit de025aa into mainSep 3, 2026
22 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/reuse-mobile-working-pill branch September 3, 2026 19:52
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 4, 2026
## What's Changed
* fix(web): make right panel tabs easier to scroll by @maria-rcks in pingdotgg/t3code#9461
* fix(web): render transparent previews on white by @UtkarshUsername in pingdotgg/t3code#9463
* fix(mobile): show loading and syncing in the working pill by @juliusmarminge in pingdotgg/t3code#9466
* fix(server): keep a/ and b/ prefixes in rendered git patches by @Mnigos in pingdotgg/t3code#9438
* fix(server): full-access OpenCode threads no longer ask for approvals by @shivamhwp in pingdotgg/t3code#9282
* fix(web): reuse pull request list data while loading by @maria-rcks in pingdotgg/t3code#9467
* feat(web): let users turn off composer collapse on blur and scroll by @juliusmarminge in pingdotgg/t3code#9469
## New Contributors
* @Mnigos made their first contribution in pingdotgg/t3code#9438
**Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260903.1272...v0.0.39-nightly.20260903.1273
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.39-nightly.20260903.1273
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:trustedPR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@juliusmarminge