The Signal
Building a World, Not a Website
Incoming Transmission…

Building a World, Not a Website

CH · Engineering107.62026.05.26LEN 04:02
  • webgl
  • gsap
  • creative-dev
  • colophon

I have a small, specific obsession: the seam between two pages. That half-second when you click a link and a website blinks white, forgets everything about where you were, and rebuilds itself from scratch. Most people never notice it. I can't stop noticing it.

Because that blink is a confession. It says: this was never one place. It was a stack of separate documents wearing a shared logo. And once I'd decided I wanted to build worlds instead of documents, that blink became the enemy.

Most sites are a stack of doors

Think about how a normal site feels to move through. You stand at a door, you walk into a room, the door slams behind you, and a completely new room loads in front of you. Every navigation is a small death and rebirth. The header you were looking at is destroyed and an identical header is born. The music stops. The cursor resets.

It works. We've all made peace with it. But it's the opposite of how a place feels. When you walk through your home, the walls don't despawn behind you. I wanted a site that behaves like one continuous space — one room that rearranges itself while you're still standing in it.

One state machine, many states

So the whole of this site is built as a single state machine. There's a persistent shell that mounts once and never tears down: the navbar, the custom cursor, the audio layer, and the WebGL ember material that glows under everything. Those things are not re-created when you navigate. They persist, and they react.

Navigating doesn't load a new world. It moves the existing world into a new state. The home route, the work index, a single post — those aren't separate pages in my head. They're positions the same machine can be in, like scenes in one long take. The shader keeps burning. The cursor keeps its momentum. You are never thrown out and let back in.

Motion lives outside React

The technical heart of this is a decision that sounds small and isn't: motion does not run through React's render cycle.

React is wonderful at describing structure — what should exist right now. It is not where you want a 60fps transition living, because every frame fighting the reconciler is a frame you can drop. So the animation lives elsewhere. GSAP and the raw WebGL material are driven imperatively, off a single store subscription. React owns the structure; a subscription owns the motion. When a transition fires, it doesn't wait for a re-render to paint — it just plays.

One subscription, the whole transition
// The transition is one subscription, not a re-render.
// React decides *what* exists; this decides *how* it moves.
transition.subscribe((phase) => {
  if (phase === 'cover')  gsap.to(shell, { '--veil': 1, duration: 0.6 })
  if (phase === 'reveal') morph(sharedEl).then(router.commit)
})

The element that travels between pages

My favourite consequence of this is the shared-element morph. On the feed, every post is a little waveform — its signal signature. When you click one, that exact waveform doesn't disappear and get replaced on the next page. It travels. It stretches, repositions, and becomes the hero of the post you opened, in one unbroken motion.

It's a tiny thing. But it's the difference between “a new page loaded” and “I followed this object deeper into the same space.” Continuity you can actually watch — the same instinct behind treating the whole portfolio like a directed film rather than a set of slides.

The cost is discipline

None of this is free. The price of a coherent world is discipline. You don't get to bolt on a one-off page with its own special animation logic that ignores the shell. Every new surface has to join the existing physics — reuse the shader, respect the transition system, hand off the shared element correctly. It's slower. It says no to a lot of clever one-offs.

But that constraint is the feature. It forces every part of the site to agree with every other part. The result reads as intentional because it literally cannot contradict itself.

A website is something you read. A world is something you're inside of.

Why it's worth the trouble

Immersion is absurdly fragile. You can spend months on atmosphere and break it in a single hard reload. One white blink and the spell is gone; the visitor remembers they're looking at a browser tab. Protecting that spell — refusing to ever drop the world — is, to me, most of the job.

Every route here is a state of the same ember world. That wasn't a limitation I worked around. It is the design — the same belief I bring to data, that everything is one system seen from different angles. A website, or a world. I'd rather build the world.


Adjacent signals

More from the same workshop:

Source //
TheIceJiMay 26, 2026Engineering · 107.6LEN 04:02
Locator — Scan the archive
esc
Indexing archive…

Indexing the archive…

select openesc close
Building a World, Not a Website — TheIceJi Horizon