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:
    7:00:00 AM
    CloudFront
    Requests
    Fetched at:
    7:00:00 AM
    Log Stream NameTimestampMessageIngestion TimeEvent ID
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]cbc123a760434fd1ab5edcf8babcb29f1789642820872INIT_START Runtime Version: nodejs:24.mainline.v55 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:dd09ef1b17ddb706b5ccd5facec44a9954fa6d8e003984ad01974c818c62990a 178964282823039910368544646054070657490782542693932591357319839219712
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]61ec5952cffe46b7bb050948acced0a81789642827187START RequestId: f0d8a3cf-6c61-4cce-b3f8-8056bd0905b4 Version: $LATEST 178964283620439910368685475259999378375930980562526444185056962347008
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]27a853b96347457e80e5f822284466e41789642827191START RequestId: 6616e339-23a2-4327-af39-6e0941cee44e Version: $LATEST 178964283620739910368685564462980172498423550620505168842130614845440
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]886deb70b2dd48ffa777e4ddb946efa41789642827193START RequestId: 4995ae91-0f08-4c6b-b606-6fe7d920ada9 Version: $LATEST 178964283621239910368685609064470569559669839418412195471532435636224
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]c521b734119542cba102486e6a04246e1789642827203START RequestId: 7e120ae8-9905-4adf-ba2a-c42e358358e6 Version: $LATEST 178964283622039910368685832071922554865901264691952376160730076872704
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]27a853b96347457e80e5f822284466e41789642827697END RequestId: 6616e339-23a2-4327-af39-6e0941cee44e 178964283620739910368696848640050628993733167693951128913052640935937
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]27a853b96347457e80e5f822284466e41789642827697REPORT RequestId: 6616e339-23a2-4327-af39-6e0941cee44e Duration: 505.32 ms Billed Duration: 506 ms Memory Size: 1024 MB Max Memory Used: 260 MB 178964283620739910368696848640050628993733167693951128913052640935938
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]886deb70b2dd48ffa777e4ddb946efa41789642827834END RequestId: 4995ae91-0f08-4c6b-b606-6fe7d920ada9 178964283621239910368699903842142827689103563813824963071257769082881
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]886deb70b2dd48ffa777e4ddb946efa41789642827834REPORT RequestId: 4995ae91-0f08-4c6b-b606-6fe7d920ada9 Duration: 640.33 ms Billed Duration: 641 ms Memory Size: 1024 MB Max Memory Used: 210 MB 178964283621239910368699903842142827689103563813824963071257769082882
    2026/09/17/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]61ec5952cffe46b7bb050948acced0a81789642827878END RequestId: f0d8a3cf-6c61-4cce-b3f8-8056bd0905b4 178964283620439910368700885074931563036521781743852844202857594814465
    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