Skip to content


Subversion checkout URL

You can clone with
Download ZIP

Release 3.5.0

@seancorfield seancorfield released this

The major new features in FW/1 3.5.0 are:

  • Subsystems 2.0. A new, more streamlined way to add subsystems to an existing FW/1 application has been added. Thank you to Steven Neiland for the inspiration and guiding principles! Read about Subsystems 2.0 and how they differ from the older approach (which is still supported). The examples have been reworked to use Subsystems 2.0 so you can see how it works in practice.
  • An Alternative Application Structure is now supported that allows you to create FW/1 applications that do not require Application.cfc extends the FW/1 component. Read about the Alternative Application Structure. Some of the examples have been updated to use this approach so you can see how it works in practice.
  • Clojure integration. If you have Leiningen installed (Clojure's build tool) then it is very easy to write services and/or controllers in Clojure and have FW/1 automatically integrate those into your CFML application. Read about mixing CFML & Clojure for more details. An example of Clojure integration is provided in the repository (you'll need Leiningen installed for that example to run).
  • ForgeBox / CommandBox support. FW/1 now has a box.json file and is hosted on ForgeBox so it can be easily installed via CommandBox.

In addition to the major features, the following enhancements have been added:

  • redirect() allows queryString to be a struct, like buildURL().
  • isFrameworkReloadRequest() is now public in case an application needs to take action when the framework is reloaded.
  • getSubsystemSectionAndItem() added to supplement getFullyQualifiedAction() (the latter omits the subsystem if it is empty).
  • The WireBox adapter now supports custom binders.
  • The conventions used for various folder names can now be overridden in the framework configuration.

And the following bugs have been fixed:

  • 377 - AOP/1 now allows a single interceptor to be applied to multiple objects.
  • 361 - renderData() could kill sessions (this was backported to 3.1.1).
  • 336 - account for expandPath() returning the wrong directory on ACF11 when the path has a trailing /.

Finally, FW/1 includes experimental support for Lucee Language, so if you are running a prerelease build of Lucee Server that has Lucee Language support enabled, you can write controllers and views etc in .lc or .lucee files and FW/1 will use them.

You can read the full list of changes since 3.1 on GitHub, along with
accepted pull requests since 3.1.


Release 3.5.0 RC 2

@seancorfield seancorfield released this · 37 commits to develop since this release

Changes since RC 1:

  • Fix layout display issue when using non-default subsystem delimiter #376 @dfair98
  • Fix subsystem model management behavior (regression from 3.1) #378
  • Fix subsystem delimiter edge case (regression from 3.1) #379
  • Expose Clojure integration example conditionally (as app and as subsystem) #380
  • Add internal trace type #381 @ryanguill
  • Fix AOP/1 issue with multiple interceptors #382 ( #377 ) @dbudde


Release 3.5.0 RC 1

@seancorfield seancorfield released this · 52 commits to develop since this release

Changes since Beta 2:

  • Fixed concurrent modification exception in edge case DI/1 setter analysis #375
  • Improved debugging of DI/1 metadata failures (by adding more information to exceptions) #374
  • Fixed view() (and layout) handling with Subsystems 2.0 #373
  • isFrameworkReloadRequest() is now public #372
  • Clojure integration should ignore editor temporary files #371
  • Subsystem bean factory handling more consistent #370
  • Updated examples that use Alternative Application Structure


Release 3.5.0 Beta 2

@seancorfield seancorfield released this · 65 commits to develop since this release

Changes since Beta 1:

Bug fixes:

  • Examples of Alternative Application Structure should work in more installations / configurations (6helloclojure, userManager)
  • Dotted CFC path deduction tweaked to fix an edge case bug


  • Add liberal plurals option (so libraries is treated as the plural of library, for example)


  • setView() / setLayout() did not respect (new) subsystems #368
  • Ignore absolute / root-relative diLocations for subsystems

Clojure integration:

  • Add server scope caching option
  • More flexible namespace-to-bean name mapping #366
  • Improved null handling in conversion functions


Release 3.5.0 Beta 1

@seancorfield seancorfield released this · 75 commits to develop since this release

Changes since Alpha 2:

  • Resolved per-application mapping issue with Alternative Application Structure in FW/1
  • Resolved edge case dotted path detection in DI/1
  • Figured out box.json ignore patterns


Release 3.1.2

@seancorfield seancorfield released this · 183 commits to master since this release

Identical to 3.1.1 with addition of box.json for ForgeBox / CommandBox usage.


Release 3.5.0 Alpha 2

@seancorfield seancorfield released this · 85 commits to develop since this release

Changes since Alpha 1:

  • Improves CFML / Clojure interop when project.clj depends on cfml-interop library.
  • Improves backward compatibility of legacy subsystem auto-detection.


Release 3.5.0 Alpha 1

@seancorfield seancorfield released this · 89 commits to develop since this release

The first "feature complete" prerelease build of FW/1 3.5.0 focuses on integration and includes:

  • Support for controllers and services to be written in CFML, Clojure, or Lucee
  • Support for views and layouts to be written in CFML or Lucee
  • Configurable folder names to set your own conventions (for controllers, layouts, subsystems, and views)
  • Support for Application.cfc to use FW/1 without extending
  • A new, cleaner, more consistent set of conventions for adding subsystems to an existing application

For a full list of changes, see


Release 3.1.1

@seancorfield seancorfield released this · 185 commits to master since this release

Reverts #342 to fix #361 -- renderData() no longer flushes content or headers generated by the application.

This should solve any problems with cross-origin headers or some session-based bugs when using REST APIs powered by renderData().

The downside is that if you output any debugging code, it will be part of the response (as it was in 3.0) and potentially break your REST call.


Release 3.1.0

@seancorfield seancorfield released this · 187 commits to master since this release

FW/1 3.1.0 "gold" release.

Changes since RC 3: None.

Full list of changes since 3.0:

Issues Closed:

Pull Requests Merged:


Something went wrong with that request. Please try again.