A new community made Cursor NixOS Package, RC1 Out Now

Hi all, I’ve been working on a native NixOS package for Cursor that includes an automated update system. It’s now in Release Candidate testing (v2.1.20-rc1) and I’d love to get feedback from the community before the stable release.

There are lots of challenges to this project idea, to say the least. If you remember, this is not the first attempt someone has made at making a Cursor IDE flake/nix pkg (no shade, burnout happens). I will outline my plan to keep the project going indefinitely, despite the many technical hurdles present in Cursor and the underlying editor. Chances are, if you are using NixOS, you are technical enough to want to know the details, so strap in, you don’t get a tl;dr.

The biggest issue to solve for is the built in updater, which has actually gotten easier (in my opinion) to solve for after the team stopped using the VS Code style of update (take all of this with some salt, as I am not a vs code or cursor contributor, and only kind of know what I am talking about). Currently, the regular appimage does still break, as it is stored in the readonly /nix/store. The second biggest issue (for me) was the lack of gpu acceleration. In its appimage form, as of writing, it does not include gpu acceleration libraries. So, if you are running cursor on some random nutjob of a dev’s system that has 6 monitors, 2 gpus that are from different vendors, but technically all the hardware is barely compatible (like my setup might be), then cursor can really start to chug and break. I also saw that there have been keybinding issues (think it was in the old thread, but idk), so that is likely an issue too.

So, now that we know what is wrong, here is how I have done my best to fix it:

First off, the update system. Since Cursor can’t update itself on NixOS, I built something that works with the grain instead of against it. The package now ships with a systemd user timer that checks Cursor’s official API daily for new versions. When an update is available, you get a nice desktop notification telling you about it. But here’s the actually cool part: there’s a command called cursor-update that does the entire update workflow for you. It auto-detects where your flake lives (or you can tell it if you’re doing something weird), runs nix flake update nixos-cursor, rebuilds your Home Manager or NixOS configuration, and then tells you what version you just upgraded to. The whole thing takes maybe 30 seconds and requires zero manual intervention beyond typing the command. If you’re a purist and want to do it the traditional Nix way (cd to your flake, update, rebuild), that still works perfect too.

The technical implementation here is actually pretty straightforward, which is why I think it’ll hold up long term. The check-update script just queries Cursor’s download API endpoint, parses the version from the JSON response, compares it to what you have installed, and bails out if they match. The update script is a bash wrapper that handles the Nix rebuild dance. Nothing fancy, nothing that’s going to break when Cursor changes their internal architecture for the third time this year. The built-in updater itself is disabled with a simple --update=false flag passed to the wrapper, so you don’t get confusing error messages about updates failing.

For the GPU acceleration issues, the fix was actually simpler than I expected once I figured out what was missing. The AppImage doesn’t include libGL or libxkbfile, which means no hardware acceleration and no proper keyboard mapping on Wayland. The NixOS package uses autoPatchelfHook to patch the binary’s ELF headers to point at NixOS’s libraries directly. This means the package gets access to your system’s libGL (for GPU acceleration), libxkbfile (for keyboard mapping), and all the other libraries it needs to actually run properly on modern Linux systems. I also added all the Wayland flags and GPU optimization flags to the wrapper, so if you’re running on modern Wayland like a civilized person in 2025, you get window decorations, hardware video decoding, zero-copy rendering, and all that good stuff. If you’re still on X11, it works there too, but I am judging you a bit.

The keyboard mapping thing was particularly annoying to track down. Turns out the native-keymap module in Electron needs libxkbfile to function properly, and without it you get all sorts of weird behavior with key bindings. Once I added that library to the build inputs and patched it in, keyboard shortcuts started working consistently. If you’ve been using Cursor on NixOS and noticed weird keyboard behavior, this should fix it.
Now, there’s also MCP server integration, which I realize is probably niche but it’s in there if you want it. Model Context Protocol is this framework for hooking up AI assistants to various tools and data sources. The package includes a Home Manager module that lets you declaratively configure filesystem access, GitHub integration, NixOS package search, memory/knowledge persistence, and browser automation via Playwright. You can enable them all with a single mcp.enable = true in your config, or pick and choose which ones you want. I’m not going to lie, the setup is a bit manual right now (you need Node.js for some of them, uvx for the NixOS one, etc.), but once they’re running they’re pretty useful if you’re doing the whole AI-assisted development thing.

If you want to try this out right now without committing to anything, you can run nix run github:Distracted-E421/nixos-cursor/v2.1.20-rc1#cursor and it’ll download and launch Cursor with zero installation required. This is genuinely the best way to test it because if something’s broken, you just close it and nothing on your system has changed. If you like it and want to actually install it, there’s a Home Manager module that handles everything. You add the flake input, import the module, set programs.cursor.enable = true, rebuild, and you’re done. The update checker and systemd timer get set up automatically, so you’ll start getting notifications when new versions drop.

