CCColophon
CC
Email me

Stack

PackageVersionWhat it does here
Next.js16.3.8App Router, with every page prerendered
React19.3.0Server components first, small client islands
TypeScript6.0.3Strict, end to end
Tailwind CSS4.3.3Utilities over generated tokens
GSAP3.15.0Scroll-linked motion, loaded after first paint
Lenis1.3.26Smooth scrolling on the GSAP ticker
Content Collections0.15.3Typed MDX case studies
Zod4.6.5Content schemas, so every figure needs a source and a date
nuqs2.10.1The /work filters live in the URL
zustand5.0.15One small client store
cmdk1.1.1The ⌘K menu, fetched on first open
Resend6.31.0Delivers the contact form
Biome2.5.14Lint and format
Vitest5.0.2Unit tests
Playwright1.63.0End-to-end and axe checks

Hosted on Vercel. Versions are read from package.json at build time.

Motion

  1. Every page is prerendered HTML, so the headline, the work, every case study and the contact details all read with JavaScript off. The Lab demos render their results on the page first too, and their controls load when you scroll to them.
  2. GSAP, ScrollTrigger and Lenis arrive in one chunk after the page has loaded and the main thread is idle, and only when motion is allowed.
  3. Most of the motion is CSS. The headline’s words rise with CSS transforms, one IntersectionObserver switches the reveals, and the footer name uses scroll-driven animation where the browser supports it.
  4. Nothing is drawn with WebGL. The glass is backdrop blur and gradients, and the globe is a 2D canvas that only draws while it’s on screen.

What turns it off

Read mode
Solid panels instead of glass, nothing sticky or moving, and the motion code never loads. It turns on by itself when the browser asks to save data.
Reduced motion
Turns Motion off: no smooth scrolling and nothing tied to the scroll position. Content that would fade in is simply there.
Motion switch
The same as reduced motion, from the menu or ⌘K, for any visitor.

Fonts

  • Satoshi by Indian Type Foundry

    Every heading, paragraph, link and button

    Source
    Fontshare
    License
    ITF Free Font License
    Loading
    3 weights (400, 500, 700), all preloaded because all of them are in the first screen
    Size
    24.7 KB to 25.0 KB per weight, 74.6 KB in total
  • JetBrains Mono by JetBrains

    Labels, numbers and code

    Source
    Google Fonts
    License
    SIL Open Font License 1.1
    Loading
    One static weight (400), not preloaded
    Size
    20.7 KB

Self-hosted at build by next/font, with a metric-matched fallback for Satoshi so the swap doesn’t move the layout. Budget: 100 KB on first load.

Generated art

6 images on this site are generated. They’re atmosphere only: light and illustration behind the content, never an interface. Project screenshots are real captures, and no client screenshot or client art is ever uploaded to a generator.

  • Home: the light behind the hero

    Cursor image generation ·

    AVIF, 2.9 KB

  • Services: Build

    Cursor image generation ·

    AVIF, 18.3 KB

  • Services: Ship onchain

    Cursor image generation ·

    AVIF, 12.8 KB · style ref: services-build

  • Services: Review

    Cursor image generation ·

    AVIF, 17.7 KB · style ref: services-build

  • Services: AI features

    Cursor image generation ·

    AVIF, 11.1 KB · style ref: services-build

  • Contact: the horizon under the globe

    Cursor image generation ·

    AVIF, 2.8 KB

Each image has a record in the repo with its prompt, the tool, the date and the post-processing. This list is built from those records.

Performance

BudgetTargetMeasured
Home first-load JavaScript≤ 180 KB gzipped175 KB gzipped
Other routes, first-load JavaScript≤ 200 KB gzipped173 KB gzipped at most (/work)
Motion chunk (GSAP, ScrollTrigger, Lenis)≤ 70 KB gzipped, after first paint52 KB gzipped
Ask drawer≤ 45 KB gzipped, on first open30 KB gzipped
Fonts on first load≤ 100 KB95.4 KB
Largest Contentful Paint≤ 2.5 s on a mid-range phone over 4GNot yet measured
Cumulative Layout Shift< 0.1Not yet measured
Interaction to Next Paint< 200 msNot yet measured

pnpm budgets measures the JavaScript after each build: what each page loads first, and the motion chunk and Ask drawer that load later. The font total is the size of the files that ship. The JavaScript numbers are from the build on October 3, 2026. Real-user numbers from Vercel Speed Insights replace the lab numbers after launch.

Credits and data

Design and code
Casey Charlesworth
Type
Satoshi by Indian Type Foundry and JetBrains Mono by JetBrains
Logos
Company logos belong to their owners and appear with permission.
Globe
Land from Natural Earth (public domain), reduced to 2,029 dots.
Price data
The range demo uses SOL/USDC history from CoinGecko, committed with a source stamp.
Transaction sizes
solana.com: larger transaction sizes (checked 2026-09-29)

Release notes

  1. v2.0This build2284450 · 2026-10-05

    • A full redesign: glass panels on near-black, Satoshi, and every project shown in a browser frame.
    • 15 case studies and 4 lab demos, all prerendered.
    • A Questions drawer, with my answers to common questions about my work.
    • Read mode, the Motion switch and the ⌘K menu carry over from v1.
  2. v1.0September 2026

    • The first version: a WebGL hero, the first case studies and the lab demos.
Questions