
The mirror
I built the Emoji Mirror to promote the Noto 3D emoji redesign at Made By Google in August 2026, an invite-only press and marketing event with influencers, senior Googlers, and friends of Pixel. It shows you your own reflection, rebuilt out of emoji.
Where it came from
I make generative art, so I'm familiar with ways to use code to make beautiful things. The quadtree is perfect for this: it can show emoji as large images so you can get a feel for what they look like, and small emoji to reveal the detail of the subject.
Every cell on the wall is an emoji!
How it works
A quadtree subdivides the live camera feed, finer where there is detail and coarser where there is not, then fills each cell with the nearest match from an atlas of 1,245 emoji. A flat wall behind you resolves to a handful of large emoji. The Einstein render below used 437 distinct emoji across 21,099 cells, picked in real time, with a rule that stops identical emoji from landing side by side.

A quadtree is a square that can divide itself into four smaller squares, each of which can do the same. Here the test is contrast: measure the brightest and darkest points inside a square, and if they are far enough apart, divide it and ask the same question of each quarter. A plain wall can come out as a single cell a quarter of the frame across. Anything with an edge in it keeps dividing.

Photograph: The New York Times
This is the list of viable emoji for the experience:


The build
One person in front of the screen, standing, at their own height. A 55" panel sits in a moulded MDF and fiberglass housing with the camera just above the glass, so the experiencer's eye line sits near the reflection.
It ran 24/7 through the event.
How it's built
The whole installation is a web page running in a MacOS wrapper app. A Node server with no dependencies serves it to Chrome in kiosk mode, and Chrome reads the camera input.
| Layer | Choice |
|---|---|
| Render | three.js, one instanced mesh, orthographic camera, up to 120,000 cells |
| Subdivision | Web Worker running the quadtree off the main thread |
| Face detail | MediaPipe face detection in WASM, driving finer cells inside the face |
| Atlas | 1,245 Noto emoji across two spritesheets, each tagged with its mean color |
| Camera | getUserMedia at 720p, pinhole module behind a cutout in the bezel |
| Server | Node standard library, zero dependencies |
| Kiosk | Chrome fullscreen on Apple Silicon, isolated profile, camera auto-granted |
Afterwards
The social media posts melted my face off!
