Release · 2026

blow-cl 0.5.0 — Anthony Green's BLOW reborn: Lisp web apps on the modern JVM

blow-cl is a modern rewrite of BLOW (2007–2010), the Common Lisp web framework for the JVM. Same tiny programming model — dispatchers, cl-who pages, .blo templates, sessions — with everything underneath replaced: ABCL 1.9 from Maven Central, embedded Jetty 11, Gradle 8, and Quicklisp-current libraries.

News · · 2 min read

blow-cl 0.5.0 — Anthony Green's BLOW reborn: Lisp web apps on the modern JVM

Another revival, in the Poplog tradition of taking a good idea the toolchain abandoned and rebuilding the toolchain: blow-cl 0.5.0 is a modern rewrite of BLOW — “A Web Application Framework in LISP” by Anthony Green, 2007–2010.

BLOW’s idea was ahead of its time: write web applications in Common Lisp, run them on boring, deployable Java servlet infrastructure. The idea aged well; the 2009 toolchain did not. blow-cl keeps the programming model and replaces everything underneath it:

2009 BLOW blow-cl
Makefile + magic blow shell script Gradle 8 (./gradlew run), nothing else
Winstone 0.9.10 / Tomcat 6 jars Embedded Jetty 11 (Jakarta Servlet 5)
Vendored 2009 abcl.jar ABCL 1.9.x from Maven Central
jfli interop (abandoned) ABCL’s built-in JAVA package
Vendored 2009 cl-who / cl-ppcre / cl-emb Quicklisp-current versions, loaded at boot
log4j 1.2.13 slf4j 2

The model stays tiny

A dispatch list tried in order per request, pages as cl-who forms or plain HTML-returning functions, .blo templates (HTML with embedded Lisp via cl-emb), and sessions your app defines by exporting one function. A whole app:

(defun make-user-session () (random 1000000))

(def-who-page page-hello (request response session)
  (:html (:body (:p "Hello from Lisp. Session: " (str session)))))

(push (create-prefix-dispatcher "/hello" #'page-hello) *dispatch-list*)

Static files are served automatically — now with the path-traversal and WEB-INF protection the 2009 original didn’t have. ./gradlew run on any JDK 11+ gets you the demo on port 9999; -Pwebapp=/path/to/your/app runs yours.

LGPL-3.0, like the original. Source on github.com/IoTone/blow-cl.

releasecommon-lispabcljvmjettyweb-frameworkrevivallgpl