The scenes

Thirty-two, in four categories. Three come byte-identical from jasalt/jolt-android-experiment with their sha256 verified, and the other twenty-nine are ports from raylib-jlt.

Frame rates are measured on an iPhone 17 Pro running iOS 26.6.1, with the probe seam described in a REPL on the phone. Anything at 58 or 59 is vsync-limited and has headroom; the numbers below 58 are the ones that were tuned to get there.

Generative

sceneper framefpsnotes
Spirograph~1000 lines55draws itself, then resets
Kaleidoscope708 lines5860-point trail, twelve-fold symmetry
Fireworks~120 circles58seeded, so it replays identically
Penrose340 triangles, ~2400 calls57P3 tiling by deflation
Fourier Epicycles~200 lines59a square wave, drawn by circles
Flow Field90 particles, 8-point trails54the first port the budget bit
Lorenz450 lines, re-projected each frame58see the sweep in performance
Life1470 rectangles falling to ~67059reseeds itself when the board stalls
Bullet Spiral~350 circles59the count is bounded by how fast a bullet leaves

Fractals

sceneper framefpsnotes
Hilbert Curve1023 lines60order 5, drawn progressively
Fractal Tree511 lines59sways; the only light-background scene
L-system Plant1488 segments59static once grown, which is why it is cheap
Automata2551 rectangles58scrolls; rules cycle on a timer

Toys

sceneper framefpsnotes
Following Eyes6 circles59byte-identical from the Android experiment
Touch Trail~40 circles59byte-identical; the first scene here that wanted a finger
Boids2025 distance tests, 90 draws52the cheapest drawing and the dearest thinking
Double Pendulum~200 trail points59chaotic, so it never repeats
Starfield~300 points58seeded
Tesseract32 lines59the cheapest scene here, and a useful control
Colour Wheel540 vertices59rlgl immediate mode
Sine & Cosine~600 lines58the projections, and their traces
Clock42 rectangles59libc time() through the FFI
Pie Chart186 vertices58segments sized per wedge
raylib Logo4 rectangles and a word58nothing eased, on purpose
Easings405 lines and 15 dots58all fifteen curves on one clock
Angles13 lines and a circle59the two lines every circular scene here uses
Writinga few lines of text58the only scene that animates text
Ball Physics9 circles58restarts when everything settles
Random Sequence24 rectangles57a permutation, not independent draws
Collision Area3 rectangles59follows a finger, and drifts without one
Dashed Line~24 short lines58equal dashes, by walking the unit vector

Games

sceneper framefpsnotes
Flappy Bird~30 shapes59byte-identical from the Android experiment

What byte-identical means

Three scenes and the three namespaces carrying the scene contract were copied from the Android experiment without a character changed, and tools/extract-from-notebooks verifies their sha256 on every extraction.

They were written for Android. They run here untouched because the contract they were written against never mentions a platform: a scene is :init, :update, :draw and :dispose over immutable state, and every raylib call lives in raylib.gallery's drawing methods instead.

That is the whole argument for the split, and it is the reason the other twenty-four ports were mechanical rather than rewrites. See porting an example for what a port actually involves.

Adding one

Four touchpoints, listed in CONTRIBUTING.md. The short version is a pure .cljc under src/raylib/scenes/, a test beside it, a draw-scene! method in raylib.gallery, and an entry in the category list.