Install
Install charly once, then use it from anywhere. The rest of this site is written for a
machine with charly installed and no charly checkout anywhere: --repo <owner>/<repo> reads a
published project straight from git, and charly box new project <dir> starts one of your own.
Nothing on any other page asks you to clone a repository.
charly runs on Linux, amd64 and arm64. The native packages pull in their runtime
dependencies — podman for containers, qemu/libvirt for VMs, gocryptfs for encrypted volumes.
Install from the package repositories
Section titled “Install from the package repositories”Every package is signed. On arm64, replace amd64 with arm64 in the repository URLs.
Fedora
Section titled “Fedora”Create /etc/yum.repos.d/charly.repo:
[charly]name=charlybaseurl=https://opencharly.github.io/charly-fedora/amd64enabled=1gpgcheck=1gpgkey=https://opencharly.github.io/charly-fedora/RPM-GPG-KEY-charlysudo dnf install charlyDebian and Ubuntu
Section titled “Debian and Ubuntu”On Ubuntu, use charly-ubuntu in place of charly-debian:
curl -fsSL https://opencharly.github.io/charly-debian/charly.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/charly.gpgecho "deb [signed-by=/etc/apt/keyrings/charly.gpg] https://opencharly.github.io/charly-debian/ stable main" | sudo tee /etc/apt/sources.list.d/charly.listsudo apt updatesudo apt install charlyArch Linux and CachyOS
Section titled “Arch Linux and CachyOS”curl -fsSL -o /tmp/charly.gpg https://opencharly.github.io/charly-arch/charly.gpgsudo pacman-key --add /tmp/charly.gpgsudo pacman-key --lsign-key 978DFF11A951A830F7ADA2D4062B073E9D1BAE2EAppend to /etc/pacman.conf, then install:
[charly]Server = https://opencharly.github.io/charly-arch/amd64SigLevel = Requiredsudo pacman -Sy charlyAlpine
Section titled “Alpine”sudo wget -O /etc/apk/keys/charly.rsa.pub https://opencharly.github.io/charly-alpine/charly.rsa.pubecho "https://opencharly.github.io/charly-alpine/amd64" | sudo tee -a /etc/apk/repositoriessudo apk updatesudo apk add charlyVariants
Section titled “Variants”Each repository carries three packages:
| Package | What it bakes in |
|---|---|
charly |
the everyday set: secrets, feature, vm, doctor, clean, settings, candy, mcp, review, pipeline |
charly-full |
the everyday set plus GPU udev rules and the preemption arbiter |
charly-minimal |
doctor, clean, settings |
There is also an OpenWrt feed — the binary installs and runs there, but OpenWrt carries no podman or libvirt — and a build for the JetKVM appliance.
Check the install
Section titled “Check the install”charly version # the CalVer the binary was stamped withcharly doctor # what is installed, what is missing, which GPU charly seesInstall with mise
Section titled “Install with mise”mise is a polyglot dev-tool version manager (asdf-compatible, Rust). It installs the published release binary straight from GitHub Releases — no Go toolchain, no source build:
mise use github:opencharly/charly # latest releasemise use writes the tool into your project’s mise.toml and installs it. The charly shim
lands on your $PATH; without activation, mise x runs it:
charly version # via the mise shimmise x -- charly version # without the shim on PATHThe binary is the same CalVer-stamped release build the package repos ship — charly version
tells you which one. A release binary brings no runtime dependencies with it; charly doctor
reports what is missing.
Developing charly
Section titled “Developing charly”All development on charly itself happens in the umbrella repository, opencharly/opencharly — one clone of the whole org, with charly, the plugins, the distros and this site pinned as submodules:
git clone --recurse-submodules https://github.com/opencharly/opencharly.gitcd opencharly./charly/scripts/bootstrap-charly.sh # builds ./charly/bin/charly (CalVer-stamped) — never installs itNever edit a submodule in place. Each session works in its own git worktree under
.worktrees/<slug>/<repo>/, branched off origin/main, builds its own binary there, and lands
every change by pull request. The umbrella’s
AGENTS.md has the full development
model.
To start your own project, create a charly.yml and a candy/ directory in any directory.
Projects predating the current schema convert in one shot with charly migrate, a single
idempotent pass to the latest CalVer schema.

