Skip to content

[Bug]: Server-side browser makes previews blurry, with no way to opt out #16578

Description

@PedroNavHurDCA

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/server

Steps to reproduce

  1. Update to 0.0.46-nightly.20261006.2735 and restart the server.
  2. Open any page in the preview pane, for example with preview_open.
  3. Look at text, borders, and map tiles, then scroll and stop.

Expected behavior

Previews look as sharp as they did on 0.0.46-nightly.20261005.2689. If the streamed server browser is now the default, there is a setting to keep previews in the local or desktop browser, or at least to raise the stream quality.

Actual behavior

Every preview is now a server-side Chromium screencast, sent to the client as JPEG frames. Text looks soft and edges show compression artifacts. While scrolling, the stream drops to half resolution and quality 50.

There is no setting to opt out:

  • The server hardcodes serverBrowser: true in the environment capabilities.
  • The client picks the runtime with capabilities.serverBrowser === true ? "server" : undefined, with no user setting involved. The desktop app is also routed to server, even though window.desktopBridge.preview is available.
  • /api/preview-stream/ws accepts a quality parameter (default DEFAULT_QUALITY = 70), but the client never sends one. The client does send maxWidth and maxHeight in device pixels, so resolution isn't the cause.
  • Motion mode (SCREENCAST_MOTION_QUALITY = 50, scale 0.5) starts after 4 frames within 300 ms of a scroll.

Request: add a setting to turn off the server browser for preview tabs and use the desktop or local runtime, either per environment or per client. Separately, raise the default JPEG quality, or expose it as a setting. Recordings already use 90.

Impact

Major degradation or frequent failure

Version or commit

0.0.46-nightly.20261006.2735 (regression from 0.0.46-nightly.20261005.2689)

Environment

Linux x64 server running as a systemd user service; viewed through the T3 Connect relay.

Workaround

Pin the server to 0.0.46-nightly.20261005.2689, which has no server browser.

