Guide

Four ports of the same game, one per Clojure-family runtime, kept side by side so the differences are readable. The game itself is a pretext. What the repo is actually for is showing what changes when the same Clojure crosses into C four different ways, and what does not.

New here? getting-started.md gets one of the four on screen in a couple of minutes.

Read in this order the first time:

PageWhat it covers
getting-started.mdInstall raylib, pick a port, run it, run it unattended.
architecture.mdWhy four standalone copies rather than one library with four backends, and the shape inside each.
the-game.mdThe half that barely changes. State, the frame step, tile-centre movement, the four ghost personalities.
crossing-to-c.mdThe comparison. How each runtime reaches raylib, what each FFI will and will not carry, and what that costs.
drawing-pac-man.mdOne shape, two implementations, and the angle convention that breaks silently.
running-unattended.mdDeadlines, screenshots, and why the clock is game time rather than wall time.

Then the per-runtime pages, which assume the four above:

PageRuntime
babashka.mdbabashka over babashka.ffi
clojure.mdClojure on the JVM over raylib-clj, coffi and Panama
jank.mdjank over cpp/ interop
jolt.mdjolt over jolt.ffi

And when you want to change something:

PageWhat it covers
contributing.mdThe gate, why a rendered frame is one of them, and how to add a runtime.

Each example directory also carries its own README.md, which is the short operational version: how to run it, what it needs installed, what bites.

Find your scenario

ScenarioPages to read
"I want to try this out"Getting started
"I want to understand how it works"Architecture, then the game
"I came for the FFI comparison"Crossing to C, then the runtime page you care about
"Something renders wrong"Drawing Pac-Man
"I want to contribute a change"Contributing

A note on what is measured here

Every claim in these pages about a runtime's behaviour was run rather than remembered, on macOS 15 and an Apple M1 Pro, in September 2026. Where a number appears, it came from a probe in this repo. Where something is described as failing, it failed and the error text is quoted. The versions in play were babashka 1.13.220, jank 0.1-alpha with raylib-sys 2026.09-3, jolt 0.8.10, and raylib 6.0 from Homebrew.

That matters most for the jank page. jank is alpha and moves quickly, so a constraint described there may have been lifted since.