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.

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.