← back

Domain Expansion: Interface Overwrite

iframeclip-pathExperimental

The original plan was to use the WICG html-in-canvas API to snapshot the page into a WebGL texture and animate it away with a blob shader — pixel-perfect, native, no JS reimplementing the CSS cascade. It turned out drawElementImage only accepts direct children of a <canvas> element. Passing document.documentElement throws. Every time. The API is unusable for full-page capture.

This is the pivot. Two live iframes — light below, dark above — the parent clips the dark layer with an organic clip-path: path() blob driven by layered sine noise. Click the theme toggle inside the iframe's floating header and the blob expands from the button position.

It's a demo of the concept, not an implementation of it — the main site toggle can't use this because you'd need to embed your own site inside your own site and keep them in sync in real time. Works in any modern browser. No flags needed.

domain-expansion.dev
Experimental · 2025clip-path · two iframes

Domain Expansion: Dilapidating Pixels

shattervoronoiExperimental

After the WICG path closed, a second attempt at the reverse direction. Since native page capture was off the table, html2canvas became the snapshot layer — a JS reimplementation of the CSS cascade that gets close but misses backdrop-filter, some custom properties, and certain font rendering subtleties. The snapshot is an approximation, not a duplicate.

To view: click the theme toggle inside the iframe. Light → dark grows the blob. Dark → light: the dark frame is snapshotted, light-blue cracks etch across the frozen image, then the snapshot shatters into a Voronoi tiling — each polygon falls, rotates, and fades — revealing the live light iframe underneath.

The effect is theatrical when it works. On slower connections the snapshot takes long enough that the pause before the cracks begin is noticeable. Still not a real toggle. Works in any modern browser, no flags needed.

domain-expansion.dev
Experimental · 2025cracks · shards · two iframes

Alpine World

Three.jsExperimental

I wanted to build you somewhere to sit. A proper alpine valley — six distinct biomes along one continuous path, no UI, no minimap, nothing to do except walk and listen. The audio was supposed to be 8D: spatially rendered, shifting as you move through pine corridors into open meadow into snowfield, so it actually felt like being somewhere.

The terrain came together. The lighting too. The trees did not cooperate, and a world without convincing trees isn't quite a world. So what's here is an honest first pass — still alive, still worth walking, still has the birds.

Use headphones. Hit the audio button. Walk.

Lauterbrunnen Valley
·

use headphones

for the full experience

Experimental · 2025journey · alive

I tried to build you this valley. The trees had other plans, and you deserved better.

(I got the birds right though.)

Since I couldn't build the valley, here's the real one.

← backokay, back to work →

A portfolio should not be a scaffold for work. The work starts from the portfolio.

Overheard somewherea thought while you wait