Senior Principal Engineer at NewsCorp Australia β ClojureDart, AI, full-stack.
Two decades in software, and I have moved with the landscape: Java β Ruby β Clojure β ClojureScript β and most recently ClojureDart for mobile and desktop. Over the past year a tiny team and I have shipped a fleet of production ClojureDart apps for iOS, Android and macOS, alongside Clojure backends and ClojureScript SPAs that share a single mental model end to end.
My current interest is where functional programming meets AI-assisted development: building maintainable agentic workflows in Clojure, and sharing the patterns and pitfalls a small team learns by shipping at pace. When I'm not coding I'm writing experience reports for developers who appreciate the art of elegant, productive engineering.
π£οΈ Speaking at Clojure/Conj 2026 β and generally available to talk about ClojureDart, MCP/agent tooling, and using LLMs in real engineering workflows. Get in touch.
π Clojure/Conj 2026 β Charlotte, NC
Production ClojureDart for iOS, Android, and macOS π Friday, October 2 Β· 9:30β10:10 AM Β· Room W207CD
Over the past twelve months a tiny team has used ClojureDart (Clojure compiled to Dart, running on Flutter) to build more than a dozen production apps β a document scanner with on-device OpenCV, a transit tracker with realtime GTFS, a venture-capital deck triager with on-device LLM evaluation, a notes app with on-device sentence embeddings, a marketplace, an encyclopedia, a financial charting app, and more. This experience report distills the patterns that survived the trip from prototype to production: a single-atom-plus-
:watcharchitecture that replaces Riverpod and BLoC, a curated catalog of cljd-flutter pitfalls, and a reusable scaffold for new apps.
My second year on the Conj stage.
πΊ Clojure/Conj 2025 β Charlotte, NC Β· Nov 2025
From Scripts to Buy-In: How Small Clojure Wins Create Big Opportunities
How small, high-impact Clojure automation β AWS workflows, replacing clunky Postman processes, automating Okta SSO β builds the credibility that earns you bigger Clojure opportunities at work.
βΆ Watch the talk Β· π My recap from Charlotte
| Talk | Venue | Date |
|---|---|---|
| raylib, driven from Lisp Open-mic demo of raylib β a C game library β driven from Lisp, across all three suites: Jolt on Chez Scheme, jank via C++/LLVM, and JVM Clojure over Panama β plus the screen-capture and UI-automation tooling built to record their demo GIFs instead of testing by hand. All three suites are open source now; the capture tooling is still unreleased. |
02Ship Sydney Meetup Level 2, 63 Dixon St, Haymarket |
Aug 2026 |
| Three lenses, one mess: logic programming for the rest of us One RBAC authorization bug through three lenses, all in plain Clojure data β Prolog for role inheritance, Z3/SMT-LIB for conflicting constraints, a Mermaid-to-Prolog translation for reachability. Live REPL demo, closing on exposing solvers as LLM tools over MCP, where not hallucinating is the whole advantage. |
FP-SYD Microsoft, North Sydney |
Jun 2026 |
| Supercharging Lisp with AI: Rapid Feedback Loops with Clojure and Claude Code Lightning talk to a room of 100+ builders. The demo ran on ClojureDart β Clojure compiled to Dart on Flutter β with a live REPL plugged straight into the running widget tree. That's the loop that lets Claude Code edit, hot-reload and assert against live UI in milliseconds instead of minutes. |
AI SYD Vercel Γ Relevance AI, Surry Hills |
Apr 2026 |
| The Anthropic Claude Ecosystem 66 slides end to end: ~/.claude as a personal AI config layer, Claude Code across CLI/IDE/desktop/CI, the agentic loop, MCP hosts and servers, and Agent Skills' three-level progressive disclosure. π Slides Β· PDF |
Vibe Code Meetup Sydney |
Feb 2026 |
| Clojure for Java Developers β Building MCP Servers Without the Java Pain Cut a 350+ line Spring AI MCP server with 15+ annotations down to 180 lines with zero annotations, keeping full enterprise capability. |
Sydney JVM Community Canva HQ, Sydney |
Jul 2025 |
| Clojure for the Type-Loving Functional Programmer What Clojure offers a typed-FP audience, beyond the dynamic typing and the parens. |
FP-SYD | Jul 2025 |
| Java/Spring Boot Troubleshooting on Steroids with Clojure REPL Debugging Spring Boot from a Clojure REPL, set directly against traditional remote debugging in IntelliJ. Live coding on a sample app: debug, explore and modify at runtime with no restart and no redeploy. |
Sydney Java Meetup #22 Infomedia, Sydney |
Mar 2025 |
| Bridging Two Worlds β Leveraging Lisp-like Tools to Work with Python Scripting, extending and manipulating Python from Clojure with Basilisp and libpython-clj. |
SYDJANGO | Dec 2024 |
| Overview of Clojure for FP Live demos: libpython-clj via OpenCV, GraalVM via Babashka, AWS automation with the Cognitect AWS library, whisper.clj transcription, plus Rama and Jank. |
FP-SYD | Aug 2024 |
Clojure Corner β Interview with Burin Choomnuan Β· Flexiana β on Clojure, tooling, and building things in the open.
I co-host Gen AI Enthusiasts (AI Users), a 2,000+ member online generative-AI community running fortnightly sessions on prompt engineering, AI tooling and news, and practical LLM use.
I write at Clojure Civitas β 11 articles, mostly browser-native ClojureScript with Scittle:
Plus b12n.net ("Lisp's Revenge"), my own blog β built with Clojure/Cryogen β where I keep browser-native slide decks: Mastering Claude Code Β· Diagrams as Text
ClojureDart in production. More than a dozen apps for iOS, Android and macOS in the past year β on-device OpenCV document scanning, realtime GTFS transit tracking, on-device LLM evaluation and sentence embeddings, charting, marketplaces. Most deployed internally, several bound for the app stores. That's the Conj 2026 talk.
Lisp beyond the JVM. Two suites of raylib demos written in two different native Clojures β no JVM in either β each reaching the same C game library the way its own host actually allows.
b12n-raylib-jlt β 75 examples in
Jolt, native Clojure on Chez Scheme. They call the
real libraylib directly over its C ABI through jolt.ffi: no wrapper library, no
codegen, no C shim. 10 games, 12 in 3D, 32 shapes, 7 generative.
π Docs & full gallery
![]() bb tetris |
![]() bb space-invaders |
![]() bb boids |
![]() bb waving-cubes |
![]() bb point-cloud |
![]() bb rlgl-solar-system |
The interesting part is the ABI. raylib passes structs by value everywhere and Chez's
foreign-procedurecannot, so each struct gets the treatment its size actually earns:Colorrides in one register as a packed:uint,Camera2D/Camera3Dgo by pointer, andVector2/Vector3geometry is drawn through rlgl's scalar immediate mode.
b12n-raylib-jnk β 209 of the 217 official
raylib examples, ported to jank: Clojure compiled to a real native
binary through C++/LLVM. The shapes, shaders, audio and text categories are complete.
π Docs & full gallery
![]() bb basic-pbr |
![]() bb magnifying-glass |
![]() bb cel-shading |
![]() bb shadowmap-rendering |
![]() bb spectrum-visualizer |
![]() bb animation-blending |
Here there is no FFI at all.
(:include "raylib.h")in thensform hands the real header to the C++ compiler, and raylib becomes ordinary interop βcpp/BeginDrawing,cpp/RAYWHITE,(cpp/Camera3D (cpp/Vector3 ...) ...). The by-value structs that cost Jolt a hand-written marshalling strategy are just constructor calls. No binding DSL, no generated shim.
b12n-raylib-clj β 91 examples in JVM Clojure, over coffi and JDK 22+'s Panama Foreign Function & Memory API. 32 core, 21 models, 18 shapes, 9 games, plus audio, text, textures and shaders. π Docs & full gallery
![]() bb tetris |
![]() bb asteroids |
![]() bb background-scrolling |
![]() bb basic-lighting |
![]() bb solar-system |
![]() bb lorenz-attractor |
This is the one where the runtime does the marshalling for you. A binding is a single
defcfnnaming the C symbol and its types, and Panama builds the downcall from that description β so the by-valueColorthat Jolt hand-packs into a:uintis just a{:r 255 :g 0 :b 0 :a 255}map here, serialized from adefaliaslayout. The seam shows where raylib mutates through a pointer: those calls allocate in aconfined-arena, and the arena's lifetime is the one thing the abstraction will not hide from you.
Three hosts, one C library: Chez Scheme, C++/LLVM, and the JVM β reading the same example three ways is the clearest map I know of where each runtime puts the boundary.
And then teaching it. b12n-gamedev-course is what those 375 examples were for β a free course that teaches Lisp and game programming as one thing, not "game dev, incidentally in Lisp." Six phases take you from never having written a line of Lisp to a capstone, and every lesson builds a real, playable game that teaches a Lisp idiom at the same time. Phase 3 is the one only those three suites make possible: port a game you wrote across all three, and watch the boundary to C move under it. π Read the course
![]() Lesson 1 β Pong |
![]() Lesson 2 β Breakout |
![]() Lesson 3 β Snake |
![]() Lesson 4 β Space Invaders |
![]() Lesson 5 β Tetris |
![]() Lesson 6 β Flappy Bird |
Those are the course's own games, running from its
exercises/code on its own vendored engine β the thing a student actually ends up with, not a borrowed screenshot. Lessons are CC BY-SA 4.0 and the code EPL-2.0, so teaching from it at a meetup or a classroom needs nothing from me. Phases 0 to 3 stand on the three public suites today; the later phases open up as the remaining sibling repos do.
Desktop GUI, the Replicant way. glitter is a
GTK4 renderer for Jolt that follows
Replicant's model rather than React's: one
application-state atom, a pure state -> hiccup view function, top-down re-render on every
change, and event handlers that are data β [[:action/inc]], not closures. No
component-local state anywhere. 43 widget tags so far; the six demos below are two basics
plus four 7GUIs tasks.
π Docs & guide
![]() jolt counter |
![]() jolt todo |
![]() jolt crud |
![]() jolt flights |
![]() jolt temperature |
![]() jolt timer |
Clojure meets AI. Agentic workflows, MCP servers, and LLM-driven developer tooling are where most of my time goes now. A lot of that work is private for the moment β so the patterns tend to surface in talks and articles before the code does.
Public bits: b12n-gamedev-course Β· b12n-raylib-jlt Β· b12n-raylib-jnk Β· b12n-raylib-clj Β· glitter (Replicant-style GTK4 for Jolt) Β· dartclojure.el (Dart/Flutter β ClojureDart, in Emacs) Β· viip Β· Clojars Β· RubyGems
Most recent is jolt-lang/jolt
itself β 15 commits across July and August 2026 to the Clojure-on-Chez-Scheme host: :string
carrying NULL in both directions through the FFI, fiber-parking for subprocess pipe I/O, and
a cross-compilation path (tarm64osx β ta6osx via Chez xpatch, macOS β Linux via zig cc)
with a CI cross-smoke workflow behind it. It is the runtime under both
b12n-raylib-jlt and
glitter, so the patches tend to fall out of building on it.
Longer-running: contributions to babashka/process, bhauman/clojure-mcp, zero-one-group/geni, BrunoBonacci/graalvm-clojure, yogthos/Selmer, clojure-emacs/clomacs, dundalek/closh, juxt/mach, apache/incubator-mxnet, and others.
π Two handles, one person. @agilecreativity is my original account, from before I found Clojure β a lot of my older OSS commits live there. @burinc is where I work now.
| π Blog | b12n.net |
| πΌ LinkedIn | in/burinc |
| π¦ X | @agilecreativity |
| βοΈ Articles | Clojure Civitas |
| π GitHub | @burinc Β· @agilecreativity |
Lisp Β· Clojure Β· ClojureDart Β· Emacs Β· and a stubborn belief that small tools compound.





























