René's URL Explorer Experiment


Title: Add a "jump to latest" (scroll-to-bottom) button to the chat transcript by DragonnZhang · Pull Request #47 · modelstudioai/openwork · GitHub

Open Graph Title: Add a "jump to latest" (scroll-to-bottom) button to the chat transcript by DragonnZhang · Pull Request #47 · modelstudioai/openwork

X Title: Add a "jump to latest" (scroll-to-bottom) button to the chat transcript by DragonnZhang · Pull Request #47 · modelstudioai/openwork

Description: Closes #46 What & why Every comparable AI desktop chat surface — Claude Code Desktop, ChatGPT desktop, Codex desktop — shows a floating "jump to latest" control when you scroll up through a long conversation. OpenWork had none: once you scrolled up to read history you had to drag all the way back down, and during streaming that meant fighting the growing content. The transcript already tracked everything needed for it — ChatDisplay's handleScroll computes distanceFromBottom, un-sticks auto-scroll when you scroll up and re-sticks at the bottom (isStickToBottomRef), and messagesEndRef is the scroll anchor. Only the UI trigger was missing. This adds a floating circular down-chevron button centered near the bottom of the transcript that: appears only when the user is well away from the bottom (200px hysteresis so it doesn't flicker near the end), on click, re-enables sticky-bottom auto-scroll (isStickToBottomRef = true) and smooth-scrolls to the latest message, hides itself once back at the bottom and on session switch, fades in/out with the motion / AnimatePresence primitives already used throughout ChatDisplay. Frontend-only. No backend / qwen-code change. One new i18n key chat.scrollToBottom (accessible label + tooltip) added to all six locales. Changes components/app-shell/ChatDisplay.tsx — showScrollToBottom state toggled in the existing handleScroll (distanceFromBottom > 200); a scrollToBottom callback; reset on session switch; the floating AnimatePresence button; a data-testid="chat-transcript" hook on the transcript ScrollArea. packages/shared/src/i18n/locales/*.json — new chat.scrollToBottom key in all 6 locales, inserted in sorted position. e2e/app.ts + e2e/runner.ts — a reusable optional seed(profileDirs) hook on the Assertion/LaunchOptions contract, run after the isolated profile is created and before Electron launches, so assertions can pre-seed on-disk session state (backend-independent). This unblocks this assertion and any future transcript-dependent one. e2e/assertions/scroll-to-bottom.assert.ts — new CDP assertion (below). Verification (DoD) bun run typecheck:all — introduces no new errors. Delta vs main is zero (11 pre-existing errors only: auto-update.ts, a settings-default-thinking test tuple, two test files importing vitest). None in the files this PR touches. bun test — the failing set is identical to main: 56 pre-existing failures (BrowserCDP, BrowserPaneManager, RPC handler profiles, RoutedClient, i18n sorted checks, resource-bundle, startWebuiHttpServer, …), same names on both branches (verified by diffing the sorted failure lists — only per-test timing differs). This change adds zero new failures. bun run lint:i18n:parity — OK (6 locales, 1543 keys each). The new key is added to every locale; the pre-existing i18n keys are sorted alphabetically failures are unchanged (their first out-of-order key is menu.homepage, well after the chat.* section this PR touches). Renderer build (bun run electron:build:renderer, where this change lives) — ✅ builds cleanly. CDP assertion transpiles (bun build e2e/...) — ✅, along with the harness changes. CDP e2e assertion (scroll-to-bottom.assert.ts) Drives the real built app over CDP end-to-end: Seeds a 40-message session on disk (a plain session.jsonl under the isolated profile's default-workspace root — no backend) via the new harness seed hook, then opens it from the sidebar (the row selects on mousedown, dispatched accordingly). Asserts the transcript renders and overflows the viewport (the real conversation loaded, not the empty/draft state). Asserts that on open the transcript is at the bottom and the button is hidden. Scrolls to the top and asserts the button appears. Clicks it and asserts the transcript returns to the bottom (distanceFromBottom < 40) and the button disappears — proving the button actually scrolls, not merely renders. ⚠️ Local CDP run was blocked by this sandbox's egress policy, not by the feature. The Electron binary download (github release host) returns 403 from the egress proxy, so the app can't be built/launched here (xvfb is present; only the binary is missing). The assertion and harness changes transpile and are included so CI / a reviewer can run bun run e2e in an environment with normal network access. Everything that doesn't require launching Electron (typecheck, unit tests, i18n parity, renderer build) passes with zero delta vs main. Part of the autonomous desktop-feature loop (loop-bot). Generated by Claude Code

Open Graph Description: Closes #46 What & why Every comparable AI desktop chat surface — Claude Code Desktop, ChatGPT desktop, Codex desktop — shows a floating "jump to latest" control when you scroll up thr...

X Description: Closes #46 What &amp; why Every comparable AI desktop chat surface — Claude Code Desktop, ChatGPT desktop, Codex desktop — shows a floating &quot;jump to latest&quot; control when you s...