Here’s what I actually need from the community though, because this is where the RC testing part comes in. I’ve tested this on my own system (x86_64, dual GPU nightmare setup as mentioned earlier), and it works great. But I need people to test on normal systems too. Does it build? Does it run? Do keyboard shortcuts work? Does GPU acceleration actually kick in? Does the update notification system function correctly? I’m especially looking for anyone on ARM64 (Apple Silicon Macs running NixOS via UTM or Asahi, ARM64 servers, whatever). The package builds for ARM64 in CI and the derivation evaluates fine, but I literally cannot test it because I don’t have the hardware. If you’re on ARM64 and this doesn’t work, I need to know about it before calling this stable.

The other thing I’m trying to gauge is whether the MCP integration is useful to anyone besides me. It’s there, it’s documented, it works, but if nobody’s using it then maybe it doesn’t need to be in the default module. Or maybe people want it but the setup is too annoying and I should automate more of it. I genuinely don’t know yet.

In terms of keeping this project going long-term, I’ve tried to make everything as maintainable as possible. The update checker uses Cursor’s official API, so as long as they don’t completely restructure their release system, it should keep working. The binary patching uses nixpkgs’ standard autoPatchelfHook, which is battle-tested and used by tons of other packages. The Home Manager module follows all the standard patterns, so it should be easy for other people to understand and contribute to if they want. And critically, the update system means users can get new Cursor versions without waiting for me to manually update the package every single time. The hash update script still needs to be run when new versions come out, but that’s a 30-second operation, not a “rebuild the entire packaging from scratch” situation.

The goal here is to make this something that can get upstreamed to nixpkgs eventually, or at minimum become the de facto way NixOS users install Cursor. But I need to know it actually works for people first, hence the RC period. So if you’re on NixOS and use Cursor, please give this a shot and let me know what breaks. Bug reports welcome, feature requests welcome, pull requests extremely welcome. The repository is at GitHub - Distracted-E421/nixos-cursor: A modern, flexible implementation of a more Nix native Cursor IDE experience and there’s a full testing guide in TESTING_RC.md that walks through everything you should check.

An update: I have just found out that the 2.1.x version is depreciating custom agents. It is my top priority today to a, get a stable version of the 2.0 on its own flake (same for the last/best stable version pre 2.0), and then b, to implement some kind of alternative for custom modes, as commands are just not gonna cut it for me, and I refuse to have my workflow dictated on a whim.

Ok, after a bit of bug fixing, I now have the first stable version of the nixos-cursor implementation. All the documentation on how to implement it in the way you use for your set up is up to date, and we now have support for 37 historical versions of cursor, and I do plan to add support for all available versions that I can get a proper s3 link and hash, so that redeployment is reliable. You can also launch multiple version concurrently, and the ‘cursor-manager‘ also lets you configure your auth/doc data sync between sessions and versions, as well as your editor settings and data. The last major inclusion that I can think of is I have implemented caching using cachix (you will be prompted, its only storing compressed binaries of open-source/public code, so no weirdness) , which will hopefully provide some more QoL support NixOS users deserve. If there are specific issues you notice, please let me know in some form, and I’ll work on patching it. I so also have a roadmap for other features: GitHub - Distracted-E421/nixos-cursor: A modern, flexible implementation of a more Nix native Cursor IDE experience

Back again, with more updates to the whole setup. For those of you who are not interested in the version manager/studio, don’t worry, you can just pick a version to default to in the config or ui, and only use the ‘cursor‘ command to launch it, and i am working on allowing for various stripped down versions (cli and/or tui on the road map), as this whole project is likely not for everyone.

