Skip to content

[Bug]: Empty thread details card shows on the new thread screen when no project is chosen #25362

Closed

Description

@Neonsy

Before submitting

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

Area

apps/web

Steps to reproduce

  1. Start T3 Code with no projects added (fresh userdata), New design on (default since nightly 20261026.3710)
  2. Land on the new thread screen ("Choose a project to start")
  3. Use a window wide enough for the inline thread details card

Expected behavior

No thread details card while it has nothing to show, or the card appears only once a project is chosen

Actual behavior

An empty rounded card sits at the top right under the window controls. The card opens inline by default (DEFAULT_THREAD_PANEL_VISIBILITY.inlineOpen: true in rightPanelStore.ts), but with no project every section renders nothing: BranchToolbar returns null without an active project, shouldShowOpenInPicker is false, there are no scripts and no gitCwd, and automations and relationships are skipped for drafts. Only the card frame is drawn

Related: the device chip under the composer is also missing in this state because shouldShowComposerContextStrip requires an active project, so there is no way to pick which device "start without a project" uses before it starts (it uses the primary environment)

Impact

Cosmetic issue

Version or commit

0.1.3-nightly.20261026.3710 (f40c7c6)

Environment

Windows 11 Pro 10.0.26200, T3 Code desktop (Nightly)

Logs or stack traces

Screenshots, recordings, or supporting files

Image

Workaround

Choose a project or "start without a project", or close the card with the thread details toggle in the header

Activity

  1. added
    bugSomething is broken or behaving incorrectly.
    needs-triageIssue needs maintainer review and initial categorization.
    on Oct 26, 2026
  2. juliusmarminge commented on Oct 26, 2026

    @juliusmarminge
    Member

    Tested the web client on current main bfc7177f9f, with a fresh isolated home, automatic project creation disabled, New design enabled, and a 1920×1080 viewport. With no projects, startup shows “What should we work on?” and no thread details card. Starting without a project opens a draft with populated workspace controls.

    What navigation or shortcut takes you from the fresh workspace to “Choose a project to start” before choosing a project or starting without one? Is there a saved draft or restored window involved?

    Fresh workspace with New design enabled

  3. Neonsy commented on Oct 26, 2026

    @Neonsy
    Author

    @juliusmarminge Found it. It's a stale client cache, not a fresh install. The empty card is real, but it needs a project that was deleted while the app was closed, and #20183 made that reachable

    My setup: I run a personal PowerShell scrubber that wipes local T3 Code thread data while the app is closed. It empties statev2.sqlite in place, which also removes all projects, and it deletes logs, attachments, scratch folders and rebuildable caches. It keeps settings, sign-ins, paired devices and the renderer profile's Local Storage and IndexedDB, because IndexedDB also holds the cloud relay proof key. So "fresh userdata" in my report was wrong. The server was empty, but the client's cached shell still listed my old projects

    What happens: On startup, IndexDraftLanding in _chat.index.tsx picks the most recent project from the cached shell and opens a draft for it. Before #20183 that pick waited for bootstrapped. Now it runs on cached data. When the live shell arrives without that project, the draft's project no longer resolves, so the headline falls back to "Choose a project to start" and the inline thread details card renders with every section empty

    Repro without my scrubber (web mode, nightly 20261026.3710):

    1. Start a server with a project, open the client and let it load
    2. Stop the server and delete statev2.sqlite
    3. Start it again, add a different project, pair and open /
    4. Result: a draft for the deleted project, "Choose a project to start", "No threads yet" and the empty card

    Control: Same steps, but delete the t3code:connection-runtime IndexedDB database before step 3 and keep all Local Storage. Startup opens a draft for the live project with a filled card

    Suggestion: Only start the landing draft from environments whose shell is live. That keeps the point of #20183 for other environments. Hiding the card when every section is empty would also stop the empty frame

    That would not solve the device picker though

    Edit: Struck parts are wrong or outdated. See the correction and narrower suggestion below

    Note

    Approved by the author, posted by Claude Opus 5.5

  4. Neonsy commented on Oct 26, 2026

    @Neonsy
    Author

    @juliusmarminge Correction to my comment above: #20183 is probably not the cause. The bootstrapped gate it removed already counted a cached shell snapshot as ready. allEnvironmentShellsBootstrappedAtom skips any environment whose snapshot is set, and the cached snapshot is loaded into that state with status cached before the live sync. So the stale startup pick likely predates #20183. I verified that in code at the parent commit, but I didn't run an older build

    The repro and control run above still hold. Here's a narrower suggestion that covers both the empty card and the device chip:

    1. Startup picks only from live environments: In IndexDraftLanding, filter the most-recent-project pick to environments in liveShellEnvironmentIdsAtom (state/shell.ts:54). Show NoProjectsHero only once every reachable environment is live, so it doesn't flash while cached data is loaded. Other environments can still connect later, which keeps the intent of fix(web): open the startup composer without waiting for every environment #20183
    2. No details card without a resolved project: Skip ThreadDetailsPanel and its toggle when the draft's project doesn't resolve (ChatView.tsx:3731). The existing "Choose a project to start" headline already lets the user recover, so no new recovery screen is needed

    The device chip needs no new picker once (1) is in. A "start without a project" draft has a real scratch project, so with more than one device the chip shows, and switching devices before sending already opens that device's scratch project (useDraftEnvironmentRouting.ts:222-251). I read that in the code but haven't tested it with two devices

    Tradeoff: startup waits for the environment that holds the pick to be live. I haven't measured how long that takes for the desktop app's local server

    Note

    Approved by the author, posted by Claude Opus 5.5

  5. Neonsy commented on Oct 26, 2026

    @Neonsy
    Author

    Extra information

    I just removed my remote server, since I'm setting up a box somewhere else, so there are currently no other device online, which results in the issue not surfacing after running the same scrubber

    So as the evidence stated, it seems to be connected to threads on other machines

  6. Neonsy commented on Oct 26, 2026

    @Neonsy
    Author

    I removed the remote from both T3 Connect and Connections. Running the same local scrubber afterward shows the normal “What should we work on?” screen

    Removing the saved connection excludes that remote from startup choices and clears its drafts. That fits a remote-owned bad draft disappearing, without proving remote threads themselves are the cause

    The cache-accepting startup gate dates to #4055. #23967 later changed draft-opening timing, so source history alone doesn’t establish the exact introducing PR

    Controlled source checks passed with simulated scheduling and storage. The original project-disappearance event and historical app reproduction remain unverified

    Note

    Approved by the author, posted by GPT-6.1 Sol

  7. Neonsy commented on Oct 26, 2026

    @Neonsy
    Author

    Retested on 0.1.3-nightly.20261026.3717 after scrubbing Windows and the remote. The bug persisted

    With no projects, Chat was unavailable. I used Ctrl+P → Escape to reach projectless chat

    I deliberately kept Local Storage and IndexedDB because wiping them would also remove data I want to preserve

    That leaves client cache and drafts intact, so this still doesn’t rule out stale client state

    Source confirms Chat is disabled with zero projects and unresolved drafts hide projectless recovery when no projects exist

    My earlier recovery suggestion was incomplete. Preserve projectless recovery and route Chat to it when scratch is supported

    This concludes my investigation. I can’t think of any further angles to try

    Note

    Approved by the author, posted by GPT-6.1 Sol

  8. Neonsy commented on Oct 28, 2026

    @Neonsy
    Author

    IDK What happened, but whatever caused this seems to be gone now

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.needs-triageIssue needs maintainer review and initial categorization.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions