Skip to content

Lab

The Lab

Interactive experiments and live demos. Launch any of them right here.

Small, self-contained things I’ve built: music theory, retro computing, generative art, systems, and AI agents. Click a card to run it in the browser; most link to a full write-up over in projects.

Showing all 21 experiments

Circle of Fifths

Click around the circle of fifths to hear each key and see how they relate.

Audio

Circle of Fifths

CGDAEBF#DbAbEbBbFPlay
C Major
Relative minor: Am

Perfect Fifth: G

Perfect Fourth: F

Tap or click any key to hear its root note. The outer ring shows major keys, the inner ring shows relative minors.

DosKit

Watch a simulated DOS boot sequence, then pick a program to run in the real WebAssembly emulator.

Retro Computing

DosKit

[ SYSTEM OFFLINE ]
Power off

This is a simulated boot; the real emulator lives at doskit.net.

Gopher Client

Browse a mock Gopherspace in a modern client, laid out the way the 1991 protocol did it.

Retro Computing

Gopher Client

gopher://demo.server/
=== Welcome to Gopherspace ===
Tap a menu item to read it. Directories [DIR] open submenus, documents [TXT] show content here.
GopherGemini

Gives an AI client the Gopher and Gemini protocols — the “small internet”.

Retro Floppy

A tactile 3.5-inch floppy you can label, re-theme and resize. Pure CSS nostalgia.

Retro Computing

Retro Floppy

Theme
Size

Hover the shutter, or tap or focus the disk, to slide it open. Each click bumps the counter.

Zero-Crust Architecture

Click through the process map of a dual-screen POS: sandboxed renderers, a trusted main process, and the IPC between them.

Systems

Zero-Crust Architecture

Main ProcessCashierCustomerHistoryDebugger
  • Commands · renderer to main
  • State · main to renderers
  • Trace · main to debugger
Main Process

Trusted process: MainStore, PaymentService, BroadcastService, IPC handlers

Pattern: Centralized State + Command Handler

Security: Zod validation, sender verification

Tap or click a node to explore. The highlighted edge is the IPC message in flight between processes.

Accessibility Techniques

Toggle accessibility techniques on and off to feel the difference each makes.

Accessibility

Accessibility Techniques

Documentary Film

An archive of civil rights documentaries spanning five decades.

Theme
Techniques

Body text 7.56:1 pass · Watch button 5.17:1 pass

Tab, or use Show focus, to see focus rings.

Frostpane

A frosted-glass panel component you can tune in real time.

Systems

Frostpane

Liquid Glass

Adjust the controls to see real-time changes to the frosted glass effect.

10px
25%
180%
16px

Equivalent CSS

backdrop-filter: blur(10px) saturate(180%);
background: rgba(166, 153, 191, 0.25);
border-radius: 16px;

At the defaults the white copy measures about 4.7:1 over the center of the gradient, then slips under 4.5:1 once opacity passes 30% or the panel crosses the pink end. One tint can’t hold AA everywhere, which is why Frostpane ships separate light and dark recipes.

Electromagnetic Spectrum

Sweep the electromagnetic spectrum from radio to gamma rays.

Generative

Electromagnetic Spectrum

Visible Light
550 nm
550 nm
545 THz, 2.25 eV. The only portion of the spectrum visible to human eyes.

Region: Visible Light

Frequency: 545 THz

Energy: 2.25 eV

The only portion of the spectrum visible to human eyes.

Drag the bar or the slider; frequency and photon energy follow from c/λ and hc/λ.

Uzumaki

A hypnotic, interactive generative spiral.

Generative

Uzumaki

Algorithm

θ = n·137.508°

Palette

See it on every platform

Fibonacci Aurora spiral
Fibonacci Aurora
Vogel Sunflower pattern
Vogel Sunflower
Uzumaki Neon spiral
Uzumaki Neon
Curlicue Matrix fractal
Curlicue Matrix
Uzumaki on iPhoneiOS
Uzumaki on Apple WatchwatchOS
Uzumaki on MacmacOS

Pick an algorithm and drag the slider; Randomize rolls a fresh spiral.

AT Protocol MCP Tools

Fire sample AT Protocol MCP tool calls and read the structured responses an AI client would get back from Bluesky.

AI Agents

MCP Tool Explorer

atproto-mcp
# Request
{
  "tool": "get_profile",
  "handle": "bsky.app"
}
Select Tool
get_profile

Fetch a user profile by handle or DID

This is a simulated demo. The real MCP server answers requests from AI assistants like Claude.

Skills Radar

A self-cycling radar of the stack. Watch each category come into focus, or grab the wheel.

Generative

Skills Radar

Frontend Skills

React8 years
TypeScript7 years
CSS/Tailwind15 years
Next.js4 years
Astro2 years

Hover or tap a skill to spotlight it; pick a category to stop the cycle.

ActivityPub MCP

Fire sample Fediverse MCP tool calls and watch WebFinger discovery and outbox responses come back, as recorded from Mastodon.

AI Agents

MCP Tool Explorer

