Skip to content

fix(shared): preview addresses containing another URL open instead of searching - #17943

Merged
juliusmarminge merged 3 commits into
pingdotgg:mainfrom
maxwellyoung:fix/preview-embedded-url-normalization
Oct 19, 2026
Merged

juliusmarminge merged 3 commits into
pingdotgg:mainfrom
maxwellyoung:fix/preview-embedded-url-normalization

Conversation

@maxwellyoung

@maxwellyoung maxwellyoung commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Typing localhost:3000/?next=https://example.com in the preview address bar starts a search instead of opening the local app. The URL normalizer mistook any embedded :// for the outer scheme.

Use the address bar's existing anchored scheme check in both helpers, preserving the outer host and path/query/fragment. Original fix by @maxwellyoung in #17943; retained after independent implementation review. Merged current main into the contributor branch without rewriting its history.

Verification at 4f4b89e:

  • Reduced eight PR-added mirrored helper cases to three address-bar behavior cases (query, path, fragment); 19 baseline cases unchanged. Total: 27 → 22.
  • With main's implementation: 3 regression cases fail, 19 pass. With the fix: all 22 pass.
  • node_modules/.bin/vp test run packages/shared/src/preview.test.ts: passed.
  • Targeted lint, formatting, shared package typecheck, and git diff --check: passed (existing Effect suggestions elsewhere).
  • One full-diff adversarial review round, independently by Claude Opus 5.5 and Codex GPT-6 Sol: no findings.
  • Actual isolated T3 web app on headless Linux, 1280×800: entering localhost:9471/redirect.html?next=https://example.com reproduces a search with the actual main helper and opens the local page with the head helper. Same fixture and viewport. A temporary downloaded fallback font supplied the host's missing fonts; no product styling changes were committed.

Before — main searches for the address:

Before: T3 Browser searches for the localhost redirect address

After — head opens the local page and preserves its query:

After: T3 Browser loads the local app with the embedded URL intact

Not verified: macOS, Windows, native iOS/Android, or Electron desktop. The shared helper callers were inspected across web, mobile, server, and desktop. This is a URL behavior fix with no visual design change.

Original work by @maxwellyoung. Takeover tests: GPT-6 Astra (high); implementation: GPT-6.1 Sol (high); reviews: Claude Opus 5.5 and GPT-6 Sol. Harnesses: Codex and Claude Code through T3 Code.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Oct 10, 2026
macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Oct 10, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at 4f4b89e

Macroscope's review found this PR approvable — This is a narrowly scoped URL parsing bug fix that preserves existing URL handling while correctly opening addresses containing embedded URLs instead of searching. The shared helper change is covered by focused regression tests and introduces no schema, deployment, security, billing, or static-analysis configuration risk.

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

@coderabbitai

coderabbitai Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 89e57d8b-afd9-4fda-837e-eea847d8a3a4
📥 Commits

Reviewing files that changed from the base of the PR and between 8acaa44 and 4f4b89e.

📒 Files selected for processing: 2
  • packages/shared/src/preview.test.ts
  • packages/shared/src/preview.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 1 remain after this review.

📝 Walkthrough

Preview URL handling now uses a shared pattern to identify inputs that begin with a valid scheme and authority. Address-bar tests cover inputs with embedded URLs in a query, fragment, or path.

Changes: Preview URL qualification

Layer / File(s) Summary
URL qualification and embedded-URL handling
packages/shared/src/preview.ts, packages/shared/src/preview.test.ts
A shared pattern identifies inputs that begin with a valid scheme and ://. resolveAddressBarInput uses this pattern. normalizePreviewUrl uses it to select the explicit URL path. Tests check that inputs with embedded URLs resolve to the outer address.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Suggested reviewers: juliusmarminge

Merge Risk: ⚪ Minimal · up to 4f4b8

The resolver preserves explicit URLs and correctly handles host addresses containing nested URLs. No actionable merge-blocking issue was found in the reviewed change.

Pre-merge checks: Passed 4
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed The title clearly and concisely describes the primary fix: preview addresses containing another URL open instead of being searched.
Description check Passed The description covers the problem, implementation, focused verification, observed results, screenshots, and unverified platforms. It references the related PR for scope, although it does not explicit…
Full details: Description check

