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:
    12:00:00 AM
    CloudFront
    Requests
    Fetched at:
    12:00:00 AM
    Log Stream NameTimestampMessageIngestion TimeEvent ID
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]3bb2535b9f7a4ac7a1b4c61f3e65c43d1759809629244INIT_START Runtime Version: nodejs:22.v53 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:a1ea9affb8746af55ecd7d4172d7be345d0d52a795388d3ac6120132594e1cbd 175980963634139245066139691089086413738217151875386552941337255673856
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]3bb2535b9f7a4ac7a1b4c61f3e65c43d1759809629409START RequestId: 9e157c7e-07ef-4bd5-bc38-9c2496b5fad1 Version: $LATEST 175980963634139245066143370712044171291035505268901539920985742442497
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]e1c0b2bbcd934afaaf0584712d88967b1759809629450INIT_START Runtime Version: nodejs:22.v53 Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:a1ea9affb8746af55ecd7d4172d7be345d0d52a795388d3ac6120132594e1cbd 175980963506739245066144285042597311046582768457841919037240114216960
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]e1c0b2bbcd934afaaf0584712d88967b1759809629602START RequestId: 4042b2bd-b28e-4b54-aeb0-d00539d3c11c Version: $LATEST 175980963506739245066147674755867487701300281887019361588189023240193
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]e1c0b2bbcd934afaaf0584712d88967b1759809630984END RequestId: 4042b2bd-b28e-4b54-aeb0-d00539d3c11c 175980963506739245066178494385731857022481884249672161623790288175106
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]e1c0b2bbcd934afaaf0584712d88967b1759809630984REPORT RequestId: 4042b2bd-b28e-4b54-aeb0-d00539d3c11c Duration: 1380.60 ms Billed Duration: 1530 ms Memory Size: 1024 MB Max Memory Used: 125 MB Init Duration: 149.02 ms 175980963506739245066178494385731857022481884249672161623790288175107
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]3bb2535b9f7a4ac7a1b4c61f3e65c43d1759809631604END RequestId: 9e157c7e-07ef-4bd5-bc38-9c2496b5fad1 175980963634139245066192320847754946008831176170510003074491369455618
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]3bb2535b9f7a4ac7a1b4c61f3e65c43d1759809631604REPORT RequestId: 9e157c7e-07ef-4bd5-bc38-9c2496b5fad1 Duration: 2194.46 ms Billed Duration: 2356 ms Memory Size: 1024 MB Max Memory Used: 151 MB Init Duration: 160.73 ms 175980963634139245066192320847754946008831176170510003074491369455619
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]3bb2535b9f7a4ac7a1b4c61f3e65c43d1759809631978START RequestId: 4f8d8faf-e9cb-4f29-a97d-219aa3e0595f Version: $LATEST 175980963634139245066200661326459196461886110529143973561694606131204
    2025/10/07/web-production-MyWebServerUseast1Function-tohtrofa[$LATEST]3bb2535b9f7a4ac7a1b4c61f3e65c43d1759809632078END RequestId: 4f8d8faf-e9cb-4f29-a97d-219aa3e0595f 175980963634139245066202891400979049524200264100971238397845204172805
    481 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