Font rendering, font rendering

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

Font rendering is a mess after the last update.

In the uploaded screenshot left side is how it looks now in Cursor, right side how it looks in Sublime Editor and how it used to look in Cursor as well. Also note that editor.fontSize is no longer working (completely ignored), that is why window.zoomLevel is set to 1.

Any extra details upon request, no idea what other details should I provide.

Steps to Reproduce

Font anti-aliasing is disabled system wide via ~/.config/fontconfig/fonts.conf. Monospaced font set in Cursor to “Terminus (TTF) for Windows”.

Expected Behavior

Font should be crisp and rendered in single pixel lines.

Screenshots / Screen Recordings

Operating System

Linux

Current Cursor Version (Menu → About Cursor → Copy)

2.1.26 (f628a4761be40b8869ca61a6189cafd14756dff0, x64)

Does this stop you from using Cursor

Yes - Cursor is unusable

Hey, thanks for the report. It looks like this issue affects font rendering on Linux when custom fontconfig settings are used.

To help investigate, could you share:

  1. Your ~/.config/fontconfig/fonts.conf configuration
  2. Whether the issue occurs with a default font like “Fira Code” or “JetBrains Mono”
  3. Any Electron/Chrome flags you have set in Cursor settings

In the meantime, you can try:

  1. Adding "editor.fontLigatures": false to your settings
  2. Launching Cursor with:
    cursor --disable-font-subpixel-positioning
    (to check if this is related to a change in the font rendering engine)

I’ll pass this on to the team, as it looks like a regression affecting Linux users with disabled font anti-aliasing.

  1. Here is my fonts.conf:
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
<fontconfig>
 <match target="font">
  <edit mode="assign" name="rgba">
   <const>none</const>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="hinting">
   <bool>true</bool>
  </edit>
 </match>
 <match target="font">
  <edit mode="assign" name="hintstyle">
   <const>hintslight</const>
  </edit>
 </match>
 <dir>~/.local/share/fonts</dir>
 <match target="font">
  <edit mode="assign" name="antialias">
   <bool>false</bool>
  </edit>
 </match>
</fontconfig>
  1. Tried “Fira Code” and “JetBrains Mono”, both are being rendered ugly, but I think they are not hinted, so they will look bad with antialiasing disabled regardless.

  2. No Electron/Chrome flags set.

“editor.fontLigatures” is already set on false, it’s visible in my OP screenshot.
Running “cursor --disable-font-subpixel-positioning” has no effect.

Today I got another update on cursor and things got worse: looks like “editor.fontFamily” and “editor.fontSize” are being totally ignored now. No matter how I change them nothing happens, even after restarting Cursor.

Thanks for the detailed response. The fact that editor.fontFamily and editor.fontSize are now being completely ignored suggests this has escalated beyond just a rendering issue.

To help investigate, could you please share:

  • Linux distribution and version (e.g., Ubuntu 24.04, Arch, Fedora 40)
  • Desktop environment (GNOME, KDE Plasma, XFCE, etc.)
  • Cursor installation method (deb, AppImage, etc.)

Could you try the following diagnostic steps:

  • Check for errors: Open Help > Toggle Developer Tools > Console tab and share any red errors you see
  • Test with clean settings: Temporarily rename ~/.config/Cursor/User/settings.json and restart Cursor to see if the issue persists

The combination of the font rendering issue and settings being ignored indicates something more fundamental broke in the recent updates for your Linux configuration.

Hi Dean,

I’m running Arch Linux, up-to-date (that is, updated daily), with latest KDE Plasma 6.5.3.

Cursor is being installed with Yay manager, which is using the deb package published on your site, URL from the AUR git repo, pointing at your latest production commit, bellow:

https://downloads.cursor.com/production/60d42bed27e5775c43ec0428d8c653c49e58e26a/linux/x64/deb/amd64/deb/cursor_2.1.39_amd64.deb

Bellow is the content of DevTools Console right after a fresh start. Running Cursor after deleting settings.json has no effect on the font issue.

======================================== warnings (yellow background) ====================================================== 
VM4 sandbox_bundle:2 Electron Security Warning (enableBlinkFeatures) This renderer process has additional "enableBlinkFeatures"
  enabled. This exposes users of this app to some security risk. If you do not
  need this feature, you should disable it.

