Wheels-The Fast &
Fun
CFML Framework!
Build apps quickly with an
organized, Ruby on
Rails-inspired
structure.
Get up and
running in no time!
Automatic Documentation
Use our built in doc viewer which grows with your application with only minor markup required
Full Documentation
Lots of lovely documentation available with tutorials and a complete API reference
Latest From the Wheels Dev Blog
CFWheels 2.1.0-beta Now Available
It’s been far too long in the making, but the beta for 2.1 has now arrived! Please do check it out: this should be considered an essential upgrade for anyone on 2.x. A huge thanks to all have contributed!
- Direct Download: Download zip
Make sure to check the “Potenitally Breaking Changes” section below, and please report any bugs.
What's New:
New GUI
Probably the most obvious change in 2.1 beta is the new internal user interface. Previously, Wheels internal pages like test outputs and routing tables could accidentally be broken by your app, as they extended your Controller.cfc by default. Now, they're completely isolated, and have been significantly beefed up to show everything that you might want to look at as a developer.
The new GUI has it's own dedicated internal routes which can be accessed directly at /wheels/info
(assuming you've got URL rewriting on) or via the usual links in the debug footer.
It's made up of six main sections:
- General Wheels info - which displays all the settings for your development environment, such as datasources and other core configuration;
- a new routing table - which includes a handy route tester as well as a quick search;
- improved test outputs so you can more easily access unit tests for your app, core tests if you're on the master branch, and plugin tests if they're available;
- a new database migration interface, which allows for SQL previews, so you can actually check your migration is going to do what you think it's going to do before executing;
- a more comprehensive documentation output, which includes your own autogenerated application docs as well as the internal wheels function references,
- and a better plugins list, showing all the information we know about any installed plugins.
This GUI is only available in development mode by default, but can be enabled in other modes - this isn't recommended, but it can be done if you really need to check the configuration or try and track something specific down. You can enable it via set(enablePublicComponent=true)
in your environment specific configuration files.
Improved CORS handling
Next up is some much needed and improved CORS handling. CORS, or Cross-Origin Resource Sharing, will be very familiar to any of you who have a javascript component or fully fledged progressive web app which runs on one domain, but needs to get information from another. A full explanation of CORS is probably beyond the scope of this post, but if you're thinking of running your own API on a standalone domain where other applications talk to it, you'll need to be able to handle CORS.
In Wheels 2.0, you could handle CORS requests, but they could only be configured in a very broad way. For instance, the CORS Allow Methods just returned all methods by default in an OPTIONS
request, which kinda defeated the whole point.
The CORS Headers - Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Credentials
can now be directly set by their respective functions.
However, for most people, a new helper configuration, accessControlAllowMethodsByRoute()
will be the single most useful function to set: it allows for automatic matching of available methods for a route and sets the CORS Header Access-Control-Allow-Methods
automatically; so now when your OPTIONS
request hits your wheels app, it will actually respond with the available methods which are allowed for that resource endpoint. This makes it much easier to diagnose why certain requests might not get through, and means javascript libraries such as axios can respond more appropriately to hitting the wrong URL with the wrong HTTP method.
Improvements to mapper()
Redirects can now be put directly in the mapper()
routing call, so you can quickly add a simple redirect for a route if you need.
mapFormat
can now be set as false
, which bypasses the additional '.[format]' routes which were put in by default for each resource. So if you don't use them, you can now just turn them off, and make your routing table a lot cleaner. This can be set either globally on the mapper()
call itself, or on a per resource basis when using resources()
params._json if request is Array
Previously, if you POST
ed or PUT/PATCH
ed json to an endpoint with an array as it's root element, it would just get ignored, and you'd not be able to access it in the params
struct. This has now been changed and if the incoming payload is a json array, it will be available at params._json
which matches rails conventions.
New FlashAppend Behaviour
You can now change the default flash behaviour to append to an existing key, rather than directly replacing it. To turn on this behaviour, add set(flashAppend=true)
to your /config/settings.cfm
file. This allows you to more easily collect flash notifications during a request:
flashInsert(success="One");
flashInsert(success="Two");
Plugin performance
The plugins system has been reverted back to 1.x behaviour, as it was simply non-performant; more on this in a future post.
Full Changelog:
Potentially breaking changes
- The new CFWheels internal GUI is more isolated and runs in it's own component: previously this was extending the developers main
Controller.cfc
which caused multiple issues. The migrator, test runner and routing GUIs have therefore all been re-written. - The plugins system behaviour no longer chains multiple functions of the same name as this was a major performance hit. It's recommended that plugin authors check their plugins to run on 2.1
- HTTP Verb/Method switching is now no longer allowed via GET requests and must be performed via POST (i.e via
_method
)
Model Enhancements
- Migrator now automatically manages the timestamp columns on
addRecord()
andupdateRecord()
calls - #852 [Charley Contreras] - Migrator correctly honors CFWheels Timestamp configuration settings (
setUpdatedAtOnCreate, softDeleteProperty, timeStampMode, timeStampOnCreateProperty, timeStampOnUpdateProperty
) - #852 [Charley Contreras] MSSQL
now usesNVARCHAR(max)
instead ofTEXT
#896 [Reuben Brown]- Allow createdAt and updatedAt to be explicitly assigned using the
allowExplicitTimestamps=true
argument - #887 - [Adam Chapman]
Controller Enhancements
- New
set(flashAppend=true)
option allows for appending of a Flash key instead of replacing - #855 - [Tom King] flashMessages()
now checks for an array of strings or just a string and outputs appropriately - #855 - [Tom King]flashInsert()
can now accept a one dimensional array - #855 - [Tom King]
Bug Fixes
- Allow uppercase table names containing reserved substrings like
OR
andAND
- #765 [Dmitry Yakhnov, Adam Chapman] - Calculated properties can now override an existing property - #764 [Adam Chapman, Andy Bellenie]
- Filters are now correctly called if there is more than one after filter - #853 [Brandon Shea, Tom King, Adam Chapman]
- Minor fix for duplicate debug output in the test suite - #176 [Adam Chapman, Tom King]
- Convert
handle
to a valid variable name so it doesn't break when using dot notation - #846 [Per Djurner] - The
validatesUniquenessOf()
check now handles cases when duplicates already exist - #480 [Randall Meeker, Per Djurner] validatesConfirmationOf()
now has acaseSensitive
argument to optionally perform a case sensitive comparison - #918 [Tom King]sendFile()
no longer expands an already expanded directory on ACF2016 - #873 [David Paul Belanger, Tom King, strubenstein]- Automatic database migrations onApplicationStart now correctly reference appropriate Application scope - #870 [Tom King]
usesLayout()
now can be called more than once and properly respects the order called - #891 [David Paul Belanger]- Migrator MSSQL adapter now respects
Time
andTimestamp
Column Types - #906 [Reuben Brown] - Automatic migrations fail on application start - #913 [Adam Chapman]
- Default
cacheFileChecking
totrue
in development mode - [Adam Chapman, Steve Harvey] - Migrator columnNames list values are now trimmed - #919 [Adam Chapman]
- Fixes bug when httpRequestData content is a JSON array - #926 [Adam Chapman]
- When httpRequestData content is a JSON array, contents are now automatically added to
params._json
- #939 [Tom King] - Fixes bug where Migrator $execute() always appends semi-colon - #924 [Adam Chapman]
- Fixes bug where model createdAt property is changed upon update - #927 [Brandon Shea, Adam Chapman]
- Fixed silent application.wheels scope exception hampering autoMigrateDatabase - #957 [Adam Chapman, Tom King]
Miscellaneous
- Added the ability to pass
&lock=false
in the URL for when reload requests won't work due to locking - [Per Djurner] - Basic 302 redirects now available in mapper via
redirect
argument forGET/PUT/PATCH/POST/DELETE
- #847 - [Tom King] .[format]
based routes can now be turned off inresources()
andresource()
viamapFormat=false
- #899 - [Tom King]mapFormat
can now be set as a default inmapper()
for all childresources()
andresource()
calls - #899 - [Tom King]HEAD
requests are now aliased toGET
requests #860 - [Tom King]- Added the
includeFilters
argument to theprocessRequest
function for skipping execution of filters during controller unit tests - [Adam Chapman] - Added the
useIndex
argument to finders for adding table index hints #864 - [Adam Chapman] - HTTP Verb/Method switching is now no longer allowed via
GET
requests and must be performed viaPOST
#886 - [Tom King] - CORS Header
Access-Control-Allow-Origin
can now be set either via a simple value or list inaccessControlAllowOrigin()
#888 [Tom King] - CORS Header
Access-Control-Allow-Methods
can now be set viaaccessControlAllowMethods(value)
#888 [Tom King] - CORS Header
Access-Control-Allow-Credentials
can now be turned on viaaccessControlAllowCredentials(true)
; #888 [Tom King] accessControlAllowMethodsByRoute()
now allows for automatic matching of available methods for a route and sets CORS HeaderAccess-Control-Allow-Methods
appropriately #888 [Tom King]- CORS Header can now be set via
accessControlAllowHeaders(value)
#888 [Tom King] - Performance Improvement: Scanning of Models and Controllers #917 [Adam Chapman]
- Added the
authenticityToken()
function for returning the raw CSRF authenticity token #925 [Adam Chapman] - Adds
enablePublicComponent
,enableMigratorComponent
,enablePluginsComponent
environment settings to completely disable those features #926 [Tom King] - New CFWheels Internal GUI #931 [Tom King]
pluginRunner()
now removed in favour of 1.x plugin behaviour for performance purposes #916 [Core Team]- Adds
validateTestPackageMetaData
environment setting for skipping test package validation on large test suites #950 [Adam Chapman] - Added aliases for
migrator.TableDefinition
functions to allow singular variant of thecolumnNames
property #922 [Sébastien FOCK CHOW THO] onAbort
is now supported viaevents/onabort.cfm
#962 [Brian Ramsey]
10 years of CFWheels / Welcome Adam / CFWheels 2.x
- 2825 commits (Per Djurner has the dubious claim to fame of the first commit, and at time of writing, the most recent too :))
- 22 Branches
- 43 Releases
- 76 forks
- 453 issues
- integrating the ColdRoute plugin into the core: ColdRoute allows you to define RESTful resources through new expressive routing helpers and controller conventions. It also allows you to organize controllers and views into subfolders via "namespaces" or "modules."
- improving wheels as a true RESTful service provider: you can already return JSON, XML and lots of other good stuff, but we're looking to improve things like setting custom headers, and really controlling your APIs response
- improving the plugin architecture, and generally looking a more "modular" way of doing things.
- dropping CF8/9 support; dropping Railo (as you should all be on Lucee now!!)
- better Commandbox support: we'll be looking at CLI type stuff to make getting going with wheels even quicker.
CFWheels 1.3.3 maintenance release
- Correct output of boolean HTML attributes using new global
booleanAttributes
setting - Make sure locks cannot be affected by other applications running on the same server
- Fixed bug with updating an integer column from
NULL
to0
- Fixed potential permissions issue when running on shared hosting
wheels
folder with the new one from the download. If you're upgrading from an older version of CFWheels, see the instructions.
CFWheels on CF Alive
David Belanger and Tom King from the CFWheels core team chat to host Michaela Light on the CF Alive Podcast! Have a watch/listen and share far and wide...
You can view the original post on the TeraTech website here
ColdFusion on Wheels 1.1 Release Candidate 1
CFWheels 2.0.0-beta.1 Now Available
- Direct Download: Download zip
- Commandbox quick install :
install cfwheels@be
(Just downloads and unzips) - Commandbox install wizard via CFWheels CLI (with url rewriting included):
wheels new
(make sure your version of the CLI is up to date withinstall cfwheels-cli
)
Need a little help upgrading?
There will be some more posts coming up covering some of the big topics like routing & migrations, but in the meantime:- Check out Adam's upgrade advisor plugin (Commandbox:
install upgradeadvisor
) - Get in touch via the Mailing List, Slack channel etc.
Changelog
Model Enhancements
- Support for passing in
select=false
toproperty()
to not include a calculated property by default in SELECT clauses - #122 [Adam Chapman, Per Djurner] - Support for setting calculated properties to a specific data type - [Per Djurner]
- Support for
returnIncludedAs
andreturnIncluded
arguments toproperties()
for returning nested properties - [Adam Chapman] - Support for calling
updateProperty()
with dynamic argument, e.g.updateProperty(firstName="Per")
- [Per Djurner] - Support for using boolean transaction argument, e.g.
update(transaction=false)
- #654 [Adam Chapman] - Support for MariaDB - #563 [AlexeiCF, Adam Chapman]
- Model instance
isPersisted()
andpropertyIsBlank()
methods - #559 [Chris Peters] - Database Migrations (dbmigrate) now available in the core - #664 [Adam Chapman, Tom King, Mike Grogan]
- Databases can now be automatically migrated to the latest version on application start - #766 [Tom King]
- New
timeStampMode
setting ("utc"
,"local"
or"epoch"
) for thecreatedAt
andupdatedAt
columns - [Andy Bellenie] - Allow nested transactions - #732 [Andy Bellenie]
- The
handle
argument to finders now set the variable name for the query so it's easier to find in the debug output - [Per Djurner] - Support added for HAVING when using aggregate functions in the
where
argument - #483 [Per Djurner] - Added support for the JSON data type in the MySQL adapter - #759 [Joel Stobart]
- Corrected mapping for text types in the MySQL adapter - #759 [Joel Stobart]
- Added global setting,
lowerCaseTableNames
, to always lower case table names in SQL statements - [Per Djurner]
View Enhancements
flashMessages()
are now in default layout.cfm - #650 [Tom King]- Added ability to override value in
textField()
,passwordField()
andhiddenField()
- #633 [Per Djurner, Chris Peters] - Support for the
method
argument inbuttonTo()
helper - #761 [Adam Chapman]
Controller Enhancements
- Support for HTTP verbs, scopes, namespaces, and resources in routes (ColdRoute) [Don Humphreys, James Gibson, Tom King]
- Support for passing in
ram://
resources tosendFile()
- #566 [Tom King] - Extended
sendMail()
so that it can return the text and/or html content of the email - #122 [Adam Chapman] renderWith()
can now set http status codes in header with thestatus
argument - #549 [Tom King]- Cross-Site Request Forgery (CSRF) protection - #613 [Chris Peters]
- Parse JSON body and add to params struct - [Tom King, Per Djurner]
Bug Fixes
- Fixes skipped model instantiation due to Linux file case sensitivity - #643 [Adam Chapman, Tom King]
- Added spatial datatypes for MySQL - #660 [Normal Cesar]
- Made
humanize()
keep spaces in input - #663 [Per Djurner, Chris Peters] - Avoid double redirect error when doing delayed redirects from a verification handler function - [Per Djurner]
- Fixes attempts to insert nulls for blank strings - #654 [Andy Bellenie, Per Djurner]
- Fix for using
validatePresenceOf()
with default on update - [Andy Bellenie] - Fixes so paginated finder calls with no records include column names - #722 [Per Djurner]
- Fixes "invalid data" error when using unsigned integers in MySQL - #768 [Per Djurner]
Plugins
- Plugins now distributed via forgebox.io [Tom King]
- Update to the plugin system to allow overriding of the same framework method multiple times - #681 [James Gibson, Tom King]
- Added ability to turn off incompatible plugin warnings from showing - [Danny Beard]
- Plugins now have any java lib/class files automatically mapped onApplicationStart 731 [Andy Bellenie, Tom King]
- Plugins now read version number off their
box.json
files and are displayed in debug area #68 [Tom King] - Plugin meta data as set in
box.json
now available inapplication.wheels.pluginMeta
scope #68 [Tom King]
Miscellaneous
- Redirect away after a reload request - [Chris Peters]
- Support checking IP in
http_x_forwarded_for
when doing maintenance mode exclusions - [Per Djurner] - Support checking user agent string when doing maintenance mode exclusions - [Per Djurner]
- Added JUnit and JSON format test results - [Adam Chapman]
- Added empty application test directories - [Chris Peters, Adam Chapman]
- Added default
urlrewrite.xml
to support Tuckey URL rewriting with Commandbox #649 - [Tom King] - Added
beforeAll()
,afterAll()
,packageSetup()
,packageTeardown()
methods to test framework #651 - [Adam Chapman] - Added
errorEmailFromAddress
anderrorEmailToAddress
config settings - #95 [Andy Bellenie, Tony Petruzzi, Per Djurner] - Support for passing in any "truthy" value to
assert()
in tests - [Per Djurner] - Added
/app/
mapping pointing to the root of the application - [Per Djurner] - Added a
processRequest()
function that simplifies testing controllers - [Per Djurner] - Added new embedded documentation viewer/generator for JavaDoc - #734 [Tom King]
- Removes all references to Railo - #656 (Adam Chapman)
- Made uncountable and irregular words configurable - #739 [Per Djurner]
- Removed
design
mode - [Per Djurner] - Removed
cacheRoutes
setting - [Per Djurner] - The
cacheFileChecking
andcacheImages
settings are now turned off in development mode - [Per Djurner] - Added
includeErrorInEmailSubject
setting - [Per Djurner] - Environment switching via URL can now be turned off via
allowEnvironmentSwitchViaUrl
- #766 [Tom King]
Breaking Changes
- Minimum Lucee version is now 4.5.5.006.
- Minimum ACF version is now 10.0.23 / 11.0.12.
- Support for Railo has been dropped.
- Rewrite and config files for IIS and Apache have been removed and has to be added manually instead.
- The
events/functions.cfm
file has been moved toglobal/functions.cfm
. - The
models/Model.cfc
file should extendwheels.Model
instead ofWheels
(models/Wheels.cfc
can be deleted). - The
controllers/Controller.cfc
file should extendwheels.Controller
instead ofWheels
(controllers/Wheels.cfc
can be deleted). - The
init
function of controllers and models should now be namedconfig
instead. - The global setting
modelRequireInit
has been renamed tomodelRequireConfig
. - The global setting
cacheControllerInitialization
has been renamed tocacheControllerConfig
. - The global setting
cacheModelInitialization
has been renamed tocacheModelConfig
. - The global setting
clearServerCache
has been renamed toclearTemplateCache
. - The
updateProperties()
method has been removed, useupdate()
instead. - Form labels automatically generated based on foreign key properties will drop the "Id" from the end (e.g., the label for the "userId" property will be "User", not "User Id").
- Routes need to be updated to use the new routing system by calling
mapper()
. - JavaScript arguments like
confirm
anddisable
have been removed from the link and form helper functions (use the JS Confirm and JS Disable plugins to reinstate the old behaviour). - Timestamping (
createdAt
,updatedAt
) is now in UTC by default (set the globaltimeStampMode
setting tolocal
to reinstate the old behaviour). - Blank strings in SQL are now converted to null checks (e.g.
where="x=''"
becomeswhere="x IS NULL"
). - Tags are now closed in HTML5 style (e.g.
<img src="x">
instead of<img src="x" />
). - The
encode
argument tomailTo
now encodes tag content and attributes instead of outputting JavaScript. - Class output is now dasherized (e.g.
field-with-errors
instead offieldWithErrors
). - The
renderPage
function has been renamed torenderView
.
CFWheels 2.3.0 Released
This is the official v2.3.0 release. It is dropping a little over a week from Release Candidate 1. We simply wanted to make sure the new CI/CD workflow was functioning before calling the release final. We feel confident that we're good to mark this release as final. There are no new enhancement or bug fixes in this release from 2.3.0.rc.1.
If updating from CFWheels 2.2.x:
If should be an easy upgrade, just swap out the wheels
folder.
Changelog
Please refer to release 2.3.0.rc.1 for details.
CFWheels on CF Alive the Sequel
Back in February of 2019 David Belanger and Tom King from the CFWheels core team sat down with Michaela Light on the ColdFusion Alive Podcast to have a chat about CFWheels. A few weeks ago Peter Amiri had a chance to speak to Michaela Light about recent developments in the CFWheels community, how to contribute to the project, and the road map ahead.
Episode 122 of the ColdFusion Alive Podcast
You can view the episode notes on the TeraTech website.
Testing Plugins on CFWheels 2.x and Travis CI via commandbox
One of the nicest things about CFWheels 2.x is the tighter integration with command-line tools such as Commandbox. We can take advantage of the new testing suite JSON return type and the new CFWheels CLI in Commandbox 2.x to easily build a Travis CI test. It's perhaps easiest to just show the .travis.yml
file - this goes in the root of your gitHub plugin repository, and once you've turned on testing under Travis.org, will run your test suite on every commit. https://gist.github.com/neokoenig/504ce0108a1caf0f19d54e87c1a8193c In sum, this:
- Installs Commandbox
- Installs the CFWheels CLI
- Installs the master branch of the CFWheels repository
- Installs your plugin from your repository (rather than the forgebox version which will be the version behind)
- Starts the local server
- Runs the test suite, pointing only at your plugin's unit tests
Naturally, you could do more complex things with this, such as multiple CF Engines, and maybe even multiple CFWheels versions, but for a quick setup it's a good starting point!
CFWheels 2.1 Released
Today sees the release of CFWheels 2.1. Only a couple of bug fixes since the beta, so please refer to the changelog for a list of all changes.
Download now (zip)
If updating from CFWheels 2.0.x:
- replace your
wheels
folder from the one in the download, and - outside the
wheels
folder, ensure you've got a file atevents/onabort.cfm
and create it if needed. - rename any instances of
findLast
() tofindLastOne()
(this has been changed due to Lucee 5.3 having a new inbuilt function called findLast() which clashes with the wheels internals)
Happy Easter, and stay safe!
Welcome to Our Community
Welcome to Our Community - a place where like-minded people connect, share ideas,
and grow
together in a positive and supportive environment.

This website uses essential cookies to improve your experience. By continuing to use the site, you consent to the use of cookies.
Top Contributors
Per Djurner
Contributed as a Software Developer
Per Djurner is a long-time core contributor and leader of the Wheels framework, with a history of shaping its direction since the project’s early days. He made the very first commit and has continued to contribute regularly, fixing important bugs, refining SQL handling, and enhancing model methods with more flexible options. In addition to code, he has improved documentation, templates, and overall project stability, ensuring Wheels remains reliable and developer-friendly. His work reflects both technical expertise and long-term commitment to the growth of the framework.
Peter Amiri
Contributed as a Software Developer and Project Manager
Peter Amiri is a senior developer and community leader who has taken on a core team / maintainer role in the Wheels framework. He has decades of experience with ColdFusion (since version 1.5), including work in user-groups, large scale sites, and infrastructure. Since returning to the project, he’s helped revitalize it — organizing roadmap discussions, guiding structure changes, supervising modernization (including CLI improvements, package modularization, and updating workflows), and helping re-energize community contributions.
Zain Ul Abideen
Contributed as a Software Developer
Zain Ul Abideen is an active contributor to the Wheels framework, playing a key role in improving its stability and usability. His work includes fixing issues like invalid columns not throwing exceptions, ensuring primary keys return correctly as numeric, and refining logic around calculated properties. He also enhanced view helpers to better handle active states and improved default routing behavior. Through these contributions, Zain has strengthened both the framework’s reliability and developer experience.
Anthony Petruzzi
Contributed as a Software Developer
Anthony Petruzzi has made valuable contributions to the Wheels through code improvements, bug fixes, and collaborative reviews. They’ve helped refine core components, enhanced framework stability, and actively participated in issue discussions to steer design decisions. Their efforts in writing clear, maintainable code and offering constructive feedback in pull requests have strengthened the project’s code quality. Overall, Anthony Petruzzi involvement showcases dedication to open-source collaboration and meaningful impact on the Wheels ecosystem.
Tom King
Contributed as a Software Developer and Maintainer
Tom King is one of the core maintainers of Wheels, with deep involvement in both development and leadership. He oversaw major releases, such as Wheels 2.0, which introduced features like RESTful routing, database migrations, improved CLI support, and a rewritten core in CFScript. He also helps steer the project’s long-term direction — writing blog posts reflecting on its history (e.g. noting its first commits, celebrating milestones) and working to modernize both tooling and community engagement.
Adam Chapman
Contributed as a Software Developer
Adam Chapman has been a dedicated and influential contributor to the Wheels ecosystem. He joined the core team after years of community support, helping to steer architectural evolution and plugin integrations. Beyond code, he’s actively engaged in issue triage, proposing enhancements and shaping long-term design direction. His commitment to both community discussion and technical contributions has strengthened the project’s cohesion and future readiness.
James
Contributed as a Software Developer
James has brought forward meaningful contributions to the Wheels through consistent code enhancements, test case development, and active engagement in issue resolution. He frequently submits detailed pull requests, helping to bolster the framework’s robustness and maintainability. Beyond code, James participates in discussion threads and reviews, offering thoughtful feedback which helps keep the project aligned with community needs. His steady involvement has strengthened both core modules and auxiliary features, making Wheels more reliable and polished for all users.
Andrew Bellenie
Contributed as a Software Developer and Maintainer
Andrew Bellenie has played a pivotal role in the Wheels ecosystem, as a long-standing core team member and active community contributor. He brings deep experience in CFML development and framework architecture. Andy has contributed code, design feedback, documentation, and mentorship to newcomers. He also helps triage issues, guide feature direction, and maintain the project’s stability. His dedication helps keep the framework evolving and its community engaged.
scahyono
Contributed as a Software Developer
scahyono has contributed thoughtful enhancements to the Wheels codebase, particularly in ensuring compatibility with Oracle setups. Notably, they worked on a module (or plugin) to allow ColdFusion on Wheels to correctly read table metadata across Oracle remote database links, which broadens database support and resilience. Their willingness to tackle specialized integration challenges strengthens the framework’s versatility and helps more users adopt Wheels in diverse environments.
MvdO79
Contributed as a Software Developer
MvdO79 has shown his support for the Wheels not only through code but also as a financial backer. He contributes monthly via Open Collective, helping sustain the framework’s ongoing development. Beyond funding, his presence in issue discussions demonstrates engagement with bug tracking and community feedback. His dual role-as supporter and participant-reinforces the open-source spirit behind Wheels.
Raul Riera
Contributed as a Software Developer
Raúl Riera has been an enthusiastic supporter and contributor to the Wheels community-beyond writing code, he’s helped through design, advocacy, and community engagement. He has designed swag such as T-shirts for Wheels events and promoted the framework through his dev shop, Hipervínculo. As a software entrepreneur (founder of Odonto.me) and developer, Raúl bridges technical and community roles, helping raise awareness of Wheels and adding a touch of creativity and outreach to the project’s ecosystem.
Michael Diederich
Contributed as a Software Developer
Michael Diederich has contributed key fixes and enhancements to the Wheels, particularly around framework usability and interface issues. Notably, he addressed documentation and UI elements-changes such as showing the current Git branch in the debug layout in version 2.5.0 reflect his involvement. In earlier releases, he also fixed bugs (for example with form and URL handling in the startFormTag() and array routing) that improved reliability across use cases. His contributions help refine both developer-facing tools and core correctness.
Rob Cameron
Contributed as a Software Developer
Rob Cameron had the original idea for CFWheels (and by extension, the foundation for Wheels), having built the framework with inspiration from Ruby on Rails in 2005. Though he eventually moved on from active core development to focus on other projects (such as Rails work), his early design and architectural direction still underpin much of the project's structure and philosophy.
Chris Peters
Contributed as a Software Developer
Chris Peters has been foundational in the development, documentation, and promotion of the Wheels framework since its early days. He authored many of the earliest releases, oversaw version 1.3.0 that introduced HTML5 enhancements, table less models, and thread-safe startup, and managed releases like 1.0.5 with dozens of bug fixes and stability updates. He also wrote technical blog posts about core features (flash messages, asset query strings, error handling) and established guidelines for contributing and documentation, helping to build a strong community around the framework.
David Paul Belanger
Contributed as a Software Developer
David Paul Belanger has been a core force behind the Wheels, contributing both technically and strategically across many versions. He has co-authored features and bug fixes (such as updates to sendFile() and usesLayout()) in the 2.x releases. Beyond code, David has helped lead the transition of the framework’s governance and been active in community outreach-having participated in CF-Alive podcasts and collaborated with Tom King and others on guiding the project’s future direction.
John Bampton
Contributed as a Software Developer and Documentation Writer
John Bampton made his mark as a contributor to the Wheels project beginning with version 2.4.0, where he helped fix broken links in documentation and correct spelling errors in the README and core templates. His attention to detail improved the documentation clarity and usability for future developers. Though he is noted as a “new contributor,” his work helped plug small but important gaps in the project’s written material, aiding the framework’s polish and accessibility.
Simon
Contributed as a Software Developer
Simon contributed to the Wheels framework by refining code and improving framework functionality. His work helped address issues and enhance stability, making the project more reliable and easier for developers to use. These contributions support the continued growth and effectiveness of the Wheels ecosystem.
Brian Ramsey
Contributed as a Software Developer and Quality Assurance Engineer
Brian Ramsey has been a long-time contributor and advocate within the Wheels community. His work spans both code contributions and knowledge sharing, with a focus on improving framework usability for everyday developers. Brian has participated in bug resolution, tested new releases, and provided feedback that shaped core improvements. Beyond code, he’s been active in community discussions, answering questions, and guiding newer users. His steady involvement has helped ensure Wheels remains both developer-friendly and reliable, reflecting his commitment to open-source collaboration and practical problem solving.
Danny Beard
Contributed as a Software Developer
Danny Beard has contributed to the Wheels framework through targeted code enhancements and thoughtful participation in issue discussions. His work has included fixing bugs, refining logic in core functions, and improving overall framework consistency. Danny’s involvement reflects an eye for detail and a practical approach to problem-solving, ensuring the framework remains dependable in real-world applications. Beyond code, his willingness to collaborate with other contributors has reinforced the community-driven nature of Wheels, helping maintain a strong and sustainable open-source project.
Reuben Brown
Contributed as a Software Developer
Reuben Brown has been a valuable contributor to the Wheels framework, offering code improvements and community input that strengthen the project’s overall quality. His work includes bug fixes and refinements that enhance stability and usability, ensuring developers can rely on Wheels in production environments. Reuben’s involvement extends beyond code, as he has taken part in discussions, reviewed issues, and provided practical feedback to guide development. His contributions reflect a thoughtful balance of technical skill and collaborative spirit, reinforcing the open-source ethos of the Wheels project.
Seb
Contributed as a Software Developer
Seb has provided important contributions to the Wheels that help improve framework robustness and usability. Through resolving issues, submitting pull requests, and polishing code, Seb has helped close gaps and make the system smoother for both new and experienced users. They’ve also participated in reviews, giving constructive feedback, which strengthens code quality and consistency across releases. Seb’s steady involvement supports the project’s open-source mission, making Wheels more reliable, maintainable, and welcoming for all contributors.
timbadolato
Contributed as a Software Developer
Timbadolato has contributed to the Wheels with a focus on improving functionality, fixing issues, and enhancing developer experience. His pull requests demonstrate a clear attention to detail, addressing edge cases and refining framework behavior to make it more predictable and reliable. By engaging in code reviews and community discussions, timbadolato has helped shape technical decisions and ensured smoother adoption for users. His contributions highlight a practical, solution-oriented approach that supports both the long-term stability and growth of the Wheels ecosystem.
Alex
Contributed as a Software Developer
Alex has played a supportive and constructive role in the Wheels, contributing code improvements and feedback that strengthen the framework’s overall reliability. His efforts include bug fixes, refinements to core features, and helpful participation in discussions that guide project direction. By addressing issues and proposing practical solutions, Alex has contributed to making Wheels easier to use and more stable for developers. His involvement reflects a collaborative spirit and reinforces the open-source values that keep the project moving forward.
Chris Geirman
Contributed as a Software Developer
Chris Geirman made contributions to the Wheels that helped refine parts of the codebase and improve developer experience. While his involvement was smaller in scope, his participation still added value to the framework and reflects the spirit of open-source collaboration.
Zac Spitzer
Contributed as a Software Developer
Zac Spitzer provided contributions to the Wheels that helped address specific issues and improve framework stability. Though his involvement was brief, his work added value to the codebase and demonstrated the importance of community participation in strengthening and maintaining open-source projects.
Nikolaj Frey
Contributed as a Software Developer
Nikolaj Frey has made contributions to the Wheels framework that supported improvements in the project’s codebase and functionality. While his involvement was limited in scope, his participation still added meaningful value, reinforcing the collaborative nature of the open-source community that drives Wheels forward.
Gralen
Contributed as a Software Developer
Gralen contributed improvements to the Wheels framework that enhanced code quality and supported overall stability. Their work helped refine the project and contributed to making the framework more reliable for developers using it in real-world applications.
Doug McCaughan
Contributed as a Software Developer
Doug McCaughan contributed to the Wheels framework by helping refine functionality and addressing issues that improved developer experience. His efforts supported the stability of the project and ensured smoother use of core features. Through his work, Doug added value to the framework’s ongoing development and its open-source community.
Coleman Sperando
Contributed as a Software Developer
Coleman Sperando contributed to the Wheels framework by making improvements that strengthened its functionality and reliability. His work addressed specific areas of the codebase, helping to refine features and ensure a smoother experience for developers. These contributions supported the project’s ongoing growth and the collaborative effort behind Wheels.
Charlie Arehart
Contributed as a Software Developer
Charlie Arehart has supported the Wheels framework through his deep expertise in ColdFusion and the broader CFML ecosystem. He has provided valuable feedback, shared knowledge with the community, and highlighted best practices that strengthen adoption and reliability. His involvement helps connect Wheels development with the wider ColdFusion community, ensuring the framework remains relevant and accessible to developers.
Charley Contreras
Contributed as a Software Developer
Charley Contreras contributed to the Wheels framework by helping refine parts of the codebase and supporting improvements that enhance usability. His work added value to the project’s overall stability and reflects the collaborative effort of developers working together to keep the framework evolving and reliable.
Brant Nielsen
Contributed as a Software Developer
Brant Nielsen contributed to the Wheels framework by improving functionality and addressing issues that supported better performance and reliability. His work helped refine the codebase and enhance the developer experience, reinforcing the project’s commitment to building a stable and effective open-source framework.
Ben Nadel
Contributed as a Software Developer
Ben Nadel is a veteran ColdFusion developer known for deep technical thought leadership and contributions to the community, including work around Wheels and related topics. He writes regularly about extending and customizing parts of Wheels (for example, customizing the router/proxy component behavior to suit specific workflow preferences). He also shares experiments and educational posts (e.g. integrating HTMX in ColdFusion apps) that help other developers understand modern patterns in CFML. While he may not always be contributing direct core framework commits, his influence shows up in how people use and adapt Wheels in real-world apps, and in sharing best practices, tutorials, and ideas that help shape how the framework is viewed and utilized.
Andrei B.
Contributed as a Software Developer
Andrei B. contributed to the Wheels framework by helping refine code and improve functionality in targeted areas of the project. His efforts supported greater stability and usability, making the framework more dependable for developers. These contributions reflect the collaborative spirit that drives the ongoing success of Wheels.
Adam Larsen
Contributed as a Software Developer
Adam Larsen contributed to the Wheels framework by improving functionality and addressing issues that enhanced the stability and reliability of the codebase. His work helped refine features and ensure a smoother experience for developers, supporting the ongoing growth and maintenance of the project.
Share Your Experience!
We'd love to hear about your experience! Would you take a moment to share a testimonial?