Explanation

The description covers the problem, implementation, focused verification, observed results, screenshots, and unverified platforms. It references the related PR for scope, although it does not explicitly identify a maintainer approval comment or explain the small-fix exemption.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

@juliusmarminge juliusmarminge added the macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews label Oct 11, 2026 — with ChatGPT Codex Connector
@macroscopeapp
macroscopeapp Bot dismissed their stale review October 11, 2026 06:10

Dismissing prior approval to re-evaluate 8acaa44

macroscopeapp[bot]
macroscopeapp Bot previously approved these changes Oct 11, 2026
@juliusmarminge juliusmarminge self-assigned this Oct 19, 2026
@juliusmarminge

Copy link
Copy Markdown
Member

Taking over this one. I'll resolve the conflict with main, rebuild it to repo conventions and push to this branch.

@macroscopeapp
macroscopeapp Bot dismissed their stale review October 19, 2026 02:07

Dismissing prior approval to re-evaluate 4f4b89e

@juliusmarminge
juliusmarminge merged commit 25aa9fc into pingdotgg:main Oct 19, 2026
30 of 31 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 19, 2026
## What's Changed
* fix(mobile): sheets close with an X and confirm with a checkmark by @juliusmarminge in pingdotgg/t3code#21319
* fix(tailscale): a slow tailscale status no longer hides Tailscale in Settings by @SunkenInTime in pingdotgg/t3code#21057
* chore(deps): web and mobile share React 19.3 from the catalog by @juliusmarminge in pingdotgg/t3code#21376
* fix(server): migrate legacy thread pull request links by @Yash-Singh1 in pingdotgg/t3code#19129
* fix(server): a failed Codex turn no longer traps the queue behind its subagents by @juliusmarminge in pingdotgg/t3code#21366
* feat(server): count which product features people use by @juliusmarminge in pingdotgg/t3code#15921
* feat(server): count which T3 MCP tools agents use by @juliusmarminge in pingdotgg/t3code#15913
* perf(web): HTML renders drop the loading skeleton by @maria-rcks in pingdotgg/t3code#21480
* fix(mobile): sent steer and queued messages are marked like desktop by @flamboh in pingdotgg/t3code#21417
* fix(server): keep queued subagent status in sync by @Yash-Singh1 in pingdotgg/t3code#21487
* perf(web): virtualize large changed-file trees by @Yash-Singh1 in pingdotgg/t3code#21482
* fix(pull-requests): distinguish skipped checks with a slash icon by @Yash-Singh1 in pingdotgg/t3code#21498
* fix(mobile): crash report shows the store build number by @mohamed-akef in pingdotgg/t3code#16052
* fix(files): load PDFs in browser previews by @Yash-Singh1 in pingdotgg/t3code#21095
* fix(server): device-host SSH tunnels exit when the server dies by @kcazin in pingdotgg/t3code#17448
* fix(web): Open in → Finder in the file preview opened the file in its default app instead of revealing it by @jamesvillarrubia in pingdotgg/t3code#16955
* fix(web): project actions no longer reuse the right-panel terminal by @TonybynMp4 in pingdotgg/t3code#18340
* fix(web): the device screen keeps focus when typing or returning to the window by @haydenkz in pingdotgg/t3code#14534
* fix(server): keep browser input responsive during slow navigation by @josephv123 in pingdotgg/t3code#16691
* fix(grok): a Homebrew-installed Grok updates through brew and is compared against the cask by @Mnigos in pingdotgg/t3code#18772
* fix(antigravity): read usage from each instance data directory by @fixfon in pingdotgg/t3code#17769
* fix(server): reconnecting no longer reopens a closed terminal by @Gigioxx in pingdotgg/t3code#18444
* fix(shared): preview addresses containing another URL open instead of searching by @maxwellyoung in pingdotgg/t3code#17943
* fix(server): ACP Registry loads on networks with slow IPv4 connects by @Gigioxx in pingdotgg/t3code#15054
* fix(preview): keep desktop-rendered tabs out of idle cleanup by @TDanks2000 in pingdotgg/t3code#18147
* fix(server): auto-delivered messages queue between provider turns by @Gigioxx in pingdotgg/t3code#15691
* fix(server): OpenCode 2 threads keep T3's tools after an idle project is evicted by @voltcrash in pingdotgg/t3code#16796
* fix(server): install the advertised version for pnpm-global provider updates by @RaphaelFakhri in pingdotgg/t3code#14295
* fix(web): ignore right-clicks in the flat Device viewport by @samaluk in pingdotgg/t3code#17020
* fix(web): "No project" picker shows its full label on the new-thread screen by @flamboh in pingdotgg/t3code#21504
* fix(web): up-arrow recall skips automation and agent messages by @maria-rcks in pingdotgg/t3code#21510
* fix(desktop): reattach a browser tab whose debugger Chromium dropped by @tobymarks in pingdotgg/t3code#17525
* fix(web): Integrations settings show one Browser section, not two by @RakshithBhat03 in pingdotgg/t3code#18264
* fix(web): hide the empty reset badge on unstarted limit windows by @akash3444 in pingdotgg/t3code#18579
* fix(cli): browser setup installs missing fonts by @adrilasar in pingdotgg/t3code#17570
* fix(web,mobile): queued messages no longer say "From queue" once sent by @flamboh in pingdotgg/t3code#21474
* fix(web): refresh embedded assets in markdown file previews by @Saikrishna1876 in pingdotgg/t3code#18647
* fix(web,mobile): keep reporting client activity after an interrupted report by @skyhong2002 in pingdotgg/t3code#15738
* fix(web): paste terminal text once and clear the shortcut on release by @t3dotgg in pingdotgg/t3code#19366
* fix(server): fall back when checkpoint fsync is unsupported by @mdshzb04 in pingdotgg/t3code#14411
* fix(preview): browser tabs no longer go blank when the tab list reorders by @mkiera in pingdotgg/t3code#13799
* fix(server): terminals no longer inherit the launching tmux session by @UzEE in pingdotgg/t3code#13359

