23 releases
| new 0.3.1 | Feb 8, 2026 |
|---|---|
| 0.3.0 | Feb 6, 2026 |
| 0.2.7 | Feb 6, 2026 |
| 0.2.1 | Jan 31, 2026 |
| 0.1.16 | Jan 29, 2026 |
#230 in Filesystem
1MB
6.5K
SLoC
nixy - Simple Declarative Nix Package Management
Why nixy?
I was frustrated with asdf and Homebrew while working, and tried to learn Nix several times—but the steep learning curve made me give up every time. What I really wanted was a simple asdf/Homebrew alternative that uses Nix's massive package repository and reproducibility under the hood.
So I built nixy—a simple Rust wrapper with profile support. It runs smoothly and I love it.
Reproducible Nix packages, simple commands. Install packages with a single command, sync them across all your machines.
nixy install ripgrep # That's it. Nix made simple.
nixy manages your Nix packages through a declarative nixy.json configuration file, ensuring the same packages and versions on every machine.
Prerequisites
nixy requires Nix. Install with:
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install
Quick Start
1. Install nixy
# Quick install (recommended)
curl -fsSL https://raw.githubusercontent.com/yusukeshib/nixy/main/install.sh | bash
# Or with cargo
cargo install nixy-rs
# Or with nix
nix profile install github:yusukeshib/nixy
2. Set up your shell
Add to .bashrc, .zshrc, etc.:
eval "$(nixy config zsh)"
For fish (~/.config/fish/config.fish):
nixy config fish | source
3. Start using
nixy install ripgrep # Install latest version
nixy install nodejs@20 # Install specific major version
nixy install python@3.11.5 # Install exact version
nixy list # See installed packages with versions
nixy search python # Find packages + available versions
nixy uninstall nodejs # Remove a package
nixy upgrade # Upgrade all within version constraints
nixy upgrade nodejs # Upgrade specific package
Commands
| Command | Description |
|---|---|
nixy install <pkg>[@version] |
Install a package with optional version (alias: add) |
nixy install <flake-ref> |
Install from a flake reference (e.g., github:user/repo) |
nixy install <pkg> --platform <platform> |
Install only for specific platform(s) |
nixy uninstall <pkg> |
Uninstall a package (alias: remove) |
nixy list |
List installed packages with versions (alias: ls) |
nixy search <query> |
Search for packages with version info |
nixy upgrade [pkg...] |
Upgrade packages within version constraints |
nixy sync |
Rebuild from flake.nix |
nixy profile |
List profiles + interactive TUI selection |
nixy profile <name> |
Switch to profile |
nixy profile <name> -c |
Create and switch to profile |
nixy profile <name> -d |
Delete profile (with confirmation) |
nixy file <pkg> |
Show path to package source file in Nix store |
nixy self-upgrade |
Upgrade nixy itself |
Version Specification
nixy supports flexible version constraints via Nixhub:
nixy install nodejs # Latest version
nixy install nodejs@20 # Latest 20.x.x (semver range)
nixy install nodejs@20.11 # Latest 20.11.x
nixy install nodejs@20.11.0 # Exact version
When you run nixy upgrade nodejs, it respects your version constraint:
nodejs(no version) → upgrades to absolute latestnodejs@20→ upgrades to latest 20.x.x
Platform-Specific Installation
Install packages only for specific platforms:
nixy install terminal-notifier --platform darwin # macOS only
nixy install linux-tool --platform linux # Linux only
nixy install specific --platform aarch64-darwin # Apple Silicon only
Valid platform names:
darwinormacos→ bothx86_64-darwinandaarch64-darwinlinux→ bothx86_64-linuxandaarch64-linux- Full names:
x86_64-darwin,aarch64-darwin,x86_64-linux,aarch64-linux
Platform-specific packages are shown with their restriction in nixy list:
terminal-notifier@2.0.0 (nixpkgs) [darwin]
Profiles
Maintain separate package sets for different contexts:
nixy profile work -c # Create and switch to new profile
nixy install slack terraform # Install work packages
nixy profile personal -c # Another profile
nixy install spotify # Different packages
nixy profile # Interactive profile selector
nixy profile work # Switch to existing profile
nixy profile old -d # Delete a profile (with confirmation)
All profiles are stored in ~/.config/nixy/nixy.json, with generated flakes in ~/.local/state/nixy/profiles/<name>/.
How nixy works
nixy is purely declarative - nixy.json is the source of truth, and flake.nix is regenerated from it on every operation.
┌─────────────────┐ ┌─────────────┐ ┌─────────────────────────────┐
│ nixy.json │ ──── │ flake.nix │ ──── │ ~/.local/state/nixy/env/bin │
│ (source of truth)│ generate │ (+ flake.lock)│ nix build │ (symlink to /nix/store) │
└─────────────────┘ └─────────────┘ └─────────────────────────────┘
│
▼
eval "$(nixy config zsh)" adds
this path to your $PATH
Unlike nix profile which maintains mutable state, nixy:
- Regenerates
flake.nixfromnixy.jsonon every operation - Runs
nix buildto create a combined environment in/nix/store - Creates a symlink at
~/.local/state/nixy/envpointing to that environment - Your shell config just adds
~/.local/state/nixy/env/binto$PATH
This means syncing is simple: copy nixy.json and your profile's flake.lock (e.g., ~/.local/state/nixy/profiles/<profile>/flake.lock) to another machine, run nixy sync, and you have the exact same environment.
FAQ
How do I find the right package name?
Use nixy search <keyword>.
Where are packages installed?
In /nix/store/. nixy creates a symlink at ~/.local/state/nixy/env pointing to your environment.
Can I edit flake.nix manually?
No, it's regenerated from nixy.json on every operation. Use flake references for custom packages (e.g., nixy install github:user/repo).
How does nixy differ from nix profile?
nixy adds reproducibility on top of Nix - your nixy.json + flake.lock can be synced and version controlled across machines.
How do I rollback?
Version control your nixy.json and flake.lock with git:
cd ~/.config/nixy
git checkout HEAD~1 -- nixy.json
nixy sync
Advanced
Directory structure
~/.config/nixy/
├── nixy.json # Source of truth (all profiles)
└── packages/ # Global custom package definitions
~/.local/state/nixy/
├── env # Symlink to active profile's build
└── profiles/
├── default/
│ ├── flake.nix # Generated (do not edit)
│ └── flake.lock # Nix lockfile
└── work/
└── ...
Custom package definitions
From GitHub flake (default package):
nixy install github:nix-community/neovim-nightly-overlay
From GitHub flake (specific package):
nixy install github:nix-community/neovim-nightly-overlay#neovim
From a local flake:
nixy install path:./my-flake
Files in packages/ directory are auto-discovered.
For existing Nix users
You can import nixy's package list into your own flake:
{
inputs.nixy-packages.url = "path:~/.local/state/nixy/profiles/default";
outputs = { self, nixpkgs, nixy-packages }: {
# nixy-packages.packages.<system>.default is a buildEnv with all packages
};
}
nixy and nix profile use separate paths and don't conflict.
Config locations
| Path | Description |
|---|---|
~/.config/nixy/nixy.json |
Configuration (all profiles) |
~/.config/nixy/packages/ |
Global custom package definitions |
~/.local/state/nixy/profiles/<name>/flake.nix |
Generated flake |
~/.local/state/nixy/profiles/<name>/flake.lock |
Nix lockfile |
~/.local/state/nixy/env |
Symlink to environment |
Environment variables: NIXY_CONFIG_DIR, NIXY_STATE_DIR, NIXY_ENV
License
MIT
Dependencies
~19–41MB
~600K SLoC