Skip to content

Start Here

Working Without the CLI

Everything the wheels CLI does to a running app goes through surfaces the framework itself provides — which means every one of them is reachable without the CLI. This page is the map. Bookmark it if you installed manually or run CommandBox.

TaskWith the wheels CLIWithout the wheels CLIAvailable in
Reload the app after config/code changeswheels reload?reload=true&password=<your-reload-password> appended to any app URLAny environment with a non-empty reloadPassword (rate-limited; set it in .env). Restarting the app server also reloads.
Run migrationswheels migrate latestBrowser: the migrator GUI at /wheels/migrator. Programmatic: application.wheels.migrator.migrateToLatest() or .migrateTo(version)GUI: development only. Programmatic: any environment. set(autoMigrateDatabase=true) runs pending migrations at application start.
Check migration statuswheels migrate info/wheels/migrator (shows applied/pending), or application.wheels.migrator.getCurrentMigrationVersion()GUI: development only. Programmatic: any environment.
Write a migrationwheels g migration <name>Create app/migrator/migrations/[timestamp]_[description].cfc by hand — it’s a plain CFC with up()/down(); copy any existing one as a starting point. See Migrations.n/a (files on disk)
Run app testswheels test/wheels/app/tests in a browser; append ?format=json for machine-readable results (that’s all the CLI does)Development only
Seed datawheels seedapplication.wheels.seeder.runSeeds() — callable from anywhere server-side (an admin action, a deploy hook, one-off script)Any environment
Inspect routeswheels routes/wheels/routes in a browser, or the debug bar’s Tools panelDevelopment only
App/framework infowheels info/wheels/info, or the debug bar’s Environment panelDevelopment only
Install a packagewheels packages add <name>Download the package release and extract into vendor/<name>/, then reload — packages are auto-discovered from vendor/*/package.json at startup. See Packages.n/a (files on disk)
Generate models/controllers/scaffoldswheels g …No runtime equivalent — generators just write files. Copy the patterns from The Basics or the snippets under app/snippets/.n/a
Upgrade the frameworkwheels upgrade applySwap vendor/wheels/ with the new release’s core zip — full recipe at Upgrading Without the CLIn/a (files on disk)
Create a new appwheels newTwo zip downloads — Manual Installationn/a

Why the “development only” rows are locked

Section titled “Why the “development only” rows are locked”

The browser surfaces under /wheels/* (migrator GUI, test runners, routes, info) are gated by a development-only allowlist — since 4.0.4 (#2903) they return 404 in every other environment, and set(enablePublicComponent=true) cannot open them outside development. That’s deliberate: they expose schema and internals no production app should serve.

So the production-safe versions are the programmatic ones: application.wheels.migrator.migrateToLatest() and application.wheels.seeder.runSeeds() called from your own protected code path (a deploy hook, an authenticated admin action), plus the URL reload — which works in production precisely because it demands the reloadPassword you set in .env. Production Configuration and Security Hardening cover hardening both.