Start Here
Manual Installation (zip / GitHub)
You don't need the wheels CLI, CommandBox, or any package manager to run Wheels. Downloading the framework from GitHub and wiring it up by hand is a fully supported path, and in Wheels 4 it's simpler than it has been in years: two zips, zero external dependencies.
You'll learn:
- Which release files to download and exactly where each one goes
- How to point your web server at the app
- The one datasource step and the URL-rewriting decision
- How this differs from the Wheels 3 manual install (it got easier)
What to download
Section titled “What to download”Every release publishes its artifacts on the GitHub releases page. For a new app you need exactly two (substitute the current version number):
| File | What it is | Where it goes |
|---|---|---|
| wheels-base-template-4.0.5.zip | The application skeleton: app/, config/, public/, tests/, an empty vendor/ | Extract as your app root |
| wheels-core-4.0.5.zip | The framework itself — a single wheels/ folder | Extract into vendor/, so it becomes vendor/wheels/ |
That's the complete list. Wheels 4 has no external dependencies: the DI container (vendor/wheels/Injector.cfc) and the test framework (vendor/wheels/wheelstest/) are built in. .md5/.sha512 checksum files are published alongside each zip if you want to verify downloads.
Step-by-step
Section titled “Step-by-step”-
Extract the base template into your application directory:
myapp/app/config/db/public/tests/vendor/ (empty — that's expected)box.jsonenv.exampleserver.jsonA zero-byte marker file named
wheels-base-template-4.0.5-<timestamp>ships in the zip; it identifies the build and is safe to delete. -
Extract the core zip into
vendor/. The zip contains a singlewheels/folder, so after extraction you havevendor/wheels/withDispatch.cfc,Model.cfc,Controller.cfc, etc. directly inside it. The folder name must be exactlywheels— the mappings inpublic/Application.cfcdepend on it. -
Create your
.envfile. Copyenv.exampleto.envand set at minimum a reload password:.env WHEELS_ENV=developmentWHEELS_DATASOURCE=wheelsWHEELS_RELOAD_PASSWORD=pick-something-longpublic/Application.cfcreads this file at startup — no dotenv tooling involved. Never commit it. -
Point your web server at
public/. The web root ispublic/and onlypublic/— set your IIS site, nginx root, or Apache DocumentRoot there. Everything else (app/,config/,vendor/,.env) sits one level up, unreachable from a browser. The mappings inpublic/Application.cfcare relative, so the app runs from any disk location. Your CFML engine (Lucee 5/6/7, Adobe ColdFusion 2018–2025, or BoxLang) must be wired to that site the same way as any other CFML app — see CFML Engines for engine specifics and IIS and Windows Deployment for the full IIS walkthrough. -
Create the datasource. The template ships with
set(dataSourceName="wheels")inconfig/settings.cfm. Register a datasource namedwheelsin your engine's admin (Lucee admin or ColdFusion Administrator), or change that line to the name of a datasource you already have. On Adobe ColdFusion, create the datasource in the CF Administrator — runtime-defined datasources are not reliably picked up. -
Decide on URL rewriting. The template defaults to
set(URLRewriting="On")inconfig/settings.cfm, which expects your web server to rewrite/posts/1to/index.cfm/posts/1. The shippedpublic/urlrewrite.xmlhandles this only on Tuckey-based servers (what the wheels CLI and CommandBox use) — IIS, nginx, and Apache each need their own rule, covered in IIS and Windows Deployment and VM and Bare-metal Deployment. Until your rewrite rule is in place, setURLRewriting="Partial"— URLs take the/index.cfm/posts/1form with no server config at all. -
Load the app in a browser. You should see the Wheels congratulations page. From here the tutorial and every guide in The Basics apply exactly as written — only the CLI convenience commands differ, and Working Without the CLI maps each one to its no-CLI equivalent.
Adding the framework to your own skeleton
Section titled “Adding the framework to your own skeleton”If you have your own app layout and deployment scripts and only want the framework files: the only hard requirements are (1) vendor/wheels/ present, (2) the six mappings public/Application.cfc defines (/app, /vendor, /wheels, /tests, /config, /plugins), and (3) a web root containing the template's Application.cfc and index.cfm. Anatomy of a Wheels App documents the full contract. Upgrading later is a vendor/wheels/ swap — see Upgrading Without the CLI.
Git-based alternative
Section titled “Git-based alternative”Prefer git clone over zips? Clone the repo and copy vendor/wheels/ from a release tag:
git clone --depth=1 --branch v4.0.5 https://github.com/wheels-dev/wheels.git /tmp/wheels-srccp -R /tmp/wheels-src/vendor/wheels myapp/vendor/wheelsThe repo's vendor/wheels/ at a release tag is the same code as the core zip, with one cosmetic difference: the release pipeline stamps the real version into wheels.json, while a git checkout carries the @build.version@ placeholder — the app runs identically, but version reporting (the debug bar, application.$wheels.version) shows the placeholder-derived value instead of 4.0.5. If exact version metadata matters to you, prefer the zips. (Either way, don't track the framework from develop in production — tags are the supported line.)