We just launched Shopify Editions Winter 2026 🎨 Here's the...

Here's the technical breakdown of how we built it 🧵
No surprises here, we’re using @threejs (and R3F) under the hood.
Each painting is a unique WebGL scene as a R3F Portal, each with custom shaders, postprocessing, animations…
Method one involved generating a depth map from the static painting and using it to displace a densely subdivided plane to create depth and preserve details.
We built a custom Electron app to reduce polycount & convert textures to GPU-friendly Basis/ETC1S. Compressed textures used ~10-100x less memory & uploaded instantly, preventing decoding lags while scrolling!
Designers get After Effects-like control over the website, able to control absolutely everything. No code changes for timing adjustments, animation iteration went from hours to minutes!
For Rive on hover, we used the first frame as a poster, then played the Rive on hover.
For linear animations, a custom Rive-to-video exporter ran them off the main thread.
BroadcastChannel syncs position/size/scroll between windows, creating a transparent window effect with real-time event messaging for interactions.
- High: Full 3D, post-processing
- Medium, Low: Simplified textures & geometry
- Fallback: Static images replace 3D
- WebGL Fallback: Pure CSS
Auto-detection based on the user's GPU capacity, with real-time downgrade based on current FPS.
On the app side, we optimized every React render loop, using Zustand when needed.
CSS + SVG transitions/animations do the lifting here, making use of the pathLength attribute to draw our DaVinci lines and transform-box to animate our title text.
We leveraged: metaobjects & metafields, products/collections, markets, translate & adapt, shopify CDN, and custom apps with Admin API integrations.
- Mobile: 2.4MB (target: 2MB)
- Desktop: 4.5MB
Route splitting, dynamic imports, aggressive tree shaking... Every PR was scrutinized for size impact!
The dev team: @mcneillie84276 @JoshSanger_eth @kylewayneluck @jh3yy @athlndr @celsostories @ArthurCloche @damienmortini @krystalcampioni

