CrushSuite · Co-founder · Live since 2024

I designed this product twice, and both times the job was to look like somebody else.

CrushSuite lets a winery sell wine inside state shipping law without leaving Shopify: age verification, per‑state eligibility, and the state’s own alcohol fee, applied in the merchant’s own checkout. I own product and design, and I ship the code. Half of it is an admin app built on Shopify’s components rather than mine; half is storefront components that render inside themes I have never seen.

RoleCo-founder. Product, design and the production code
ScopeAdmin app, storefront components, knowledge base
TeamFour co-founders, none full-time
StatusLive since May 2024 · 40+ wineries · $10K MRR · 5.0 on the Shopify App Store · Clubs shipped 2026
01 · The system I chose not to own

The merchant should never be able to tell where Shopify ends and we begin.

Every competitor solved wine compliance by moving the winery somewhere else: a hosted compliance checkout, or an upgrade to Shopify Plus. Our user is a tasting‑room manager who moves between our settings and Shopify’s own orders in a single sitting. If our half looks like a different product, she is learning two systems.

So I built the admin app on Polaris and used Shopify’s components instead of mine. That was a choice, not a rule: Shopify requires App Bridge and an embedded experience, but Polaris itself is only required if you want the Built for Shopify badge. I traded having a look for her never noticing the seam.

The hardest part was that Polaris has no pattern for a page inside a page. The admin is built on one hop, index to detail, and our model went deeper than that: a compliance profile, the states inside it, the rules inside a state. Every obvious fix was a lookalike, and a lookalike is the one thing that reads as not‑Shopify.

So I flattened the model to the one hop Polaris actually gives you. The depth we could not show natively, we stopped showing: it cost us a way to express the structure, and it bought us a product that never looks foreign inside somebody else’s admin.

The trade pays back quietly. When Shopify changed the admin’s primary button from green to black, our app changed with it and nobody here spent an hour on it.

02 · Themes I will never see

The storefront half was not a preference. It was the only route the product had.

A state alcohol fee has to reach the buyer as a real line before they pay. Inside Shopify’s checkout that is Plus‑only work, and Shopify Functions cannot add a line at all. The only place left is the cart, on the merchant’s storefront, which means our code runs inside a theme I have never seen.

Shopify’s app review team rejects blocks that do not inherit the theme’s type and color. The platform then refuses to hand you either: color schemes are not exposed to app blocks, and a theme app extension’s stylesheet is a static file that cannot read one theme setting.

The only reliable way to inherit a theme is to destroy everything it gave you, then hand two properties back.

Reset our wrapper to nothing, scoped so it can never touch the store around it, then re‑inherit exactly two things: font family and color. Size, spacing, states and motion stay ours, because those are structure. Type and color belong to the store, because those are identity.

So the components keep their proportion and states, and take type and color from the store. I designed every state, then how much of itself each one gives up on arrival.

The variance is the real spec. A scan of 986,167 storefronts in August 2026 found more than 36,700 distinct themes, and 77,000 stores still running ones Shopify has deprecated. All of it inside 100 KB of Liquid, roughly 10 KB of compressed JavaScript, and no external scripts: no framework, no icon set, no web font.

Running prototype The age gate, the eligibility check and the California alcohol fee, all rendered by a theme app extension inside the store’s own theme. Nothing here is my typeface or my color. The block resets itself and takes both from the store.
Running prototype The club runs on the winery’s own storefront and customer account, not a third‑party portal. Same two inherited properties, two years later, against a newer theme architecture.
03 · Four people, none full-time

The rule was that this could never become anyone’s job.

CrushSuite started as a mentorship with one rule: it could never require full‑time effort from anybody building it. That is why AI was a requirement and not an option.

It argued with decisions before anything was drawn, generated variants against the Polaris and theme constraints faster than I could evaluate them, and built the components in code as the design.

I write, merge and deploy the production code: a React and TypeScript front end, APIs on Supabase and Postgres, and CI on GitHub Actions, with the Shopify, payments and Claude API integrations. I also built the admin, support and AI agent tools the four of us run it on.

Because every component lived in the codebase with its states already defined, the same source produced the documentation. I wrote 216 knowledge base articles and the onboarding guide out of it, so the docs show the interface that is running rather than a screenshot that quietly stopped being true.

That is the support model, not marketing. The buyer is a winemaker who will never file a ticket. If the answer is not written when she needs it, she leaves.

AI produced the volume. I owned the judgment: what a component refuses to do, and what it gives up when it lands in a stranger’s theme.