Great that it worked on a clean VM, that narrows things down a lot. If a fresh install works, then it’s not really about glibc or the distro. It’s either your user config and cache, or a specific workspace. Let’s check both.
About “window”: each Cursor window is one editor instance with one folder or workspace open. When you start it from the terminal or launcher, it usually opens one window, but Cursor restores the previous session, so the logs showed two window folders. If it crashes on every launch even with one window and a simple “hi”, that points to local state, not the number of windows.
Config and cache paths on Linux:
~/.config/Cursor/ main app data:
Cache, Code Cache, GPUCache
User/globalStorage global state
User/workspaceStorage/<hash> state for each workspace
logs
~/.cursor/ extensions and CLI
How to test with a clean config, fastest way to reproduce the fresh VM effect:
mv ~/.config/Cursor ~/.config/Cursor.bak
mv ~/.cursor ~/.cursor.bak
Then start 3.9.16. If it works, the issue is definitely in the old config or cache. Note this will log you out and reset local UI state and chat history, so rename to .bak instead of deleting so you can restore it.
About the monorepo, yeah, it’s a real suspect. A big nested monorepo can slow down extension host activation due to file scanning and watching, and the provider might not register before the timeout. Test it like this: in 3.9.16 open a small or empty folder, not the monorepo. If it works instantly there but hangs on the monorepo, the cause is that workspace. You can then delete only its entry in ~/.config/Cursor/User/workspaceStorage/. You can find the right <hash> by running grep for your project path in the workspace.json inside those folders.
Let me know what fixed it, the config reset or switching the workspace. That’ll make it clear what to dig into next.
Also for the future, if the problem comes back after resetting config, check folder permissions. On Linux, ~/.config/Cursor sometimes ends up owned by root after running sudo, and then Cursor can’t write its state. Fix:
sudo chown -R $USER:$USER ~/.config/Cursor