This is a personal project I built to have a proper play with Three.js. It is an interactive globe carrying all 16 World Cup 2026 venues, across the United States, Mexico and Canada.

Have a go with the live demo

Click any stadium marker and the camera flies over to it. A panel opens with the capacity, the climate data and the full fixture list for that venue.

The globe

The interactive globe showing venue markers across North America
The globe. Country colours on the markers pick out the host nation, and the borders are drawn from GeoJSON.

The atmosphere glow is a custom GLSL shader rather than a texture, because a texture falls apart the moment you spin the thing quickly. Marker clicks go through raycasting. The camera moves are handled by GSAP so they arc across the surface instead of cutting straight through the middle of the planet.

That last one sounds like a detail. It is the difference between it feeling like a globe and feeling like a menu.

Country borders are drawn from GeoJSON as LineSegments on the sphere, and the markers take the host nation colours, so you can read the three countries without a legend.

The stadium panels

A venue panel showing a wireframe stadium model beside its data
The venue panel. The wireframe on the left is a live model in its own WebGL context, not a picture.

Each venue renders a live rotating wireframe model in its own WebGL context, completely separate from the globe renderer. I built the models in Blender with parametric Python scripts, exported them as GLB, then rendered them with EdgesGeometry at a 15 degree threshold.

That threshold is the whole trick really. It keeps the clean structural edges and drops all the internal triangulation, so a stadium reads as an architectural drawing rather than a mesh. Gold wireframes mark the Final and the Opening match.

The full schedule is in there as well, all 104 fixtures, wired to each venue from a JSON dataset I structured by hand. That took a good deal longer than the shader did.

The architecture

Deliberately light. No framework, no build step, just ES modules served straight to the browser through an importmap.

For something this size that is plenty. I have gone back to old projects with a two year old toolchain and spent most of a day getting them to compile before changing a single line, and I did not fancy that again. There is nothing here to go stale.

Built with Three.js, WebGL, GLSL, Blender, ES Modules, GeoJSON and GLB. It is still up, and I tidy the fixture data as the schedule firms up at the moment.