Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Lively Build Status

ClojureScript live coding with ease

Lively monitors compiled JavaScript files for changes and reloads them when they change, so that you don't have to. This creates a development environment where you can edit ClojureScript code and see the changes immediately in your browser without needing to refresh the page.

Lively does not compile ClojureScript. (I recommend using lein-cljsbuild for that.)

Lively does not provide web server for serving JavaScript files.


Add the following Leiningen dependency:

[lively "0.2.1"]



  • ClojureScript version 0.0-2202 or newer
  • ClojureScript is compiled with :optimizations set to :none
  • JavaScript files are loaded over HTTP

Simply include call to lively/start somewhere in your ClojureScript codebase, passing the location of the main JavaScript file (this is the value of src attribute of the script tag loading the file in your HTML markup):

  (:require [lively.core :as lively]))

(lively/start "/js/hello.js")

Call to start is idempotent, it is safe to call it multiple times.

The followig options can be passed as an optional options map:

  • :polling-rate: Milliseconds to sleep between polls. Defaults to 1000.
  • :on-reload: Callback function to call after files have been reloaded.

For example:

(lively/start "/js/hello.js" {:polling-rate 500
                              :on-reload    (fn [] (.log js/console "Reloaded!"))})


  • Minimalistic example project can be found in example directory.
  • Lively Snake Demo showcases implementing a snake game using Lively

How does it work?

Lively monitors changes in JavaScript files by making consecutive HEAD requests to the server. When ClojureScript files are compiled, the main JavaScript file is always is generated again and this change is noticed by Lively. Lively finds out which namespaces have changed by making HEAD requests for each namespace-specific JavaScript file and reloads ones that have changed.


Copyright © 2014-2015 Immo Heikkinen

Distributed under the Eclipse Public License, the same as Clojure.