Start Here
Your First 15 Minutes
Fifteen minutes. Zero explanations. You run commands, you see results, you know whether Wheels fits your brain. If it does, move on to the full tutorial — that’s where you’ll actually learn how things work.
You’ll learn:
- Whether Wheels feels right for you
- What a scaffolded Wheels app looks like
- Where to go next
1. Create an app (3 min)
Section titled “1. Create an app (3 min)”First, confirm the CLI is installed:
wheels --versionThen create a new app:
wheels new hellocd helloThis creates a SQLite-backed Wheels app called hello and drops you into its directory. The scaffold takes a couple of seconds.
2. Start the server (2 min)
Section titled “2. Start the server (2 min)”wheels startYou’ll see log lines ending with something like Server started successfully. Open http://localhost:8080 in your browser. A welcome page appears: “Welcome to hello. Your Wheels application is running.”
The dev server stays running in the background. Leave the terminal open.
3. Add a page (5 min)
Section titled “3. Add a page (5 min)”-
Open
config/routes.cfm. You’ll see amapper()...end()block wrapped in<cfscript>. Insidemapper(), add a line so the file looks like:mapper().get(name="greet", pattern="/greet", to="main##greet").wildcard().root(to="main##index", method="get").end();.get(...)declares: when a GET request hits/greet, run thegreetaction on theMaincontroller. -
Open
app/controllers/Main.cfcand add agreetaction:component extends="Controller" {function index() {}function greet() {}}Wheels renders the view at
app/views/main/greet.cfm. -
Create
app/views/main/greet.cfm:app/views/main/greet.cfm <h1>Hello from Wheels</h1><p>This page didn't exist a minute ago.</p> -
Tell Wheels to pick up the changes:
your shell wheels reload
4. Verify (2 min)
Section titled “4. Verify (2 min)”curl -s http://localhost:8080/greetYou should see <h1>Hello from Wheels</h1> in the response.
5. What just happened (3 min)
Section titled “5. What just happened (3 min)”Three pieces moved:
- Route —
routes.cfmmapped a URL to a controller action. URL lookup is convention-driven;/greet→main##greetmeans “thegreetfunction on theMaincontroller.” - Controller —
Main.cfc’sgreetaction ran. It did nothing visible; it just existed, so Wheels proceeded to render the view. - View —
app/views/main/greet.cfmrendered. The path is conventional:views/<controller>/<action>.cfm.
That’s it. Every request is a variant of the same three-beat dance: route, controller action, view. The full tutorial fills in models, migrations, forms, validations, and the rest.