ClojureScript interface to Facebook's React
Pull request Compare This branch is 1733 commits behind omcljs:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


A ClojureScript interface to Facebook's React.

Om allows users to represent their UIs simply as EDN. Because ClojureScript data is immutable data, Om can always rapidly re-render the UI from the root. Thus Om UIs are out of the box snapshotable and undoable and these operations have no implementation complexity and little overhead.


(ns example
  (:require [om.core :as om :include-macros true]
            [om.dom :as dom :include-macros true]))

(defn widget [data]
    (dom/div nil "Hello world!")))

(om/root {} widget js/document.body)

The repo includes several simple examples you can build yourself. If you view the project.clj you will see their build identifiers. Assuming you have Leiningen installed, to build an example run:

lein cljsbuild once build-id

Then open the corresponding index.html in your favorite browser.

For a more fleshed-out example, please see the Om implementation of TodoMVC exists here.


There's no commitment yet to an API. Still, the code has fairly verbose docstrings for the existing functionality.

There is a conceptual overview that we recommend reading as there are some design choices in Om that make it quite different from other client side solutions and even React itself.

HTML Syntax

Om is not opinionated about HTML syntax, third parties can provide the preferred flavors over the React.DOM api. Alternative syntaxes will be listed here:

Using it

Om is pre-alpha software.

Make sure you have Leiningen installed, then clone the Om repo and install it locally with lein install.

Your project.clj should include something like the following:

(defproject foo "0.1.0-SPAPSHOT"
  :dependencies [[org.clojure/clojure "1.5.1"]
                 [org.clojure/clojurescript "0.0-2127"]
                 [om "0.1.0-SNAPSHOT"]]

For local development your lein-cljsbuild settings should look something like this:

:cljsbuild { 
  :builds [{:id "dev"
            :source-paths ["src"]
            :compiler {
              :output-to "main.js"
              :output-dir "out"
              :optimizations :none
              :source-map true}}]}

Your local development markup should include something like the following:

<script src=""></script>
<script src="out/goog/base.js" type="text/javascript"></script>
<script src="main.js" type="text/javascript"></script>
<script type="text/javascript">goog.require("main.core");</script>

For production your lein-cljsbuild settings should look something like this:

:cljsbuild { 
  :builds [{:id "release"
            :source-paths ["src"]
            :compiler {
              :output-to "main.js"
              :optimizations :advanced
              :pretty-print false
              :preamble ["react/react.min.js"]
              :externs ["react/externs/react.js"]
              {:non-standard-jsdoc :off}}}]}

This will generate a single file main.js.


No pull requests at this time please.

Om is still in the design phase so enhancements are low priority. However, bug reports are welcome for the existing functionality.

For a sense of where Om is going the existing issues give a rough idea.

Copyright and license

Copyright © 2013-2014 David Nolen

Licensed under the EPL (see the file epl.html).