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:
    1:00:00 PM
    CloudFront
    Requests
    Fetched at:
    1:00:00 PM
    Log Stream NameTimestampMessageIngestion TimeEvent ID
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]6b0dffe761f544ef9f541232555e23291786294820179START RequestId: 41c673f7-2a64-4399-abc7-d8f2feade75a Version: $LATEST 178629482919939835705634266957121793859878209356852225190526909480960
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]6b0dffe761f544ef9f541232555e23291786294820312END RequestId: 41c673f7-2a64-4399-abc7-d8f2feade75a 178629482919939835705637232956233198432756033607382487422607204876289
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]6b0dffe761f544ef9f541232555e23291786294820312REPORT RequestId: 41c673f7-2a64-4399-abc7-d8f2feade75a Duration: 133.05 ms Billed Duration: 134 ms Memory Size: 1024 MB Max Memory Used: 170 MB 178629482919939835705637232956233198432756033607382487422607204876290
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]6b0dffe761f544ef9f541232555e23291786294854920START RequestId: 5b5fbb42-4f72-4d09-a30d-a6668be94321 Version: $LATEST 178629486393939835706409017146063946238480299658642145837765616992256
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]6b0dffe761f544ef9f541232555e23291786294855233END RequestId: 5b5fbb42-4f72-4d09-a30d-a6668be94321 178629486393939835706415997279311086323523600338461484774916988862465
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]6b0dffe761f544ef9f541232555e23291786294855233REPORT RequestId: 5b5fbb42-4f72-4d09-a30d-a6668be94321 Duration: 311.81 ms Billed Duration: 312 ms Memory Size: 1024 MB Max Memory Used: 170 MB 178629486393939835706415997279311086323523600338461484774916988862466
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]4fd30e9433b84761ab6d154f3baf0d381786295217832INIT_START Runtime Version: nodejs:24.v48 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:b8e18ea517c3a4b8dd61fb8536eb5cff76c10fbbc3fc766e8079f3b873f7fad3 178629522465339835714502225187553091744457386468303846914685285302272
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]4fd30e9433b84761ab6d154f3baf0d381786295217989START RequestId: e1fd9e2a-b447-4689-9c09-453fb96536f2 Version: $LATEST 178629522465339835714505726404549261052290607576072652707441724227585
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]4fd30e9433b84761ab6d154f3baf0d381786295219780END RequestId: e1fd9e2a-b447-4689-9c09-453fb96536f2 178629522465339835714545667039199829398337098047498965922898935152642
    2026/08/09/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]4fd30e9433b84761ab6d154f3baf0d381786295219780REPORT RequestId: e1fd9e2a-b447-4689-9c09-453fb96536f2 Duration: 1790.67 ms Billed Duration: 1944 ms Memory Size: 1024 MB Max Memory Used: 158 MB Init Duration: 153.32 ms 178629522465339835714545667039199829398337098047498965922898935152643
    418 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