A circus that ended years ago and has not noticed. One page, Spanish first, on a Cloudflare Worker — and because the soundtrack needed making, the project grew an audio editor, which now publishes the finished track and a sheet of timestamps the site reads to throw its own lights in time with the music.
- Two languages, one page
- Spanish is in the HTML so the page works with JavaScript off; English is a toggle. Written for a border town where half the audience reads each, and translated for Tecate rather than for a dictionary.
- A sign that fails properly
- Bulbs distributed along an SVG path with a fixed burnt-out pattern and a chase. The lettering, the bulbs and the misregistered red plate all die on one clock, so it reads as a single outage rather than three unrelated glitches — and unlit letters go darker than their surroundings rather than transparent, the way physical letters do.
- The flier prints itself
- Generated to an unlisted page at exact US Letter size, scaled to fit a phone without reflowing so the crew can check it before a print run. The QR is encoded from scratch — byte mode, Reed–Solomon over GF(256), all eight mask patterns scored — rather than pulled from a library.
- Eight fliers, eight URLs
- Every poster location gets its own short URL that serves the same page and records the visit in D1. Bots are filtered and the write is deferred, so counting can never delay the page someone came for. A hidden page compares the locations, so the next print run can chase whatever is working.
- An audio tool, because the score needed one
- Tramoya — Spanish for the rigging and trapdoors behind a stage, the part that makes the ghost appear. Multitrack editing in the browser: clips that split and trim without ever touching the source audio, a separate machine per row, seventeen effects written by hand against the Web Audio API, and MP3 export through LAME in a worker. Projects and audio live in R2, addressed by the hash of their own bytes, so the same track backing two projects is stored once.
- The music drives the lights
- The editor publishes the track and a cue sheet of timestamps; the site fires its blackouts, red washes and burn-outs off the audio's own clock rather than a page timer, so they land correctly whenever the visitor allows the sound to start. Both Workers share one bucket, so re-cutting the teaser is a publish rather than a deploy.