re-frame is a ClojureScript framework for building user interfaces that leverages React through a data-oriented, functional architecture.
The framework addresses the complexity of managing state and side effects in single-page applications by inverting the typical reactive model. Rather than making views causal through colocated queries and lifecycle hooks, re-frame treats events as the source of causality while views remain purely reactive. Application state flows through a predictable chain: events trigger state changes, derived values compute automatically from that state, and views render those derived values. This approach eliminates entire categories of bugs that arise from views managing their own state or triggering side effects independently.
re-frame suits teams building substantial single-page applications where maintainability and developer productivity matter more than minimizing dependencies. It works well for projects that will grow beyond a few thousand lines of code, where the cost of managing state chaos outweighs the overhead of a framework. The framework's use of ClojureScript provides a significant advantage over JavaScript-based alternatives: Lisp's expressive power and the maturity of the ClojureScript ecosystem mean developers avoid the constant churn of JavaScript frameworks that require major rewrites every few years. The tool's stability and production track record across applications exceeding forty thousand lines of code demonstrate its viability for long-term projects.
The project maintains a steady, deliberate development pace with regular updates that add diagnostic capabilities and refinements rather than breaking changes. Recent work has focused on programmatic diagnostics including source-meta macros, trace tag schema validation, and dry-run dispatch with effect overrides, indicating attention to developer experience and debugging workflows. The stable function API design—where core registration and dispatch functions are ordinary Clojure functions—allows them to be composed and manipulated programmatically, reflecting a philosophy that treats the framework itself as data rather than magic.