For more information and help, consult
https://electronjs.org/docs/tutorial/security.
This warning will not show up
once the app is packaged.
(anonymous) @ VM4 sandbox_bundle:2
workbench.desktop.main.js:542 This document requires 'TrustedScript' assignment.
(anonymous) @ workbench.desktop.main.js:542
workbench.desktop.main.js:542 The JavaScript Function constructor does not accept TrustedString arguments. See https://github.com/w3c/webappsec-trusted-types/wiki/Trusted-Types-for-function-constructor for more information.
workbench.desktop.main.js:55  WARN Missing property "rpcFileLoggerFolder" in oldValue. Filling with value from initValue. Please add a migration if necessary.
warn @ workbench.desktop.main.js:55
workbench.desktop.main.js:55  WARN Via 'product.json#extensionEnabledApiProposals' extension 'ms-toolsai.datawrangler' wants API proposal 'debugFocus' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.
warn @ workbench.desktop.main.js:55
workbench.desktop.main.js:55  WARN Via 'product.json#extensionEnabledApiProposals' extension 'ms-vscode.vscode-copilot-data-analysis' wants API proposal 'chatVariableResolver' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.
warn @ workbench.desktop.main.js:55
workbench.desktop.main.js:55  WARN Via 'product.json#extensionEnabledApiProposals' extension 'ms-python.python' wants API proposal 'terminalShellType' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.
warn @ workbench.desktop.main.js:55
workbench.desktop.main.js:55  WARN Via 'product.json#extensionEnabledApiProposals' extension 'ms-python.vscode-python-envs' wants API proposal 'terminalShellType' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.
warn @ workbench.desktop.main.js:55
workbench.desktop.main.js:55  WARN Via 'product.json#extensionEnabledApiProposals' extension 'github.copilot-chat' wants API proposal 'chatReadonlyPromptReference' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.
warn @ workbench.desktop.main.js:55
workbench.desktop.main.js:55  WARN Via 'product.json#extensionEnabledApiProposals' extension 'ms-azuretools.vscode-azure-github-copilot' wants API proposal 'lmTools' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.
warn @ workbench.desktop.main.js:55
workbench.desktop.main.js:55  WARN Via 'product.json#extensionEnabledApiProposals' extension 'vscjava.vscode-java-pack' wants API proposal 'lmTools' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.
warn @ workbench.desktop.main.js:55
workbench.desktop.main.js:55  WARN Via 'product.json#extensionEnabledApiProposals' extension 'apidev.azure-api-center' wants API proposal 'chatParticipant' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.
warn @ workbench.desktop.main.js:55
workbench.desktop.main.js:55  WARN Via 'product.json#extensionEnabledApiProposals' extension 'apidev.azure-api-center' wants API proposal 'languageModels' but that proposal DOES NOT EXIST. Likely, the proposal has been finalized (check 'vscode.d.ts') or was abandoned.
warn @ workbench.desktop.main.js:55

======================================== starting from here just errors (red background) =================================================
workbench.desktop.main.js:55   ERR [Extension Host] (node:23858) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `exe --trace-deprecation ...` to show where the warning was created)
error @ workbench.desktop.main.js:55
workbench.desktop.main.js:6299 [Extension Host] (node:23858) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `exe --trace-deprecation ...` to show where the warning was created)
vXh @ workbench.desktop.main.js:6299
workbench.desktop.main.js:7205 Failed to get git telemetry attributes: Error: Unable to parse repository URL: limsabc
getGitAttributes @ workbench.desktop.main.js:7205
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720) Object
error @ workbench.desktop.main.js:6995
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720) Object
error @ workbench.desktop.main.js:6995
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [deadline_exceeded] the operation timed out
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.checkNumberConfig (workbench.desktop.main.js:565:74406)
    at async workbench.desktop.main.js:7025:6196
    at async n (workbench.desktop.main.js:7025:5955)
    at async aoo.maybeRefreshConfigInner (workbench.desktop.main.js:7025:6179)
    at async aoo.getLatestConfig (workbench.desktop.main.js:7025:5568) Object
error @ workbench.desktop.main.js:6995
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getTeamAdminSettings (workbench.desktop.main.js:565:74406)
    at async LMl (workbench.desktop.main.js:588:3704)
    at async olh (workbench.desktop.main.js:588:4234) Object
error @ workbench.desktop.main.js:6995
workbench.desktop.main.js:588 Failed to fetch team admin settings: ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getTeamAdminSettings (workbench.desktop.main.js:565:74406)
    at async LMl (workbench.desktop.main.js:588:3704)
    at async olh (workbench.desktop.main.js:588:4234)
LMl @ workbench.desktop.main.js:588
workbench.desktop.main.js:588 [AutorunSettings] Failed to fetch admin settings (network error, no cache available): Object
olh @ workbench.desktop.main.js:588
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getTeamRepos (workbench.desktop.main.js:565:74406)
    at async h0o.pollRepoBlocklist (workbench.desktop.main.js:8905:1984) Object
error @ workbench.desktop.main.js:6995
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720) Object
error @ workbench.desktop.main.js:6995
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720) Object
error @ workbench.desktop.main.js:6995
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getTeamAdminSettings (workbench.desktop.main.js:565:74406)
    at async XYn.refresh (workbench.desktop.main.js:542:306860) {arch: 'x64', platform: 'linux', channel: 'stable', client_version: '2.1.39', service: 'aiserver.v1.DashboardService', …}
