Placeholder write-up. Replace this body with the real account; the frontmatter above already carries the fields the layout renders.
The problem
A still image on a landing page is inert. A canvas of particles that responds to the cursor is not, but hand-authoring one per image does not scale.
The approach
Split the work in two. A Python pipeline turns any image into a sampled point cloud: grayscale, multi-scale edge extraction, then Poisson-disc sampling so points land where the detail is. The runtime knows nothing about images. It loads a cloud, spawns particles at rest positions, and simulates.
Because the two halves only share a serialisation contract, either can be replaced. The demo below proves it in both directions. Uploads go to the Python service and come back as a cloud the renderer accepts unchanged, and when that service is down a much simpler JavaScript tracer stands in without the renderer noticing. The corona on this site’s home page is not traced from an image at all. It is generated parametrically and loaded by the same runtime.
What I would do differently
To be written.