Skip to content

[Bug]: Scrolling lists in dialogs flickers on macOS, but never while screen recording #23788

Open

Description

@flamboh

Before submitting

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

Possibly related: #7766 (flicker over masked scroll areas on Linux and Windows). For those reporters, removing the scroll-area-viewport mask fixes it. Here it doesn't, so I'm filing this separately until we know whether it's the same root cause.

Area

apps/desktop

Steps to reproduce

  1. On macOS, open T3 Code (Nightly).
  2. Go to Settings → Providers → Add provider.
  3. Scroll the "Or choose from ACP Registry" list.

The same flicker happens when scrolling the command palette.

Expected behavior

The list scrolls without flickering.

Actual behavior

The dialog flickers while the list scrolls. It never shows up while macOS screen recording is running, so I haven't been able to capture it in a recording.

Ruled out with live DevTools overrides in Nightly (none of these stopped the flicker):

  • mask-image: none on [data-slot=scroll-area-viewport]. This doesn't touch the command palette's mask, which is .virtualized-scroll-fade on the LegendList scroller.
  • A static mask on the viewport, and the mask moved to the non-scrolling ScrollArea root.
  • filter: none on the registry icons, which use an SVG url(#…) filter.
  • backdrop-filter: none on dialog-popup and dialog-backdrop.
  • will-change: auto on the popup.

I also probed it headlessly against a dev server in Linux Chromium, and over CDP in Chrome 155 on another Mac (DPR 1 and 2), using real wheel ticks. In neither dialog did anything change on every frame: no React commits, no layout shift, and on macOS no GPU layers created or destroyed. The only per-frame repaint was the scrollbar thumb. React only commits at scroll start and stop (data-scrolling). The scrollbar's opacity transition never runs during a wheel scroll, because data-hovering stays set.

The one per-frame churn found was in Linux Chromium at DPR 1: the mask makes a large "Overlap" layer get rebuilt on almost every wheel tick (~21 per gesture, 0 with the mask removed). It doesn't happen on macOS at DPR 1 or 2.

Current guess: a Chromium compositor or macOS display-timing bug, possibly ProMotion frame pacing, which would explain why screen recording hides it. Unconfirmed.

Not yet tried:

  • Disabling all masks, filters, backdrop filters, transitions and animations at once.
  • Hiding the scrollbars.
  • Locking the display to 60 Hz.
  • Launching with --disable-skia-graphite or --disable-gpu-compositing.

Impact

Cosmetic issue

Version or commit

T3 Code (Nightly), Electron 44.4.5

Environment

macOS, T3 Code (Nightly) desktop app

Workaround

None found yet.

Activity

  1. koushikxd commented on Oct 22, 2026

    @koushikxd
    Contributor

    I tried reproducing this on my Mac (T3 Code Beta 0.1.1, Electron 44.4.5) by scrolling the ACP Registry list and the command palette, and couldn't see the flicker.

    What are your display settings? Which display, its refresh rate, and whether it's ProMotion or an external monitor.

    Since screen recording hides it, could you film it with your phone? Even a short clip would help a lot.

  2. prayzey commented on Oct 25, 2026

    @prayzey

    Hi! @flamboh @koushikxd

    I experienced this and tried to reproduce this on macOS with an external high-refresh monitor and filmed it with my phone, the flickers happen more towards the end of the 23 sec video

    Setup

    • T3 Code Nightly 0.1.3-nightly.20261023.3592 (Electron 44.9.3)
    • macOS 27.2 (26B118), Apple M4 Max
    • Main display: ASUS ROG XG27AQM, 2560x1440 @ 240 Hz, external (not ProMotion). Two other external monitors at 144 Hz and 165 Hz, plus the built-in display.

    What I see

    • Open the command palette (Cmd+K) and move the selection up and down the list. Single frames flash where the dimmed, blurred backdrop disappears.
    • In those frames the palette's own frosted background also disappears, so the chat shows straight through the list. The palette text stays drawn. Both missing layers are the backdrop-filter layers (dialog-backdrop and dialog-glass).
    • In a 23 second clip at 30 fps I counted about 15 single-frame flashes. Each one is a +10 brightness spike that recovers on the next frame.

    What does not trigger it

    • With the palette open and my hands off it, an agent scrolling, screenshotting, resizing and reloading a browser preview behind it caused no flashes.
    • Flashes continued after the agent went idle, as long as I kept moving through the list.
    t3-flicker-palette-scrolling-v2.mp4
  3. shanghaiEric commented on Oct 30, 2026

    @shanghaiEric

    I can reproduce this on macOS with T3 Code Desktop 0.1.6-nightly.20261030.3904.zh.2, using a trackpad and an external display at 144Hz. Scrolling the Cmd+K list causes flickering whether the conversation behind it is generating a response or has finished. Switching the same display to 60Hz eliminates the flickering.

  4. FiveFM commented on Oct 31, 2026

    @FiveFM

    Another data point for the refresh-rate theory, this time on a built-in ProMotion display rather than an external monitor, and on the stable build:

    • T3 Code (Beta) desktop 0.1.5, local server 0.1.5 (Electron 44.10.0)
    • macOS 27.0, Apple Silicon, built-in Liquid Retina XDR (ProMotion), trackpad

    Repro: Settings → Sharing & access → "Get more tunnels" → Security tab, then scroll the active devices list. Partway through the scroll, the thread view behind the modal shows through for one frame. It reproduces reliably.

    Switching the display from ProMotion to a fixed 60 Hz (System Settings → Displays → Refresh Rate) stops it completely.

    Investigated via t3 triage with Claude Code (Claude Opus 5.5).

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions