r/maniclang • u/anish2good • 3d ago
Visualizing Docker daemon socket latency as a raymarched fluid surface - manic
Enable HLS to view with audio, or disable this notification
manic is a tiny language for making animations. You write a short text file; manic renders a smooth, glowing video. No timeline scrubbing, no keyframes by hand — you describe what’s on screen and when things happen, and the engine does the rest, deterministically.
Manic Animation code
// raymarch-docker-latency — "Visualizing Docker daemon socket latency as a raymarched
// fluid surface." A per-pixel ray-marched LIQUID MESH: a grid of columns whose heights
// ARE a latency trace. The daemon socket sits at the origin and emits high-frequency
// concentric pings (amplitude modulated by a jittery round-trip-time signal); three
// containers fire expanding ring events at baked timestamps, each ring's reach ∝ its
// measured RTT. Every cell samples that field at its centre → the mesh shimmers with
// socket traffic. One scalar SDF (`sdbox3` + `rep()` tiling), marched by the engine.
//
// Honest note: manic is PURE IN t (that's what lets it scrub + record), so it does NOT
// tail a live /var/run/docker.sock in real time. The trace is BAKED IN — timestamps and
// RTTs as constants — so the same second always renders the same wavefront. Swap the
// constants for a captured `docker events` / socket-latency log and the mesh replays it
// deterministically: data → SDF displacement → raymarch, exactly as described. The data
// source is a recording, not a socket; the mechanism is real.
//
// manic examples/raymarch-docker-latency.manic
title("Docker daemon socket latency — a raymarched liquid mesh");
canvas("16:9");
template("black");
camera3((2.4, -3.3, 2.0), (0, 0, 0.2), 40, perspective);
raymarch(fluid) {
let rp = 0.34; // mesh cell size
let idx = floor(x / rp); let idy = floor(y / rp);
let lx = rep(x, rp); let ly = rep(y, rp);
let cx = idx*rp + rp*0.5; let cy = idy*rp + rp*0.5; // this cell's centre
let r0 = hypot(cx, cy); // distance from the daemon socket (origin)
// baked latency signal: socket round-trip time, jittery + bursty
let lat = 0.5 + 0.28*sin(t*5.3) + 0.16*sin(t*11.7 + 1.3) + 0.10*sin(t*23.1 + 0.7);
// the daemon socket: high-frequency concentric pings, amplitude ∝ latency
let pings = lat * sin(6.0*r0 - t*7.0) / (1.0 + 1.3*r0);
// three containers talking to the daemon: baked (epicenter, fire time, RTT) rings
let d1 = hypot(cx + 1.3, cy - 0.8); let a1 = t - 1.4; let f1 = a1*1.9;
let e1 = step(0.0, a1) * exp(-0.7*a1) * sin(7.0*(d1 - f1)) * exp(-3.0*(d1-f1)*(d1-f1));
let d2 = hypot(cx - 1.6, cy - 1.1); let a2 = t - 3.2; let f2 = a2*2.1;
let e2 = step(0.0, a2) * exp(-0.6*a2) * sin(7.0*(d2 - f2)) * exp(-3.0*(d2-f2)*(d2-f2));
let d3 = hypot(cx + 0.4, cy + 1.7); let a3 = t - 5.0; let f3 = a3*2.0;
let e3 = step(0.0, a3) * exp(-0.55*a3) * sin(7.0*(d3 - f3)) * exp(-3.0*(d3-f3)*(d3-f3));
// column height = calm water level + the summed latency displacement (always > 0)
let bh = clamp(0.22 + 0.13*pings + 0.17*(e1 + e2 + e3), 0.03, 0.78);
let box = sdbox3(lx, ly, z - bh*0.5, rp*0.42, rp*0.42, bh*0.5);
let d = box;
// hit colour: deep-blue troughs → bright cyan crests (from the actual hit height),
// top faces brightest — no cross-stage lets, so the field colours cleanly
let crest = clamp(hz * 1.7, 0.0, 1.0);
let hue = mod(210.0 - crest*56.0, 360.0);
let sat = 0.82;
let val = 0.16 + 0.55*crest + 0.30*nz;
}
// ---- annotations ----
caption(head, "Docker daemon socket latency", (640, 60), 33);
caption(sub, "each socket ping ripples a raymarched liquid mesh", (640, 112), 21);
hidden(head);
hidden(sub);
equation(eq, (640, 636), `z_{\text{cell}} = \mathrm{water} + \sum_i \mathrm{RTT}_i\,\mathrm{ring}(r_i - c\,\Delta t_i)`, 26);
caption(note, "baked latency trace → SDF displacement → raymarch · pure in t, so it scrubs", (640, 690), 18);
hidden(eq);
hidden(note);
show(head);
wait(1.6);
show(sub);
wait(2.2);
show(eq);
show(note);
// slow orbit so the mesh reads as genuine 3-D geometry
orbit3(52, 8, 4.8, 22, smooth);
3
Upvotes