Now, for everyone that is interested in all the other stuff I am building, here is the short list, the rest is on the GitHub - Distracted-E421/nixos-cursor at pre-release ReadME.

  • Converted most scripts to my preferred (better/faster than regular bash) languages
  • Modified manager to be more vs code like, without being on electron, instead running on rust/egui.
  • Created a parser for your installed vs ode themes, so your cursor studio window can match (still in early stages, not all patterns are accounted for, feel free to open an issue with feedback or submit a pr)
  • More Versions Available! (labeled wrong, will be fixed before release)
  • Linux ARM Support for those who use that as their main workstation………who are you tho??? I have know what that is like
  • Darwin (MacOS) support is going to be in version 0.2.0 (the next one), but is in beta and will require feedback and help from those using nix on mac. Since I don’t own a mac and have no intention of ever buying one, baring one falling into my lap for free, I cannot fix Darwin specific/on reproducible on the hardware issues.
  • Created a chat library/manager, with the ability to import, render, bookmark, favorite, and eventually more with all your raw chat data (as much as I have been able to get thus far. Should allow for better past chat context management at a glance.
  • Full text search of individual or all chats (will work on more filtering options and data manipulation methods)
  • Bookmarks and Favorites are built to survive and work with the re-import feature, so don’t worry about data loss. Eventually, we will have a multi database backup system to keep the data clean, and easy to work with. Be sure if there are things that are missing to use the refresh all button in settings (eventually a less manual/jank solution will be had)
  • Made studio/manager window persistent (though not necessary for cursor to continue running)
  • Export and cross device sync (sync all button) is in the works (NOT functional currently) and a priority for me, as I move from machine to machine. The solution will be designed to be self-hosted but reliable.
  • Framework to use local system resources (vram, storage, cpu threads, ram), not currently implemented but soon. IDK how well I can translate that to arm and mac support, but we will cross that bridge when we get there.
  • The beginning of an npm supply chain safety system above the permission level of cursor (also isolated), blocking the download of highly suspect or flagged cve’s for repos/pkgs. This is not the finally version, and npm/java script is not a language/pm I use much (out of avoidance), so if you notice mistakes or have ideas/advice, please let me know. You can disable this, however, please research your mcp server supply chain, its rough out here.
  • Home Manager options for most things, working on ensuring I bind the gui to also change them so that newbies can spend less time trying to modify the details and enjoy the benefits of home manager/ flakes
  • All previous “beta“ features carried forward :wink:

v0.2.0 is now on main in a stable release. Sorry for having v0.1.2 up for so long, has some major issues and was still really a prototype. Thanks to anyone using the project, hopefully main line releases should be more stable going forward, especially with the changes under the hood and the improved gui. I have a tui in the pipe for those who want a more claude code like experience, as well as expanded cli options and support for those uninterested in the overhead of the main gui version.

After a bit over a month, I am back (no, I am not giving up, not yet at least), and we have a new version v0.3.1! As always, you can find the latest full release in main or the release tab Release cursor-studio v0.3.1 - Maintenance Release · Distracted-E421/nixos-cursor · GitHub and we have home manager, flake, and other options for your config. The biggest thing (aside from some stability fixes and cursor EOLing 1.6.x versions -_-) is a new system that was inspired by Claude Coworker’s demo. While it is beyond even my delusional ass to try to modify things to actually get inline stuff in vscode/cursor (i despise electron, js, the dom, all of it), what we have already proven/done with the studio app seems to indicate that yall are ok with/like/tolerate the external gui to help things (plus the cli of course). In addition now, I have set up a system that allows the dev to provide feedback to the ai in a less token intensive/less disruptive method. The system works as a tool call, though not an mcp server. While I certainly make use of them, I believe the protocol is inherently flawed, slow, and has a hyper vulnerable supply chain that is under bombardment at the moment.

Instead, it is a rules file that can be toggled on/off for a workspace. This rules files instructs the agent how and when to use the Interactive Dialog System (IDS) (not very catchy, but functional). The IDS is a flexible daemon that allows the agent to generate blocking queries for the user to respond to, without the need to send a new message/stop and derail the chat. The goal is to further increase agent uptime per request, will also improving agent precision, accuracy, and versatility. The agent currently has the ability to prompt the user for multiple choice questions, select multiple options, slider of preset options, and t/f or confirmation. It can also push non-blocking toast notifications, that can be kept in the sidebar of the persistent window. No matter which question pattern the ai uses, it always has a comments form, so you can provide additional on the fly feedback when needed/wanted. It also has a timer, that release the tool call as failed/not respond to, allowing you to do the full hands off vibe coding if you want. At the same time, the timer has a pause button, which allows the tool call to hang (theoretically) indefinitely (dependent on how long cursor keeps the connection alive, best guess is between 15 and 30 minutes reliably from my experience, sometimes if its a lightly used instance that is particularly stable on a good day up to an hour), giving the perfectionist the time to write a novel in each comment of every dialog. Now, keep in mind, the pause button is state retentive, meaning if you left it paused when you answered, the next time it pops up, it will be paused automatically, and the same in reverse if you leave it unpaused. I am planning on implementing more granular and specific controls for how it behaves, as well as other things/features for the IDS as a whole, so please let me know if an issue, pr, or the thread what you want to see, here or elsewhere in the app.

As always, any additional features are optional, not mandatory. If you just want it as Cursor ships it, that will always work, and if it does not, it’s not intended behavior from the app on my end.

For those wondering if I will have an update to nixos-cursor after the breaking changes form 2.4.xx, I will, it is probably gonna take a minute though. You can read why here: Cursor Team needs to understand Userspace -_-