A TUI for managing Nix environments. Mica lets you search packages, apply presets, and keep a reproducible default.nix with minimal Nix ceremony.
Features
- Interactive TUI for package search and preset selection
- Generates a managed
default.nixand preserves edits outside# mica:markers - Pin management for nixpkgs
- Bundled presets plus user presets from configurable directories
- Cached SQLite index for fast search
Requirements
- Nix installed, with
nix-envandnix-prefetch-urlavailable - Optional: Rust toolchain for development from source
- Optional: direnv for project shells
Install
nix-env -f https://github.com/jpetrucciani/nix/archive/main.tar.gz -iA micaQuick Start (Project Mode)
- In a project directory without an existing managed
default.nix, runmica init - Launch the TUI with
mica tui - In the TUI, search packages, toggle selections, and press
Ctrl+Sto save
Targeting Examples (--file, --global)
mica --file ./default.nix listinspect a specific managed filemica --file ./default.nix diffcheck drift for that filemica --global listinspect your global profile statemica --global add ripgrepadd a package globallymica --global generations listinspect global generations
TUI Keys
Tabswitch focus between packages, presets, and changesTypesearch in the focused panel,Ctrl+Uclears search- Search shortcuts:
'exact,bin:,name:,desc:(for examplebin:rgor'name:ripgrep) EnterorSpacetoggle selectionScycle search mode (all,name,desc,bin)Ctrl+Ppackage info,Ctrl+Vversion pickerB/I/Vtoggle broken, insecure, and installed-only filtersL/Oedit license and platform filtersEedit environment variablesHedit shell hookTtoggle presets panel,Ctoggle changes panelDdiff preview, and inside diff viewTtoggles full vs changes-onlyKtoggle details panelUupdate nixpkgs pinRrebuild index,Yreload from nixCtrl+Ssave,Ctrl+Qquit,?help
CLI Examples
mica initinitialize a projectdefault.nixmica tuilaunch the TUImica add ripgrep fdadd packagesmica remove fdremove packagesmica search rg --mode binarysearch by binary namemica apply rustapply a presetmica unapply rustremove a presetmica --file ./default.nix listtarget a specific filemica --global listtarget global profile statemica diffshow drift between state anddefault.nixmica syncregeneratedefault.nixfrom statemica index rebuild /tmp/nixpkgs.jsonmica index rebuild-local ~/dev/jpetrucciani-nix --skip-attr home-manager --show-trace
Configuration
Config lives at ~/.config/mica/config.toml.
[nixpkgs]
default_url = "https://github.com/jpetrucciani/nix"
default_branch = "main"
[presets]
extra_dirs = ["~/my-presets"]
[index]
remote_url = "https://static.g7c.us/mica"
update_check_interval = 24
[tui]
show_details = trueFor index.remote_url, mica tries <remote>/<nixpkgs_commit>.db.
You can also override the repo for mica init with --repo or MICA_NIXPKGS_REPO.
Files and State
- Project state is embedded in
default.nix - Global profile state uses
~/.config/mica/profile.tomland~/.config/mica/profile.nix - Package index cache is stored at
~/.config/mica/cache/index.db
Presets
Mica ships with bundled presets in presets/ and can load extra preset directories via presets.extra_dirs.
Advanced
- Extra pin workflows are available via
mica pin --help.
Development
direnv exec . cargo run -p mica -- tuidirenv exec . cargo fmtdirenv exec . cargo clippy --all --benches --tests --examples --all-features -- -D warnings -W clippy::collapsible_else_if
Docs (VitePress + bun)
bun installbun run docs:devbun run docs:build