Photo by 五玄土 ORIENTO on Unsplash
A unified runtime and package manager.
Consolidate your version managers into a single binary.
I built copper to solve two specific problems in my own workflow:
- Tool Fatigue: I loved using
fnmfor Node, but I didn't want to install and configure a separate version manager for every language (Go, Python, Zig, etc). copper brings that "auto-switch oncd" experience to all your runtimes. - Update Lag: General package managers like Homebrew are excellent, but they often lag behind on fast-moving binaries like Zig. copper fetches packages directly from the source or official mirrors, so you get updates the moment they are released.
With copper, I was able to remove fnm entirely and stop using brew for language runtimes. It effectively functions as a universal package manager for your dev tools.
Copper supports both language runtimes and standalone tools.
| Package | Description |
|---|---|
| node | JavaScript runtime (supports .nvmrc) |
| go | The Go programming language (supports go.mod and .go-version) |
| python | Python language runtime (supports .python-version) |
| rust | Systems programming language |
| zig | General-purpose programming language |
| bun | Fast all-in-one JavaScript runtime |
| cyber | Fast, efficient scripting language |
| Package | Description | Package | Description |
|---|---|---|---|
| neovim | Vim-based text editor | lazygit | Terminal UI for git |
| helix | Modal editor inspired by Kakoune & Vim (built in Rust) | tree-sitter | Incremental parsing system & CLI |
| ripgrep | Blazing-fast line-oriented search tool | fd | Simple, fast alternative to find |
| fzf | Interactive command-line fuzzy finder | zoxide | Smarter cd that learns your habits |
| opencode | The open source coding agent. | just | Modern command runner (Makefile alt) |
| btop | Beautiful resource monitor | dufs | Fast static file server |
| git | The stupid content tracker | jj | Git-compatible VCS with modern workflow |
View all supported tools
To install the binary automatically:
curl -fsSL https://raw.githubusercontent.com/logotip4ik/copper/master/install.sh | bashPrefer not to pipe curl to bash? You can download the binary manually from the Releases page.
- Ensure the
copperbinary is in your$PATH. - Initialize the shell hook to enable auto-switching capabilities:
| Shell | Add to Config |
|---|---|
Zsh (~/.zshrc) |
eval "$(copper shell zsh)" |
Bash (~/.bashrc) |
eval "$(copper shell bash)" |
Fish (config.fish) |
copper shell fish | source |
PowerShell ($PROFILE) |
Invoke-Expression (&copper shell pwsh) |
Note: Windows support is theoretical...
Basic Command Structure:
copper <action> <package> [version]| Action | Command | Description |
|---|---|---|
| Install | copper add node 22 |
Fetches the latest Node 22.* version. |
| List | copper list-remote zig |
Shows available versions for installation. |
| Use | copper use node 24 |
Sets the default global version. |
| Check | copper installed |
Lists all packages currently managed by copper. |
| Update | copper update-self |
Updates the copper binary itself. |
Copper hooks into your directory changes. If you cd into a folder with a config file (e.g., .nvmrc, .python-version), copper will automatically update current default runtime to the specified version.
Global state - copper currently does not support per-session versioning. If you change the default version in one terminal tab, it affects all other sessions. This works fine for personal development machines, but PRs are welcome if you need session isolation.