Skip to content
View burinc's full-sized avatar
πŸ’­
Coding with pragmatic Lisp/Clojure/ClojureDart/AI/Claude Code
πŸ’­
Coding with pragmatic Lisp/Clojure/ClojureDart/AI/Claude Code

Highlights

  • Pro

Block or report burinc

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
burinc/readme.md

Burin Choomnuan

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.

Website Articles LinkedIn X


🎀 Speaking

πŸ”œ 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-:watch architecture 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

Meetups

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

πŸŽ™οΈ Interview

Clojure Corner β€” Interview with Burin Choomnuan Β· Flexiana β€” on Clojure, tooling, and building things in the open.

🀝 Community

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.


✍️ Writing

I write at Clojure Civitas β€” 11 articles, mostly browser-native ClojureScript with Scittle:

Article Date
Making Fun Games with Clojure + Raylib Feb 2026
Clojure Conj 2025 β€” Two Lies and a Truth Trivia Nov 2025
Browser-Native PDF Viewer with ClojureScript & Scittle Nov 2025
Web Audio API Playground with ClojureScript & Scittle Nov 2025
Build Galaga with ClojureScript & Scittle Nov 2025
Build Asteroids with ClojureScript & Scittle Nov 2025
Build a Memory Game with ClojureScript & Scittle Nov 2025
Browser-Native QR Code Scanner with Scittle Nov 2025
Free Weather Data with the National Weather Service API Nov 2025
Python + ClojureScript: Pyodide Integration with Scittle Nov 2025
Building Browser-Native Presentations with Scittle Nov 2025

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


πŸ› οΈ What I build

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

Tetris
bb tetris
Space Invaders
bb space-invaders
Boids flocking
bb boids
Waving cubes in 3D
bb waving-cubes
Rotating point cloud
bb point-cloud
Solar system in rlgl
bb rlgl-solar-system

The interesting part is the ABI. raylib passes structs by value everywhere and Chez's foreign-procedure cannot, so each struct gets the treatment its size actually earns: Color rides in one register as a packed :uint, Camera2D/Camera3D go by pointer, and Vector2/Vector3 geometry 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

Physically based rendering
bb basic-pbr
Magnifying glass over a texture
bb magnifying-glass
Cel-shaded model
bb cel-shading
Real-time shadow mapping
bb shadowmap-rendering
Audio spectrum visualizer
bb spectrum-visualizer
Skeletal animation blending
bb animation-blending

Here there is no FFI at all. (:include "raylib.h") in the ns form 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

Tetris
bb tetris
Asteroids
bb asteroids
Parallax background scrolling
bb background-scrolling
Shader-based dynamic lighting
bb basic-lighting
Orbiting solar system in 3D
bb solar-system
Lorenz attractor
bb lorenz-attractor

This is the one where the runtime does the marshalling for you. A binding is a single defcfn naming the C symbol and its types, and Panama builds the downcall from that description β€” so the by-value Color that Jolt hand-packs into a :uint is just a {:r 255 :g 0 :b 0 :a 255} map here, serialized from a defalias layout. The seam shows where raylib mutates through a pointer: those calls allocate in a confined-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

Pong
Lesson 1 β€” Pong
Breakout
Lesson 2 β€” Breakout
Snake
Lesson 3 β€” Snake
Space Invaders
Lesson 4 β€” Space Invaders
Tetris
Lesson 5 β€” Tetris
Flappy Bird
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

Counter demo
jolt counter
Todo task board
jolt todo
7GUIs CRUD task
jolt crud
7GUIs Flight Booker task
jolt flights
7GUIs Temperature Converter task
jolt temperature
7GUIs Timer task
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


🌱 Open source

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.


πŸ“« Elsewhere

🌐 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.

Pinned Loading

  1. b12n-gamedev-course b12n-gamedev-course Public

    A free course that teaches Lisp and game programming as one thing β€” six phases from your first line of Clojure to a shipped game, built on raylib across three Lisps

    Clojure 6

  2. b12n-raylib-jlt b12n-raylib-jlt Public

    91 raylib examples in Jolt: native Clojure on Chez Scheme, binding libraylib 6.0 directly over its C ABI

    Clojure 12

  3. b12n-raylib-jnk b12n-raylib-jnk Public

    209 raylib examples in jank β€” native Clojure compiled to native code via C++/LLVM, calling raylib directly through jank's C++ interop

    Clojure 2 1

  4. b12n-raylib-clj b12n-raylib-clj Public

    113 raylib 6.0 examples in Clojure, calling libraylib directly from the JVM over coffi and JDK 22+'s Panama Foreign Function & Memory API, with no wrapper layer

    Clojure 2

  5. glitter glitter Public

    A Replicant-style GTK4 renderer for Jolt: one state atom, a pure state -> hiccup view, and event handlers as data. Native Clojure on Chez Scheme, no JVM.

    Clojure 2

  6. clojurecivitas.github.io clojurecivitas.github.io Public

    Forked from ClojureCivitas/clojurecivitas.github.io

    An open effort to structure learning resources with meaningful connections.

    Clojure 1