feat(mobile): add video playback with native iOS controls - #8919

Merged
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback
Aug 31, 2026
Merged

feat(mobile): add video playback with native iOS controls#8919
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 31, 2026

Copy link
Copy Markdown
Member

What Changed

Mobile video attachments currently open as files. This adds playback from received messages and local drafts, including the compact composer and new-task sheet.

  • iOS opens AVKit's full-screen player from the attachment thumbnail, with native playback controls, zoom, Close, and swipe dismissal. Received videos stream directly from their signed URL; there is no full-file download or app loading overlay before presentation.
  • Video tiles show cached thumbnails. The asset endpoint supports single byte ranges so native readers can fetch metadata, frames, and playback data without downloading the entire file first.
  • Touch and hold an iOS video attachment to save or share the original through the system sheet. Android uses an Expo Video modal with a save/share action. Draft file leases remain active through playback and sharing.
  • Preserve picker filenames and recognize video extensions when MIME metadata is generic. Web and mobile share that detection helper. The native source-view registration can be reused for image zoom transitions.

Why

Videos should be playable before and after sending. AVKit supplies the expected iOS controls and dismissal behavior, while byte-range delivery lets opening, seeking, and thumbnail extraction avoid waiting for a complete download.

UI Changes

Current iPhone 17 Pro / iOS 27 recording: thumbnail → streaming playback → native controls → swipe back → reopen → Close.

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f0c0378d96a0fe5/ios-streaming-video-player.mp4

The screenshots compare an earlier player iteration on this branch with the final native player, using the same sample clip.

Before native UI refinementFinal iOS player
Earlier player with custom header and save/share footerFinal AVKit player with native controls

Validation

  • iOS 27 simulator: received and local-draft playback, thumbnails, autoplay, play/pause, Close/reopen, swipe dismissal, native sharing, and invalid-video recovery. A separate audio player remained playing through video presentation and dismissal.
  • A stalled stream opened and remained dismissible before any video bytes arrived. Throttled playback progressed before the file finished transferring. Two normal previews made zero full-file download calls.
  • Focused download/share, draft-lease, thumbnail, MIME-detection, and HTTP byte-range tests passed. Mobile and server typechecks, targeted lint, SwiftLint, and formatting passed. The picker suite includes a provider-URI regression and passes all 31 tests.
  • A matching development build is installed on the phone and launched against Metro. Phone playback still needs manual verification. Android, relay/tunnel transport, and physical audio routing were not runtime-tested.
Other observations from simulator testing

Saving to Files under a new filename passed with identical file bytes. Replacing an existing filename stalled on iOS 27, including with the original Expo Sharing path.

Sending a video from the new-task sheet uploaded it and received a reply, but left the cleared sheet open. The navigation call is unchanged; a runtime comparison with main was not performed.

Checklist

  • Changes are focused on video attachment playback and its supporting delivery/lifecycle code
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches asset HTTP semantics for videos, native AVKit/audio-session behavior, and attachment file lifecycle; regressions could affect non-video downloads, older servers without ranges, or draft cleanup timing.

Overview
Adds end-to-end mobile video attachments: playable tiles in the thread feed and composer, with iOS AVKit full-screen playback zooming from a registered thumbnail and Android using an expo-video modal.

Native iOS (T3NativeControls) exposes presentVideo / dismissVideo, a PresentationSource view for transition/share anchoring, and shareFileFromSource for popover share sheets. Playback streams remote signed URLs without a full download first; drafts use retain/release leases so files are not deleted during preview or share.

Supporting client work includes cached expo-video thumbnails, expo-document-picker for file picks, refactored download/share preview files, and shared videoMimeType in @t3tools/shared/video.

Server: video asset GETs honor single Range requests (206/416) so iOS can stream and extract frames; normal downloads and unsupported ranges still return the full file.

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

Note

Add native iOS video playback, thumbnail caching, and byte-range asset serving

  • Adds T3NativeControls expo module that presents AVPlayerViewController (inline-to-fullscreen zoom, auto-play, audio session management, cleanup on dismiss) and presentVideo/dismissVideo/shareFileFromSource JS-callable functions; PresentationSource view registers source anchors for share and zoom transitions.
  • Adds videoThumbnails.ts that lazily imports expo-video to extract a single frame (≤480x480) with abort signaling, 15s timeout, and LRU cache capped at 32 entries; VideoThumbnailImage.tsx renders these lazily and cancels on unmount.
  • Adds assetFileResponse in the server asset route that serves 206 partial content with Content-Range/Accept-Ranges for video MIME types and 416 for unsatisfiable ranges; non-video assets and unsupported Range syntax fall back to full 200.
  • Integrates video into the composer and feed: video attachments render as VideoAttachmentTile with thumbnails and a long-press share menu on iOS; VideoPreviewModal resolves local draft files via loadLocalVideoPreview or remote URLs and presents the native player.
  • Refactors attachment download/share lifecycle around AttachmentPreviewFile with explicit share/dispose, switches file picking to expo-document-picker, and adds retain/release leases (retainComposerAttachmentFile) so preview/playback prevents premature file deletion.
  • Risk: pickComposerFiles now uses expo-document-picker (getDocumentAsync, copyToCacheDirectory) and consumes result.assets/mimeType instead of expo-file-systempickFileAsync fields; presentVideo rejects when the URL is not playable or a presentation is already active; video asset routes now return 416 for unsatisfiable ranges.

Macroscope summarized b6f497d.

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 31, 2026
@coderabbitai

coderabbitaiBot commented Aug 31, 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: f64f2a38-cc80-4a15-a218-87973bd34b11

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

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 31, 2026
@github-actions