Activity

  1. juliusmarminge commented on Oct 6, 2026

    @juliusmarminge
    Member

    Note

    Grok responding on behalf of Julius.

    Confirmed on current main. After #15328, environments advertise serverBrowser: true (ServerEnvironment capabilities), and the web client always picks runtime: "server" when that flag is set (previewRuntimeFor / readEnvironmentSupportsServerBrowser). There is no client or environment setting that opts preview tabs back to a local or desktop runtime.

    Streamed viewers hit /api/preview-stream/ws as JPEG screencast frames. The server defaults quality to 70 (DEFAULT_QUALITY in ServerBrowserStream.ts). The client never sends quality — only maxWidth / maxHeight (packages/client-runtime/src/preview/serverBrowserStream.ts) — so every Connect / non-native viewer stays on that default. Recordings already use quality 90 (RECORDING_SCREENCAST in ServerBrowser.ts).

    While scrolling, motion mode kicks in after 4 frames within 300 ms of a scroll (SCREENCAST_MOTION_FRAMES / SCREENCAST_MOTION_WINDOW_MS): scale drops to 0.5 and quality is capped at SCREENCAST_MOTION_QUALITY (50). That matches the half-resolution + soft scroll artifacts in the report.

    Nuance for desktop: the primary desktop environment can still draw server tabs in a native <webview> (rendersServerTabNatively), which is not the JPEG path. The Connect-relay / remote-viewer path (this report) always streams. Discussion #15339 is about which browser serves an agent when several desktops share an environment — related product choice, not a duplicate. #9872 is about screenshot quality in narrow previews, a different surface.

    Next steps (either or both):

    1. Add a setting (per environment or per client) to prefer desktop/local preview when available, instead of forcing server whenever serverBrowser is advertised.
    2. Raise the default stream quality (or pass quality from the client), and reconsider motion scale/quality for text-heavy pages. Recordings at 90 are a useful reference.

    Pinning to 0.0.46-nightly.20261005.2689 remains the workaround until then.

  2. added
    bugSomething is broken or behaving incorrectly.
    via-triageFiled through npx t3 triage
    on Oct 6, 2026
  3. zaunermax commented on Oct 6, 2026

    @zaunermax

    While I think it is super duper cool that T3 code now can access locally running dev servers, wouldn't it be better to just tunnel those through somehow and "access" the dev environments over the wire? Local browser rendering will always be faster than streaming something over the wire 🤔 On the other hand this could be nice for when I am on the phone and there is no preview browser, so making it somehow controllable would be super nice. In older versions this was easily solvable by just creating a skill which tells the agent how to give you a linkt that you can open via tailscale or some VPN over the integrated browser - enabling fast iterations with the agent. Now it's just impossible to use the integrated browser anymore in tandem with the agent haha.

    Also minor nit: the new browser doesn't let you re-size the borders anymore, which is also a very big downgrade when you are on a small laptop screen, having to change the numbers in the top screen and not being able to just resize the window anymore.

    Thanks for your efforts on this awesome software!

  4. CaseyBlackburn commented on Oct 7, 2026

    @CaseyBlackburn

    This is one of my many frustrations with this change. Additionally the latency and the lack of decent motion rendering you get with a stream. (even on the same local network). The lack of annotations (my favorite tool) and not being able to do a right click also feel like major degradation. I was unsure if it would be proper to create issues about all of these things so for the time being I'm just expanding on here.

    I understand that this is a nightly and you have to start somewhere. I was hoping this would have been the resolution to work arounds I've been doing to painlessly access the remote machines dev services without tons of environment changes, but this streaming browser solution doesn't seem like a solution to my frustrations (hopefully it is for someone else's). I guess I was hoping for some solution like each remote T3 Code machine runs a SOCKS proxy and the machine you are working from uses that in its browser with the localhost proxy bypass disabled. (This would require the different remote environments to have each their own profile on your machine but you should be able to access localhost resources on the remote machine and not have to worry about port collisions between machines like you would if using SSH port forwarding)

    Anyways, just trying to boost importance of this issue. Thanks for all the hard work from the contributors!

  5. zaunermax commented on Oct 7, 2026

    @zaunermax

    Now that Theo even showed off how to develop UIs fast with astra on ultafast, it's not even feasible anymore because the remote streaming is so laggy and sluggish lol 🫣

  6. neel-kumar-v commented on Oct 7, 2026

    @neel-kumar-v

    Add a setting (per environment or per client) to prefer desktop/local preview when available, instead of forcing server whenever serverBrowser is advertised.

    I already had my Tailscale set up that my remote computer could tunnel my dev environment preview over to my phone & laptop. This has to be brought back as an option otherwise I will just have to revert the version I use.

    I do want to add that there are definitely some difficulties with getting the exact link sometimes from the agent, that could definitely be handled better, but the streaming version is essentially useless.

  7. jjsessa commented on Oct 8, 2026

    @jjsessa

    +1 for a setting to opt out of the server browser. I run T3 on a headless Mac and use it from a MacBook and a phone over Tailscale. Every dev server is already reachable from my devices, so I want preview and agent tabs to open in the browser on the device I'm using, not in a headless Chromium on the server. A per-client or per-environment toggle to use the local or desktop browser runtime would cover it.

  8. booklet-mikolajczak commented on Oct 8, 2026

    @booklet-mikolajczak

    +1. Same setup here: T3 desktop on a Linux (Ubuntu) machine, used locally and from other devices over Tailscale. Our dev servers are already reachable from every device, so a local/desktop <webview> render would be sharper and lower-latency than the headless Chromium stream. A per-client setting "Prefer desktop preview when available" would fully solve it for us.

  9. Xanacas commented on Oct 8, 2026

    @Xanacas
    Contributor

    I see the benefit and the intent, but please let us have both options.
    let the agent use the server side preview for the stuff that he is doing by default but, let me open my dev server as embedded browser tab clientside, while still having the annotation tools and the ability to let the agent control that tab.

    Let me set a default in the settings, and let me and the agent pick where to open a new tab.

  10. juliusmarminge commented on Oct 8, 2026

    @juliusmarminge
    Member

    Note

    Grok responding on behalf of Julius.

    Closing as fixed by merged #17316 — on desktop, user-opened tabs for remote environments now render locally instead of the blurry server stream, which is the opt-out this asked for. Agent tabs and web/mobile still stream.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is broken or behaving incorrectly.via-triageFiled through npx t3 triage

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions