Express started as a hackathon submission. We built a single-page Shopify theme — entire storefront on one scroll, no second clicks — over a long weekend in early 2020. Two weeks later the world locked down, every restaurant on earth needed to take orders online, and the project we'd thought of as "a fun demo" turned into a flagship theme launched in May 2020.
By the end of that year, 65,000+ food and beverage merchants worldwide were using Express to take orders.
Why one page
The core insight was that food and beverage commerce is menu-shaped, not catalog-shaped. A pizza place doesn't need product pages, related products, customer reviews, or a wishlist. They need: photo of the dish, name, price, "add to cart." Done.
Removing every page transition turned out to be a measurable win:
- No PLP → PDP friction. The menu is the catalog and the product page. You scroll, you tap, the cart drawer opens, you keep scrolling.
- Cart-first by default. A persistent cart drawer that follows the page meant merchants doubled their average order value — adding "and a side of fries" stops being a separate flow.
- Fast, by construction. With no second page to load, the only performance budget that mattered was the initial paint of one HTML document. Easy to monitor, easy to defend in code review.
The constraint forced clarity. We didn't have a homepage to design — only a menu to fit on a phone screen.
What shipped
The bones, for the technically curious:
- All Liquid, all server-rendered. No SPA shell, no client router. Add-to-cart and the cart drawer are sprinkles of vanilla JS over a server-rendered base. View source still works.
- Section-driven menu groups. Merchants could add unlimited menu sections (Starters, Mains, Drinks, Desserts) and reorder them in the editor. Each group is a Liquid section, not a hard-coded layout.
- Performant images by default.
srcset,loading="lazy", dominant-color placeholders — every product image budgeted for 4G in a parking lot. - Built for the cart drawer. AJAX cart with optimistic updates so adding an item never felt like a page hit.
What I'd do differently
Reading Dave's post-mortem two years later, his observations match my own: the theme outgrew its original "one-page only" thesis as merchants started selling non-food categories on it. The single-page constraint that made it sing for restaurants started feeling forced when a merchant had thirty product variants across seven categories.
If I were rebuilding it today:
- Make the single-page nature optional. A "expand to per-product page" toggle per section group, opt-in for merchants whose catalog grew.
- Adopt JSON templates from Dawn. Express predates Online Store 2.0 — the same architectural shift would have made section management dramatically more flexible.
- Lean harder on the cart drawer. It was the secret of Express's conversion lift; it should have been a first-class theme primitive, not a per-template implementation.
Hackathon code is allowed to age. The interesting question is always where it ages, not whether.