Start Here
Installing Wheels
Install the wheels CLI. Five minutes.
You’ll learn:
- How to install Wheels on macOS, Windows, or Linux
- How to verify the install worked
- How to upgrade later
Choose a channel
Section titled “Choose a channel”Wheels ships on two parallel channels. The instructions below install stable (wheels) — the right pick for ~95% of users. If you want bleeding-edge (wheels-be, tracks every merge to develop), see Release Channels for the comparison and install steps.
The two are mutually exclusive — both expose the wheels binary. You install one, not both. You can switch later without losing any of your already-scaffolded apps.
Install the CLI
Section titled “Install the CLI”-
Tap the Wheels Homebrew repo:
your shell brew tap wheels-dev/wheelsHomebrew 5.1+ asks you to trust third-party taps on first use — run
brew trust wheels-dev/wheelsonce if prompted. -
Install the CLI:
your shell brew install wheels -
Verify:
Terminal window wheels --versionYou should see a
Wheels Version: <version>line followed by ASCII art. ALucee Version: <version>line may also appear once Lucee Express has been downloaded (typically on firstwheels start). Any non-empty version output means the CLI is wired up correctly.
The legacy wheels package on chocolatey.org is the CommandBox-based v1.x release and cannot drive this tutorial. Wheels v4 ships on Windows through Scoop instead — see CLI Installation for the full rationale.
-
Install Scoop if you don’t have it (skip if
scoop --versionalready works):PowerShell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserInvoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression -
Install git (required by Scoop to add any third-party bucket — skip if
git --versionalready works):PowerShell scoop install gitThe Scoop installer doesn’t ship git, but
scoop bucket addusesgit cloneunder the hood. The defaultmainbucket is the one exception — its metadata is bundled with Scoop, which is whyscoop install gitfrom a fresh shell works without any prior bucket setup. -
Add the Wheels bucket and install a channel:
PowerShell scoop bucket add wheels https://github.com/wheels-dev/scoop-wheelsscoop install wheels # stable - tracks v4.0.0 GA tags# OR:scoop install wheels-be # bleeding-edge - tracks every develop mergeBoth packages inline OpenJDK 21 — no separate
javabucket orJAVA_HOMEsetup required. Both expose the samewheelsshim on PATH, so Scoop refuses to install both at once. See Release Channels for the comparison. -
Verify:
PowerShell wheels --versionYou should see a
Wheels Version: <version>line followed by ASCII art. ALucee Version: <version>line may also appear once Lucee Express has been downloaded (typically on firstwheels start). Any non-empty version output means the CLI is wired up correctly.
Pick LuCLI and Wheels Module versions that are known to be paired — see CLI Installation → Manual JAR install for the canonical version-pairing source.
Wheels publishes signed native apt and yum repositories at https://apt.wheels.dev and https://yum.wheels.dev. Add the source once, then apt upgrade wheels / dnf upgrade wheels picks up new versions automatically. The package installs /usr/bin/wheels, declares OpenJDK 21 as a runtime dependency (so apt/dnf pulls a JDK in automatically), and on first run syncs the framework module into ~/.wheels/.
The apt and yum repos are GPG-signed with the Wheels Distribution key (fingerprint 6872 16C9 32B4 9F03 94E0 9AED 5D89 AF8F 9C9B 8CFB). apt/dnf verify the signature on every update, so a network-level attacker can’t substitute the package contents. The public half is published at https://apt.wheels.dev/wheels.gpg and https://yum.wheels.dev/wheels.gpg — both files are byte-identical. The sources.list / .repo snippets below wire the signature check in automatically. The published key is ASCII-armored, so the Debian/Ubuntu snippet pipes it through sudo gpg --dearmor before writing /usr/share/keyrings/wheels.gpg — apt expects a binary keyring there and rejects an armored key with an “unsupported filetype” warning and a NO_PUBKEY error.
-
Add the Wheels apt/yum source:
Debian / Ubuntu — stable curl -fsSL https://apt.wheels.dev/wheels.gpg \| sudo gpg --dearmor -o /usr/share/keyrings/wheels.gpgecho "deb [signed-by=/usr/share/keyrings/wheels.gpg] https://apt.wheels.dev stable main" \| sudo tee /etc/apt/sources.list.d/wheels.listsudo apt update && sudo apt install wheelsFedora / RHEL — stable sudo dnf config-manager --add-repo https://yum.wheels.dev/wheels.reposudo dnf install wheelsThe bleeding-edge channel publishes a fresh
.deb/.rpmon every merge todevelop. It’s served from the same apt.wheels.dev / yum.wheels.dev hosts but under a separatebleeding-edgedistribution name, with a distinct package name (wheels-be) so it can coexist with the stablewheelsinstall on the same host:Debian / Ubuntu — bleeding-edge curl -fsSL https://apt.wheels.dev/wheels.gpg \| sudo gpg --dearmor -o /usr/share/keyrings/wheels.gpgecho "deb [signed-by=/usr/share/keyrings/wheels.gpg] https://apt.wheels.dev bleeding-edge main" \| sudo tee /etc/apt/sources.list.d/wheels-be.listsudo apt update && sudo apt install wheels-beFedora / RHEL — bleeding-edge sudo dnf config-manager --add-repo https://yum.wheels.dev/wheels-be.reposudo dnf install wheels-beSnapshot tags use a SemVer hyphen (
v4.0.0-snapshot.1825) and the package’s internal version preserves the~snapshot.Nform soapt/dnforder the version correctly relative to GA. See Release Channels. -
Verify:
your shell wheels --versionYou should see a
Wheels Version: <version>line followed by ASCII art. ALucee Version: <version>line may also appear once Lucee Express has been downloaded (typically on firstwheels start). Any non-empty version output means the CLI is wired up correctly.
Upgrading
Section titled “Upgrading”brew updatebrew upgrade wheelsIf Homebrew 5.1+ refuses with an “untrusted tap” error, run brew trust wheels-dev/wheels once, then re-run the upgrade.
Upgrade through Scoop — it pulls the latest LuCLI launcher and Wheels Module from the wheels-dev/scoop-wheels bucket:
scoop update wheels# or, for the bleeding-edge channel:scoop update wheels-beOnce the apt or yum source from the install step is in place, upgrades are a single command — apt/dnf watches the repo and pulls the latest signed package on every refresh:
sudo apt update && sudo apt upgrade wheels # or `wheels-be` for bleeding-edgesudo dnf upgrade wheels # or `wheels-be` for bleeding-edgeThe first wheels invocation after upgrade syncs the new framework module into ~/.wheels/modules/wheels/ automatically.
Troubleshooting
Section titled “Troubleshooting”wheels: command not found
Your shell’s PATH doesn’t include the CLI. Restart your shell first — most installs only put the binary on PATH for new shell sessions. On macOS, confirm Homebrew’s bin path is in PATH: echo $PATH | tr ':' '\n' | grep brew. On Linux, the .deb/.rpm package installs /usr/bin/wheels, which should be on every user’s default PATH; if it’s not, check dpkg -L wheels (Debian) or rpm -ql wheels (RHEL) to confirm the package installed and the binary is where expected.
Error: unable to find Java runtime
Install Java 21+ from Adoptium. On macOS: brew install openjdk@21. The wheels wrapper resolves Java on its own, but anything else (java -version, IDEs, Maven, Gradle) needs JAVA_HOME and PATH set in your shell profile:
export JAVA_HOME="$(brew --prefix openjdk@21)/libexec/openjdk.jdk/Contents/Home"export PATH="$JAVA_HOME/bin:$PATH"If you installed from Adoptium directly instead of Homebrew, use whatever /usr/libexec/java_home -v 21 prints for JAVA_HOME.
brew: cask 'wheels' has no formulae to install from
You skipped brew tap wheels-dev/wheels. Run the tap command, then re-run the install.
Refusing to load formula wheels from untrusted tap wheels-dev/wheels
Homebrew 5.1+ requires trusting third-party taps before installing or upgrading from them. Run brew trust wheels-dev/wheels once, then re-run the command.