I switched the web portion of ScreenCred to Astro and hosted on fly.io. Using this post, I was able to put Cloudflare in front of it. We'll see how it goes.

I also found a little bug where sometimes the og:image failed to generate. To fix it, I added a redirect to the generic/default og:image.

try {
    const buffer = await makeImage(first, second);

    return new Response(buffer, {
      status: 200,
      headers: {
        "Content-Type": "image/png",
  } catch {
    return redirect("/images/screencred_social.png", 307);

Simple enough.

Things seem to be working smoothly though. Image generation is taking about 750–1000ms. And this is on the free 256MB instance.

Now I need to get back to actually working on the app. Enough with this distraction!