The Theme Loop / Q4 2025
Cross-Browser Background Video, Shipped Solo Across Four Layouts.
Safari only played the first one. Chrome only showed thumbnails. Firefox lied about everything.
// The Problem
Three browsers, three different failure modes. Safari played only the first video on the page and ignored the rest. Chrome rendered static thumbnails instead of autoplaying. Firefox showed thumbnails but lied about the video state in its API responses. The store needed Liquid sections supporting four layout variants (columns, scroll, collapsible, slider), each capable of rendering either an image or a silent looping background video.
// The Fix
The root cause was browser autoplay policy enforcement. Each browser implements the spec differently, and Shopify's Liquid rendering compounded the inconsistencies. I built a custom IntersectionObserver solution that manages video lifecycle based on viewport visibility: videos load and play only when scrolled into view, pause when scrolled out (saving battery on mobile), and handle the Safari-specific quirk of requiring user gesture delegation for multiple video elements.
Zero third-party dependencies. Zero layout shifts. The videos are truly background elements: muted, looping, with no controls, and a static image fallback for browsers or devices that refuse autoplay entirely.
// outcome
All four layouts (columns, scroll, collapsible, slider) shipping background video on Safari, Chrome, and Firefox.
4
Layout variants
3
Browsers reconciled
1
Hand-rolled IO solution
0
Third-party deps
// NDA note
This project was completed under NDA. Full narrative with technical detail, trade-offs, and sanitized artifacts available under your own NDA. Contact directly to request the long form.
AI Shopify Generator
Q3 2025A CLI that turns a prompt into a production Shopify page, deployed and validated.
NDA client
The Tracking Gap
Q2 2024Browser-only tracking was missing half the story.
NDA client
The Brand Asset Hub
Q2 2025I replaced three vendor relationships with a single internal tool that runs the entire creative ops loop.
NDA client
Got a similar problem? Let’s talk.