Self-Updating Cursor Flake
A Nix flake that provides the Cursor code editor with automatic daily updates via CI (GitHub Actions-compatible workflows, e.g. GitHub Actions or Gitea Actions).
This fork includes native aarch64-linux (linux-arm64) support in addition to x86_64-linux.
Features
- 🚀 Self-updating: Automatically checks for new Cursor versions daily
- 🔧 Manual updates: Local script for immediate updates
- 🛡️ Robust: Proper error handling and fallbacks
- 📦 AppImage-based: Uses Cursor's official AppImage for maximum compatibility
- 🎯 Linux x86_64 + aarch64: Supports both AMD64 and ARM64 (aarch64) Linux
Quick Start
Method 1: Direct Installation
# Install Cursor directly
nix profile install git+https://git.chiasson.cloud/Olivier/cursor-nixos-flake
# Run Cursor
cursor --version
Method 2: Add to Your Flake
Add to your flake.nix inputs:
inputs.cursor.url = "git+https://git.chiasson.cloud/Olivier/cursor-nixos-flake";
Then use in your configuration:
# For NixOS system configuration
environment.systemPackages = with pkgs; [
cursor.packages.${pkgs.system}.cursor
];
# For home-manager
home.packages = with pkgs; [
cursor.packages.${pkgs.system}.cursor
];
# For devShell
devShells.default = pkgs.mkShell {
packages = with pkgs; [
cursor.packages.${pkgs.system}.cursor
];
};
Method 3: Temporary Run
# Run without installing
nix run git+https://git.chiasson.cloud/Olivier/cursor-nixos-flake
# Build and run
nix build git+https://git.chiasson.cloud/Olivier/cursor-nixos-flake
./result/bin/cursor
Manual Update
To manually update Cursor to the latest version:
./update-cursor.sh
To update to a specific version:
./update-cursor.sh 1.8.0
How It Works
Automatic Updates
The CI workflow in .github/workflows/update-cursor.yml runs daily and:
- Checks Cursor's API for the latest version
- Only updates if a new version is available
- Downloads the AppImage and calculates SHA256 hash
- Updates
cursor-release.nixwith the new version and per-architecture hashes (x86_64-linux+aarch64-linux) - Tests the build and commits changes
- Pushes the update back to the repository
Manual Updates
The update-cursor.sh script provides:
- Version checking and comparison
- Safe updates with backups
- Build validation
- Interactive confirmation prompts
API Endpoints
- x86_64 AppImage Download:
https://api2.cursor.sh/updates/download/golden/linux-x64/cursor/{version} - aarch64 AppImage Download:
https://api2.cursor.sh/updates/download/golden/linux-arm64/cursor/{version}
Version pointers / "channels"
Cursor exposes a few redirect-style pointers that may not always move in lockstep:
.../cursor/latest: “promoted” latest build for that channel. This can lag a new release during phased rollout / promotion..../cursor/{major.minor}(e.g..../cursor/2.2): latest patch within that major.minor line. This can point to a newer build earlier thanlatest.
Concrete example (this has happened in practice):
.../cursor/latestredirects toCursor-2.2.43-...AppImage.../cursor/2.2redirects toCursor-2.2.44-...AppImage
In that situation, latest is behind. This flake’s updater checks both and will choose 2.2.44.
This flake’s update-cursor.sh default (auto) strategy:
- Checks multiple pointers:
latest, the current installed major.minor (e.g.2.2), and (if different)latest’s own major.minor (e.g.2.3). - Picks the highest semver: so it won’t stick to an old minor, but it also won’t miss patch releases when
latestlags.
Testing
# Test flake syntax
nix flake check
# Test building
nix build '.#cursor' --dry-run
Development
Customization
- Update frequency: Modify cron schedule in
.github/workflows/update-cursor.yml - API endpoints: Update URLs in workflow and update script
- Build options: Modify the
buildCursorfunction inflake.nix
License
MIT License - see LICENSE file for details.