Repository navigation
fix(web): live dictation transcript keeps the newest words in view - #32960
juliusmarminge merged 2 commits into
Conversation
The live transcription box under the composer is capped at max-h-32 and scrolls, but nothing kept it scrolled to the end. Once a long dictation overflowed it, new words appeared below the visible area. Lay the box out as a reversed flex column so the browser anchors its scroll at the bottom. Scrolling up to reread is still respected.
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — The change keeps recent dictation words visible while retaining normal text order. Its effects are confined to the transcript preview’s layout and scrolling, with no changes to transcription or message handling. You can add or adjust custom eligibility rules. Learn more. |
|
No actionable comments were generated in the recent review. Walkthrough
Merge Risk:
|
|
Note Written by Verified in a real dev environmentverified unchanged head
existing ci checks are green. no source edits or pushes were needed; no new automated checks were run. before, on main: after, on the pr, with the same spoken passage: 18-second sampled recording, about one captured frame per second, showing the live preview following incoming text: Not verifiednative electron, ios/android, safari/firefox, physical microphone hardware, other speech models, cloud transcription, and remote/relay connections were not exercised on this linux vm. mobile has no equivalent changed preview. no cross-platform or performance claim is made. |
|
Hey @maria-rcks, if possible could you get this merged? I need to see what I'm saying while I dictate. Sorry for bugging you |
…ollows-text Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
EvidenceScenario: Live dictation keeps the newest words visibleChromium 156, 1280×800, light theme; fresh databases on both commits. Settings > Voice: select local transcription and download Parakeet Unified English 0.6B. Open the seeded thread, start voice input, and play identical continuous speech. Capture when the final sentence is transcribed, scroll upward, and continue dictating until over 120 more characters arrive. Proven: the scenario fails on base 9f815c94af and passes on head a50c6690e8.
Scenario source · Speech recording · Speech text · Sanitized proof run log |
**v0.1.10-nightly.20261115.4736** · 95 changes from 43 contributors - **Large terminal pastes.** Paste large amounts of text into the terminal without the paste being rejected. - **Faster Codex skills.** Codex skills appear faster when opening or switching workspaces. - **Faster long threads.** Long threads open about 2.5 times faster. - **Image attachments.** Distinct pasted images with matching attachment details are no longer silently collapsed into one. - **Selected-file commits.** Committing selected files preserves merge conflicts in other files. - **Long-lived drafts.** Images in older drafts are recovered before sending if their uploads have expired. - **Optional questions.** Submit agent questions without filling in optional text fields. ### Plus 82 more bug fixes and performance improvements. <details> <summary>Full changelog</summary> ## What's Changed * fix(web): sidebar edge uses the same resize cursor as side panels by @tenyoru in pingdotgg/t3code#33083 * fix(web): attach command palette threads outside the sidebar by @Yash-Singh1 in pingdotgg/t3code#37054 * fix(server): status reports no branch while a clone has not checked out HEAD by @juliusmarminge in pingdotgg/t3code#37041 * perf(scripts): check:changed on Windows no longer spends minutes walking node_modules (2,500 s → 5.0 s) by @Pyseph in pingdotgg/t3code#32023 * perf(web): answering a question no longer re-renders the whole chat view by @OmarAlex24 in pingdotgg/t3code#32324 * perf(server): command palette status rows skip the Changes totals they never show by @Yuruzuu in pingdotgg/t3code#32351 * fix(web): PR file order follows alias imports of dotted modules by @jancuk in pingdotgg/t3code#32364 * fix(acp): a failed MCP-over-ACP disconnect can be retried by @notzenco in pingdotgg/t3code#33069 * fix(web): settle check lines up with row timestamps by @sergiiopm in pingdotgg/t3code#33053 * fix(provider-core): handoff work reserve fits small context windows by @MiaAI-Lab in pingdotgg/t3code#32598 * fix(mobile): video previews survive re-signed URLs and a late-attached player item by @bartlomiejbloniarz in pingdotgg/t3code#32196 * fix(mobile): honor Android clock format in message timestamps by @razzeee in pingdotgg/t3code#33078 * fix(shared): .localdomain hosts no longer leak to the favicon service by @mrlufepines in pingdotgg/t3code#32657 * fix(web): collapsing Electron main no longer hides the backend server by @thepradipvc in pingdotgg/t3code#32619 * test: remove duplicate client call-site coverage by @t3-code-bot[bot] in pingdotgg/t3code#36776 * fix(github): pull request activity reports a rate-limited review-thread read instead of hiding its threads by @only21mil in pingdotgg/t3code#32620 * fix(web): stacked composer banners no longer show dark seam bands by @Pulsar-Programmer in pingdotgg/t3code#32683 * fix(web): draft images keep their order after a reload by @only21mil in pingdotgg/t3code#32709 * fix(web): open PDF links in the file viewer by @Yash-Singh1 in pingdotgg/t3code#37064 * fix(server): a selected-file commit keeps other files' merge conflicts by @only21mil in pingdotgg/t3code#33115 * fix(web): a file opened from a diff in a project folder inside a repository opens that file by @Entrpi in pingdotgg/t3code#32684 * test(web): ACP project picker test waits for the popup to take focus by @seancarnahan in pingdotgg/t3code#33061 * fix(web): stop held dictation when shortcut modifiers are released by @mrlufepines in pingdotgg/t3code#32648 * perf(web): resting on a PR row also reads its activity, so the timeline shows on click by @Bil0000 in pingdotgg/t3code#32842 * fix(server): agents can see whether a thread is pinned by @shadizx in pingdotgg/t3code#32727 * fix(server): a pushed commit no longer reports failure when the final git status read fails by @only21mil in pingdotgg/t3code#32705 * test(web): the streaming render scenario gives the timeline stable props by @Entrpi in pingdotgg/t3code#32792 * fix(web): HTML file previews use the current canvas color by @Yash-Singh1 in pingdotgg/t3code#37072 * fix(web): an image-only send that fails behind a new draft now says so by @only21mil in pingdotgg/t3code#32732 * fix(assets): align app icons and retain a folder placeholder while loading by @Yash-Singh1 in pingdotgg/t3code#37067 * fix(github): pull request activity says when its comments were cut by @only21mil in pingdotgg/t3code#32707 * test(github): activity mock sets the new truncated flag by @juliusmarminge in pingdotgg/t3code#37078 * fix(server): a branch's own pull request shows past a hundred same-named fork pull requests by @only21mil in pingdotgg/t3code#32796 * fix(server): an effect this build can't read no longer blocks its thread's later work by @only21mil in pingdotgg/t3code#32746 * fix(acp-registry): a failed agent install no longer floods provider status with its whole log by @only21mil in pingdotgg/t3code#32800 * fix(web): terminal reports focus changes to programs that request them by @StiensWout in pingdotgg/t3code#37066 * fix(web): remove redundant subagent action from background row by @Yash-Singh1 in pingdotgg/t3code#37079 * fix(web): a side chat's subagent opens its parent as a side chat tab, not a bare page by @Yuruzuu in pingdotgg/t3code#32907 * fix(shared): inline code paths like `docker/Dockerfile` become file chips by @felixlaga in pingdotgg/t3code#32402 * fix(web): Esc in Clerk's account modal no longer closes Settings by @thepradipvc in pingdotgg/t3code#32859 * fix(mobile): show thread sync status in the header, not above the composer by @juliusmarminge in pingdotgg/t3code#37076 * fix(mobile): undo toast lines up with the folded Duo's tab bar by @juliusmarminge in pingdotgg/t3code#37081 * fix(desktop): Stable switch no longer tells policy-blocked nightly apps to reinstall by hand by @only21mil in pingdotgg/t3code#32609 * fix(web): live dictation transcript keeps the newest words in view by @SharoonRafeek in pingdotgg/t3code#32960 * fix(server): preserve shell paths containing spaces and dashes by @StiensWout in pingdotgg/t3code#37069 * perf(server): batch terminal output that arrives within 2 ms by @juliusmarminge in pingdotgg/t3code#37060 * perf(desktop): WSL preflight starts the staged runtime once instead of twice by @juliusmarminge in pingdotgg/t3code#37052 * fix(mobile): worktree setup shows in the chat from the first moment by @juliusmarminge in pingdotgg/t3code#37084 * fix(server): an MCP pin lands at the top of the Pinned section by @xwchen in pingdotgg/t3code#33978 * fix(mobile): keep Diagnostics and Client Storage content above floating tabs by @j-gaertig in pingdotgg/t3code#32821 * fix(acp-registry): observe delayed model discovery and avoid stale cache lock by @hxbib in pingdotgg/t3code#33170 * test(web): Settings Esc test waits for the modal's initial focus by @juliusmarminge in pingdotgg/t3code#37089 * fix(claude): keep monitor threads waiting between updates by @Yash-Singh1 in pingdotgg/t3code#37085 * fix(mobile): the iPhone Duo's sidebar list ends above its tab bar in portrait by @juliusmarminge in pingdotgg/t3code#37091 * fix(web): switching providers no longer drops the thread's stored effort by @only21mil in pingdotgg/t3code#33090 * fix(mobile): PR activity filter remembers bot and resolved visibility by @juliusmarminge in pingdotgg/t3code#37096 * fix(web): terminal links open bare compiler filenames by @StiensWout in pingdotgg/t3code#37071 * fix(acp): optional text questions can be left blank by @shivamhwp in pingdotgg/t3code#36997 * fix(shared): MCP apps that fall back to a blob: frame no longer render blank by @u9g in pingdotgg/t3code#32129 * fix(shared): keep coalescing workers alive when processors throw by @luke2x in pingdotgg/t3code#32178 * fix(server): an empty Antigravity MCP config still allows text generation by @saphid in pingdotgg/t3code#36496 * perf(server): active thread reads filter on the archived_at column by @mahirozdin in pingdotgg/t3code#28992 * perf(resource-monitor): look up external process identities by PID by @hieu-lee in pingdotgg/t3code#31202 * fix(server): accept ASCII whitespace in base64 image payloads by @darshmahadevia in pingdotgg/t3code#31798 * perf(server): Codex skills for four workspaces load in a median 138 ms instead of 1,657 ms (12x) by @Yuruzuu in pingdotgg/t3code#33972 * fix(web): recover expired composer uploads before sending by @Adamulek123 in pingdotgg/t3code#32910 * fix(server): content search recovers after a slow first index by @ItsThierry in pingdotgg/t3code#33138 * fix(terminal): show shell startup failures across attachments by @StiensWout in pingdotgg/t3code#37088 * perf(server): long threads open about 2.5x faster by @valuin in pingdotgg/t3code#34014 * fix(mobile): inline markdown images page through their message's images by @juliusmarminge in pingdotgg/t3code#37117 * fix(mobile): /model suggestion opens the model picker by @StiensWout in pingdotgg/t3code#37109 * fix(desktop): release cancelled Codex callback listeners during browser launch by @romil-bijarnia in pingdotgg/t3code#29734 * perf(server): skip compression for the desktop's local connection by @voltcrash in pingdotgg/t3code#30832 * fix(server): outside MCP clients stop being offered thread-bound tools by @RVZO6 in pingdotgg/t3code#32764 * fix(ssh): preserve literal home paths in Include expansion by @Lucenx9 in pingdotgg/t3code#33288 * fix(server): finish closed terminal kills before shutdown by @StiensWout in pingdotgg/t3code#37113 * fix(web): keep distinct images with matching attachment metadata by @StiensWout in pingdotgg/t3code#37116 * fix(web): large terminal pastes reach the program intact by @StiensWout in pingdotgg/t3code#37103 * fix(server): settling a thread keeps exec and foreground Bash terminals open by @juliusmarminge in pingdotgg/t3code#37125 * fix(codex): keep browser access prompts available in full access by @Yash-Singh1 in pingdotgg/t3code#37104 * fix(web): open terminal file links naming the server hostname by @StiensWout in pingdotgg/t3code#37133 * fix(mobile): recheck the current branch before selecting it by @StiensWout in pingdotgg/t3code#37121 * fix(acp): wait for session/load to reply before prompting by @shivamhwp in pingdotgg/t3code#37139 * fix(web): terminal mouse reports hit the drawn cell by @StiensWout in pingdotgg/t3code#37148 * fix(server): run_scheduled_task_now returns why a started run failed by @SouthCarpet in pingdotgg/t3code#37149 * fix(azure-devops): pull request titles like `@notes.txt` are saved as typed by @juliusmarminge in pingdotgg/t3code#37110 * fix(web): Sharing & access can select a desktop-local WSL backend by @juliusmarminge in pingdotgg/t3code#37151 * fix(mobile): pasted GIFs on iOS keep their animation by @StiensWout in pingdotgg/t3code#37143 * fix(acp): Copilot's reply after a background agent wakes it opens a continuation run by @juliusmarminge in pingdotgg/t3code#37159 * fix(shared): ß no longer splits words in generated folder and branch names by @lowlyleon in pingdotgg/t3code#37152 * fix(server): name the missing project when a change request's repository has none by @Sidreyas in pingdotgg/t3code#37161 * fix(server): an oversized provider request reads as too large, not raw 413 HTML by @Sidreyas in pingdotgg/t3code#37156 * fix(provider-acp): Grok early task completion no longer replaces the child's answer by @juliusmarminge in pingdotgg/t3code#37162 * fix(web): keypad navigation works with NumLock off by @StiensWout in pingdotgg/t3code#37175 ## New Contributors * @tenyoru made their first contribution in pingdotgg/t3code#33083 * @mrlufepines made their first contribution in pingdotgg/t3code#32657 * @thepradipvc made their first contribution in pingdotgg/t3code#32619 * @Pulsar-Programmer made their first contribution in pingdotgg/t3code#32683 * @seancarnahan made their first contribution in pingdotgg/t3code#33061 * @shadizx made their first contribution in pingdotgg/t3code#32727 * @SharoonRafeek made their first contribution in pingdotgg/t3code#32960 * @xwchen made their first contribution in pingdotgg/t3code#33978 * @j-gaertig made their first contribution in pingdotgg/t3code#32821 * @hxbib made their first contribution in pingdotgg/t3code#33170 * @ItsThierry made their first contribution in pingdotgg/t3code#33138 * @lowlyleon made their first contribution in pingdotgg/t3code#37152 **Full Changelog**: pingdotgg/t3code@v0.1.10-nightly.20261115.4723...v0.1.10-nightly.20261115.4736 </details> Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.10-nightly.20261115.4736