Opengraph URL: https://github.com/modelstudioai/openwork/pull/47

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:11b2da68-a7ba-4617-5376-b89db65705d6
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idB5B8:260009:96CE3D:CB503F:6A5278D2
html-safe-noncebc13e75222b7848703427b8d51f6ed508434fd05077d33aaf2b4ec8ac83e795f
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCNUI4OjI2MDAwOTo5NkNFM0Q6Q0I1MDNGOjZBNTI3OEQyIiwidmlzaXRvcl9pZCI6IjI5NTIyOTU2NzEzNDI5ODc0NzQiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmac19c6df11cedf0553f9628b0f4b9b2febef7cb788eefc9befcb7c6825341209ba
hovercard-subject-tagpull_request:3978720404
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/modelstudioai/openwork/pull/47/files
twitter:imagehttps://avatars.githubusercontent.com/u/52599892?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/52599892?s=400&v=4
og:image:altCloses #46 What & why Every comparable AI desktop chat surface — Claude Code Desktop, ChatGPT desktop, Codex desktop — shows a floating "jump to latest" control when you scroll up thr...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Noneb9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/modelstudioai/openwork git https://github.com/modelstudioai/openwork.git
octolytics-dimension-user_id283556804
octolytics-dimension-user_loginmodelstudioai
octolytics-dimension-repository_id1256697754
octolytics-dimension-repository_nwomodelstudioai/openwork
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id1256697754
octolytics-dimension-repository_network_root_nwomodelstudioai/openwork
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
release07a982c1d40157c619b364352b704c3ce66bb332
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/modelstudioai/openwork/pull/47/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelstudioai%2Fopenwork%2Fpull%2F47%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fmodelstudioai%2Fopenwork%2Fpull%2F47%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=modelstudioai%2Fopenwork
Reloadhttps://github.com/modelstudioai/openwork/pull/47/files
Reloadhttps://github.com/modelstudioai/openwork/pull/47/files
Reloadhttps://github.com/modelstudioai/openwork/pull/47/files
Please reload this pagehttps://github.com/modelstudioai/openwork/pull/47/files
modelstudioai https://github.com/modelstudioai
openworkhttps://github.com/modelstudioai/openwork
Notifications https://github.com/login?return_to=%2Fmodelstudioai%2Fopenwork
Fork 3 https://github.com/login?return_to=%2Fmodelstudioai%2Fopenwork
Star 11 https://github.com/login?return_to=%2Fmodelstudioai%2Fopenwork
Code https://github.com/modelstudioai/openwork
Issues 14 https://github.com/modelstudioai/openwork/issues
Pull requests 12 https://github.com/modelstudioai/openwork/pulls
Actions https://github.com/modelstudioai/openwork/actions
Projects https://github.com/modelstudioai/openwork/projects
Security and quality 0 https://github.com/modelstudioai/openwork/security
Insights https://github.com/modelstudioai/openwork/pulse
Code https://github.com/modelstudioai/openwork
Issues https://github.com/modelstudioai/openwork/issues
Pull requests https://github.com/modelstudioai/openwork/pulls
Actions https://github.com/modelstudioai/openwork/actions
Projects https://github.com/modelstudioai/openwork/projects
Security and quality https://github.com/modelstudioai/openwork/security
Insights https://github.com/modelstudioai/openwork/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fmodelstudioai%2Fopenwork%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fmodelstudioai%2Fopenwork%2Fissues%2Fnew%2Fchoose
DragonnZhanghttps://github.com/DragonnZhang
mainhttps://github.com/modelstudioai/openwork/tree/main
loop/scroll-to-bottomhttps://github.com/modelstudioai/openwork/tree/loop/scroll-to-bottom
Conversation 0 https://github.com/modelstudioai/openwork/pull/47
Commits 3 https://github.com/modelstudioai/openwork/pull/47/commits
Checks 0 https://github.com/modelstudioai/openwork/pull/47/checks
Files changed https://github.com/modelstudioai/openwork/pull/47/files
Please reload this pagehttps://github.com/modelstudioai/openwork/pull/47/files
Add a "jump to latest" (scroll-to-bottom) button to the chat transcript https://github.com/modelstudioai/openwork/pull/47/files#top
Show all changes 3 commits https://github.com/modelstudioai/openwork/pull/47/files
43601fc Add jump-to-latest (scroll-to-bottom) button to the chat transcript claude Jul 2, 2026 https://github.com/modelstudioai/openwork/pull/47/commits/43601fc66363b32b573e1fa20e19c40b5c08f2bf
30d6472 docs(loop): fix merged ledger table rows claude Jul 2, 2026 https://github.com/modelstudioai/openwork/pull/47/commits/30d6472ac701567a9fe83fcde6a7e13ae520c661
c841663 chore: merge main into loop/scroll-to-bottom claude Jul 6, 2026 https://github.com/modelstudioai/openwork/pull/47/commits/c841663699a294dc69bb6b28615349e52ed4596d
Clear filters https://github.com/modelstudioai/openwork/pull/47/files
Please reload this pagehttps://github.com/modelstudioai/openwork/pull/47/files
Please reload this pagehttps://github.com/modelstudioai/openwork/pull/47/files
ChatDisplay.tsx https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
feature-ledger.md https://github.com/modelstudioai/openwork/pull/47/files#diff-2ae33a5d5ac052f40e2dfa56a7c3a17353f66baa0e674a59cc228e165b47c1af
app.ts https://github.com/modelstudioai/openwork/pull/47/files#diff-6bad88de69297c2f9af7a06f5af2c13a699f97c65258104ec2c662d6cf15e17d
scroll-to-bottom.assert.ts https://github.com/modelstudioai/openwork/pull/47/files#diff-b9c489ac689cacb3a285d71f4c941ac3264dae89a64fed2d4226022cef285255
runner.ts https://github.com/modelstudioai/openwork/pull/47/files#diff-8089e33a4e84a46eb6f3d77dd464caa4296a200fd5175952be807416ec54bf7f
de.json https://github.com/modelstudioai/openwork/pull/47/files#diff-a07701a4bc4176fccd6c7f3e46bf998f5837c2b31a637c3368b7e2bd4945196f
en.json https://github.com/modelstudioai/openwork/pull/47/files#diff-650c08c76762dcf05df7a125fe3b6ddae49ec33728cbe9faa1cdb21d7a685fbd
es.json https://github.com/modelstudioai/openwork/pull/47/files#diff-17b9af294bafe3747f72d5e451d5bfca9e55f81e78c2cc4eaf8990c9144cf70b
hu.json https://github.com/modelstudioai/openwork/pull/47/files#diff-6214170c87d0d435f797d6f51294f090b12c8e0da8444c00e4cfed01fd0010ef
ja.json https://github.com/modelstudioai/openwork/pull/47/files#diff-249ff4abe047742db0ebfebd9afa8f6caa0fb2f3c2f471323f7f399b845b8933
pl.json https://github.com/modelstudioai/openwork/pull/47/files#diff-c1520578547c50e85365472656e70246092c4844b0010e599a5b4c2b315818ad
zh-Hans.json https://github.com/modelstudioai/openwork/pull/47/files#diff-f6d1257160b49bb15b0c0d38bd31c98febbbbe1eb1475f4c0be0e9d99d24c954
apps/electron/src/renderer/components/app-shell/ChatDisplay.tsxhttps://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
View file https://github.com/modelstudioai/openwork/blob/c841663699a294dc69bb6b28615349e52ed4596d/apps/electron/src/renderer/components/app-shell/ChatDisplay.tsx
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelstudioai/openwork/pull/47/{{ revealButtonHref }}
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
https://github.com/modelstudioai/openwork/pull/47/files#diff-3154e2bd1db99ff094a184866d009778426ee4dd7896d9719bd0233a17b855d0
docs/loop/feature-ledger.mdhttps://github.com/modelstudioai/openwork/pull/47/files#diff-2ae33a5d5ac052f40e2dfa56a7c3a17353f66baa0e674a59cc228e165b47c1af
View file https://github.com/modelstudioai/openwork/blob/c841663699a294dc69bb6b28615349e52ed4596d/docs/loop/feature-ledger.md
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelstudioai/openwork/pull/47/{{ revealButtonHref }}
https://github.com/modelstudioai/openwork/pull/47/files#diff-2ae33a5d5ac052f40e2dfa56a7c3a17353f66baa0e674a59cc228e165b47c1af
https://github.com/modelstudioai/openwork/pull/47/files#diff-2ae33a5d5ac052f40e2dfa56a7c3a17353f66baa0e674a59cc228e165b47c1af
e2e/app.tshttps://github.com/modelstudioai/openwork/pull/47/files#diff-6bad88de69297c2f9af7a06f5af2c13a699f97c65258104ec2c662d6cf15e17d
View file https://github.com/modelstudioai/openwork/blob/c841663699a294dc69bb6b28615349e52ed4596d/e2e/app.ts
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelstudioai/openwork/pull/47/{{ revealButtonHref }}
https://github.com/modelstudioai/openwork/pull/47/files#diff-6bad88de69297c2f9af7a06f5af2c13a699f97c65258104ec2c662d6cf15e17d
https://github.com/modelstudioai/openwork/pull/47/files#diff-6bad88de69297c2f9af7a06f5af2c13a699f97c65258104ec2c662d6cf15e17d
https://github.com/modelstudioai/openwork/pull/47/files#diff-6bad88de69297c2f9af7a06f5af2c13a699f97c65258104ec2c662d6cf15e17d
https://github.com/modelstudioai/openwork/pull/47/files#diff-6bad88de69297c2f9af7a06f5af2c13a699f97c65258104ec2c662d6cf15e17d
e2e/assertions/scroll-to-bottom.assert.tshttps://github.com/modelstudioai/openwork/pull/47/files#diff-b9c489ac689cacb3a285d71f4c941ac3264dae89a64fed2d4226022cef285255
View file https://github.com/modelstudioai/openwork/blob/c841663699a294dc69bb6b28615349e52ed4596d/e2e/assertions/scroll-to-bottom.assert.ts
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/modelstudioai/openwork/pull/47/{{ revealButtonHref }}
Please reload this pagehttps://github.com/modelstudioai/openwork/pull/47/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.