Conjure upon ripples of past reverie to run multiple versions of runtimes and tools
Find a file
2026-01-22 02:59:17 +07:00
.github/workflows chore: update dist 2025-10-01 05:39:45 +07:00
cyrene chore: add debug messages 2026-01-22 02:59:17 +07:00
.gitignore feat: initial commit 2025-09-30 21:07:20 +07:00
Cargo.lock fix: return HTTP error first before processing versions 2025-12-23 10:43:38 +07:00
Cargo.toml feat: initial commit 2025-09-30 21:07:20 +07:00
CHANGELOG.md chore: mark the update lockfile as breaking change 2025-10-14 03:45:20 +07:00
dist-workspace.toml chore: update dist 2025-10-01 05:39:45 +07:00
LICENSE fix: plugin modules 2025-10-01 02:19:47 +07:00
README.md chore: [skip ci] update README instruction on installing itself some more 2025-10-02 02:55:00 +07:00
release.toml chore: first MVP 2025-10-01 03:23:30 +07:00

cyrene

Conjure upon ripples of past reverie to run multiple versions of runtimes and tools.

Features

  • Install and upgrade multiple versions of tools
  • Symlink-based version management
  • Extensible with scripts written in Rune
  • Synchronize tool versions with cyrene.toml lockfiles

Installation

cyrene should depend only on libc.

A set of plugins are available in the cyrene-plugins repository.

From releases

Grab the latest binary from the Releases page.

After that, run cyrene env to generate required environment variables to $HOME/.config/cyrene/cyrene_env.sh, then source this file.

Run from source

cyrene is built and tested against latest Rust.

git clone https://github.com/Damillora/cyrene.git
cd cyrene
cargo install --path cyrene

After that, run cyrene env to generate required environment variables to $HOME/.config/cyrene/cyrene_env.sh, then source this file.

Managing cyrene with cyrene

To manage cyrene with cyrene itself, first install cyrene version 0.2.3 or later, alongside the cyrene plugin.

After that, run cyrene env to generate required environment variables to $HOME/.config/cyrene/cyrene_env.sh, then source this file. Loading this environment file is mandatory to manage cyrene with cyrene. cyrene version 0.2.3 has a check that prevents cyrene from sacrificing itself if the environment is not properly loaded.

Then simply:

cyrene install cyrene

Usage

asciicast

# Install multiple versions of runtimes...
cyrene install node@22
cyrene install node@20
# ..and enable one of them at a time.
cyrene link node 20
node
# Welcome to Node.js v20.19.5.
# Type ".help" for more information.
# >
cyrene link node 22
node
# Welcome to Node.js v22.20.0.
# Type ".help" for more information.
# >

# Upgrades are per major version
cyrene upgrade node@22
# Uninstall every Node version
cyrene uninstall node
# Lockfile example
cat << EOF > cyrene.toml
[versions]
node = "20.19.5"
EOF
cyrene load
node
# Welcome to Node.js v20.19.5.
# Type ".help" for more information.
# >
# Load default lockfile
cyrene load -d

Configuration

Cyrene is currently configured with environment variables: Run cyrene env to generate a script exporting its default configuration to $HOME/.config/cyrene/cyrene.sh.

  • CYRENE_APPS_DIR: Location of installed binaries. Defaults to $HOME/.local/share/cyrene/apps.
  • CYRENE_PLUGINS_DIR: Location of installed plugins. Defaults to $HOME/.local/share/cyrene/apps.
  • CYRENE_INSTALL_DIR: Location of the cyrene binary itself. Default to the location of the cyrene executable itself.

The default lockfile is located at $HOME/.config/cyrene/cyrene.toml. Per-project lockfiles are configured using the current directory's cyrene.toml file.

Contributing

cyrene is still in heavy development, but contributions are welcome! Feel free to file an issue or even submit a PR if you want.

License

cyrene is licensed under the MIT License.