Problem
While dictating in the chat composer, the live transcription box under the editor stops following the text. It is capped at
max-h-32withoverflow-y-auto, but nothing keeps it scrolled to the end, so once a long dictation overflows the box, new words land below the visible area and you can't see what is being transcribed as you speak.Steps: start voice input in the composer (desktop or web) and keep talking until the transcript is taller than the box. The box stays on the first lines while the scrollbar grows.
Change
The box is now a reversed flex column (
flex flex-col-reverse) with the committed and tentative spans wrapped in one innerdiv. Withcolumn-reverse, the browser anchors the scroll position at the bottom, so the newest words stay in view as text arrives. No JS runs per update, and if you scroll up to reread, the box keeps your position instead of jumping back down. The innerdivkeeps the text in normal reading order.Only the composer's box is affected. The other live previews (Settings > Voice microphone test, text-field dictation) have no max height, so they grow instead of scrolling.
Scope and approval
I believe this qualifies as a very small, focused fix for an obvious bug: the box is meant to show the live transcript, and it hides the newest part of it. It changes one element's layout in
ChatComposer.tsxand no behavior beyond scrolling.Before opening this, I searched open and closed issues and PRs for transcript, dictation, live transcription, voice input, and scroll, and found no report or fix for it. Related work I checked:
surface-well) as part of the redesign stack. It doesn't change scrolling, but the two will touch the same lines.Verification
scrollTopstayed at 0 (first lines visible). New: stayed pinned to the last line. A one-sentence transcript still renders as a short box (39px). After scrolling up 60px, appending more text left the position at -60, so rereading isn't interrupted.vp run check:changedpasses (format, lint, knip, typecheck, react compiler).Not checked: mobile (it has no equivalent box), and Safari/Firefox (the desktop app is Chromium;
column-reversescroll anchoring is supported in current versions of both).Opus 5.5, Claude Code