Shopify · Fashion
Love and Hate
Store moved to a new theme, rebuilt product pages, faster on phones
Love and Hate sells lingerie sewn in Poland. I moved the store from an old Prestige 4 theme to Prestige 11 on Online Store 2.0, rebuilt the product pages, added what the EU withdrawal rules require and then measured and removed what slowed phones down.
- Role
- Lead developer: 38 of 39 merged pull requests
- Period
- Apr - Sep 2026
- Stack
- Shopify
- Liquid
- Prestige 11 (OS 2.0)
- Metaobjects
- Customer Privacy API
- Judge.me
- Python
- Live site
- loveandhate.pl(opens in a new tab)


- PageSpeed mobile, average
- 57 → 71
- style recalculation time
- −85%
- collection page size
- 700 → 502 KB
- texts in the EN translation memory
- 3,800+
Context
The live store ran Prestige 4.14, an older theme without app blocks. A redesign on the new version had stalled since June, and the store had nothing that the EU directive on online withdrawal requires: returns went through a printable PDF and an email.
The new version went live on 25 September 2026, in Polish and English.
What I did
- Migration to Prestige 11.1 on Online Store 2.0, with the redesign finished on top of it
- Colour variants as separate products grouped by a metaobject, with a +N counter on product cards
- Sticky add-to-cart bar on phones, with size selects inside the bar
- Bras with band and cup as two side-by-side selects instead of one long list
- Online withdrawal under EU Directive 2023/2673: a footer link and a button on a dedicated page open the withdrawal form
- One region switcher that sets country, currency and language together
- English version through a CSV pipeline with Python scripts and a translation memory of 3,800+ texts
- Own cookie banner on Shopify's Customer Privacy API; Yandex and Clarity load only after consent
- Traced a Baselinker-Fakturownia integration that had blocked month-end accounting to an expired token and backfilled the missing invoices
Hard parts and how I solved them
Problem
Judge.me keeps review counts in Shopify fields, but not the review texts, so product pages showed stars with nothing under them.
Solution
Counts render on the server from the Shopify fields, and the texts load lazily from Judge.me's widget endpoint when the section scrolls into view.
Problem
Three :has() rules in the theme made the browser recalculate styles for over a second on collection and product pages.
Solution
Scoped the selectors to body:has(...). Style recalculation dropped from 1,369 to 205 ms on collections and from 1,238 to 177 ms on product pages.
Problem
The old theme had no app blocks and Shopify's native returns need a customer account, so neither could cover online withdrawal.
Solution
A withdrawal app wired into the theme: a link in the footer and a button on the withdrawal page, with no account required.
Results
- PageSpeed mobile, average of key pages: 57.0 → 71.2
- Page size before compression: collection 700 → 502 KB, search 1,287 → 490 KB
- Product pages on phones, field data from Shopify (75th percentile, first day after launch): 1.83 s → 1.14 s
- Withdrawal online, as required by EU Directive 2023/2673
Screens
Swipe or use the buttons to browse the screens.
Want this kind of work on your team?
I'm happy to walk you through any of these projects in more detail.
Get in touch



