The story

One demo I couldn't record.

foley started as one demo. I was building a TUI that draws pixel art straight into the terminal, went looking for a recorder, and found VHS, which won me over on sight: write the demo as code, a .tape script instead of a shaky screen recording. I still think that model is exactly right. But my app speaks the kitty graphics protocol, and those pixels never arrived on the recording, because the screen being filmed didn't speak it.

I loved the workflow and couldn't use it, so my first move was to fix it at the source: teach VHS the kitty graphics protocol. But VHS films an xterm.js terminal, and xterm.js doesn't render kitty graphics. Getting it there is a long road through a project that hasn't chosen to walk it, and waiting on that meant shelving the tape workflow indefinitely. The only route that kept both the authoring model and the pixels was to render the terminal myself.

That one decision turned out to carry the whole project.

When the frame is yours from the pty up, things stop being features you bolt on and start being consequences of the architecture:

So that's foley: VHS's authoring model, kept whole, plus the post-production that a rendered terminal makes possible.

$ brew install GH-Jaider/foley/foley
Back to the projection room