Get me a chocolate milk <3

2holl.is

Miller Downey · Nov 2026

I bought the domain back in May 2025. When I met him in Oct 2025, I pitched the idea, and he gave me the go-ahead. I have had my head down since, working on the site and bringing the vision to life. 2holl.is is the complete 2hollis archive, and I made it from start to finish: about 580 tracks (songs, snippets and album tracks) on one timeline, where you can play any of them, mix two together and even contribute facts. I did the design, the frontend, the audio engine, and the backend myself.

  1. 2025-26 2holl.is Design, frontend, audio engine, backend

TYPESCRIPT · THREE.JS · WEB AUDIO API · GSAP · LENIS · SUPABASE · CLOUDFLARE PAGES

The intro

Landing on it starts a film that the scroll controls: a signature draws in neon, the camera goes around a GT-R and gets in, then a lightspeed highway takes you into the archive. Scroll back up and it plays in reverse.

The archive

The archive is a wall of cards in WebGL, one column per month, bent through a barrel lens and wrapped around so it never ends. Drag it, zoom it, search it. A click plays the track and a double click turns the card over.

The player

Most of my time went into the player: a DJ deck written right on the Web Audio API, with no audio library. It has an effects rack, roll pads that stay on the beat and stems (you can take the vocals out of any track). On a laptop there's a second deck as well, with tempo sync, a crossfader and key lock, so a track sped up to match the other one stays in key. To get that working I analysed every catalogue track for tempo, key and beats and split all 564 into vocals and instrumental on my own computer.

  • 11 effects: filter, EQ, compressor, drive, crush, space, reverb, flanger, phaser, gate and speed. All native Web Audio nodes.
  • Roll pads: they loop on a beat grid fitted through the whole track, the way a CDJ quantizes.
  • Key lock: a phase vocoder running in an AudioWorklet.
  • Sync: tempo from both decks' beat grids, with the phase held by bending one deck's rate by up to 4%.

The fans

The fans keep it accurate. After 20 tracks listened to all the way through and 5 favourites saved, you can request a missing song or suggest an edit. Every request goes through a moderation queue and every edit is versioned, so a wrong one can be undone.

Shows

Shows have their own globe: the 167 shows on setlist.fm to start, across 79 cities, with a city's page holding the fan videos of its shows, sorted by angle.

Under it

Under all of it is plain TypeScript, no framework. Three.js for the 3D, GSAP and Lenis for the motion, Supabase for accounts and data, Cloudflare for hosting, the API and the audio. Every track, release, show and city also has its own page built ahead of time so search engines can read it.

What broke

A few things broke. iPhones reload a page that uses too much memory and Apple won't say the limit, so the grid only keeps full size textures for the cards closest to you. Songs with only a year used to go in June, which put 73 of them in June 2022 (they go to the quietest month of their year now). And the day the first fan shows were approved, the globe emptied out: the code switched to the database as soon as it had any rows, and those were the only ones in it.