activitypub-mcp
# Request
{
  "tool": "webfinger_lookup",
  "account": "@user@mastodon.social"
}
Select Tool
webfinger

Discover a user via WebFinger lookup

This is a simulated demo. The real MCP server answers requests from AI assistants like Claude.

OpenZIM MCP

Search Wikipedia through MCP with the cable unplugged: sample calls, recorded answers, zero network.

AI AgentsSystems

MCP Tool Explorer

openzim-mcp
# Request
{
  "tool": "zim_search",
  "query": "quantum computing",
  "limit": 5
}
Select Tool
search

Search for articles in the ZIM knowledge base

This is a simulated demo. The real MCP server answers requests from AI assistants like Claude.

Clarissa

Step through a terminal agent’s tool calls: read a file, run git, diff, fetch the web. The ReAct loop, one recorded sample at a time.

AI Agents

MCP Tool Explorer

clarissa
# Request
{
  "tool": "read_file",
  "path": "./src/agent.ts"
}
Select Tool
read_file

Read the contents of a file

This is a simulated demo. The real MCP server answers requests from AI assistants like Claude.

ClarissaBot

Follow a vehicle-safety agent through its NHTSA tool calls: recalls, complaints, crash ratings, from recorded responses.

AI Agents

MCP Tool Explorer

clarissabot
# Request
{
  "tool": "check_recalls",
  "make": "Honda",
  "model": "Civic",
  "year": 2019
}
Select Tool
check_recalls

Find recall campaigns affecting a vehicle

This is a simulated demo. The real MCP server answers requests from AI assistants like Claude.

Step Sequencer

Tap out a beat on a 16-step grid and hear it loop. Drums and bass, no install.

AudioGenerative

Step Sequencer

110 BPM

Stopped

Tap or click a cell to arm that step, then hit Play — every sound is synthesized live with the Web Audio API, no samples. On iPhone, flip the silent switch off to hear it.

Contrast Lab

Pick two colors and watch the WCAG ratio pass or fail in real time.

AccessibilityGenerative

Contrast Lab

The quick brown fox

jumps over the lazy dog

Sample text at 4.83:1

4.83:1
Contrast ratio — passes 3 of 4 WCAG checks

Contrast 4.83 to 1, passes 3 of 4

Already passes AA for normal text, so there is nothing to fix.

AA normal textPass
AA large textPass
AAA normal textFail
AAA large textPass

Ratios follow the WCAG 2.x relative-luminance formula. AA needs 4.5:1 for normal text (3:1 large); AAA needs 7:1 (4.5:1 large). “Suggest a fix” nudges the text color toward black or white until AA-normal passes.

CRT Terminal

Type into a green-phosphor terminal with scanlines, flicker, and a blinking block cursor.

Retro ComputingGenerative

CRT Terminal

rye.dev
rye terminal v1.0 — type `help` for commands

Try help, about, or echo hi. It is all client-side — no real shell behind the glass.

Subnet Calculator

Drag the CIDR slider and watch network, broadcast, and host range recompute bit by bit.

Systems

Subnet Calculator

IPv4 address
Network address
192.168.1.0
Broadcast address
192.168.1.255
Subnet mask
255.255.255.0
Wildcard mask
0.0.0.255
First usable host
192.168.1.1
Last usable host
192.168.1.254
Usable hosts
254
Network 192.168.1.0/24, broadcast 192.168.1.255, 254 usable hosts.

Edit the address or drag the prefix; the mask, host range, and binary view recompute as you go.

Reaction-Diffusion

Paint into a Gray-Scott reaction and watch organic Turing patterns spread.

GenerativeSystems

Reaction-Diffusion

Pattern regime
f = 0.0545, k = 0.0620

Paint into a Gray-Scott reaction and watch organic Turing patterns spread.

Lexicon Inspector

Pick an AT Protocol record type and see the lexicon schema and a sample record side by side.

AI AgentsSystems

Lexicon Inspector

Record type
app.bsky.feed.post.json
# Lexicon schema
{
  "lexicon": 1,
  "id": "app.bsky.feed.post",
  "type": "record",
  "key": "tid",
  "record": {
    "type": "object",
    "required": [
      "text",
      "createdAt"
    ],
    "properties": {
      "text": {
        "type": "string",
        "description": "Post body (max 300 graphemes)"
      },
      "createdAt": {
        "type": "string",
        "format": "datetime"
      },
      "langs": {
        "type": "array",
        "description": "BCP-47 language tags"
      },
      "reply": {
        "type": "object",
        "description": "Parent + root refs"
      }
    }
  }
}
record.json
# Sample record
{
  "$type": "app.bsky.feed.post",
  "text": "Hello from the AT Protocol.",
  "createdAt": "2026-06-27T10:15:00.000Z",
  "langs": [
    "en"
  ]
}
Record:
Valid — conforms to app.bsky.feed.post.

Lexicon is the AT Protocol schema system. Each record is validated against its NSID’s schema (required fields + types) before it’s written to a repo. Schemas here are faithful, abbreviated subsets of the real Bluesky lexicons.

Want the full story behind these?

Most experiments started life as a project. Read the write-ups, or get in touch.