github-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−3 B (−0.0%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−4 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages10100 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.5 KiB+222 B (+1.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.6 KiB+226 B (+3.5%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB57.9 KiB+1.5 KiB (+2.7%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: bba79cc · PR result: b6f497d · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

Comment threadapps/mobile/src/lib/composerImages.ts Outdated
Comment threaddocs/internals/mobile-navigation.md Outdated
Comment threadapps/mobile/modules/t3-native-controls/ios/T3NativeVideoPresentation.swift 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 ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit b6f497d. Configure here.

Comment threadapps/mobile/src/lib/videoThumbnails.ts
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a large end-to-end mobile video feature spanning native iOS playback, Android playback, sharing, file retention, thumbnail extraction, document picking, and server byte-range delivery, with meaningful runtime side effects across existing paths. An unresolved concrete concern about rejected native thumbnail work after cancellation further warrants human review.

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

@juliusmarminge
juliusmarminge merged commit 31c1c59 into mainAug 31, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the feat/mobile-video-playback branch August 31, 2026 19:06
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
**Full Changelog**: pingdotgg/t3code@v0.0.38-nightly.20260831.1240...v0.0.38-nightly.20260831.1241
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38-nightly.20260831.1241
alexcstark added a commit to alexcstark/t3code that referenced this pull request Sep 1, 2026
fc3751f kept call sites while dropping the definitions from both
sides, so the built app threw "deriveTurnPlans is not defined" on
render. tsgo reported 16 errors in apps/web on that commit.
- drop the stale deriveTurnPlans call and the extra deriveTimelineEntries
argument (upstream removed the function in pingdotgg#8734)
- restore the workingStepLabel memo TerminalShellStatus reads
- restore NOOP_USE_ARTIFACT_TEMPLATE / NOOP_OPEN_ATTACHMENT and rename
ctx.onFileDownload to upstream's ctx.onFileOpen
- restore the video play-button rendering from pingdotgg#8919; its props and the
userVideos split merged in but nothing rendered them
- restore the helpers dropped from ChatMarkdown.workspace-images.test.tsx
and delete the orphaned resolveSidebarStageBadgeLabel test that
branding.test.ts already covers
Claude-Session: https://claude.ai/code/session_01VucnEAuRBJ3icH9fzd7Mqu
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* Add mobile composer attachment menu with video support by @juliusmarminge in pingdotgg/t3code#8843
* fix(web): restore unified activity logs and composer banners by @t3dotgg in pingdotgg/t3code#8734
* fix(web): address composer banner review follow-ups by @juliusmarminge in pingdotgg/t3code#8850
* fix(web): widen sync banners and simplify the working timer by @juliusmarminge in pingdotgg/t3code#8855
* fix(preview): improve browser recording quality by @maria-rcks in pingdotgg/t3code#8839
* fix(web): mark pull request links as external by @juliusmarminge in pingdotgg/t3code#8856
* fix(mobile): replace Callstack glass with Expo glass by @juliusmarminge in pingdotgg/t3code#8862
* fix(server): skip IDE detection in Claude probes by @yashranaway in pingdotgg/t3code#8634
* chore(macroscope): review diagnostic overrides by @t3-code[bot] in pingdotgg/t3code#8917
* fix(contracts): accept CLI event origins by @nateEc in pingdotgg/t3code#8905
* fix(web): hide invalid slash skill completions by @nateEc in pingdotgg/t3code#8904
* fix(mobile): defer draft navigation until submission completes by @juliusmarminge in pingdotgg/t3code#8914
* chore: disable CodeRabbit review status by @juliusmarminge in pingdotgg/t3code#8933
* Delete app.json by @juliusmarminge in pingdotgg/t3code#8934
* fix(web): show scrollbar for wide markdown tables by @UtkarshUsername in pingdotgg/t3code#8868
* fix(mobile): shimmer active tool rows by @juliusmarminge in pingdotgg/t3code#8932
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
* fix(web): prevent chat metadata overlap by @MatthewFeroz in pingdotgg/t3code#8851
* fix(server): preserve usage cache outside walked roots by @Lucenx9 in pingdotgg/t3code#8540
* feat(mobile): add native image and PDF previews by @juliusmarminge in pingdotgg/t3code#8959
* fix(server): allow long thread IDs in HTTP routes by @nateEc in pingdotgg/t3code#8898
* fix(shared): preserve Windows shell PATH priority by @UtkarshUsername in pingdotgg/t3code#8748
* fix(web): make WSL settings searchable by @UtkarshUsername in pingdotgg/t3code#8881
* feat(web): add expand/collapse all control to the files surface by @UtkarshUsername in pingdotgg/t3code#8889
* feat(mobile): upload attachments while composing by @juliusmarminge in pingdotgg/t3code#8978
* fix(chat): keep agent activity visible between actions by @maria-rcks in pingdotgg/t3code#8984
* fix(server): isolate remote web session cookies by @Bil0000 in pingdotgg/t3code#8085
* feat(pull-requests): link GitHub references in markdown by @maria-rcks in pingdotgg/t3code#8812
* perf(server): reduce frequency of full tool call output being loaded into memory from db by @t3dotgg in pingdotgg/t3code#8988
* feat(web): add pull request list filters by @maria-rcks in pingdotgg/t3code#8809
* feat(web): search individual settings by detail by @maria-rcks in pingdotgg/t3code#8831
* feat(client): render viewed images in work logs by @maria-rcks in pingdotgg/t3code#8936
* fix(client): use package import for markdown image helpers by @juliusmarminge in pingdotgg/t3code#9010
* test: remove static presentation snapshots by @t3-code[bot] in pingdotgg/t3code#9008
* perf(server): bound snapshot activity payload memory by @t3dotgg in pingdotgg/t3code#9000
* perf(server): cut idle CPU use and stop provider event leaks by @t3dotgg in pingdotgg/t3code#8187
* perf(server): scan only appended transcript bytes for usage summaries by @StiensWout in pingdotgg/t3code#9024
* perf(server): cut chatty tool-update frames by 90% by @Adamulek123 in pingdotgg/t3code#8368
* fix(server): settle threads server-side by @t3dotgg in pingdotgg/t3code#8600
* fix(clients): dedupe skills in composer menus by @Adamulek123 in pingdotgg/t3code#8043
* fix(server): stop OpenCode child sessions by @t3dotgg in pingdotgg/t3code#9005
* perf(web): defer pull request line stats until visible by @Adamulek123 in pingdotgg/t3code#6471
* perf(server): skip full-message reads while streaming by @t3dotgg in pingdotgg/t3code#9032
* perf(client-runtime): halve server config bootstrap traffic by @Adamulek123 in pingdotgg/t3code#8367
* fix(web): align un-settle banner action by @StiensWout in pingdotgg/t3code#9033
* fix(web): block type-to-focus behind open dialogs by @Lucenx9 in pingdotgg/t3code#8139
* feat(shortcuts): copy active thread reference by @maria-rcks in pingdotgg/t3code#8994
* fix(mobile): keep thread scroll bounds current after animations by @juliusmarminge in pingdotgg/t3code#9013
* fix(server): cache project favicon resolution by @willsheldon in pingdotgg/t3code#9080
* feat(claude): add Claude Fable 5.1 model by @q1 in pingdotgg/t3code#9078
* fix(preview): restore recording and macOS rendering after Electron 43 by @StiensWout in pingdotgg/t3code#9001
* feat(desktop): add configurable quit shortcut confirmation by @juliusmarminge in pingdotgg/t3code#9076
* feat(web): open project settings from thread menus by @SunkenInTime in pingdotgg/t3code#8925
* fix(chat): reuse one row for live activity by @maria-rcks in pingdotgg/t3code#9062
* feat(models): discover Claude models from remote manifest by @juliusmarminge in pingdotgg/t3code#9084
* Revert "fix(chat): reuse one row for live activity" by @maria-rcks in pingdotgg/t3code#9096
* fix(web): sync sidebar PR state from open panel by @t3-code[bot] in pingdotgg/t3code#9092
* fix(web): changing projects no longer creates a draft by @extoci in pingdotgg/t3code#9097
* fix(web): keep theme placeholder text dimmer than entered text by @flamboh in pingdotgg/t3code#9104
* fix(web): keep the selected environment when changing projects by @t3dotgg in pingdotgg/t3code#9102
## New Contributors
* @willsheldon made their first contribution in pingdotgg/t3code#9080
* @q1 made their first contribution in pingdotgg/t3code#9078
**Full Changelog**: pingdotgg/t3code@v0.0.37...v0.0.38
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.size:XXL1,000+ 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

feat(mobile): add video playback with native iOS controls - #8919

Merged
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback
Aug 31, 2026
Merged

feat(mobile): add video playback with native iOS controls#8919
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 31, 2026

Copy link
Copy Markdown
Member

What Changed

Mobile video attachments currently open as files. This adds playback from received messages and local drafts, including the compact composer and new-task sheet.

  • iOS opens AVKit's full-screen player from the attachment thumbnail, with native playback controls, zoom, Close, and swipe dismissal. Received videos stream directly from their signed URL; there is no full-file download or app loading overlay before presentation.
  • Video tiles show cached thumbnails. The asset endpoint supports single byte ranges so native readers can fetch metadata, frames, and playback data without downloading the entire file first.
  • Touch and hold an iOS video attachment to save or share the original through the system sheet. Android uses an Expo Video modal with a save/share action. Draft file leases remain active through playback and sharing.
  • Preserve picker filenames and recognize video extensions when MIME metadata is generic. Web and mobile share that detection helper. The native source-view registration can be reused for image zoom transitions.

Why

Videos should be playable before and after sending. AVKit supplies the expected iOS controls and dismissal behavior, while byte-range delivery lets opening, seeking, and thumbnail extraction avoid waiting for a complete download.

UI Changes

Current iPhone 17 Pro / iOS 27 recording: thumbnail → streaming playback → native controls → swipe back → reopen → Close.

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f0c0378d96a0fe5/ios-streaming-video-player.mp4

The screenshots compare an earlier player iteration on this branch with the final native player, using the same sample clip.

Before native UI refinementFinal iOS player
Earlier player with custom header and save/share footerFinal AVKit player with native controls

Validation

  • iOS 27 simulator: received and local-draft playback, thumbnails, autoplay, play/pause, Close/reopen, swipe dismissal, native sharing, and invalid-video recovery. A separate audio player remained playing through video presentation and dismissal.
  • A stalled stream opened and remained dismissible before any video bytes arrived. Throttled playback progressed before the file finished transferring. Two normal previews made zero full-file download calls.
  • Focused download/share, draft-lease, thumbnail, MIME-detection, and HTTP byte-range tests passed. Mobile and server typechecks, targeted lint, SwiftLint, and formatting passed. The picker suite includes a provider-URI regression and passes all 31 tests.
  • A matching development build is installed on the phone and launched against Metro. Phone playback still needs manual verification. Android, relay/tunnel transport, and physical audio routing were not runtime-tested.
Other observations from simulator testing

Saving to Files under a new filename passed with identical file bytes. Replacing an existing filename stalled on iOS 27, including with the original Expo Sharing path.

Sending a video from the new-task sheet uploaded it and received a reply, but left the cleared sheet open. The navigation call is unchanged; a runtime comparison with main was not performed.

Checklist

  • Changes are focused on video attachment playback and its supporting delivery/lifecycle code
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches asset HTTP semantics for videos, native AVKit/audio-session behavior, and attachment file lifecycle; regressions could affect non-video downloads, older servers without ranges, or draft cleanup timing.

Overview
Adds end-to-end mobile video attachments: playable tiles in the thread feed and composer, with iOS AVKit full-screen playback zooming from a registered thumbnail and Android using an expo-video modal.

Native iOS (T3NativeControls) exposes presentVideo / dismissVideo, a PresentationSource view for transition/share anchoring, and shareFileFromSource for popover share sheets. Playback streams remote signed URLs without a full download first; drafts use retain/release leases so files are not deleted during preview or share.

Supporting client work includes cached expo-video thumbnails, expo-document-picker for file picks, refactored download/share preview files, and shared videoMimeType in @t3tools/shared/video.

Server: video asset GETs honor single Range requests (206/416) so iOS can stream and extract frames; normal downloads and unsupported ranges still return the full file.

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

Note

Add native iOS video playback, thumbnail caching, and byte-range asset serving

  • Adds T3NativeControls expo module that presents AVPlayerViewController (inline-to-fullscreen zoom, auto-play, audio session management, cleanup on dismiss) and presentVideo/dismissVideo/shareFileFromSource JS-callable functions; PresentationSource view registers source anchors for share and zoom transitions.
  • Adds videoThumbnails.ts that lazily imports expo-video to extract a single frame (≤480x480) with abort signaling, 15s timeout, and LRU cache capped at 32 entries; VideoThumbnailImage.tsx renders these lazily and cancels on unmount.
  • Adds assetFileResponse in the server asset route that serves 206 partial content with Content-Range/Accept-Ranges for video MIME types and 416 for unsatisfiable ranges; non-video assets and unsupported Range syntax fall back to full 200.
  • Integrates video into the composer and feed: video attachments render as VideoAttachmentTile with thumbnails and a long-press share menu on iOS; VideoPreviewModal resolves local draft files via loadLocalVideoPreview or remote URLs and presents the native player.
  • Refactors attachment download/share lifecycle around AttachmentPreviewFile with explicit share/dispose, switches file picking to expo-document-picker, and adds retain/release leases (retainComposerAttachmentFile) so preview/playback prevents premature file deletion.
  • Risk: pickComposerFiles now uses expo-document-picker (getDocumentAsync, copyToCacheDirectory) and consumes result.assets/mimeType instead of expo-file-systempickFileAsync fields; presentVideo rejects when the URL is not playable or a presentation is already active; video asset routes now return 416 for unsatisfiable ranges.

Macroscope summarized b6f497d.

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 31, 2026
@coderabbitai

coderabbitaiBot commented Aug 31, 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: f64f2a38-cc80-4a15-a218-87973bd34b11

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

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 31, 2026
@github-actions

github-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−3 B (−0.0%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−4 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages10100 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.5 KiB+222 B (+1.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.6 KiB+226 B (+3.5%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB57.9 KiB+1.5 KiB (+2.7%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: bba79cc · PR result: b6f497d · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

Comment threadapps/mobile/src/lib/composerImages.ts Outdated
Comment threaddocs/internals/mobile-navigation.md Outdated
Comment threadapps/mobile/modules/t3-native-controls/ios/T3NativeVideoPresentation.swift 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 ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit b6f497d. Configure here.

Comment threadapps/mobile/src/lib/videoThumbnails.ts
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a large end-to-end mobile video feature spanning native iOS playback, Android playback, sharing, file retention, thumbnail extraction, document picking, and server byte-range delivery, with meaningful runtime side effects across existing paths. An unresolved concrete concern about rejected native thumbnail work after cancellation further warrants human review.

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

@juliusmarminge
juliusmarminge merged commit 31c1c59 into mainAug 31, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the feat/mobile-video-playback branch August 31, 2026 19:06
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
**Full Changelog**: pingdotgg/t3code@v0.0.38-nightly.20260831.1240...v0.0.38-nightly.20260831.1241
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38-nightly.20260831.1241
alexcstark added a commit to alexcstark/t3code that referenced this pull request Sep 1, 2026
fc3751f kept call sites while dropping the definitions from both
sides, so the built app threw "deriveTurnPlans is not defined" on
render. tsgo reported 16 errors in apps/web on that commit.
- drop the stale deriveTurnPlans call and the extra deriveTimelineEntries
argument (upstream removed the function in pingdotgg#8734)
- restore the workingStepLabel memo TerminalShellStatus reads
- restore NOOP_USE_ARTIFACT_TEMPLATE / NOOP_OPEN_ATTACHMENT and rename
ctx.onFileDownload to upstream's ctx.onFileOpen
- restore the video play-button rendering from pingdotgg#8919; its props and the
userVideos split merged in but nothing rendered them
- restore the helpers dropped from ChatMarkdown.workspace-images.test.tsx
and delete the orphaned resolveSidebarStageBadgeLabel test that
branding.test.ts already covers
Claude-Session: https://claude.ai/code/session_01VucnEAuRBJ3icH9fzd7Mqu
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* Add mobile composer attachment menu with video support by @juliusmarminge in pingdotgg/t3code#8843
* fix(web): restore unified activity logs and composer banners by @t3dotgg in pingdotgg/t3code#8734
* fix(web): address composer banner review follow-ups by @juliusmarminge in pingdotgg/t3code#8850
* fix(web): widen sync banners and simplify the working timer by @juliusmarminge in pingdotgg/t3code#8855
* fix(preview): improve browser recording quality by @maria-rcks in pingdotgg/t3code#8839
* fix(web): mark pull request links as external by @juliusmarminge in pingdotgg/t3code#8856
* fix(mobile): replace Callstack glass with Expo glass by @juliusmarminge in pingdotgg/t3code#8862
* fix(server): skip IDE detection in Claude probes by @yashranaway in pingdotgg/t3code#8634
* chore(macroscope): review diagnostic overrides by @t3-code[bot] in pingdotgg/t3code#8917
* fix(contracts): accept CLI event origins by @nateEc in pingdotgg/t3code#8905
* fix(web): hide invalid slash skill completions by @nateEc in pingdotgg/t3code#8904
* fix(mobile): defer draft navigation until submission completes by @juliusmarminge in pingdotgg/t3code#8914
* chore: disable CodeRabbit review status by @juliusmarminge in pingdotgg/t3code#8933
* Delete app.json by @juliusmarminge in pingdotgg/t3code#8934
* fix(web): show scrollbar for wide markdown tables by @UtkarshUsername in pingdotgg/t3code#8868
* fix(mobile): shimmer active tool rows by @juliusmarminge in pingdotgg/t3code#8932
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
* fix(web): prevent chat metadata overlap by @MatthewFeroz in pingdotgg/t3code#8851
* fix(server): preserve usage cache outside walked roots by @Lucenx9 in pingdotgg/t3code#8540
* feat(mobile): add native image and PDF previews by @juliusmarminge in pingdotgg/t3code#8959
* fix(server): allow long thread IDs in HTTP routes by @nateEc in pingdotgg/t3code#8898
* fix(shared): preserve Windows shell PATH priority by @UtkarshUsername in pingdotgg/t3code#8748
* fix(web): make WSL settings searchable by @UtkarshUsername in pingdotgg/t3code#8881
* feat(web): add expand/collapse all control to the files surface by @UtkarshUsername in pingdotgg/t3code#8889
* feat(mobile): upload attachments while composing by @juliusmarminge in pingdotgg/t3code#8978
* fix(chat): keep agent activity visible between actions by @maria-rcks in pingdotgg/t3code#8984
* fix(server): isolate remote web session cookies by @Bil0000 in pingdotgg/t3code#8085
* feat(pull-requests): link GitHub references in markdown by @maria-rcks in pingdotgg/t3code#8812
* perf(server): reduce frequency of full tool call output being loaded into memory from db by @t3dotgg in pingdotgg/t3code#8988
* feat(web): add pull request list filters by @maria-rcks in pingdotgg/t3code#8809
* feat(web): search individual settings by detail by @maria-rcks in pingdotgg/t3code#8831
* feat(client): render viewed images in work logs by @maria-rcks in pingdotgg/t3code#8936
* fix(client): use package import for markdown image helpers by @juliusmarminge in pingdotgg/t3code#9010
* test: remove static presentation snapshots by @t3-code[bot] in pingdotgg/t3code#9008
* perf(server): bound snapshot activity payload memory by @t3dotgg in pingdotgg/t3code#9000
* perf(server): cut idle CPU use and stop provider event leaks by @t3dotgg in pingdotgg/t3code#8187
* perf(server): scan only appended transcript bytes for usage summaries by @StiensWout in pingdotgg/t3code#9024
* perf(server): cut chatty tool-update frames by 90% by @Adamulek123 in pingdotgg/t3code#8368
* fix(server): settle threads server-side by @t3dotgg in pingdotgg/t3code#8600
* fix(clients): dedupe skills in composer menus by @Adamulek123 in pingdotgg/t3code#8043
* fix(server): stop OpenCode child sessions by @t3dotgg in pingdotgg/t3code#9005
* perf(web): defer pull request line stats until visible by @Adamulek123 in pingdotgg/t3code#6471
* perf(server): skip full-message reads while streaming by @t3dotgg in pingdotgg/t3code#9032
* perf(client-runtime): halve server config bootstrap traffic by @Adamulek123 in pingdotgg/t3code#8367
* fix(web): align un-settle banner action by @StiensWout in pingdotgg/t3code#9033
* fix(web): block type-to-focus behind open dialogs by @Lucenx9 in pingdotgg/t3code#8139
* feat(shortcuts): copy active thread reference by @maria-rcks in pingdotgg/t3code#8994
* fix(mobile): keep thread scroll bounds current after animations by @juliusmarminge in pingdotgg/t3code#9013
* fix(server): cache project favicon resolution by @willsheldon in pingdotgg/t3code#9080
* feat(claude): add Claude Fable 5.1 model by @q1 in pingdotgg/t3code#9078
* fix(preview): restore recording and macOS rendering after Electron 43 by @StiensWout in pingdotgg/t3code#9001
* feat(desktop): add configurable quit shortcut confirmation by @juliusmarminge in pingdotgg/t3code#9076
* feat(web): open project settings from thread menus by @SunkenInTime in pingdotgg/t3code#8925
* fix(chat): reuse one row for live activity by @maria-rcks in pingdotgg/t3code#9062
* feat(models): discover Claude models from remote manifest by @juliusmarminge in pingdotgg/t3code#9084
* Revert "fix(chat): reuse one row for live activity" by @maria-rcks in pingdotgg/t3code#9096
* fix(web): sync sidebar PR state from open panel by @t3-code[bot] in pingdotgg/t3code#9092
* fix(web): changing projects no longer creates a draft by @extoci in pingdotgg/t3code#9097
* fix(web): keep theme placeholder text dimmer than entered text by @flamboh in pingdotgg/t3code#9104
* fix(web): keep the selected environment when changing projects by @t3dotgg in pingdotgg/t3code#9102
## New Contributors
* @willsheldon made their first contribution in pingdotgg/t3code#9080
* @q1 made their first contribution in pingdotgg/t3code#9078
**Full Changelog**: pingdotgg/t3code@v0.0.37...v0.0.38
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.size:XXL1,000+ 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

feat(mobile): add video playback with native iOS controls - #8919

Merged
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback
Aug 31, 2026
Merged

feat(mobile): add video playback with native iOS controls#8919
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 31, 2026

Copy link
Copy Markdown
Member

What Changed

Mobile video attachments currently open as files. This adds playback from received messages and local drafts, including the compact composer and new-task sheet.

  • iOS opens AVKit's full-screen player from the attachment thumbnail, with native playback controls, zoom, Close, and swipe dismissal. Received videos stream directly from their signed URL; there is no full-file download or app loading overlay before presentation.
  • Video tiles show cached thumbnails. The asset endpoint supports single byte ranges so native readers can fetch metadata, frames, and playback data without downloading the entire file first.
  • Touch and hold an iOS video attachment to save or share the original through the system sheet. Android uses an Expo Video modal with a save/share action. Draft file leases remain active through playback and sharing.
  • Preserve picker filenames and recognize video extensions when MIME metadata is generic. Web and mobile share that detection helper. The native source-view registration can be reused for image zoom transitions.

Why

Videos should be playable before and after sending. AVKit supplies the expected iOS controls and dismissal behavior, while byte-range delivery lets opening, seeking, and thumbnail extraction avoid waiting for a complete download.

UI Changes

Current iPhone 17 Pro / iOS 27 recording: thumbnail → streaming playback → native controls → swipe back → reopen → Close.

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f0c0378d96a0fe5/ios-streaming-video-player.mp4

The screenshots compare an earlier player iteration on this branch with the final native player, using the same sample clip.

Before native UI refinementFinal iOS player
Earlier player with custom header and save/share footerFinal AVKit player with native controls

Validation

  • iOS 27 simulator: received and local-draft playback, thumbnails, autoplay, play/pause, Close/reopen, swipe dismissal, native sharing, and invalid-video recovery. A separate audio player remained playing through video presentation and dismissal.
  • A stalled stream opened and remained dismissible before any video bytes arrived. Throttled playback progressed before the file finished transferring. Two normal previews made zero full-file download calls.
  • Focused download/share, draft-lease, thumbnail, MIME-detection, and HTTP byte-range tests passed. Mobile and server typechecks, targeted lint, SwiftLint, and formatting passed. The picker suite includes a provider-URI regression and passes all 31 tests.
  • A matching development build is installed on the phone and launched against Metro. Phone playback still needs manual verification. Android, relay/tunnel transport, and physical audio routing were not runtime-tested.
Other observations from simulator testing

Saving to Files under a new filename passed with identical file bytes. Replacing an existing filename stalled on iOS 27, including with the original Expo Sharing path.

Sending a video from the new-task sheet uploaded it and received a reply, but left the cleared sheet open. The navigation call is unchanged; a runtime comparison with main was not performed.

Checklist

  • Changes are focused on video attachment playback and its supporting delivery/lifecycle code
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches asset HTTP semantics for videos, native AVKit/audio-session behavior, and attachment file lifecycle; regressions could affect non-video downloads, older servers without ranges, or draft cleanup timing.

Overview
Adds end-to-end mobile video attachments: playable tiles in the thread feed and composer, with iOS AVKit full-screen playback zooming from a registered thumbnail and Android using an expo-video modal.

Native iOS (T3NativeControls) exposes presentVideo / dismissVideo, a PresentationSource view for transition/share anchoring, and shareFileFromSource for popover share sheets. Playback streams remote signed URLs without a full download first; drafts use retain/release leases so files are not deleted during preview or share.

Supporting client work includes cached expo-video thumbnails, expo-document-picker for file picks, refactored download/share preview files, and shared videoMimeType in @t3tools/shared/video.

Server: video asset GETs honor single Range requests (206/416) so iOS can stream and extract frames; normal downloads and unsupported ranges still return the full file.

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

Note

Add native iOS video playback, thumbnail caching, and byte-range asset serving

  • Adds T3NativeControls expo module that presents AVPlayerViewController (inline-to-fullscreen zoom, auto-play, audio session management, cleanup on dismiss) and presentVideo/dismissVideo/shareFileFromSource JS-callable functions; PresentationSource view registers source anchors for share and zoom transitions.
  • Adds videoThumbnails.ts that lazily imports expo-video to extract a single frame (≤480x480) with abort signaling, 15s timeout, and LRU cache capped at 32 entries; VideoThumbnailImage.tsx renders these lazily and cancels on unmount.
  • Adds assetFileResponse in the server asset route that serves 206 partial content with Content-Range/Accept-Ranges for video MIME types and 416 for unsatisfiable ranges; non-video assets and unsupported Range syntax fall back to full 200.
  • Integrates video into the composer and feed: video attachments render as VideoAttachmentTile with thumbnails and a long-press share menu on iOS; VideoPreviewModal resolves local draft files via loadLocalVideoPreview or remote URLs and presents the native player.
  • Refactors attachment download/share lifecycle around AttachmentPreviewFile with explicit share/dispose, switches file picking to expo-document-picker, and adds retain/release leases (retainComposerAttachmentFile) so preview/playback prevents premature file deletion.
  • Risk: pickComposerFiles now uses expo-document-picker (getDocumentAsync, copyToCacheDirectory) and consumes result.assets/mimeType instead of expo-file-systempickFileAsync fields; presentVideo rejects when the URL is not playable or a presentation is already active; video asset routes now return 416 for unsatisfiable ranges.

Macroscope summarized b6f497d.

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 31, 2026
@coderabbitai

coderabbitaiBot commented Aug 31, 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: f64f2a38-cc80-4a15-a218-87973bd34b11

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

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 31, 2026
@github-actions

github-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−3 B (−0.0%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−4 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages10100 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.5 KiB+222 B (+1.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.6 KiB+226 B (+3.5%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB57.9 KiB+1.5 KiB (+2.7%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: bba79cc · PR result: b6f497d · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

Comment threadapps/mobile/src/lib/composerImages.ts Outdated
Comment threaddocs/internals/mobile-navigation.md Outdated
Comment threadapps/mobile/modules/t3-native-controls/ios/T3NativeVideoPresentation.swift 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 ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit b6f497d. Configure here.

Comment threadapps/mobile/src/lib/videoThumbnails.ts
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a large end-to-end mobile video feature spanning native iOS playback, Android playback, sharing, file retention, thumbnail extraction, document picking, and server byte-range delivery, with meaningful runtime side effects across existing paths. An unresolved concrete concern about rejected native thumbnail work after cancellation further warrants human review.

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

@juliusmarminge
juliusmarminge merged commit 31c1c59 into mainAug 31, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the feat/mobile-video-playback branch August 31, 2026 19:06
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
**Full Changelog**: pingdotgg/t3code@v0.0.38-nightly.20260831.1240...v0.0.38-nightly.20260831.1241
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38-nightly.20260831.1241
alexcstark added a commit to alexcstark/t3code that referenced this pull request Sep 1, 2026
fc3751f kept call sites while dropping the definitions from both
sides, so the built app threw "deriveTurnPlans is not defined" on
render. tsgo reported 16 errors in apps/web on that commit.
- drop the stale deriveTurnPlans call and the extra deriveTimelineEntries
argument (upstream removed the function in pingdotgg#8734)
- restore the workingStepLabel memo TerminalShellStatus reads
- restore NOOP_USE_ARTIFACT_TEMPLATE / NOOP_OPEN_ATTACHMENT and rename
ctx.onFileDownload to upstream's ctx.onFileOpen
- restore the video play-button rendering from pingdotgg#8919; its props and the
userVideos split merged in but nothing rendered them
- restore the helpers dropped from ChatMarkdown.workspace-images.test.tsx
and delete the orphaned resolveSidebarStageBadgeLabel test that
branding.test.ts already covers
Claude-Session: https://claude.ai/code/session_01VucnEAuRBJ3icH9fzd7Mqu
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* Add mobile composer attachment menu with video support by @juliusmarminge in pingdotgg/t3code#8843
* fix(web): restore unified activity logs and composer banners by @t3dotgg in pingdotgg/t3code#8734
* fix(web): address composer banner review follow-ups by @juliusmarminge in pingdotgg/t3code#8850
* fix(web): widen sync banners and simplify the working timer by @juliusmarminge in pingdotgg/t3code#8855
* fix(preview): improve browser recording quality by @maria-rcks in pingdotgg/t3code#8839
* fix(web): mark pull request links as external by @juliusmarminge in pingdotgg/t3code#8856
* fix(mobile): replace Callstack glass with Expo glass by @juliusmarminge in pingdotgg/t3code#8862
* fix(server): skip IDE detection in Claude probes by @yashranaway in pingdotgg/t3code#8634
* chore(macroscope): review diagnostic overrides by @t3-code[bot] in pingdotgg/t3code#8917
* fix(contracts): accept CLI event origins by @nateEc in pingdotgg/t3code#8905
* fix(web): hide invalid slash skill completions by @nateEc in pingdotgg/t3code#8904
* fix(mobile): defer draft navigation until submission completes by @juliusmarminge in pingdotgg/t3code#8914
* chore: disable CodeRabbit review status by @juliusmarminge in pingdotgg/t3code#8933
* Delete app.json by @juliusmarminge in pingdotgg/t3code#8934
* fix(web): show scrollbar for wide markdown tables by @UtkarshUsername in pingdotgg/t3code#8868
* fix(mobile): shimmer active tool rows by @juliusmarminge in pingdotgg/t3code#8932
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
* fix(web): prevent chat metadata overlap by @MatthewFeroz in pingdotgg/t3code#8851
* fix(server): preserve usage cache outside walked roots by @Lucenx9 in pingdotgg/t3code#8540
* feat(mobile): add native image and PDF previews by @juliusmarminge in pingdotgg/t3code#8959
* fix(server): allow long thread IDs in HTTP routes by @nateEc in pingdotgg/t3code#8898
* fix(shared): preserve Windows shell PATH priority by @UtkarshUsername in pingdotgg/t3code#8748
* fix(web): make WSL settings searchable by @UtkarshUsername in pingdotgg/t3code#8881
* feat(web): add expand/collapse all control to the files surface by @UtkarshUsername in pingdotgg/t3code#8889
* feat(mobile): upload attachments while composing by @juliusmarminge in pingdotgg/t3code#8978
* fix(chat): keep agent activity visible between actions by @maria-rcks in pingdotgg/t3code#8984
* fix(server): isolate remote web session cookies by @Bil0000 in pingdotgg/t3code#8085
* feat(pull-requests): link GitHub references in markdown by @maria-rcks in pingdotgg/t3code#8812
* perf(server): reduce frequency of full tool call output being loaded into memory from db by @t3dotgg in pingdotgg/t3code#8988
* feat(web): add pull request list filters by @maria-rcks in pingdotgg/t3code#8809
* feat(web): search individual settings by detail by @maria-rcks in pingdotgg/t3code#8831
* feat(client): render viewed images in work logs by @maria-rcks in pingdotgg/t3code#8936
* fix(client): use package import for markdown image helpers by @juliusmarminge in pingdotgg/t3code#9010
* test: remove static presentation snapshots by @t3-code[bot] in pingdotgg/t3code#9008
* perf(server): bound snapshot activity payload memory by @t3dotgg in pingdotgg/t3code#9000
* perf(server): cut idle CPU use and stop provider event leaks by @t3dotgg in pingdotgg/t3code#8187
* perf(server): scan only appended transcript bytes for usage summaries by @StiensWout in pingdotgg/t3code#9024
* perf(server): cut chatty tool-update frames by 90% by @Adamulek123 in pingdotgg/t3code#8368
* fix(server): settle threads server-side by @t3dotgg in pingdotgg/t3code#8600
* fix(clients): dedupe skills in composer menus by @Adamulek123 in pingdotgg/t3code#8043
* fix(server): stop OpenCode child sessions by @t3dotgg in pingdotgg/t3code#9005
* perf(web): defer pull request line stats until visible by @Adamulek123 in pingdotgg/t3code#6471
* perf(server): skip full-message reads while streaming by @t3dotgg in pingdotgg/t3code#9032
* perf(client-runtime): halve server config bootstrap traffic by @Adamulek123 in pingdotgg/t3code#8367
* fix(web): align un-settle banner action by @StiensWout in pingdotgg/t3code#9033
* fix(web): block type-to-focus behind open dialogs by @Lucenx9 in pingdotgg/t3code#8139
* feat(shortcuts): copy active thread reference by @maria-rcks in pingdotgg/t3code#8994
* fix(mobile): keep thread scroll bounds current after animations by @juliusmarminge in pingdotgg/t3code#9013
* fix(server): cache project favicon resolution by @willsheldon in pingdotgg/t3code#9080
* feat(claude): add Claude Fable 5.1 model by @q1 in pingdotgg/t3code#9078
* fix(preview): restore recording and macOS rendering after Electron 43 by @StiensWout in pingdotgg/t3code#9001
* feat(desktop): add configurable quit shortcut confirmation by @juliusmarminge in pingdotgg/t3code#9076
* feat(web): open project settings from thread menus by @SunkenInTime in pingdotgg/t3code#8925
* fix(chat): reuse one row for live activity by @maria-rcks in pingdotgg/t3code#9062
* feat(models): discover Claude models from remote manifest by @juliusmarminge in pingdotgg/t3code#9084
* Revert "fix(chat): reuse one row for live activity" by @maria-rcks in pingdotgg/t3code#9096
* fix(web): sync sidebar PR state from open panel by @t3-code[bot] in pingdotgg/t3code#9092
* fix(web): changing projects no longer creates a draft by @extoci in pingdotgg/t3code#9097
* fix(web): keep theme placeholder text dimmer than entered text by @flamboh in pingdotgg/t3code#9104
* fix(web): keep the selected environment when changing projects by @t3dotgg in pingdotgg/t3code#9102
## New Contributors
* @willsheldon made their first contribution in pingdotgg/t3code#9080
* @q1 made their first contribution in pingdotgg/t3code#9078
**Full Changelog**: pingdotgg/t3code@v0.0.37...v0.0.38
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.size:XXL1,000+ 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

feat(mobile): add video playback with native iOS controls - #8919

Merged
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback
Aug 31, 2026
Merged

feat(mobile): add video playback with native iOS controls#8919
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 31, 2026

Copy link
Copy Markdown
Member

What Changed

Mobile video attachments currently open as files. This adds playback from received messages and local drafts, including the compact composer and new-task sheet.

  • iOS opens AVKit's full-screen player from the attachment thumbnail, with native playback controls, zoom, Close, and swipe dismissal. Received videos stream directly from their signed URL; there is no full-file download or app loading overlay before presentation.
  • Video tiles show cached thumbnails. The asset endpoint supports single byte ranges so native readers can fetch metadata, frames, and playback data without downloading the entire file first.
  • Touch and hold an iOS video attachment to save or share the original through the system sheet. Android uses an Expo Video modal with a save/share action. Draft file leases remain active through playback and sharing.
  • Preserve picker filenames and recognize video extensions when MIME metadata is generic. Web and mobile share that detection helper. The native source-view registration can be reused for image zoom transitions.

Why

Videos should be playable before and after sending. AVKit supplies the expected iOS controls and dismissal behavior, while byte-range delivery lets opening, seeking, and thumbnail extraction avoid waiting for a complete download.

UI Changes

Current iPhone 17 Pro / iOS 27 recording: thumbnail → streaming playback → native controls → swipe back → reopen → Close.

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f0c0378d96a0fe5/ios-streaming-video-player.mp4

The screenshots compare an earlier player iteration on this branch with the final native player, using the same sample clip.

Before native UI refinementFinal iOS player
Earlier player with custom header and save/share footerFinal AVKit player with native controls

Validation

  • iOS 27 simulator: received and local-draft playback, thumbnails, autoplay, play/pause, Close/reopen, swipe dismissal, native sharing, and invalid-video recovery. A separate audio player remained playing through video presentation and dismissal.
  • A stalled stream opened and remained dismissible before any video bytes arrived. Throttled playback progressed before the file finished transferring. Two normal previews made zero full-file download calls.
  • Focused download/share, draft-lease, thumbnail, MIME-detection, and HTTP byte-range tests passed. Mobile and server typechecks, targeted lint, SwiftLint, and formatting passed. The picker suite includes a provider-URI regression and passes all 31 tests.
  • A matching development build is installed on the phone and launched against Metro. Phone playback still needs manual verification. Android, relay/tunnel transport, and physical audio routing were not runtime-tested.
Other observations from simulator testing

Saving to Files under a new filename passed with identical file bytes. Replacing an existing filename stalled on iOS 27, including with the original Expo Sharing path.

Sending a video from the new-task sheet uploaded it and received a reply, but left the cleared sheet open. The navigation call is unchanged; a runtime comparison with main was not performed.

Checklist

  • Changes are focused on video attachment playback and its supporting delivery/lifecycle code
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches asset HTTP semantics for videos, native AVKit/audio-session behavior, and attachment file lifecycle; regressions could affect non-video downloads, older servers without ranges, or draft cleanup timing.

Overview
Adds end-to-end mobile video attachments: playable tiles in the thread feed and composer, with iOS AVKit full-screen playback zooming from a registered thumbnail and Android using an expo-video modal.

Native iOS (T3NativeControls) exposes presentVideo / dismissVideo, a PresentationSource view for transition/share anchoring, and shareFileFromSource for popover share sheets. Playback streams remote signed URLs without a full download first; drafts use retain/release leases so files are not deleted during preview or share.

Supporting client work includes cached expo-video thumbnails, expo-document-picker for file picks, refactored download/share preview files, and shared videoMimeType in @t3tools/shared/video.

Server: video asset GETs honor single Range requests (206/416) so iOS can stream and extract frames; normal downloads and unsupported ranges still return the full file.

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

Note

Add native iOS video playback, thumbnail caching, and byte-range asset serving

  • Adds T3NativeControls expo module that presents AVPlayerViewController (inline-to-fullscreen zoom, auto-play, audio session management, cleanup on dismiss) and presentVideo/dismissVideo/shareFileFromSource JS-callable functions; PresentationSource view registers source anchors for share and zoom transitions.
  • Adds videoThumbnails.ts that lazily imports expo-video to extract a single frame (≤480x480) with abort signaling, 15s timeout, and LRU cache capped at 32 entries; VideoThumbnailImage.tsx renders these lazily and cancels on unmount.
  • Adds assetFileResponse in the server asset route that serves 206 partial content with Content-Range/Accept-Ranges for video MIME types and 416 for unsatisfiable ranges; non-video assets and unsupported Range syntax fall back to full 200.
  • Integrates video into the composer and feed: video attachments render as VideoAttachmentTile with thumbnails and a long-press share menu on iOS; VideoPreviewModal resolves local draft files via loadLocalVideoPreview or remote URLs and presents the native player.
  • Refactors attachment download/share lifecycle around AttachmentPreviewFile with explicit share/dispose, switches file picking to expo-document-picker, and adds retain/release leases (retainComposerAttachmentFile) so preview/playback prevents premature file deletion.
  • Risk: pickComposerFiles now uses expo-document-picker (getDocumentAsync, copyToCacheDirectory) and consumes result.assets/mimeType instead of expo-file-systempickFileAsync fields; presentVideo rejects when the URL is not playable or a presentation is already active; video asset routes now return 416 for unsatisfiable ranges.

Macroscope summarized b6f497d.

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 31, 2026
@coderabbitai

coderabbitaiBot commented Aug 31, 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: f64f2a38-cc80-4a15-a218-87973bd34b11

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

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 31, 2026
@github-actions

github-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−3 B (−0.0%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−4 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages10100 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.5 KiB+222 B (+1.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.6 KiB+226 B (+3.5%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB57.9 KiB+1.5 KiB (+2.7%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: bba79cc · PR result: b6f497d · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

Comment threadapps/mobile/src/lib/composerImages.ts Outdated
Comment threaddocs/internals/mobile-navigation.md Outdated
Comment threadapps/mobile/modules/t3-native-controls/ios/T3NativeVideoPresentation.swift 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 ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit b6f497d. Configure here.

Comment threadapps/mobile/src/lib/videoThumbnails.ts
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a large end-to-end mobile video feature spanning native iOS playback, Android playback, sharing, file retention, thumbnail extraction, document picking, and server byte-range delivery, with meaningful runtime side effects across existing paths. An unresolved concrete concern about rejected native thumbnail work after cancellation further warrants human review.

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

@juliusmarminge
juliusmarminge merged commit 31c1c59 into mainAug 31, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the feat/mobile-video-playback branch August 31, 2026 19:06
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
**Full Changelog**: pingdotgg/t3code@v0.0.38-nightly.20260831.1240...v0.0.38-nightly.20260831.1241
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38-nightly.20260831.1241
alexcstark added a commit to alexcstark/t3code that referenced this pull request Sep 1, 2026
fc3751f kept call sites while dropping the definitions from both
sides, so the built app threw "deriveTurnPlans is not defined" on
render. tsgo reported 16 errors in apps/web on that commit.
- drop the stale deriveTurnPlans call and the extra deriveTimelineEntries
argument (upstream removed the function in pingdotgg#8734)
- restore the workingStepLabel memo TerminalShellStatus reads
- restore NOOP_USE_ARTIFACT_TEMPLATE / NOOP_OPEN_ATTACHMENT and rename
ctx.onFileDownload to upstream's ctx.onFileOpen
- restore the video play-button rendering from pingdotgg#8919; its props and the
userVideos split merged in but nothing rendered them
- restore the helpers dropped from ChatMarkdown.workspace-images.test.tsx
and delete the orphaned resolveSidebarStageBadgeLabel test that
branding.test.ts already covers
Claude-Session: https://claude.ai/code/session_01VucnEAuRBJ3icH9fzd7Mqu
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* Add mobile composer attachment menu with video support by @juliusmarminge in pingdotgg/t3code#8843
* fix(web): restore unified activity logs and composer banners by @t3dotgg in pingdotgg/t3code#8734
* fix(web): address composer banner review follow-ups by @juliusmarminge in pingdotgg/t3code#8850
* fix(web): widen sync banners and simplify the working timer by @juliusmarminge in pingdotgg/t3code#8855
* fix(preview): improve browser recording quality by @maria-rcks in pingdotgg/t3code#8839
* fix(web): mark pull request links as external by @juliusmarminge in pingdotgg/t3code#8856
* fix(mobile): replace Callstack glass with Expo glass by @juliusmarminge in pingdotgg/t3code#8862
* fix(server): skip IDE detection in Claude probes by @yashranaway in pingdotgg/t3code#8634
* chore(macroscope): review diagnostic overrides by @t3-code[bot] in pingdotgg/t3code#8917
* fix(contracts): accept CLI event origins by @nateEc in pingdotgg/t3code#8905
* fix(web): hide invalid slash skill completions by @nateEc in pingdotgg/t3code#8904
* fix(mobile): defer draft navigation until submission completes by @juliusmarminge in pingdotgg/t3code#8914
* chore: disable CodeRabbit review status by @juliusmarminge in pingdotgg/t3code#8933
* Delete app.json by @juliusmarminge in pingdotgg/t3code#8934
* fix(web): show scrollbar for wide markdown tables by @UtkarshUsername in pingdotgg/t3code#8868
* fix(mobile): shimmer active tool rows by @juliusmarminge in pingdotgg/t3code#8932
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
* fix(web): prevent chat metadata overlap by @MatthewFeroz in pingdotgg/t3code#8851
* fix(server): preserve usage cache outside walked roots by @Lucenx9 in pingdotgg/t3code#8540
* feat(mobile): add native image and PDF previews by @juliusmarminge in pingdotgg/t3code#8959
* fix(server): allow long thread IDs in HTTP routes by @nateEc in pingdotgg/t3code#8898
* fix(shared): preserve Windows shell PATH priority by @UtkarshUsername in pingdotgg/t3code#8748
* fix(web): make WSL settings searchable by @UtkarshUsername in pingdotgg/t3code#8881
* feat(web): add expand/collapse all control to the files surface by @UtkarshUsername in pingdotgg/t3code#8889
* feat(mobile): upload attachments while composing by @juliusmarminge in pingdotgg/t3code#8978
* fix(chat): keep agent activity visible between actions by @maria-rcks in pingdotgg/t3code#8984
* fix(server): isolate remote web session cookies by @Bil0000 in pingdotgg/t3code#8085
* feat(pull-requests): link GitHub references in markdown by @maria-rcks in pingdotgg/t3code#8812
* perf(server): reduce frequency of full tool call output being loaded into memory from db by @t3dotgg in pingdotgg/t3code#8988
* feat(web): add pull request list filters by @maria-rcks in pingdotgg/t3code#8809
* feat(web): search individual settings by detail by @maria-rcks in pingdotgg/t3code#8831
* feat(client): render viewed images in work logs by @maria-rcks in pingdotgg/t3code#8936
* fix(client): use package import for markdown image helpers by @juliusmarminge in pingdotgg/t3code#9010
* test: remove static presentation snapshots by @t3-code[bot] in pingdotgg/t3code#9008
* perf(server): bound snapshot activity payload memory by @t3dotgg in pingdotgg/t3code#9000
* perf(server): cut idle CPU use and stop provider event leaks by @t3dotgg in pingdotgg/t3code#8187
* perf(server): scan only appended transcript bytes for usage summaries by @StiensWout in pingdotgg/t3code#9024
* perf(server): cut chatty tool-update frames by 90% by @Adamulek123 in pingdotgg/t3code#8368
* fix(server): settle threads server-side by @t3dotgg in pingdotgg/t3code#8600
* fix(clients): dedupe skills in composer menus by @Adamulek123 in pingdotgg/t3code#8043
* fix(server): stop OpenCode child sessions by @t3dotgg in pingdotgg/t3code#9005
* perf(web): defer pull request line stats until visible by @Adamulek123 in pingdotgg/t3code#6471
* perf(server): skip full-message reads while streaming by @t3dotgg in pingdotgg/t3code#9032
* perf(client-runtime): halve server config bootstrap traffic by @Adamulek123 in pingdotgg/t3code#8367
* fix(web): align un-settle banner action by @StiensWout in pingdotgg/t3code#9033
* fix(web): block type-to-focus behind open dialogs by @Lucenx9 in pingdotgg/t3code#8139
* feat(shortcuts): copy active thread reference by @maria-rcks in pingdotgg/t3code#8994
* fix(mobile): keep thread scroll bounds current after animations by @juliusmarminge in pingdotgg/t3code#9013
* fix(server): cache project favicon resolution by @willsheldon in pingdotgg/t3code#9080
* feat(claude): add Claude Fable 5.1 model by @q1 in pingdotgg/t3code#9078
* fix(preview): restore recording and macOS rendering after Electron 43 by @StiensWout in pingdotgg/t3code#9001
* feat(desktop): add configurable quit shortcut confirmation by @juliusmarminge in pingdotgg/t3code#9076
* feat(web): open project settings from thread menus by @SunkenInTime in pingdotgg/t3code#8925
* fix(chat): reuse one row for live activity by @maria-rcks in pingdotgg/t3code#9062
* feat(models): discover Claude models from remote manifest by @juliusmarminge in pingdotgg/t3code#9084
* Revert "fix(chat): reuse one row for live activity" by @maria-rcks in pingdotgg/t3code#9096
* fix(web): sync sidebar PR state from open panel by @t3-code[bot] in pingdotgg/t3code#9092
* fix(web): changing projects no longer creates a draft by @extoci in pingdotgg/t3code#9097
* fix(web): keep theme placeholder text dimmer than entered text by @flamboh in pingdotgg/t3code#9104
* fix(web): keep the selected environment when changing projects by @t3dotgg in pingdotgg/t3code#9102
## New Contributors
* @willsheldon made their first contribution in pingdotgg/t3code#9080
* @q1 made their first contribution in pingdotgg/t3code#9078
**Full Changelog**: pingdotgg/t3code@v0.0.37...v0.0.38
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.size:XXL1,000+ 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

feat(mobile): add video playback with native iOS controls - #8919

Merged
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback
Aug 31, 2026
Merged

feat(mobile): add video playback with native iOS controls#8919
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 31, 2026

Copy link
Copy Markdown
Member

What Changed

Mobile video attachments currently open as files. This adds playback from received messages and local drafts, including the compact composer and new-task sheet.

  • iOS opens AVKit's full-screen player from the attachment thumbnail, with native playback controls, zoom, Close, and swipe dismissal. Received videos stream directly from their signed URL; there is no full-file download or app loading overlay before presentation.
  • Video tiles show cached thumbnails. The asset endpoint supports single byte ranges so native readers can fetch metadata, frames, and playback data without downloading the entire file first.
  • Touch and hold an iOS video attachment to save or share the original through the system sheet. Android uses an Expo Video modal with a save/share action. Draft file leases remain active through playback and sharing.
  • Preserve picker filenames and recognize video extensions when MIME metadata is generic. Web and mobile share that detection helper. The native source-view registration can be reused for image zoom transitions.

Why

Videos should be playable before and after sending. AVKit supplies the expected iOS controls and dismissal behavior, while byte-range delivery lets opening, seeking, and thumbnail extraction avoid waiting for a complete download.

UI Changes

Current iPhone 17 Pro / iOS 27 recording: thumbnail → streaming playback → native controls → swipe back → reopen → Close.

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f0c0378d96a0fe5/ios-streaming-video-player.mp4

The screenshots compare an earlier player iteration on this branch with the final native player, using the same sample clip.

Before native UI refinementFinal iOS player
Earlier player with custom header and save/share footerFinal AVKit player with native controls

Validation

  • iOS 27 simulator: received and local-draft playback, thumbnails, autoplay, play/pause, Close/reopen, swipe dismissal, native sharing, and invalid-video recovery. A separate audio player remained playing through video presentation and dismissal.
  • A stalled stream opened and remained dismissible before any video bytes arrived. Throttled playback progressed before the file finished transferring. Two normal previews made zero full-file download calls.
  • Focused download/share, draft-lease, thumbnail, MIME-detection, and HTTP byte-range tests passed. Mobile and server typechecks, targeted lint, SwiftLint, and formatting passed. The picker suite includes a provider-URI regression and passes all 31 tests.
  • A matching development build is installed on the phone and launched against Metro. Phone playback still needs manual verification. Android, relay/tunnel transport, and physical audio routing were not runtime-tested.
Other observations from simulator testing

Saving to Files under a new filename passed with identical file bytes. Replacing an existing filename stalled on iOS 27, including with the original Expo Sharing path.

Sending a video from the new-task sheet uploaded it and received a reply, but left the cleared sheet open. The navigation call is unchanged; a runtime comparison with main was not performed.

Checklist

  • Changes are focused on video attachment playback and its supporting delivery/lifecycle code
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches asset HTTP semantics for videos, native AVKit/audio-session behavior, and attachment file lifecycle; regressions could affect non-video downloads, older servers without ranges, or draft cleanup timing.

Overview
Adds end-to-end mobile video attachments: playable tiles in the thread feed and composer, with iOS AVKit full-screen playback zooming from a registered thumbnail and Android using an expo-video modal.

Native iOS (T3NativeControls) exposes presentVideo / dismissVideo, a PresentationSource view for transition/share anchoring, and shareFileFromSource for popover share sheets. Playback streams remote signed URLs without a full download first; drafts use retain/release leases so files are not deleted during preview or share.

Supporting client work includes cached expo-video thumbnails, expo-document-picker for file picks, refactored download/share preview files, and shared videoMimeType in @t3tools/shared/video.

Server: video asset GETs honor single Range requests (206/416) so iOS can stream and extract frames; normal downloads and unsupported ranges still return the full file.

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

Note

Add native iOS video playback, thumbnail caching, and byte-range asset serving

  • Adds T3NativeControls expo module that presents AVPlayerViewController (inline-to-fullscreen zoom, auto-play, audio session management, cleanup on dismiss) and presentVideo/dismissVideo/shareFileFromSource JS-callable functions; PresentationSource view registers source anchors for share and zoom transitions.
  • Adds videoThumbnails.ts that lazily imports expo-video to extract a single frame (≤480x480) with abort signaling, 15s timeout, and LRU cache capped at 32 entries; VideoThumbnailImage.tsx renders these lazily and cancels on unmount.
  • Adds assetFileResponse in the server asset route that serves 206 partial content with Content-Range/Accept-Ranges for video MIME types and 416 for unsatisfiable ranges; non-video assets and unsupported Range syntax fall back to full 200.
  • Integrates video into the composer and feed: video attachments render as VideoAttachmentTile with thumbnails and a long-press share menu on iOS; VideoPreviewModal resolves local draft files via loadLocalVideoPreview or remote URLs and presents the native player.
  • Refactors attachment download/share lifecycle around AttachmentPreviewFile with explicit share/dispose, switches file picking to expo-document-picker, and adds retain/release leases (retainComposerAttachmentFile) so preview/playback prevents premature file deletion.
  • Risk: pickComposerFiles now uses expo-document-picker (getDocumentAsync, copyToCacheDirectory) and consumes result.assets/mimeType instead of expo-file-systempickFileAsync fields; presentVideo rejects when the URL is not playable or a presentation is already active; video asset routes now return 416 for unsatisfiable ranges.

Macroscope summarized b6f497d.

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 31, 2026
@coderabbitai

coderabbitaiBot commented Aug 31, 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: f64f2a38-cc80-4a15-a218-87973bd34b11

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

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 31, 2026
@github-actions

github-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−3 B (−0.0%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−4 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages10100 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.5 KiB+222 B (+1.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.6 KiB+226 B (+3.5%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB57.9 KiB+1.5 KiB (+2.7%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: bba79cc · PR result: b6f497d · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

Comment threadapps/mobile/src/lib/composerImages.ts Outdated
Comment threaddocs/internals/mobile-navigation.md Outdated
Comment threadapps/mobile/modules/t3-native-controls/ios/T3NativeVideoPresentation.swift 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 ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit b6f497d. Configure here.

Comment threadapps/mobile/src/lib/videoThumbnails.ts
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a large end-to-end mobile video feature spanning native iOS playback, Android playback, sharing, file retention, thumbnail extraction, document picking, and server byte-range delivery, with meaningful runtime side effects across existing paths. An unresolved concrete concern about rejected native thumbnail work after cancellation further warrants human review.

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

@juliusmarminge
juliusmarminge merged commit 31c1c59 into mainAug 31, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the feat/mobile-video-playback branch August 31, 2026 19:06
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
**Full Changelog**: pingdotgg/t3code@v0.0.38-nightly.20260831.1240...v0.0.38-nightly.20260831.1241
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38-nightly.20260831.1241
alexcstark added a commit to alexcstark/t3code that referenced this pull request Sep 1, 2026
fc3751f kept call sites while dropping the definitions from both
sides, so the built app threw "deriveTurnPlans is not defined" on
render. tsgo reported 16 errors in apps/web on that commit.
- drop the stale deriveTurnPlans call and the extra deriveTimelineEntries
argument (upstream removed the function in pingdotgg#8734)
- restore the workingStepLabel memo TerminalShellStatus reads
- restore NOOP_USE_ARTIFACT_TEMPLATE / NOOP_OPEN_ATTACHMENT and rename
ctx.onFileDownload to upstream's ctx.onFileOpen
- restore the video play-button rendering from pingdotgg#8919; its props and the
userVideos split merged in but nothing rendered them
- restore the helpers dropped from ChatMarkdown.workspace-images.test.tsx
and delete the orphaned resolveSidebarStageBadgeLabel test that
branding.test.ts already covers
Claude-Session: https://claude.ai/code/session_01VucnEAuRBJ3icH9fzd7Mqu
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* Add mobile composer attachment menu with video support by @juliusmarminge in pingdotgg/t3code#8843
* fix(web): restore unified activity logs and composer banners by @t3dotgg in pingdotgg/t3code#8734
* fix(web): address composer banner review follow-ups by @juliusmarminge in pingdotgg/t3code#8850
* fix(web): widen sync banners and simplify the working timer by @juliusmarminge in pingdotgg/t3code#8855
* fix(preview): improve browser recording quality by @maria-rcks in pingdotgg/t3code#8839
* fix(web): mark pull request links as external by @juliusmarminge in pingdotgg/t3code#8856
* fix(mobile): replace Callstack glass with Expo glass by @juliusmarminge in pingdotgg/t3code#8862
* fix(server): skip IDE detection in Claude probes by @yashranaway in pingdotgg/t3code#8634
* chore(macroscope): review diagnostic overrides by @t3-code[bot] in pingdotgg/t3code#8917
* fix(contracts): accept CLI event origins by @nateEc in pingdotgg/t3code#8905
* fix(web): hide invalid slash skill completions by @nateEc in pingdotgg/t3code#8904
* fix(mobile): defer draft navigation until submission completes by @juliusmarminge in pingdotgg/t3code#8914
* chore: disable CodeRabbit review status by @juliusmarminge in pingdotgg/t3code#8933
* Delete app.json by @juliusmarminge in pingdotgg/t3code#8934
* fix(web): show scrollbar for wide markdown tables by @UtkarshUsername in pingdotgg/t3code#8868
* fix(mobile): shimmer active tool rows by @juliusmarminge in pingdotgg/t3code#8932
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
* fix(web): prevent chat metadata overlap by @MatthewFeroz in pingdotgg/t3code#8851
* fix(server): preserve usage cache outside walked roots by @Lucenx9 in pingdotgg/t3code#8540
* feat(mobile): add native image and PDF previews by @juliusmarminge in pingdotgg/t3code#8959
* fix(server): allow long thread IDs in HTTP routes by @nateEc in pingdotgg/t3code#8898
* fix(shared): preserve Windows shell PATH priority by @UtkarshUsername in pingdotgg/t3code#8748
* fix(web): make WSL settings searchable by @UtkarshUsername in pingdotgg/t3code#8881
* feat(web): add expand/collapse all control to the files surface by @UtkarshUsername in pingdotgg/t3code#8889
* feat(mobile): upload attachments while composing by @juliusmarminge in pingdotgg/t3code#8978
* fix(chat): keep agent activity visible between actions by @maria-rcks in pingdotgg/t3code#8984
* fix(server): isolate remote web session cookies by @Bil0000 in pingdotgg/t3code#8085
* feat(pull-requests): link GitHub references in markdown by @maria-rcks in pingdotgg/t3code#8812
* perf(server): reduce frequency of full tool call output being loaded into memory from db by @t3dotgg in pingdotgg/t3code#8988
* feat(web): add pull request list filters by @maria-rcks in pingdotgg/t3code#8809
* feat(web): search individual settings by detail by @maria-rcks in pingdotgg/t3code#8831
* feat(client): render viewed images in work logs by @maria-rcks in pingdotgg/t3code#8936
* fix(client): use package import for markdown image helpers by @juliusmarminge in pingdotgg/t3code#9010
* test: remove static presentation snapshots by @t3-code[bot] in pingdotgg/t3code#9008
* perf(server): bound snapshot activity payload memory by @t3dotgg in pingdotgg/t3code#9000
* perf(server): cut idle CPU use and stop provider event leaks by @t3dotgg in pingdotgg/t3code#8187
* perf(server): scan only appended transcript bytes for usage summaries by @StiensWout in pingdotgg/t3code#9024
* perf(server): cut chatty tool-update frames by 90% by @Adamulek123 in pingdotgg/t3code#8368
* fix(server): settle threads server-side by @t3dotgg in pingdotgg/t3code#8600
* fix(clients): dedupe skills in composer menus by @Adamulek123 in pingdotgg/t3code#8043
* fix(server): stop OpenCode child sessions by @t3dotgg in pingdotgg/t3code#9005
* perf(web): defer pull request line stats until visible by @Adamulek123 in pingdotgg/t3code#6471
* perf(server): skip full-message reads while streaming by @t3dotgg in pingdotgg/t3code#9032
* perf(client-runtime): halve server config bootstrap traffic by @Adamulek123 in pingdotgg/t3code#8367
* fix(web): align un-settle banner action by @StiensWout in pingdotgg/t3code#9033
* fix(web): block type-to-focus behind open dialogs by @Lucenx9 in pingdotgg/t3code#8139
* feat(shortcuts): copy active thread reference by @maria-rcks in pingdotgg/t3code#8994
* fix(mobile): keep thread scroll bounds current after animations by @juliusmarminge in pingdotgg/t3code#9013
* fix(server): cache project favicon resolution by @willsheldon in pingdotgg/t3code#9080
* feat(claude): add Claude Fable 5.1 model by @q1 in pingdotgg/t3code#9078
* fix(preview): restore recording and macOS rendering after Electron 43 by @StiensWout in pingdotgg/t3code#9001
* feat(desktop): add configurable quit shortcut confirmation by @juliusmarminge in pingdotgg/t3code#9076
* feat(web): open project settings from thread menus by @SunkenInTime in pingdotgg/t3code#8925
* fix(chat): reuse one row for live activity by @maria-rcks in pingdotgg/t3code#9062
* feat(models): discover Claude models from remote manifest by @juliusmarminge in pingdotgg/t3code#9084
* Revert "fix(chat): reuse one row for live activity" by @maria-rcks in pingdotgg/t3code#9096
* fix(web): sync sidebar PR state from open panel by @t3-code[bot] in pingdotgg/t3code#9092
* fix(web): changing projects no longer creates a draft by @extoci in pingdotgg/t3code#9097
* fix(web): keep theme placeholder text dimmer than entered text by @flamboh in pingdotgg/t3code#9104
* fix(web): keep the selected environment when changing projects by @t3dotgg in pingdotgg/t3code#9102
## New Contributors
* @willsheldon made their first contribution in pingdotgg/t3code#9080
* @q1 made their first contribution in pingdotgg/t3code#9078
**Full Changelog**: pingdotgg/t3code@v0.0.37...v0.0.38
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.size:XXL1,000+ 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

feat(mobile): add video playback with native iOS controls - #8919

Merged
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback
Aug 31, 2026
Merged

feat(mobile): add video playback with native iOS controls#8919
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 31, 2026

Copy link
Copy Markdown
Member

What Changed

Mobile video attachments currently open as files. This adds playback from received messages and local drafts, including the compact composer and new-task sheet.

  • iOS opens AVKit's full-screen player from the attachment thumbnail, with native playback controls, zoom, Close, and swipe dismissal. Received videos stream directly from their signed URL; there is no full-file download or app loading overlay before presentation.
  • Video tiles show cached thumbnails. The asset endpoint supports single byte ranges so native readers can fetch metadata, frames, and playback data without downloading the entire file first.
  • Touch and hold an iOS video attachment to save or share the original through the system sheet. Android uses an Expo Video modal with a save/share action. Draft file leases remain active through playback and sharing.
  • Preserve picker filenames and recognize video extensions when MIME metadata is generic. Web and mobile share that detection helper. The native source-view registration can be reused for image zoom transitions.

Why

Videos should be playable before and after sending. AVKit supplies the expected iOS controls and dismissal behavior, while byte-range delivery lets opening, seeking, and thumbnail extraction avoid waiting for a complete download.

UI Changes

Current iPhone 17 Pro / iOS 27 recording: thumbnail → streaming playback → native controls → swipe back → reopen → Close.

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f0c0378d96a0fe5/ios-streaming-video-player.mp4

The screenshots compare an earlier player iteration on this branch with the final native player, using the same sample clip.

Before native UI refinementFinal iOS player
Earlier player with custom header and save/share footerFinal AVKit player with native controls

Validation

  • iOS 27 simulator: received and local-draft playback, thumbnails, autoplay, play/pause, Close/reopen, swipe dismissal, native sharing, and invalid-video recovery. A separate audio player remained playing through video presentation and dismissal.
  • A stalled stream opened and remained dismissible before any video bytes arrived. Throttled playback progressed before the file finished transferring. Two normal previews made zero full-file download calls.
  • Focused download/share, draft-lease, thumbnail, MIME-detection, and HTTP byte-range tests passed. Mobile and server typechecks, targeted lint, SwiftLint, and formatting passed. The picker suite includes a provider-URI regression and passes all 31 tests.
  • A matching development build is installed on the phone and launched against Metro. Phone playback still needs manual verification. Android, relay/tunnel transport, and physical audio routing were not runtime-tested.
Other observations from simulator testing

Saving to Files under a new filename passed with identical file bytes. Replacing an existing filename stalled on iOS 27, including with the original Expo Sharing path.

Sending a video from the new-task sheet uploaded it and received a reply, but left the cleared sheet open. The navigation call is unchanged; a runtime comparison with main was not performed.

Checklist

  • Changes are focused on video attachment playback and its supporting delivery/lifecycle code
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches asset HTTP semantics for videos, native AVKit/audio-session behavior, and attachment file lifecycle; regressions could affect non-video downloads, older servers without ranges, or draft cleanup timing.

Overview
Adds end-to-end mobile video attachments: playable tiles in the thread feed and composer, with iOS AVKit full-screen playback zooming from a registered thumbnail and Android using an expo-video modal.

Native iOS (T3NativeControls) exposes presentVideo / dismissVideo, a PresentationSource view for transition/share anchoring, and shareFileFromSource for popover share sheets. Playback streams remote signed URLs without a full download first; drafts use retain/release leases so files are not deleted during preview or share.

Supporting client work includes cached expo-video thumbnails, expo-document-picker for file picks, refactored download/share preview files, and shared videoMimeType in @t3tools/shared/video.

Server: video asset GETs honor single Range requests (206/416) so iOS can stream and extract frames; normal downloads and unsupported ranges still return the full file.

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

Note

Add native iOS video playback, thumbnail caching, and byte-range asset serving

  • Adds T3NativeControls expo module that presents AVPlayerViewController (inline-to-fullscreen zoom, auto-play, audio session management, cleanup on dismiss) and presentVideo/dismissVideo/shareFileFromSource JS-callable functions; PresentationSource view registers source anchors for share and zoom transitions.
  • Adds videoThumbnails.ts that lazily imports expo-video to extract a single frame (≤480x480) with abort signaling, 15s timeout, and LRU cache capped at 32 entries; VideoThumbnailImage.tsx renders these lazily and cancels on unmount.
  • Adds assetFileResponse in the server asset route that serves 206 partial content with Content-Range/Accept-Ranges for video MIME types and 416 for unsatisfiable ranges; non-video assets and unsupported Range syntax fall back to full 200.
  • Integrates video into the composer and feed: video attachments render as VideoAttachmentTile with thumbnails and a long-press share menu on iOS; VideoPreviewModal resolves local draft files via loadLocalVideoPreview or remote URLs and presents the native player.
  • Refactors attachment download/share lifecycle around AttachmentPreviewFile with explicit share/dispose, switches file picking to expo-document-picker, and adds retain/release leases (retainComposerAttachmentFile) so preview/playback prevents premature file deletion.
  • Risk: pickComposerFiles now uses expo-document-picker (getDocumentAsync, copyToCacheDirectory) and consumes result.assets/mimeType instead of expo-file-systempickFileAsync fields; presentVideo rejects when the URL is not playable or a presentation is already active; video asset routes now return 416 for unsatisfiable ranges.

Macroscope summarized b6f497d.

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 31, 2026
@coderabbitai

coderabbitaiBot commented Aug 31, 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: f64f2a38-cc80-4a15-a218-87973bd34b11

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

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 31, 2026
@github-actions

github-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−3 B (−0.0%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−4 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages10100 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.5 KiB+222 B (+1.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.6 KiB+226 B (+3.5%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB57.9 KiB+1.5 KiB (+2.7%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: bba79cc · PR result: b6f497d · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

Comment threadapps/mobile/src/lib/composerImages.ts Outdated
Comment threaddocs/internals/mobile-navigation.md Outdated
Comment threadapps/mobile/modules/t3-native-controls/ios/T3NativeVideoPresentation.swift 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 ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit b6f497d. Configure here.

Comment threadapps/mobile/src/lib/videoThumbnails.ts
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a large end-to-end mobile video feature spanning native iOS playback, Android playback, sharing, file retention, thumbnail extraction, document picking, and server byte-range delivery, with meaningful runtime side effects across existing paths. An unresolved concrete concern about rejected native thumbnail work after cancellation further warrants human review.

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

@juliusmarminge
juliusmarminge merged commit 31c1c59 into mainAug 31, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the feat/mobile-video-playback branch August 31, 2026 19:06
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
**Full Changelog**: pingdotgg/t3code@v0.0.38-nightly.20260831.1240...v0.0.38-nightly.20260831.1241
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38-nightly.20260831.1241
alexcstark added a commit to alexcstark/t3code that referenced this pull request Sep 1, 2026
fc3751f kept call sites while dropping the definitions from both
sides, so the built app threw "deriveTurnPlans is not defined" on
render. tsgo reported 16 errors in apps/web on that commit.
- drop the stale deriveTurnPlans call and the extra deriveTimelineEntries
argument (upstream removed the function in pingdotgg#8734)
- restore the workingStepLabel memo TerminalShellStatus reads
- restore NOOP_USE_ARTIFACT_TEMPLATE / NOOP_OPEN_ATTACHMENT and rename
ctx.onFileDownload to upstream's ctx.onFileOpen
- restore the video play-button rendering from pingdotgg#8919; its props and the
userVideos split merged in but nothing rendered them
- restore the helpers dropped from ChatMarkdown.workspace-images.test.tsx
and delete the orphaned resolveSidebarStageBadgeLabel test that
branding.test.ts already covers
Claude-Session: https://claude.ai/code/session_01VucnEAuRBJ3icH9fzd7Mqu
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* Add mobile composer attachment menu with video support by @juliusmarminge in pingdotgg/t3code#8843
* fix(web): restore unified activity logs and composer banners by @t3dotgg in pingdotgg/t3code#8734
* fix(web): address composer banner review follow-ups by @juliusmarminge in pingdotgg/t3code#8850
* fix(web): widen sync banners and simplify the working timer by @juliusmarminge in pingdotgg/t3code#8855
* fix(preview): improve browser recording quality by @maria-rcks in pingdotgg/t3code#8839
* fix(web): mark pull request links as external by @juliusmarminge in pingdotgg/t3code#8856
* fix(mobile): replace Callstack glass with Expo glass by @juliusmarminge in pingdotgg/t3code#8862
* fix(server): skip IDE detection in Claude probes by @yashranaway in pingdotgg/t3code#8634
* chore(macroscope): review diagnostic overrides by @t3-code[bot] in pingdotgg/t3code#8917
* fix(contracts): accept CLI event origins by @nateEc in pingdotgg/t3code#8905
* fix(web): hide invalid slash skill completions by @nateEc in pingdotgg/t3code#8904
* fix(mobile): defer draft navigation until submission completes by @juliusmarminge in pingdotgg/t3code#8914
* chore: disable CodeRabbit review status by @juliusmarminge in pingdotgg/t3code#8933
* Delete app.json by @juliusmarminge in pingdotgg/t3code#8934
* fix(web): show scrollbar for wide markdown tables by @UtkarshUsername in pingdotgg/t3code#8868
* fix(mobile): shimmer active tool rows by @juliusmarminge in pingdotgg/t3code#8932
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
* fix(web): prevent chat metadata overlap by @MatthewFeroz in pingdotgg/t3code#8851
* fix(server): preserve usage cache outside walked roots by @Lucenx9 in pingdotgg/t3code#8540
* feat(mobile): add native image and PDF previews by @juliusmarminge in pingdotgg/t3code#8959
* fix(server): allow long thread IDs in HTTP routes by @nateEc in pingdotgg/t3code#8898
* fix(shared): preserve Windows shell PATH priority by @UtkarshUsername in pingdotgg/t3code#8748
* fix(web): make WSL settings searchable by @UtkarshUsername in pingdotgg/t3code#8881
* feat(web): add expand/collapse all control to the files surface by @UtkarshUsername in pingdotgg/t3code#8889
* feat(mobile): upload attachments while composing by @juliusmarminge in pingdotgg/t3code#8978
* fix(chat): keep agent activity visible between actions by @maria-rcks in pingdotgg/t3code#8984
* fix(server): isolate remote web session cookies by @Bil0000 in pingdotgg/t3code#8085
* feat(pull-requests): link GitHub references in markdown by @maria-rcks in pingdotgg/t3code#8812
* perf(server): reduce frequency of full tool call output being loaded into memory from db by @t3dotgg in pingdotgg/t3code#8988
* feat(web): add pull request list filters by @maria-rcks in pingdotgg/t3code#8809
* feat(web): search individual settings by detail by @maria-rcks in pingdotgg/t3code#8831
* feat(client): render viewed images in work logs by @maria-rcks in pingdotgg/t3code#8936
* fix(client): use package import for markdown image helpers by @juliusmarminge in pingdotgg/t3code#9010
* test: remove static presentation snapshots by @t3-code[bot] in pingdotgg/t3code#9008
* perf(server): bound snapshot activity payload memory by @t3dotgg in pingdotgg/t3code#9000
* perf(server): cut idle CPU use and stop provider event leaks by @t3dotgg in pingdotgg/t3code#8187
* perf(server): scan only appended transcript bytes for usage summaries by @StiensWout in pingdotgg/t3code#9024
* perf(server): cut chatty tool-update frames by 90% by @Adamulek123 in pingdotgg/t3code#8368
* fix(server): settle threads server-side by @t3dotgg in pingdotgg/t3code#8600
* fix(clients): dedupe skills in composer menus by @Adamulek123 in pingdotgg/t3code#8043
* fix(server): stop OpenCode child sessions by @t3dotgg in pingdotgg/t3code#9005
* perf(web): defer pull request line stats until visible by @Adamulek123 in pingdotgg/t3code#6471
* perf(server): skip full-message reads while streaming by @t3dotgg in pingdotgg/t3code#9032
* perf(client-runtime): halve server config bootstrap traffic by @Adamulek123 in pingdotgg/t3code#8367
* fix(web): align un-settle banner action by @StiensWout in pingdotgg/t3code#9033
* fix(web): block type-to-focus behind open dialogs by @Lucenx9 in pingdotgg/t3code#8139
* feat(shortcuts): copy active thread reference by @maria-rcks in pingdotgg/t3code#8994
* fix(mobile): keep thread scroll bounds current after animations by @juliusmarminge in pingdotgg/t3code#9013
* fix(server): cache project favicon resolution by @willsheldon in pingdotgg/t3code#9080
* feat(claude): add Claude Fable 5.1 model by @q1 in pingdotgg/t3code#9078
* fix(preview): restore recording and macOS rendering after Electron 43 by @StiensWout in pingdotgg/t3code#9001
* feat(desktop): add configurable quit shortcut confirmation by @juliusmarminge in pingdotgg/t3code#9076
* feat(web): open project settings from thread menus by @SunkenInTime in pingdotgg/t3code#8925
* fix(chat): reuse one row for live activity by @maria-rcks in pingdotgg/t3code#9062
* feat(models): discover Claude models from remote manifest by @juliusmarminge in pingdotgg/t3code#9084
* Revert "fix(chat): reuse one row for live activity" by @maria-rcks in pingdotgg/t3code#9096
* fix(web): sync sidebar PR state from open panel by @t3-code[bot] in pingdotgg/t3code#9092
* fix(web): changing projects no longer creates a draft by @extoci in pingdotgg/t3code#9097
* fix(web): keep theme placeholder text dimmer than entered text by @flamboh in pingdotgg/t3code#9104
* fix(web): keep the selected environment when changing projects by @t3dotgg in pingdotgg/t3code#9102
## New Contributors
* @willsheldon made their first contribution in pingdotgg/t3code#9080
* @q1 made their first contribution in pingdotgg/t3code#9078
**Full Changelog**: pingdotgg/t3code@v0.0.37...v0.0.38
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.size:XXL1,000+ 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

feat(mobile): add video playback with native iOS controls - #8919

Merged
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback
Aug 31, 2026
Merged

feat(mobile): add video playback with native iOS controls#8919
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 31, 2026

Copy link
Copy Markdown
Member

What Changed

Mobile video attachments currently open as files. This adds playback from received messages and local drafts, including the compact composer and new-task sheet.

  • iOS opens AVKit's full-screen player from the attachment thumbnail, with native playback controls, zoom, Close, and swipe dismissal. Received videos stream directly from their signed URL; there is no full-file download or app loading overlay before presentation.
  • Video tiles show cached thumbnails. The asset endpoint supports single byte ranges so native readers can fetch metadata, frames, and playback data without downloading the entire file first.
  • Touch and hold an iOS video attachment to save or share the original through the system sheet. Android uses an Expo Video modal with a save/share action. Draft file leases remain active through playback and sharing.
  • Preserve picker filenames and recognize video extensions when MIME metadata is generic. Web and mobile share that detection helper. The native source-view registration can be reused for image zoom transitions.

Why

Videos should be playable before and after sending. AVKit supplies the expected iOS controls and dismissal behavior, while byte-range delivery lets opening, seeking, and thumbnail extraction avoid waiting for a complete download.

UI Changes

Current iPhone 17 Pro / iOS 27 recording: thumbnail → streaming playback → native controls → swipe back → reopen → Close.

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f0c0378d96a0fe5/ios-streaming-video-player.mp4

The screenshots compare an earlier player iteration on this branch with the final native player, using the same sample clip.

Before native UI refinementFinal iOS player
Earlier player with custom header and save/share footerFinal AVKit player with native controls

Validation

  • iOS 27 simulator: received and local-draft playback, thumbnails, autoplay, play/pause, Close/reopen, swipe dismissal, native sharing, and invalid-video recovery. A separate audio player remained playing through video presentation and dismissal.
  • A stalled stream opened and remained dismissible before any video bytes arrived. Throttled playback progressed before the file finished transferring. Two normal previews made zero full-file download calls.
  • Focused download/share, draft-lease, thumbnail, MIME-detection, and HTTP byte-range tests passed. Mobile and server typechecks, targeted lint, SwiftLint, and formatting passed. The picker suite includes a provider-URI regression and passes all 31 tests.
  • A matching development build is installed on the phone and launched against Metro. Phone playback still needs manual verification. Android, relay/tunnel transport, and physical audio routing were not runtime-tested.
Other observations from simulator testing

Saving to Files under a new filename passed with identical file bytes. Replacing an existing filename stalled on iOS 27, including with the original Expo Sharing path.

Sending a video from the new-task sheet uploaded it and received a reply, but left the cleared sheet open. The navigation call is unchanged; a runtime comparison with main was not performed.

Checklist

  • Changes are focused on video attachment playback and its supporting delivery/lifecycle code
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches asset HTTP semantics for videos, native AVKit/audio-session behavior, and attachment file lifecycle; regressions could affect non-video downloads, older servers without ranges, or draft cleanup timing.

Overview
Adds end-to-end mobile video attachments: playable tiles in the thread feed and composer, with iOS AVKit full-screen playback zooming from a registered thumbnail and Android using an expo-video modal.

Native iOS (T3NativeControls) exposes presentVideo / dismissVideo, a PresentationSource view for transition/share anchoring, and shareFileFromSource for popover share sheets. Playback streams remote signed URLs without a full download first; drafts use retain/release leases so files are not deleted during preview or share.

Supporting client work includes cached expo-video thumbnails, expo-document-picker for file picks, refactored download/share preview files, and shared videoMimeType in @t3tools/shared/video.

Server: video asset GETs honor single Range requests (206/416) so iOS can stream and extract frames; normal downloads and unsupported ranges still return the full file.

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

Note

Add native iOS video playback, thumbnail caching, and byte-range asset serving

  • Adds T3NativeControls expo module that presents AVPlayerViewController (inline-to-fullscreen zoom, auto-play, audio session management, cleanup on dismiss) and presentVideo/dismissVideo/shareFileFromSource JS-callable functions; PresentationSource view registers source anchors for share and zoom transitions.
  • Adds videoThumbnails.ts that lazily imports expo-video to extract a single frame (≤480x480) with abort signaling, 15s timeout, and LRU cache capped at 32 entries; VideoThumbnailImage.tsx renders these lazily and cancels on unmount.
  • Adds assetFileResponse in the server asset route that serves 206 partial content with Content-Range/Accept-Ranges for video MIME types and 416 for unsatisfiable ranges; non-video assets and unsupported Range syntax fall back to full 200.
  • Integrates video into the composer and feed: video attachments render as VideoAttachmentTile with thumbnails and a long-press share menu on iOS; VideoPreviewModal resolves local draft files via loadLocalVideoPreview or remote URLs and presents the native player.
  • Refactors attachment download/share lifecycle around AttachmentPreviewFile with explicit share/dispose, switches file picking to expo-document-picker, and adds retain/release leases (retainComposerAttachmentFile) so preview/playback prevents premature file deletion.
  • Risk: pickComposerFiles now uses expo-document-picker (getDocumentAsync, copyToCacheDirectory) and consumes result.assets/mimeType instead of expo-file-systempickFileAsync fields; presentVideo rejects when the URL is not playable or a presentation is already active; video asset routes now return 416 for unsatisfiable ranges.

Macroscope summarized b6f497d.

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 31, 2026
@coderabbitai

coderabbitaiBot commented Aug 31, 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: f64f2a38-cc80-4a15-a218-87973bd34b11

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

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 31, 2026
@github-actions

github-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−3 B (−0.0%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−4 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages10100 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.5 KiB+222 B (+1.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.6 KiB+226 B (+3.5%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB57.9 KiB+1.5 KiB (+2.7%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: bba79cc · PR result: b6f497d · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

Comment threadapps/mobile/src/lib/composerImages.ts Outdated
Comment threaddocs/internals/mobile-navigation.md Outdated
Comment threadapps/mobile/modules/t3-native-controls/ios/T3NativeVideoPresentation.swift 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 ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit b6f497d. Configure here.

Comment threadapps/mobile/src/lib/videoThumbnails.ts
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a large end-to-end mobile video feature spanning native iOS playback, Android playback, sharing, file retention, thumbnail extraction, document picking, and server byte-range delivery, with meaningful runtime side effects across existing paths. An unresolved concrete concern about rejected native thumbnail work after cancellation further warrants human review.

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

@juliusmarminge
juliusmarminge merged commit 31c1c59 into mainAug 31, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the feat/mobile-video-playback branch August 31, 2026 19:06
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
**Full Changelog**: pingdotgg/t3code@v0.0.38-nightly.20260831.1240...v0.0.38-nightly.20260831.1241
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38-nightly.20260831.1241
alexcstark added a commit to alexcstark/t3code that referenced this pull request Sep 1, 2026
fc3751f kept call sites while dropping the definitions from both
sides, so the built app threw "deriveTurnPlans is not defined" on
render. tsgo reported 16 errors in apps/web on that commit.
- drop the stale deriveTurnPlans call and the extra deriveTimelineEntries
argument (upstream removed the function in pingdotgg#8734)
- restore the workingStepLabel memo TerminalShellStatus reads
- restore NOOP_USE_ARTIFACT_TEMPLATE / NOOP_OPEN_ATTACHMENT and rename
ctx.onFileDownload to upstream's ctx.onFileOpen
- restore the video play-button rendering from pingdotgg#8919; its props and the
userVideos split merged in but nothing rendered them
- restore the helpers dropped from ChatMarkdown.workspace-images.test.tsx
and delete the orphaned resolveSidebarStageBadgeLabel test that
branding.test.ts already covers
Claude-Session: https://claude.ai/code/session_01VucnEAuRBJ3icH9fzd7Mqu
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* Add mobile composer attachment menu with video support by @juliusmarminge in pingdotgg/t3code#8843
* fix(web): restore unified activity logs and composer banners by @t3dotgg in pingdotgg/t3code#8734
* fix(web): address composer banner review follow-ups by @juliusmarminge in pingdotgg/t3code#8850
* fix(web): widen sync banners and simplify the working timer by @juliusmarminge in pingdotgg/t3code#8855
* fix(preview): improve browser recording quality by @maria-rcks in pingdotgg/t3code#8839
* fix(web): mark pull request links as external by @juliusmarminge in pingdotgg/t3code#8856
* fix(mobile): replace Callstack glass with Expo glass by @juliusmarminge in pingdotgg/t3code#8862
* fix(server): skip IDE detection in Claude probes by @yashranaway in pingdotgg/t3code#8634
* chore(macroscope): review diagnostic overrides by @t3-code[bot] in pingdotgg/t3code#8917
* fix(contracts): accept CLI event origins by @nateEc in pingdotgg/t3code#8905
* fix(web): hide invalid slash skill completions by @nateEc in pingdotgg/t3code#8904
* fix(mobile): defer draft navigation until submission completes by @juliusmarminge in pingdotgg/t3code#8914
* chore: disable CodeRabbit review status by @juliusmarminge in pingdotgg/t3code#8933
* Delete app.json by @juliusmarminge in pingdotgg/t3code#8934
* fix(web): show scrollbar for wide markdown tables by @UtkarshUsername in pingdotgg/t3code#8868
* fix(mobile): shimmer active tool rows by @juliusmarminge in pingdotgg/t3code#8932
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
* fix(web): prevent chat metadata overlap by @MatthewFeroz in pingdotgg/t3code#8851
* fix(server): preserve usage cache outside walked roots by @Lucenx9 in pingdotgg/t3code#8540
* feat(mobile): add native image and PDF previews by @juliusmarminge in pingdotgg/t3code#8959
* fix(server): allow long thread IDs in HTTP routes by @nateEc in pingdotgg/t3code#8898
* fix(shared): preserve Windows shell PATH priority by @UtkarshUsername in pingdotgg/t3code#8748
* fix(web): make WSL settings searchable by @UtkarshUsername in pingdotgg/t3code#8881
* feat(web): add expand/collapse all control to the files surface by @UtkarshUsername in pingdotgg/t3code#8889
* feat(mobile): upload attachments while composing by @juliusmarminge in pingdotgg/t3code#8978
* fix(chat): keep agent activity visible between actions by @maria-rcks in pingdotgg/t3code#8984
* fix(server): isolate remote web session cookies by @Bil0000 in pingdotgg/t3code#8085
* feat(pull-requests): link GitHub references in markdown by @maria-rcks in pingdotgg/t3code#8812
* perf(server): reduce frequency of full tool call output being loaded into memory from db by @t3dotgg in pingdotgg/t3code#8988
* feat(web): add pull request list filters by @maria-rcks in pingdotgg/t3code#8809
* feat(web): search individual settings by detail by @maria-rcks in pingdotgg/t3code#8831
* feat(client): render viewed images in work logs by @maria-rcks in pingdotgg/t3code#8936
* fix(client): use package import for markdown image helpers by @juliusmarminge in pingdotgg/t3code#9010
* test: remove static presentation snapshots by @t3-code[bot] in pingdotgg/t3code#9008
* perf(server): bound snapshot activity payload memory by @t3dotgg in pingdotgg/t3code#9000
* perf(server): cut idle CPU use and stop provider event leaks by @t3dotgg in pingdotgg/t3code#8187
* perf(server): scan only appended transcript bytes for usage summaries by @StiensWout in pingdotgg/t3code#9024
* perf(server): cut chatty tool-update frames by 90% by @Adamulek123 in pingdotgg/t3code#8368
* fix(server): settle threads server-side by @t3dotgg in pingdotgg/t3code#8600
* fix(clients): dedupe skills in composer menus by @Adamulek123 in pingdotgg/t3code#8043
* fix(server): stop OpenCode child sessions by @t3dotgg in pingdotgg/t3code#9005
* perf(web): defer pull request line stats until visible by @Adamulek123 in pingdotgg/t3code#6471
* perf(server): skip full-message reads while streaming by @t3dotgg in pingdotgg/t3code#9032
* perf(client-runtime): halve server config bootstrap traffic by @Adamulek123 in pingdotgg/t3code#8367
* fix(web): align un-settle banner action by @StiensWout in pingdotgg/t3code#9033
* fix(web): block type-to-focus behind open dialogs by @Lucenx9 in pingdotgg/t3code#8139
* feat(shortcuts): copy active thread reference by @maria-rcks in pingdotgg/t3code#8994
* fix(mobile): keep thread scroll bounds current after animations by @juliusmarminge in pingdotgg/t3code#9013
* fix(server): cache project favicon resolution by @willsheldon in pingdotgg/t3code#9080
* feat(claude): add Claude Fable 5.1 model by @q1 in pingdotgg/t3code#9078
* fix(preview): restore recording and macOS rendering after Electron 43 by @StiensWout in pingdotgg/t3code#9001
* feat(desktop): add configurable quit shortcut confirmation by @juliusmarminge in pingdotgg/t3code#9076
* feat(web): open project settings from thread menus by @SunkenInTime in pingdotgg/t3code#8925
* fix(chat): reuse one row for live activity by @maria-rcks in pingdotgg/t3code#9062
* feat(models): discover Claude models from remote manifest by @juliusmarminge in pingdotgg/t3code#9084
* Revert "fix(chat): reuse one row for live activity" by @maria-rcks in pingdotgg/t3code#9096
* fix(web): sync sidebar PR state from open panel by @t3-code[bot] in pingdotgg/t3code#9092
* fix(web): changing projects no longer creates a draft by @extoci in pingdotgg/t3code#9097
* fix(web): keep theme placeholder text dimmer than entered text by @flamboh in pingdotgg/t3code#9104
* fix(web): keep the selected environment when changing projects by @t3dotgg in pingdotgg/t3code#9102
## New Contributors
* @willsheldon made their first contribution in pingdotgg/t3code#9080
* @q1 made their first contribution in pingdotgg/t3code#9078
**Full Changelog**: pingdotgg/t3code@v0.0.37...v0.0.38
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.size:XXL1,000+ 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

feat(mobile): add video playback with native iOS controls - #8919

Merged
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback
Aug 31, 2026
Merged

feat(mobile): add video playback with native iOS controls#8919
juliusmarminge merged 6 commits into
mainfrom
feat/mobile-video-playback

Conversation

@juliusmarminge

@juliusmarmingejuliusmarminge commented Aug 31, 2026

Copy link
Copy Markdown
Member

What Changed

Mobile video attachments currently open as files. This adds playback from received messages and local drafts, including the compact composer and new-task sheet.

  • iOS opens AVKit's full-screen player from the attachment thumbnail, with native playback controls, zoom, Close, and swipe dismissal. Received videos stream directly from their signed URL; there is no full-file download or app loading overlay before presentation.
  • Video tiles show cached thumbnails. The asset endpoint supports single byte ranges so native readers can fetch metadata, frames, and playback data without downloading the entire file first.
  • Touch and hold an iOS video attachment to save or share the original through the system sheet. Android uses an Expo Video modal with a save/share action. Draft file leases remain active through playback and sharing.
  • Preserve picker filenames and recognize video extensions when MIME metadata is generic. Web and mobile share that detection helper. The native source-view registration can be reused for image zoom transitions.

Why

Videos should be playable before and after sending. AVKit supplies the expected iOS controls and dismissal behavior, while byte-range delivery lets opening, seeking, and thumbnail extraction avoid waiting for a complete download.

UI Changes

Current iPhone 17 Pro / iOS 27 recording: thumbnail → streaming playback → native controls → swipe back → reopen → Close.

https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/5f0c0378d96a0fe5/ios-streaming-video-player.mp4

The screenshots compare an earlier player iteration on this branch with the final native player, using the same sample clip.

Before native UI refinementFinal iOS player
Earlier player with custom header and save/share footerFinal AVKit player with native controls

Validation

  • iOS 27 simulator: received and local-draft playback, thumbnails, autoplay, play/pause, Close/reopen, swipe dismissal, native sharing, and invalid-video recovery. A separate audio player remained playing through video presentation and dismissal.
  • A stalled stream opened and remained dismissible before any video bytes arrived. Throttled playback progressed before the file finished transferring. Two normal previews made zero full-file download calls.
  • Focused download/share, draft-lease, thumbnail, MIME-detection, and HTTP byte-range tests passed. Mobile and server typechecks, targeted lint, SwiftLint, and formatting passed. The picker suite includes a provider-URI regression and passes all 31 tests.
  • A matching development build is installed on the phone and launched against Metro. Phone playback still needs manual verification. Android, relay/tunnel transport, and physical audio routing were not runtime-tested.
Other observations from simulator testing

Saving to Files under a new filename passed with identical file bytes. Replacing an existing filename stalled on iOS 27, including with the original Expo Sharing path.

Sending a video from the new-task sheet uploaded it and received a reply, but left the cleared sheet open. The navigation call is unchanged; a runtime comparison with main was not performed.

Checklist

  • Changes are focused on video attachment playback and its supporting delivery/lifecycle code
  • I explained what changed and why
  • I included before/after screenshots for UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches asset HTTP semantics for videos, native AVKit/audio-session behavior, and attachment file lifecycle; regressions could affect non-video downloads, older servers without ranges, or draft cleanup timing.

Overview
Adds end-to-end mobile video attachments: playable tiles in the thread feed and composer, with iOS AVKit full-screen playback zooming from a registered thumbnail and Android using an expo-video modal.

Native iOS (T3NativeControls) exposes presentVideo / dismissVideo, a PresentationSource view for transition/share anchoring, and shareFileFromSource for popover share sheets. Playback streams remote signed URLs without a full download first; drafts use retain/release leases so files are not deleted during preview or share.

Supporting client work includes cached expo-video thumbnails, expo-document-picker for file picks, refactored download/share preview files, and shared videoMimeType in @t3tools/shared/video.

Server: video asset GETs honor single Range requests (206/416) so iOS can stream and extract frames; normal downloads and unsupported ranges still return the full file.

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

Note

Add native iOS video playback, thumbnail caching, and byte-range asset serving

  • Adds T3NativeControls expo module that presents AVPlayerViewController (inline-to-fullscreen zoom, auto-play, audio session management, cleanup on dismiss) and presentVideo/dismissVideo/shareFileFromSource JS-callable functions; PresentationSource view registers source anchors for share and zoom transitions.
  • Adds videoThumbnails.ts that lazily imports expo-video to extract a single frame (≤480x480) with abort signaling, 15s timeout, and LRU cache capped at 32 entries; VideoThumbnailImage.tsx renders these lazily and cancels on unmount.
  • Adds assetFileResponse in the server asset route that serves 206 partial content with Content-Range/Accept-Ranges for video MIME types and 416 for unsatisfiable ranges; non-video assets and unsupported Range syntax fall back to full 200.
  • Integrates video into the composer and feed: video attachments render as VideoAttachmentTile with thumbnails and a long-press share menu on iOS; VideoPreviewModal resolves local draft files via loadLocalVideoPreview or remote URLs and presents the native player.
  • Refactors attachment download/share lifecycle around AttachmentPreviewFile with explicit share/dispose, switches file picking to expo-document-picker, and adds retain/release leases (retainComposerAttachmentFile) so preview/playback prevents premature file deletion.
  • Risk: pickComposerFiles now uses expo-document-picker (getDocumentAsync, copyToCacheDirectory) and consumes result.assets/mimeType instead of expo-file-systempickFileAsync fields; presentVideo rejects when the URL is not playable or a presentation is already active; video asset routes now return 416 for unsatisfiable ranges.

Macroscope summarized b6f497d.

@github-actionsgithub-actionsBot added the vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. label Aug 31, 2026
@coderabbitai

coderabbitaiBot commented Aug 31, 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: f64f2a38-cc80-4a15-a218-87973bd34b11

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

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


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

@github-actionsgithub-actionsBot added size:XXL 1,000+ changed lines (additions + deletions). 📱 Native Change Changes the native fingerprint; merging blocks production OTAs until a new store build ships. labels Aug 31, 2026
@github-actions

github-actionsBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

ProviderMetricMain baselineThis PRImpactPR ceiling
CodexTotal thread wire13.3 KiB13.3 KiB−3 B (−0.0%)15.1 KiB
CodexThread snapshot wire6.9 KiB6.9 KiB+1 B (+0.0%)7.3 KiB
CodexLive turn WebSocket wire6.4 KiB6.4 KiB−4 B (−0.1%)7.8 KiB
CodexLive turn WebSocket decoded55.6 KiB55.6 KiB0 B (0.0%)66.4 KiB
CodexLive turn messages10100 (0.0%)21
ClaudeTotal thread wire13.3 KiB13.5 KiB+222 B (+1.6%)15.1 KiB
ClaudeThread snapshot wire6.9 KiB6.9 KiB−4 B (−0.1%)7.3 KiB
ClaudeLive turn WebSocket wire6.4 KiB6.6 KiB+226 B (+3.5%)7.8 KiB
ClaudeLive turn WebSocket decoded56.4 KiB57.9 KiB+1.5 KiB (+2.7%)66.4 KiB
ClaudeLive turn messages911+2 (+22.2%)21

Baseline: bba79cc · PR result: b6f497d · 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: 109.4 KiB
  • Claude decoded thread snapshot: 110.1 KiB

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

Comment threadapps/mobile/src/lib/composerImages.ts Outdated
Comment threaddocs/internals/mobile-navigation.md Outdated
Comment threadapps/mobile/modules/t3-native-controls/ios/T3NativeVideoPresentation.swift 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 ON, but a cloud agent failed to start.

Reviewed by Cursor Bugbot for commit b6f497d. Configure here.

Comment threadapps/mobile/src/lib/videoThumbnails.ts
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This is a large end-to-end mobile video feature spanning native iOS playback, Android playback, sharing, file retention, thumbnail extraction, document picking, and server byte-range delivery, with meaningful runtime side effects across existing paths. An unresolved concrete concern about rejected native thumbnail work after cancellation further warrants human review.

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

@juliusmarminge
juliusmarminge merged commit 31c1c59 into mainAug 31, 2026
27 checks passed
@juliusmarminge
juliusmarminge deleted the feat/mobile-video-playback branch August 31, 2026 19:06
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
**Full Changelog**: pingdotgg/t3code@v0.0.38-nightly.20260831.1240...v0.0.38-nightly.20260831.1241
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38-nightly.20260831.1241
alexcstark added a commit to alexcstark/t3code that referenced this pull request Sep 1, 2026
fc3751f kept call sites while dropping the definitions from both
sides, so the built app threw "deriveTurnPlans is not defined" on
render. tsgo reported 16 errors in apps/web on that commit.
- drop the stale deriveTurnPlans call and the extra deriveTimelineEntries
argument (upstream removed the function in pingdotgg#8734)
- restore the workingStepLabel memo TerminalShellStatus reads
- restore NOOP_USE_ARTIFACT_TEMPLATE / NOOP_OPEN_ATTACHMENT and rename
ctx.onFileDownload to upstream's ctx.onFileOpen
- restore the video play-button rendering from pingdotgg#8919; its props and the
userVideos split merged in but nothing rendered them
- restore the helpers dropped from ChatMarkdown.workspace-images.test.tsx
and delete the orphaned resolveSidebarStageBadgeLabel test that
branding.test.ts already covers
Claude-Session: https://claude.ai/code/session_01VucnEAuRBJ3icH9fzd7Mqu
github-actionsBot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 1, 2026
## What's Changed
* Add mobile composer attachment menu with video support by @juliusmarminge in pingdotgg/t3code#8843
* fix(web): restore unified activity logs and composer banners by @t3dotgg in pingdotgg/t3code#8734
* fix(web): address composer banner review follow-ups by @juliusmarminge in pingdotgg/t3code#8850
* fix(web): widen sync banners and simplify the working timer by @juliusmarminge in pingdotgg/t3code#8855
* fix(preview): improve browser recording quality by @maria-rcks in pingdotgg/t3code#8839
* fix(web): mark pull request links as external by @juliusmarminge in pingdotgg/t3code#8856
* fix(mobile): replace Callstack glass with Expo glass by @juliusmarminge in pingdotgg/t3code#8862
* fix(server): skip IDE detection in Claude probes by @yashranaway in pingdotgg/t3code#8634
* chore(macroscope): review diagnostic overrides by @t3-code[bot] in pingdotgg/t3code#8917
* fix(contracts): accept CLI event origins by @nateEc in pingdotgg/t3code#8905
* fix(web): hide invalid slash skill completions by @nateEc in pingdotgg/t3code#8904
* fix(mobile): defer draft navigation until submission completes by @juliusmarminge in pingdotgg/t3code#8914
* chore: disable CodeRabbit review status by @juliusmarminge in pingdotgg/t3code#8933
* Delete app.json by @juliusmarminge in pingdotgg/t3code#8934
* fix(web): show scrollbar for wide markdown tables by @UtkarshUsername in pingdotgg/t3code#8868
* fix(mobile): shimmer active tool rows by @juliusmarminge in pingdotgg/t3code#8932
* chore(deps): bump Electron to 43.4.1 by @StiensWout in pingdotgg/t3code#8626
* fix(chat): smooth worktree setup status by @juliusmarminge in pingdotgg/t3code#8922
* feat(mobile): add video playback with native iOS controls by @juliusmarminge in pingdotgg/t3code#8919
* fix(web): prevent chat metadata overlap by @MatthewFeroz in pingdotgg/t3code#8851
* fix(server): preserve usage cache outside walked roots by @Lucenx9 in pingdotgg/t3code#8540
* feat(mobile): add native image and PDF previews by @juliusmarminge in pingdotgg/t3code#8959
* fix(server): allow long thread IDs in HTTP routes by @nateEc in pingdotgg/t3code#8898
* fix(shared): preserve Windows shell PATH priority by @UtkarshUsername in pingdotgg/t3code#8748
* fix(web): make WSL settings searchable by @UtkarshUsername in pingdotgg/t3code#8881
* feat(web): add expand/collapse all control to the files surface by @UtkarshUsername in pingdotgg/t3code#8889
* feat(mobile): upload attachments while composing by @juliusmarminge in pingdotgg/t3code#8978
* fix(chat): keep agent activity visible between actions by @maria-rcks in pingdotgg/t3code#8984
* fix(server): isolate remote web session cookies by @Bil0000 in pingdotgg/t3code#8085
* feat(pull-requests): link GitHub references in markdown by @maria-rcks in pingdotgg/t3code#8812
* perf(server): reduce frequency of full tool call output being loaded into memory from db by @t3dotgg in pingdotgg/t3code#8988
* feat(web): add pull request list filters by @maria-rcks in pingdotgg/t3code#8809
* feat(web): search individual settings by detail by @maria-rcks in pingdotgg/t3code#8831
* feat(client): render viewed images in work logs by @maria-rcks in pingdotgg/t3code#8936
* fix(client): use package import for markdown image helpers by @juliusmarminge in pingdotgg/t3code#9010
* test: remove static presentation snapshots by @t3-code[bot] in pingdotgg/t3code#9008
* perf(server): bound snapshot activity payload memory by @t3dotgg in pingdotgg/t3code#9000
* perf(server): cut idle CPU use and stop provider event leaks by @t3dotgg in pingdotgg/t3code#8187
* perf(server): scan only appended transcript bytes for usage summaries by @StiensWout in pingdotgg/t3code#9024
* perf(server): cut chatty tool-update frames by 90% by @Adamulek123 in pingdotgg/t3code#8368
* fix(server): settle threads server-side by @t3dotgg in pingdotgg/t3code#8600
* fix(clients): dedupe skills in composer menus by @Adamulek123 in pingdotgg/t3code#8043
* fix(server): stop OpenCode child sessions by @t3dotgg in pingdotgg/t3code#9005
* perf(web): defer pull request line stats until visible by @Adamulek123 in pingdotgg/t3code#6471
* perf(server): skip full-message reads while streaming by @t3dotgg in pingdotgg/t3code#9032
* perf(client-runtime): halve server config bootstrap traffic by @Adamulek123 in pingdotgg/t3code#8367
* fix(web): align un-settle banner action by @StiensWout in pingdotgg/t3code#9033
* fix(web): block type-to-focus behind open dialogs by @Lucenx9 in pingdotgg/t3code#8139
* feat(shortcuts): copy active thread reference by @maria-rcks in pingdotgg/t3code#8994
* fix(mobile): keep thread scroll bounds current after animations by @juliusmarminge in pingdotgg/t3code#9013
* fix(server): cache project favicon resolution by @willsheldon in pingdotgg/t3code#9080
* feat(claude): add Claude Fable 5.1 model by @q1 in pingdotgg/t3code#9078
* fix(preview): restore recording and macOS rendering after Electron 43 by @StiensWout in pingdotgg/t3code#9001
* feat(desktop): add configurable quit shortcut confirmation by @juliusmarminge in pingdotgg/t3code#9076
* feat(web): open project settings from thread menus by @SunkenInTime in pingdotgg/t3code#8925
* fix(chat): reuse one row for live activity by @maria-rcks in pingdotgg/t3code#9062
* feat(models): discover Claude models from remote manifest by @juliusmarminge in pingdotgg/t3code#9084
* Revert "fix(chat): reuse one row for live activity" by @maria-rcks in pingdotgg/t3code#9096
* fix(web): sync sidebar PR state from open panel by @t3-code[bot] in pingdotgg/t3code#9092
* fix(web): changing projects no longer creates a draft by @extoci in pingdotgg/t3code#9097
* fix(web): keep theme placeholder text dimmer than entered text by @flamboh in pingdotgg/t3code#9104
* fix(web): keep the selected environment when changing projects by @t3dotgg in pingdotgg/t3code#9102
## New Contributors
* @willsheldon made their first contribution in pingdotgg/t3code#9080
* @q1 made their first contribution in pingdotgg/t3code#9078
**Full Changelog**: pingdotgg/t3code@v0.0.37...v0.0.38
Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.38
brentkelly added a commit to brentkelly/t3code-orchestrator that referenced this pull request Sep 2, 2026
* feat(analytics): threads and turns now know which client started them (pingdotgg#7774)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop marking mixed tool runs as failed (pingdotgg#7893)
* fix(web): command-click spaced folder links (pingdotgg#6439)
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(chat): stop pushing follow-up messages to the top (pingdotgg#7897)
* test(desktop): remove redundant release note assertion (pingdotgg#7873)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): handle wide ordered-list marker edge cases (pingdotgg#7856)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(ssh): restore user PATH for remote servers (pingdotgg#7213)
* fix(desktop): keep tailscale spawn defects from breaking advertised endpoints (pingdotgg#7116)
* fix(web): keep Codex service tier labels readable (pingdotgg#4503)
* fix: render workspace images in chat markdown (pingdotgg#6433)
* fix(clients): keep opening responses visible after turns settle (pingdotgg#7723)
* feat(web): add appearance contrast control (pingdotgg#7906)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop completed Codex threads from staying stuck on working (pingdotgg#7937)
* fix(mobile): preserve markdown image dimensions (pingdotgg#7940)
* fix(web): remove duplicate provider update progress (pingdotgg#7761)
* fix(server): fall back to the remote default branch instead of assuming main (pingdotgg#7078)
* fix(web): give sidebar project menu rows the same side padding as other menus (pingdotgg#7913)
* fix(clients): reconnect after credentials fail during remote server updates (pingdotgg#7953)
* feat(codex): submit thread feedback to OpenAI (pingdotgg#7949)
* fix(server): stop kills lingering Claude work (pingdotgg#5891)
* fix(ci): let Macroscope approve pull requests again (pingdotgg#7970)
* fix(clients): move settled pinned threads into the settled section (pingdotgg#7969)
* perf(ci): speed up release builds and Windows packaging (pingdotgg#7975)
* fix(web): stop tool calls from leaving a blank page in threads (pingdotgg#7971)
* fix(web): stop recovered tool failures from marking work logs red (pingdotgg#7999)
* fix(mobile): isolate markdown image requests (pingdotgg#7942)
* feat(web): redesign skills in `$` menu and in `/` menu (pingdotgg#8009)
* fix(web): restore right panel toggle clicks after closing on desktop (pingdotgg#8016)
* fix(web): keep server update banners flush with the composer (pingdotgg#8000)
* perf(web): reuse work log rows during streaming (pingdotgg#8006)
* fix(web): keep provider badge legible in dark themes (pingdotgg#7968)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): treat configured urls with uppercase schemes as secure (pingdotgg#8005)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(desktop): keep release notes visible while downloading (pingdotgg#6412)
* fix(web): show only providers with usage in usage views (pingdotgg#7563)
* fix(web): prevent expanded tool calls from hiding thread content (pingdotgg#8052)
* test(server): remove no-op live activity tests (pingdotgg#8056)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(web): clarify terminal sidebar grouping (pingdotgg#7967)
* fix(codex): show app access approval prompts (pingdotgg#8058)
* feat(web): upload image attachments before sending (pingdotgg#8048)
* fix(server): bound OpenCode skill discovery output (pingdotgg#7675)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* fix(mobile): persist thread shelf collapse state (pingdotgg#5152)
* fix(mobile): restore Android tablet thread controls, clean up header (pingdotgg#5385)
* fix(mobile): land the first thread open above the composer on Android (pingdotgg#5585)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(server): check out submodules in a new worktree (pingdotgg#7674)
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
* fix(server): preserve merged PR badges after branch deletion (pingdotgg#6216)
* fix(server): return fresh live pull request reads (pingdotgg#6472)
* fix(web): compare client and server versions as semver, not strings (pingdotgg#7579)
* fix(web): stop follow-ups from leaving giant blank space (pingdotgg#8068)
* fix(marketing): stop automatic Vercel deployments on pull requests (pingdotgg#8070)
* chore: vouch repeat contributors (pingdotgg#8071)
* fix(server): keep the authoritative subagent model when snapshots race task_started (pingdotgg#7583)
* fix(server): honor auto-accept edits for the OpenCode provider (pingdotgg#7100)
* fix(server): run the CLI on Node versions without import.meta.main (pingdotgg#7141)
* fix(server): recover from provider interrupt failures (pingdotgg#7412)
* fix(server): recreate a thread's worktree before starting a turn (pingdotgg#7839)
* fix(server): thread delete no longer fails on already-removed worktrees (pingdotgg#8076)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): stop update notices showing through the composer (pingdotgg#8083)
* fix(web): detect outdated nightly servers (pingdotgg#8124)
* fix(web): align usage page skeleton layout (pingdotgg#8111)
* fix(web): make terminal links appear clickable only when clickable (pingdotgg#7488)
* fix(web): make Windows file links clickable in chat (pingdotgg#8081)
* fix(web): sort usage models by token count (pingdotgg#8108)
* fix: open agent file links in the file viewer (pingdotgg#8098)
* fix(server): stop routine events from rescanning thread history (pingdotgg#8150)
* fix(deps): stop pnpm installs from changing the lockfile (pingdotgg#8163)
* feat(web): settle and restore threads with a keyboard shortcut (pingdotgg#8089)
* perf(desktop): cut macOS signing calls by 81% (pingdotgg#8093)
* feat: link pull requests to threads (pingdotgg#8160)
* feat(web): safely attach HEIC photos as JPEG images (pingdotgg#8161)
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
* feat(mobile): track device models and OS versions (pingdotgg#8169)
* fix(grok): bound cumulative tool output updates (pingdotgg#7279)
* fix(web): delay thread shortcut hints by 200 ms (pingdotgg#8172)
* fix(server): stop probing Cursor until enabled (pingdotgg#8175)
* docs(release): verify remote updates with database migrations (pingdotgg#8177)
* fix(server): keep provider CLIs available in the macOS service (pingdotgg#8173)
* feat(claude): compact old threads before they burn through usage (pingdotgg#8144)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(client-runtime): retry queries after connection interruption (pingdotgg#8117)
* fix(server): keep previously used providers working after upgrades (pingdotgg#8176)
* feat(desktop): build macOS previews from a PR label (pingdotgg#8182)
* fix(web): thread jump hints no longer stick after a dictation paste (pingdotgg#8189)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): keep grouped project renames (pingdotgg#7831)
* feat(web): reveal chat file chips in the system file manager (pingdotgg#7140)
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
* fix(server): push no longer writes a feature branch's commits to its base branch (pingdotgg#8228)
* chore(deps): bump @clerk/electron to 0.0.37 (pingdotgg#8240)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(server): fetch legacy model classification from a hosted manifest (pingdotgg#8227)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(release): prepare v0.0.34
* fix(desktop): let Clerk UI receive stable auth fixes (pingdotgg#8248)
* fix(app): un-settled threads return to the top of the list (pingdotgg#8231)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* perf(ci): cut about a minute from every release (pingdotgg#8250)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(ci): download macOS preview DMGs without signing in (pingdotgg#8243)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(codex): accept Codex 0.150 multi-agent events (pingdotgg#8346)
* chore(release): prepare v0.0.35
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)
* test(server): remove duplicate missing worktree test (pingdotgg#8252)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)
Co-authored-by: Theo Browne <me@t3.gg>
* test: remove low-signal test files (pingdotgg#8397)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* test: prune trivial error and layout tests (pingdotgg#8400)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* Fix Android adaptive launcher icon (pingdotgg#4332)
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
* feat(web): split provider settings into list and editor (pingdotgg#8380)
* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)
* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)
* fix(mobile): keep iOS home header stable (pingdotgg#8467)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)
* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)
* test(web): remove redundant cache key test (pingdotgg#8484)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* fix(release): move nightly schedule to minute 38
Recent scheduled nightlies have been delayed or skipped.
Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.
Authored by GPT-5.6 Sol with the Codex harness.
* fix(web): stabilize the provider settings editor (pingdotgg#8472)
* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)
* fix(codex): show sub-agent models (pingdotgg#8502)
* feat(analytics): report connected client platforms (pingdotgg#8481)
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(web): toggle thread pin from the keyboard
Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.
* fix(web): add back button to project settings (pingdotgg#8168)
* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)
Co-authored-by: codex <codex@users.noreply.github.com>
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times (pingdotgg#5769)
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(clients): honor project default models in new threads (pingdotgg#6011)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(mobile): show file actions on Android (pingdotgg#8215)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix(connect): explain DPoP connection failures (pingdotgg#8351)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)
* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)
* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)
* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)
* fix: make thread auto-settling opt-in (pingdotgg#8321)
* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)
* fix(mobile): show composer menus when starting a task (pingdotgg#8587)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): show the configured stash shortcut (pingdotgg#8437)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
* fix: restore automatic thread settling defaults (pingdotgg#8596)
* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)
Co-authored-by: Julius Marminge <julius@mac.lan>
* Remove Messages Glass Lab experiment (pingdotgg#8599)
* chore(release): prepare v0.0.36
* Require human review for pull requests changing product defaults (pingdotgg#8603)
* fix(codex): avoid quadratic app-server input buffering (pingdotgg#8605)
* fix(mobile): stabilize iOS header item transitions (pingdotgg#8607)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(mobile): upgrade to Expo SDK 57 (pingdotgg#8609)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(mobile): harden native header toolbar items (pingdotgg#8611)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): stop querying Claude context usage after turns (pingdotgg#8610)
* chore: vouch ryanrhughes (pingdotgg#8613)
* feat(web): attach PDFs, ZIPs, and other files to a turn (pingdotgg#8236)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* fix(web): pass stashShortcutLabel in the mixed-attachments stash test
PRs pingdotgg#8437 and pingdotgg#8236 crossed: one made stashShortcutLabel a required
ComposerStashMenu prop, the other added a test case without it, so
main fails web typecheck.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): keybinding settings as settings rows (pingdotgg#8532)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat: let an environment publish themes as a file (pingdotgg#8569)
Co-authored-by: Theo Browne <me@t3.gg>
* fix(web): clean up provider settings list and editor (pingdotgg#8504)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): keep project picker popup inside the sidebar (pingdotgg#8627)
* fix(mobile): prevent header overflow and back-button artifacts (pingdotgg#8624)
* fix(server): retry automatic thread title generation (pingdotgg#8087)
* fix(client-runtime): refresh edited pull request comments (pingdotgg#8094)
* fix(web): four composer spacing defects (pingdotgg#8090)
* perf(desktop): skip duplicate browser updates (pingdotgg#8018)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): render nested markdown images correctly (pingdotgg#8501)
* fix(web): unify activity logs and composer banners (pingdotgg#8693)
* fix(mobile): reduce dev-client reload and Metro startup cost (pingdotgg#8694)
Co-authored-by: Julius Marminge <julius@mac.lan>
* revert(web): restore previous composer banners (pingdotgg#8733)
* test(web): remove tests for unreachable helpers (pingdotgg#8738)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* feat(mobile): update tool summaries and chat transitions (pingdotgg#8793)
* feat(web): play video attachments in chat (pingdotgg#8688)
* fix(web,mobile): snooze menu no longer offers the same wake time twice (pingdotgg#8741)
* fix(grok): allow model changes in existing threads (pingdotgg#8392)
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
* feat(mobile): pick, share, and receive files in threads (pingdotgg#8237)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* fix(web): reduce title bar scroll fade height (pingdotgg#8799)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(windows): strip quotes from repaired PATH (pingdotgg#8746)
* fix(web): open agent images in expanded preview (pingdotgg#8807)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(git): follow repository instructions in generated source control text (pingdotgg#8804)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): stop overpricing cached Claude tokens (pingdotgg#8806)
* fix(web): keep image preview above sidebar control (pingdotgg#8811)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): keep right panel synced with agent edits (pingdotgg#8803)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web,mobile): render Codex citations and artifact templates (pingdotgg#8584)
* chore: add Windows setup script to t3.json (pingdotgg#8814)
* fix(web): fold interim turn responses (pingdotgg#8828)
* fix(web): use circle alert for failed tool calls (pingdotgg#8840)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(mobile): add offline iPhone voice input (pingdotgg#8614)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent pull request metadata overlap (pingdotgg#8790)
* chore(release): prepare v0.0.37
* Add mobile composer attachment menu with video support (pingdotgg#8843)
* fix(mobile): map native menu icon colors explicitly
* fix(web): restore unified activity logs and composer banners (pingdotgg#8734)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
* fix(web): address composer banner review follow-ups (pingdotgg#8850)
* fix(web): widen sync banners and simplify the working timer (pingdotgg#8855)
* fix(preview): improve browser recording quality (pingdotgg#8839)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(web): mark pull request links as external (pingdotgg#8856)
* fix(mobile): replace Callstack glass with Expo glass (pingdotgg#8862)
* fix(server): skip IDE detection in Claude probes (pingdotgg#8634)
* chore(macroscope): review diagnostic overrides (pingdotgg#8917)
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
* fix(contracts): accept CLI event origins (pingdotgg#8905)
* fix(web): hide invalid slash skill completions (pingdotgg#8904)
* fix(mobile): defer draft navigation until submission completes (pingdotgg#8914)
* chore: disable CodeRabbit review status (pingdotgg#8933)
* Delete app.json (pingdotgg#8934)
* fix(web): show scrollbar for wide markdown tables (pingdotgg#8868)
* fix(mobile): shimmer active tool rows (pingdotgg#8932)
Co-authored-by: Julius Marminge <julius@mac.lan>
* chore(deps): bump Electron to 43.4.1 (pingdotgg#8626)
* fix(chat): smooth worktree setup status (pingdotgg#8922)
* feat(mobile): add video playback with native iOS controls (pingdotgg#8919)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(web): prevent chat metadata overlap (pingdotgg#8851)
* fix(server): preserve usage cache outside walked roots (pingdotgg#8540)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(mobile): add native image and PDF previews (pingdotgg#8959)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): allow long thread IDs in HTTP routes (pingdotgg#8898)
* fix(shared): preserve Windows shell PATH priority (pingdotgg#8748)
* fix(web): make WSL settings searchable (pingdotgg#8881)
* feat(web): add expand/collapse all control to the files surface (pingdotgg#8889)
* Add auto_review configuration to coderabbit.yaml
* style: format CodeRabbit configuration
* feat(mobile): upload attachments while composing (pingdotgg#8978)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(chat): keep agent activity visible between actions (pingdotgg#8984)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(server): isolate remote web session cookies (pingdotgg#8085)
Co-authored-by: Julius Marminge <julius0216@outlook.com>
* feat(pull-requests): link GitHub references in markdown (pingdotgg#8812)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* perf(server): reduce frequency of full tool call output being loaded into memory from db (pingdotgg#8988)
* feat(web): add pull request list filters (pingdotgg#8809)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(web): search individual settings by detail (pingdotgg#8831)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(client): render viewed images in work logs (pingdotgg#8936)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(client): use package import for markdown image helpers (pingdotgg#9010)
* test: remove static presentation snapshots (pingdotgg#9008)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
* perf(server): bound snapshot activity payload memory (pingdotgg#9000)
* perf(server): cut idle CPU use and stop provider event leaks (pingdotgg#8187)
* perf(server): scan only appended transcript bytes for usage summaries (pingdotgg#9024)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): cut chatty tool-update frames by 90% (pingdotgg#8368)
* fix(server): settle threads server-side (pingdotgg#8600)
* fix(clients): dedupe skills in composer menus (pingdotgg#8043)
* fix(server): stop OpenCode child sessions (pingdotgg#9005)
* perf(web): defer pull request line stats until visible (pingdotgg#6471)
Co-authored-by: Theo Browne <me@t3.gg>
* perf(server): skip full-message reads while streaming (pingdotgg#9032)
* perf(client-runtime): halve server config bootstrap traffic (pingdotgg#8367)
Reuse one server config subscription for session bootstrap and live updates.
Preserve environment theme opt-in, replay, deletion, slow subscriber recovery, and config stream failure handling.
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
* fix(web): align un-settle banner action (pingdotgg#9033)
* fix(web): block type-to-focus behind open dialogs (pingdotgg#8139)
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
* feat(shortcuts): copy active thread reference (pingdotgg#8994)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* fix(mobile): keep thread scroll bounds current after animations (pingdotgg#9013)
Co-authored-by: Julius Marminge <julius@mac.lan>
* fix(server): cache project favicon resolution (pingdotgg#9080)
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(claude): add Claude Fable 5.1 model (pingdotgg#9078)
* fix(preview): restore recording and macOS rendering after Electron 43 (pingdotgg#9001)
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
* feat(desktop): add configurable quit shortcut confirmation (pingdotgg#9076)
* feat(web): open project settings from thread menus (pingdotgg#8925)
* fix(chat): reuse one row for live activity (pingdotgg#9062)
Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>
* feat(models): discover Claude models from remote manifest (pingdotgg#9084)
* Revert "fix(chat): reuse one row for live activity" (pingdotgg#9096)
* fix(web): sync sidebar PR state from open panel (pingdotgg#9092)
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
* fix(web): changing projects no longer creates a draft (pingdotgg#9097)
* fix(web): keep theme placeholder text dimmer than entered text (pingdotgg#9104)
* fix(web): keep the selected environment when changing projects (pingdotgg#9102)
* docs(plans): t3o-31 upstream sync to v0.0.38
* fix(board): clear the ten pre-existing typecheck errors before the upstream sync (t3o-31 P0)
Two test fakes failed with a bare Error in the Effect failure channel, a
closure-assigned let narrowed to never, and a single-override pill read
overriddenRows[0] under noUncheckedIndexedAccess. None changed behaviour;
they were masked because the recursive typecheck never reached apps/server.
* fix(sync): the three type errors and two test failures the v0.0.38 merge caused
- BoardModelRow reads planModeEnabled from client settings, as the composer does.
- findBranchPullRequest resolves the default branch for upstream's widened PR
cache key instead of passing null.
- The orphaned-session integration test mocks the supervisor reactor that the
startup seam yields (new inventory row).
- The projection resume test seeds board projector watermarks into
boards.projection_state, where t3o-26 reads them, and asserts over the union.
- searchSettings("work") now also matches upstream's worktree/network items.
* refactor(board): native title attributes become BoardHint tooltips
Upstream's new no-native-title-tooltip rule flags every intrinsic-element
title= in the board (61 sites). BoardHint wraps the styled Tooltip primitive
and renders its child as the trigger, so layout is unchanged; a nullish label
renders the child alone.
* docs(seams): record the v0.0.38 sync (t3o-31)
Merge-log row, the decisions taken (plans stay tracked, upstream's settlement
reactor accepted after audit, projector-enumeration policy, launcher protocol
note), an unmarked-edits debt table for the next sync, a marker census, the
three new upstream workflows to disable, and the runbook's per-package
verification notes.
* review(t3o-31): announce the board's status dots, and order the merge log
Round-1 nitpicks: a bare span's aria-label is not announced, so the working,
running and awaiting dots now carry role="img"; the v0.0.38 merge-log row
moves below the two 2026-08-09 rows so the table reads chronologically.
---------
Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: abcdmku <63693423+abcdmku@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: Rishet11 <154429365+Rishet11@users.noreply.github.com>
Co-authored-by: Alex <me@pixp.cc>
Co-authored-by: maria <254055478+maria-rcks@users.noreply.github.com>
Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com>
Co-authored-by: Ishaan Kothari <ishaanko.mail@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Rakshith Bhat <88523594+RakshithBhat03@users.noreply.github.com>
Co-authored-by: Simone <lucenz@proton.me>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com>
Co-authored-by: Tristan Knight <admin@snappeh.com>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: Pavlo Trinko <paul.trinko95@gmail.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Rodrigo Brechard <rodrigobrechard@gmail.com>
Co-authored-by: Rodrigo Brechard <rodrigo@clubtidy.fr>
Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com>
Co-authored-by: spiky02plateau <155588579+spiky02plateau@users.noreply.github.com>
Co-authored-by: Carlos Jimenez <cjimenez@r21digital.com>
Co-authored-by: Mark Griffin <mrmg@deflexion.net>
Co-authored-by: MacKinley Smith <smithmackinley@gmail.com>
Co-authored-by: oliver <97427849+flamboh@users.noreply.github.com>
Co-authored-by: mweinbach <maxweinbach5@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Mohtasham Murshid <154406804+MohtashamMurshid@users.noreply.github.com>
Co-authored-by: Dara Adedeji <daraaded@amazon.com>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
Co-authored-by: Ryan Hughes <ryan@heyoodle.com>
Co-authored-by: Vitaly Iegorov <vitalyiegorov@gmail.com>
Co-authored-by: Ahmed Besic <ahmed.besic2000@gmail.com>
Co-authored-by: maria <maria@kuuro.net>
Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com>
Co-authored-by: Julius Marminge <jmarminge@gmail.com>
Co-authored-by: Aditya Garud <153842990+yashranaway@users.noreply.github.com>
Co-authored-by: Yukun Shan <92423096+nateEc@users.noreply.github.com>
Co-authored-by: Will Sheldon <will@autimo.com>
Co-authored-by: mic <85814106+q1@users.noreply.github.com>
Co-authored-by: Guillermo Casanova <guillermo.casanova.b@gmail.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📱 Native ChangeChanges the native fingerprint; merging blocks production OTAs until a new store build ships.size:XXL1,000+ 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