## New Contributors
* @mohamed-akef made their first contribution in pingdotgg/t3code#16052
* @haydenkz made their first contribution in pingdotgg/t3code#14534
* @RaphaelFakhri made their first contribution in pingdotgg/t3code#14295
* @samaluk made their first contribution in pingdotgg/t3code#17020
* @tobymarks made their first contribution in pingdotgg/t3code#17525
* @adrilasar made their first contribution in pingdotgg/t3code#17570
* @skyhong2002 made their first contribution in pingdotgg/t3code#15738
* @mkiera made their first contribution in pingdotgg/t3code#13799

**Full Changelog**: pingdotgg/t3code@v0.1.1-nightly.20261018.3335...v0.1.1-nightly.20261019.3348

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.1-nightly.20261019.3348
github-actions Bot added a commit to davidvanderklay/t3code-flake that referenced this pull request Oct 19, 2026
## What's Changed
* fix(mobile): sheets close with an X and confirm with a checkmark by @juliusmarminge in pingdotgg/t3code#21319
* fix(tailscale): a slow tailscale status no longer hides Tailscale in Settings by @SunkenInTime in pingdotgg/t3code#21057
* chore(deps): web and mobile share React 19.3 from the catalog by @juliusmarminge in pingdotgg/t3code#21376
* fix(server): migrate legacy thread pull request links by @Yash-Singh1 in pingdotgg/t3code#19129
* fix(server): a failed Codex turn no longer traps the queue behind its subagents by @juliusmarminge in pingdotgg/t3code#21366
* feat(server): count which product features people use by @juliusmarminge in pingdotgg/t3code#15921
* feat(server): count which T3 MCP tools agents use by @juliusmarminge in pingdotgg/t3code#15913
* perf(web): HTML renders drop the loading skeleton by @maria-rcks in pingdotgg/t3code#21480
* fix(mobile): sent steer and queued messages are marked like desktop by @flamboh in pingdotgg/t3code#21417
* fix(server): keep queued subagent status in sync by @Yash-Singh1 in pingdotgg/t3code#21487
* perf(web): virtualize large changed-file trees by @Yash-Singh1 in pingdotgg/t3code#21482
* fix(pull-requests): distinguish skipped checks with a slash icon by @Yash-Singh1 in pingdotgg/t3code#21498
* fix(mobile): crash report shows the store build number by @mohamed-akef in pingdotgg/t3code#16052
* fix(files): load PDFs in browser previews by @Yash-Singh1 in pingdotgg/t3code#21095
* fix(server): device-host SSH tunnels exit when the server dies by @kcazin in pingdotgg/t3code#17448
* fix(web): Open in → Finder in the file preview opened the file in its default app instead of revealing it by @jamesvillarrubia in pingdotgg/t3code#16955
* fix(web): project actions no longer reuse the right-panel terminal by @TonybynMp4 in pingdotgg/t3code#18340
* fix(web): the device screen keeps focus when typing or returning to the window by @haydenkz in pingdotgg/t3code#14534
* fix(server): keep browser input responsive during slow navigation by @josephv123 in pingdotgg/t3code#16691
* fix(grok): a Homebrew-installed Grok updates through brew and is compared against the cask by @Mnigos in pingdotgg/t3code#18772
* fix(antigravity): read usage from each instance data directory by @fixfon in pingdotgg/t3code#17769
* fix(server): reconnecting no longer reopens a closed terminal by @Gigioxx in pingdotgg/t3code#18444
* fix(shared): preview addresses containing another URL open instead of searching by @maxwellyoung in pingdotgg/t3code#17943
* fix(server): ACP Registry loads on networks with slow IPv4 connects by @Gigioxx in pingdotgg/t3code#15054
* fix(preview): keep desktop-rendered tabs out of idle cleanup by @TDanks2000 in pingdotgg/t3code#18147
* fix(server): auto-delivered messages queue between provider turns by @Gigioxx in pingdotgg/t3code#15691
* fix(server): OpenCode 2 threads keep T3's tools after an idle project is evicted by @voltcrash in pingdotgg/t3code#16796
* fix(server): install the advertised version for pnpm-global provider updates by @RaphaelFakhri in pingdotgg/t3code#14295
* fix(web): ignore right-clicks in the flat Device viewport by @samaluk in pingdotgg/t3code#17020
* fix(web): "No project" picker shows its full label on the new-thread screen by @flamboh in pingdotgg/t3code#21504
* fix(web): up-arrow recall skips automation and agent messages by @maria-rcks in pingdotgg/t3code#21510
* fix(desktop): reattach a browser tab whose debugger Chromium dropped by @tobymarks in pingdotgg/t3code#17525
* fix(web): Integrations settings show one Browser section, not two by @RakshithBhat03 in pingdotgg/t3code#18264
* fix(web): hide the empty reset badge on unstarted limit windows by @akash3444 in pingdotgg/t3code#18579
* fix(cli): browser setup installs missing fonts by @adrilasar in pingdotgg/t3code#17570
* fix(web,mobile): queued messages no longer say "From queue" once sent by @flamboh in pingdotgg/t3code#21474
* fix(web): refresh embedded assets in markdown file previews by @Saikrishna1876 in pingdotgg/t3code#18647
* fix(web,mobile): keep reporting client activity after an interrupted report by @skyhong2002 in pingdotgg/t3code#15738
* fix(web): paste terminal text once and clear the shortcut on release by @t3dotgg in pingdotgg/t3code#19366
* fix(server): fall back when checkpoint fsync is unsupported by @mdshzb04 in pingdotgg/t3code#14411
* fix(preview): browser tabs no longer go blank when the tab list reorders by @mkiera in pingdotgg/t3code#13799
* fix(server): terminals no longer inherit the launching tmux session by @UzEE in pingdotgg/t3code#13359

## New Contributors
* @mohamed-akef made their first contribution in pingdotgg/t3code#16052
* @haydenkz made their first contribution in pingdotgg/t3code#14534
* @RaphaelFakhri made their first contribution in pingdotgg/t3code#14295
* @samaluk made their first contribution in pingdotgg/t3code#17020
* @tobymarks made their first contribution in pingdotgg/t3code#17525
* @adrilasar made their first contribution in pingdotgg/t3code#17570
* @skyhong2002 made their first contribution in pingdotgg/t3code#15738
* @mkiera made their first contribution in pingdotgg/t3code#13799

**Full Changelog**: pingdotgg/t3code@v0.1.1-nightly.20261018.3335...v0.1.1-nightly.20261019.3348

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.1-nightly.20261019.3348
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews size:XS 0-9 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants