WORK, WRITING, STUFF

Projects.

Some things I made

Cloudfront viewer info

Various viewer request info generated at edge by this website’s CDN. While this overview page is a static route and is composed of several other page.tsx components, via @slots, the viewer request feature uses the Next.js dynamic headers()  API so it has to live on its own dedicated route. (See Next.js parallel routes docs).

→ Go to viewer info

Go in browser

This widget executes a WASM program, built from Go. The program itself interprets arbitrary JavaScript text input, and evaluates it as Go, using Yaegi.

Output

    CloudFlare turnstile

    A playground to familiarize myself with CloudFlare’s turnstile service. Again, this overview route is static, and the @turnstileslot/page component is an async server component. While parts of it can be statically rendered, it uses the Next.js dynamic cookies() API to power both the "Client" and "Server" results. You can still view the playground below,you'll need to go to the dedicated route for a full working example.

    → Go to working turnstile playground

    Turnstile Playground#

    SiteKeyDescriptionVisibilityDemo
    1x00000000000000000000AAAlways passesvisible
    2x00000000000000000000ABAlways blocksvisible
    1x00000000000000000000BBAlways passesinvisible
    2x00000000000000000000BBAlways blocksinvisible
    3x00000000000000000000FFForces an interactive challengevisible

    https://developers.cloudflare.com/turnstile/troubleshooting/client-side-errors/error-codes/

    https://developers.cloudflare.com/turnstile/get-started/client-side-rendering/#configurations

    Logs viewer

    Pulling logs from AWS CloudWatch logs and displaying them in a reasonably pretty format.

    Function URL Latency
    Latency in milliseconds
    Lambda
    Invocations
    Fetched at:
    11:00:00 PM
    CloudFront
    Requests
    Fetched at:
    11:00:00 PM
    Log Stream NameTimestampMessageIngestion TimeEvent ID
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]22de7eb3879c48ebb6b66b71d451164c1788231666495START RequestId: 38d49a00-1301-40f8-b1ea-06e7edd63a15 Version: $LATEST 178823167551239878898750448785847841069184244580256981345548736331776
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]22de7eb3879c48ebb6b66b71d451164c1788231666797END RequestId: 38d49a00-1301-40f8-b1ea-06e7edd63a15 178823167551239878898757183610897797317372988367175321150723542417409
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]22de7eb3879c48ebb6b66b71d451164c1788231666797REPORT RequestId: 38d49a00-1301-40f8-b1ea-06e7edd63a15 Duration: 301.26 ms Billed Duration: 302 ms Memory Size: 1024 MB Max Memory Used: 165 MB 178823167551239878898757183610897797317372988367175321150723542417410
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]22de7eb3879c48ebb6b66b71d451164c1788231676187START RequestId: 133b845c-e71d-4f3d-abfa-9a3eea5f8382 Version: $LATEST 178823168520439878898966587608311999868683725626052315148237980041216
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]22de7eb3879c48ebb6b66b71d451164c1788231676596END RequestId: 133b845c-e71d-4f3d-abfa-9a3eea5f8382 178823168520439878898975708613098198893548613734825828328093926031361
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]22de7eb3879c48ebb6b66b71d451164c1788231676598REPORT RequestId: 133b845c-e71d-4f3d-abfa-9a3eea5f8382 Duration: 408.98 ms Billed Duration: 409 ms Memory Size: 1024 MB Max Memory Used: 165 MB 178823168520439878898975753214588595954794896806262373624816937992194
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]f825e63e32324f06b1ed151bc198c83e1788231677020INIT_START Runtime Version: nodejs:24.v48 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:b8e18ea517c3a4b8dd61fb8536eb5cff76c10fbbc3fc766e8079f3b873f7fad3 178823168606739878898985164129062375877761668190558973297928394702848
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]fca01d9860a641e5bf7d704178eddf131788231677169INIT_START Runtime Version: nodejs:24.v48 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:b8e18ea517c3a4b8dd61fb8536eb5cff76c10fbbc3fc766e8079f3b873f7fad3 178823167923239878898988486940096956940601493552420151761333385822208
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]fde783ac690b49d9a908089a666654741788231677174INIT_START Runtime Version: nodejs:24.v48 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:b8e18ea517c3a4b8dd61fb8536eb5cff76c10fbbc3fc766e8079f3b873f7fad3 178823168093839878898988598443822949593719264067606342342782509449216
    2026/09/01/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]f825e63e32324f06b1ed151bc198c83e1788231677190START RequestId: 99814f7f-a3f4-4721-b1c8-f9ae2fc3d987 Version: $LATEST 178823168606739878898988955255746126083695729262665323519384411373569
    0 ms ago

    nextjs-components

    React components that I transcribed from Vercel’s Design System, years ago. — See the code on GitHub

    OpenGraph image for the nextjs-components GitHub repository