u/Garaekz

I built a package where your view tells Chrome when it's actually ready instead of praying that my PDF renders inside the delay(2000) timespan

Every HTML-to-PDF setup I've shipped had the same bug: Chrome captured the page before it was actually done. Chart.js still animating. Custom font not loaded yet. Async data not back. The "fixes" were always waitUntilNetworkIdle + delay(2000) + prayer, and it always eventually flaked on a queue worker.

So I built Canio. Your Blade view sets:

window.__CANIO_READY__ = true;

...when it's genuinely ready (fonts.ready, chart onComplete, fetch done, whatever you decide). Canio waits for that. No timing heuristics.

The part I'm actually proud of: every render can persist an artifact bundle, HTML source, DOM snapshot, screenshot, console log, network log. So when someone says "the invoice from 3 days ago looked wrong", you open the screenshot artifact and see exactly what Chrome saw. PDF debugging stops being a guess.

It's MIT, runs on a Go runtime over CDP, supports Laravel 10-13.

Repo: https://github.com/oxhq/canio

Demo: https://youtu.be/Cg9OAi0dBtQ

Not trying to replace Browsershot, it's great and I still use it. Canio is for the cases where capture timing and render debuggability actually matter. Happy to answer anything technical.

u/Garaekz — 4 days ago