An ecommerce brand born from a gap in the fan art market
Palette Town is my art brand. I hand-draw vector designs inspired by Pokémon TCG and sell them as prints, canvas, shirts and phone cases, all fulfilled print-on-demand through a headless Shopify storefront.
It started on Twitch, where I streamed Pokémon card pack openings and wanted giant card art as posters on the wall behind me. Nothing like that existed online, so I decided to test my illustrator chops (or lack thereof) and make them myself. After a few rounds, I found my own style and was proud of the art. I bet other people might want it too, and since I love building websites and learning how buyers make decisions, I built the entire business myself.
I also wanted to test my marketing skills and see how far I could grow a business spending $0 on ads, using only organic search and social. Analytics and testing are my idea of fun, so why not see what happens?

THE PROBLEM
Outgrowing the old store
The store’s first build was a custom WordPress theme I never had time to polish between client projects, so I swapped it for a premade drag-and-drop theme.
UNFAMILIAR CHECKOUT
Buyers had to type their card into a checkout they’d never seen, and for a small fan art shop, that’s often where the sale ends.
SLOW PAGES
The premade theme was bloated, and it showed in every page load. My store depends on organic search, so slow pages cost me rankings and sales.
SLOW EDITING
Each card list post had 100+ images, and the editor got slower as a post grew. My highest-traffic content took the longest to make and was the most error-prone.
PLATFORM
Choosing headless Shopify
Trusted checkout
As a shopper, I use Shop Pay whenever it’s offered. Moving to Shopify put buyers in a checkout they’ve already used.
Faster pages
The new storefront is a headless Next.js frontend on Vercel, so every page loads faster, which matters most for a store that depends on search.
Polished emails
Shopify’s order and shipping emails look professional out of the box. My WooCommerce setup was finicky to style and charged extra to add tracking info.

TRADEOFF
Skipping the CMS
WHAT I GAVE UP
A CMS entirely, and I miss it. I’m not comfortable writing markdown.
WHY
I’m the only one editing this site, and I wanted an AI workflow that produced content faster than I could by hand. Editing component copy is already familiar to me, so setting up WordPress felt unnecessary.
WHAT REPLACED IT
I defined blog components with clear rules, and Claude writes the structured markdown against them from my description of each post.
BACK OFFICE
Building my own admin
Without a CMS, I built my own panel for the three things my shop needs.

Poster voting
Visitors vote for the next poster with their email. Votes land in Firebase and sync to Klaviyo, so every new poster launches with a list of the people who asked for it.

Card curation
I review incoming votes and suggested cards, then publish new ballot options to the site.
AI blog drafts
I pick related coverage from trusted news sources, the Claude API drafts an original post with every source tracked, and I design a thumbnail in Figma before publishing.
Being my own client is thefastest feedback loop I’ve ever had.

CONTENT OPS
Speeding up card lists
Claude Code now renames every image to an SEO naming convention, writes titles and alt text across the catalog, and checks each post against its card set so nothing’s missing.
Posts that used to take days now take minutes.
PRODUCTION
Handling the launch details

Launch and fulfillment
I moved DNS to Vercel without breaking the shop’s email routing, and integrated and tested Gelato fulfillment end to end.

Search and schema
I fixed a Merchant Center feed rejection, kept product JSON-LD up to Google’s requirements, and wrote SEO packages for all 23 prints from Search Console data.

Email and CRM
I patched Shopify’s transactional emails to show the right store details, and set up Klaviyo to segment subscribers by the posters they voted for.
IMPACT
Growing without ads
Blog posts take minutes instead of days, and faster pages and structured data put my products in Google Shopping results. The voting feature has also grown an email list of people waiting for new posters.
| Ad spend, lifetime | $0 |
|---|---|
| Search impressions | 196KMay–Aug 2026 |
| First 83 days | Clicks +32% · impressions +23%Post-migration |
| Ranking queries | 1,100+ · 99% non-branded |
| Search reach | 169 countries |
| Catalog | 23 designs · 5 formats |
Reflection
Having access to every data point has taught me a lot, and it gives me the confidence to collaborate with other marketers.
Now that blog posts are streamlined, my new bottleneck is creating products in Shopify and Gelato. I may build a Claude pipeline that writes listings from set guidelines and creates them for me to review.
Update, Oct 2026: I started with audits instead. Claude Code checks every listing and shows me anything unusual, like mismatched names or prices. Once I confirm, it updates the pages for me through the Claude in Chrome extension, which has saved me from a lot of errors.
Next time I build a portal for a site, I’ll separate the styling layer from the start, so every part of the site uses consistent components.
Update, Oct 2026: I’m testing this now. Heartcore Studio and Clever Keeper should share one design system, so I’m building every component in Storybook with Claude Code and reviewing each one for consistency. Next, I’ll bring the updates into Clever Keeper locally to see how much it cleans up the app.