Skip to content
koray.dev

Archives

All the articles I've archived.

20269
July1
June2
  • Cache the prompt, not the inputs

    2 min read

    An LLM cache keyed on a hand-picked list of inputs fell behind the prompt it protected. Hashing the rendered prompt fixed it, and the choice of hash turned out to be a security decision.

  • Fire-and-forget doesn't survive on Cloudflare Workers

    3 min read

    A view counter returned 204 on every call and never moved. Workers can cancel work still pending after the response unless it is passed to waitUntil.

May2
  • What a non-extractable key actually protects

    4 min read

    Keeping a signing key in the browser under a WebCrypto key that cannot be exported: what that stops, what it does not, and where the real protection comes from.

  • We moved our page cache to R2, then deleted it

    4 min read

    R2 charges 12.5 times more for a write than a read. Rendered HTML that revalidates on a timer is the worst workload for that pricing, and images are the best.

April2
  • Your error handler is inside the cache

    3 min read

    A thirty-second backend restart became an hour of 404s, because a try/catch inside a "use cache" function cached the failure as a value.

  • Keep the model call off the request path

    3 min read

    A per-instance throttle limited nothing and blocked the job meant to recover from quota exhaustion. Removing the request path's ability to generate fixed both.

March1
February1
  • Math.floor is not a floor

    4 min read

    Flooring a decimal for an API that wants strings: the obvious version drops a step, the clever one rounds up past the input, and neither throws.