Where does the bug appear (feature/product)?
Cursor IDE
Describe the Bug
Canvases are persisted under a project key derived from a per-launch temporary path, so Publish fails with “Canvas file not found” and canvases become unreachable after a restart.
In the standalone app (Glass layout) on Windows, opening a multi-folder session produces an ad-hoc workspace whose identity is derived from a temp path that does not exist on disk. Canvases land here:
%USERPROFILE%\.cursor\projects\<project-key>\canvases\<name>.canvas.tsx
where <project-key> looks like C-Users-<SHORTNAME>-1-AppData-Local-Temp-<uuid>.
Two symptoms:
- A new uuid (new project key) is minted on every launch, even when the folder set is identical, so canvases created in one session are orphaned in the next. 30 temp-keyed project directories have accumulated on this machine, with canvas files stranded in the older ones.
- Publish reports “Canvas file not found” even though the
.canvas.tsxfile exists (23 KB) and its sibling status file reads{"status":"rendered"}.
The temp path that the key encodes does not exist — not even for the session currently running. Searching %LOCALAPPDATA%\Temp for the uuid of the live session returns no match, and the same is true for the previous session’s uuid. Canvases are therefore filed under an identity pointing at a phantom path.
Likely contributing cause: the same physical canvas file is registered twice under inconsistent path normalization, producing two different canvasIds. From the Cursor Agent Exec log:
15:44:30 Registered canvas {"path":"c:\\Users\\...\\canvases\\my-report.canvas.tsx","canvasId":"77bc00d4a9b1"}
15:52:15 Registered canvas {"path":"C:/Users/.../canvases/my-report.canvas.tsx","canvasId":"50f41e5972f5"}
Lowercase c: with backslashes versus uppercase C: with forward slashes. That duplicate identity looks like a plausible direct cause of the failed lookup, and appears fixable independently of the storage-location design.
The standalone app exposes no way to pin a stable project identity, so this is not user-correctable.
Steps to Reproduce
- On Windows, launch the standalone Cursor app (Glass layout, not the IDE layout).
- Open a multi-folder session (more than one root folder — mine is three: two local repos plus one OneDrive-backed folder).
- Have the agent create a canvas; confirm it renders.
- Attempt Publish on that canvas — it reports “Canvas file not found”.
- Fully exit Cursor, then relaunch from the taskbar or Start Menu.
- Observe a new
...AppData-Local-Temp-<uuid>project key under%USERPROFILE%\.cursor\projects\, with the canvas from step 3 unreachable.
To confirm the phantom path: take the uuid from the live session’s project key and search %LOCALAPPDATA%\Temp for it. There is no matching file or directory, even while that session is running.
Expected Behavior
- A canvas I create should stay reachable and publishable in later sessions, regardless of how the workspace was opened.
- Publish should resolve the canvas file that is on disk and rendered — and if it genuinely cannot find it, report the path it attempted rather than a bare “Canvas file not found”.
- Canvases should be stored durably — keyed to the folder set, or in a user-visible location — not under a per-launch temporary path.
Operating System
Windows 10/11
Version Information
- Cursor 3.16.29 (also observed on 3.16.17)
- Layout: Glass — standalone app, not the IDE layout
- OS: Windows 11, build 26200
- Workspace shape: multi-root, three folders (two local repos plus one OneDrive-backed folder)
Additional Information
Workarounds attempted — all failed
- File → Open Workspace from File: does not exist in Glass. The File menu is New Agent, Open Folder (
glass.openWorkspace, Ctrl+O), New Terminal, New Browser, Open IDE, Exit. - Save a real
.code-workspaceand open it: no UI path to open a workspace file in Glass. - Pass the
.code-workspaceas a launch argument (Cursor.exe "path\to\my.code-workspace", set on the taskbar shortcut): argument silently ignored. Relaunch still minted a fresh temp key; the stable key was never used. - Copy the canvas into a stable project key manually: not picked up; the running session reads only its own temp key.
The only workaround that preserves a stable key is opening a single folder, which forfeits the multi-root layout entirely.
Impact
- Canvases cannot be shared, which is their main collaborative purpose. Publish is effectively unavailable to standalone multi-root users.
- Work is silently lost: analysis rendered into a canvas becomes unreachable after a restart, with no warning that its storage was ephemeral.
- Orphaned project directories accumulate with no cleanup (30 and counting on this machine).
- No user remedy, since the app exposes no workspace-identity control.
Suggested fixes
- Derive the project key from the folder set rather than a temp workspace path — e.g. a hash of the sorted absolute root paths, so an identical folder set resolves to the same key every launch.
- Normalize paths before registering canvases: canonicalize drive-letter case and separators so one file cannot produce multiple canvasIds.
- Make Publish resolve the on-disk file, and report the path it attempted when it fails.
- Store canvases durably / user-visibly, or add an explicit save/export action so work is not tied to session identity.
- Optionally honor a
.code-workspacelaunch argument in Glass (or add recent-workspaces), so a stable identity can be pinned. - Garbage-collect orphaned temp-keyed project directories, or migrate their contents when a matching folder set reappears.
Related observation while filing this report
Agent-driven browser automation runs in a browser session that is not the visible Glass Browser panel, so a composer filled by the agent is invisible to the user; only the auto-saved Discourse draft revealed it. Separately, opening such a draft from the drafts list showed the form-template fields empty, so the saved content was not recoverable through the composer.
Diagnostics came from %USERPROFILE%\.cursor\projects\, %APPDATA%\Cursor\logs\, and %APPDATA%\Cursor\User\globalStorage\storage.json. Paths and canvas names above are genericized — happy to supply fuller log excerpts privately.
Does this stop you from using Cursor
No - Cursor works, but with this issue