error @ workbench.desktop.main.js:6995
t @ workbench.desktop.main.js:6331
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720) {arch: 'x64', platform: 'linux', channel: 'stable', client_version: '2.1.39', service: 'aiserver.v1.BackgroundComposerService', …}
error @ workbench.desktop.main.js:6995
t @ workbench.desktop.main.js:6331
await in t
(anonymous) @ workbench.desktop.main.js:6331
Wrr @ workbench.desktop.main.js:52
s$ @ workbench.desktop.main.js:52
unary @ workbench.desktop.main.js:6331
unary @ workbench.desktop.main.js:565
await in unary
(anonymous) @ workbench.desktop.main.js:565
vct.initialRetryTimeMs @ workbench.desktop.main.js:8991
vct @ workbench.desktop.main.js:565
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720) {arch: 'x64', platform: 'linux', channel: 'stable', client_version: '2.1.39', service: 'aiserver.v1.BackgroundComposerService', …}
error @ workbench.desktop.main.js:6995
t @ workbench.desktop.main.js:6331
await in t
(anonymous) @ workbench.desktop.main.js:6331
Wrr @ workbench.desktop.main.js:52
s$ @ workbench.desktop.main.js:52
unary @ workbench.desktop.main.js:6331
unary @ workbench.desktop.main.js:565
await in unary
(anonymous) @ workbench.desktop.main.js:565
vct.initialRetryTimeMs @ workbench.desktop.main.js:8991
vct @ workbench.desktop.main.js:565
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getTeamAdminSettings (workbench.desktop.main.js:565:74406)
    at async XYn.refresh (workbench.desktop.main.js:542:306860)
    at async XYn.getLatest (workbench.desktop.main.js:542:307019)
    at async soo.setDefaultModel (workbench.desktop.main.js:6996:7001)
    at async soo.refreshDefaultModels (workbench.desktop.main.js:6996:6507) {arch: 'x64', platform: 'linux', channel: 'stable', client_version: '2.1.39', service: 'aiserver.v1.DashboardService', …}
error @ workbench.desktop.main.js:6995
t @ workbench.desktop.main.js:6331
await in t
(anonymous) @ workbench.desktop.main.js:6331
Wrr @ workbench.desktop.main.js:52
s$ @ workbench.desktop.main.js:52
unary @ workbench.desktop.main.js:6331
(anonymous) @ workbench.desktop.main.js:565
refresh @ workbench.desktop.main.js:542
await in refresh
getLatest @ workbench.desktop.main.js:542
setDefaultModel @ workbench.desktop.main.js:6996
refreshDefaultModels @ workbench.desktop.main.js:6996
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720) {arch: 'x64', platform: 'linux', channel: 'stable', client_version: '2.1.39', service: 'aiserver.v1.BackgroundComposerService', …}
error @ workbench.desktop.main.js:6995
t @ workbench.desktop.main.js:6331
await in t
(anonymous) @ workbench.desktop.main.js:6331
Wrr @ workbench.desktop.main.js:52
s$ @ workbench.desktop.main.js:52
unary @ workbench.desktop.main.js:6331
unary @ workbench.desktop.main.js:565
await in unary
(anonymous) @ workbench.desktop.main.js:565
vct.initialRetryTimeMs @ workbench.desktop.main.js:8991
vct @ workbench.desktop.main.js:565
workbench.desktop.main.js:8991 [hasGithubAccess] unexpected error checking GitHub access:  ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720)
hasGithubAccess @ workbench.desktop.main.js:8991
workbench.desktop.main.js:6995 [transport] Connect error in unary AI connect ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720) {arch: 'x64', platform: 'linux', channel: 'stable', client_version: '2.1.39', service: 'aiserver.v1.BackgroundComposerService', …}
error @ workbench.desktop.main.js:6995
t @ workbench.desktop.main.js:6331
await in t
(anonymous) @ workbench.desktop.main.js:6331
Wrr @ workbench.desktop.main.js:52
s$ @ workbench.desktop.main.js:52
unary @ workbench.desktop.main.js:6331
unary @ workbench.desktop.main.js:565
await in unary
(anonymous) @ workbench.desktop.main.js:565
vct.initialRetryTimeMs @ workbench.desktop.main.js:8991
vct @ workbench.desktop.main.js:565
workbench.desktop.main.js:8991 [hasGithubAccess] unexpected error checking GitHub access:  ConnectError: [invalid_argument] Error
    at t (workbench.desktop.main.js:6331:410245)
    at async Object.getGithubAccessTokenForRepos (workbench.desktop.main.js:565:74406)
    at async vct (workbench.desktop.main.js:565:68650)
    at async fTo.hasGithubAccess (workbench.desktop.main.js:8991:24215)
    at async n (workbench.desktop.main.js:7139:60469)
    at async Promise.all (index 2)
    at async cao.initializeBackgroundComposerState (workbench.desktop.main.js:7139:60720)
hasGithubAccess @ workbench.desktop.main.js:8991

Best,
Mircea.

Hi Dean,

Any news on this? I seldom use Cursor lately because of the font rendering issue. This is getting critical.

Thanks,
Mircea.