Back to projects

In plain English

My online art shop. I use AI to design printable wall art and kids' colouring books and sell them on Etsy, where customers buy and download instantly. From spotting trends to making the art to listing it, the whole thing runs almost on autopilot.

End-to-end · Solo build

Kepo Prints

A solo-run Etsy shop selling AI-generated printable wall art and Gelato POD framed prints. Python pipeline turns one plant or landscape name into 10 color variants, room mockups, SEO copy, and an Etsy draft listing. 40 listings, sale-anchor pricing, pre-revenue.

ProductDesignAI engineeringBackend
Dusty Blue Protea triptych styled in a boho living room
Dusty Blue Protea triptych, one of 10 botanical wall art designs, shown in a boho living room mockup

Browse the shop

Botanical triptychs, nature landscapes, framed prints

Digital downloads from €8.99 (sale €5.99), framed prints from €87.99 (sale €59), printed and shipped via Gelato.

By the numbers

Live since

Apr 2026

Shop opened, pre-revenue

Listings

40

10 botanical, 10 nature, 10 framed, 10 coloring

Pinterest reach

15-26

Impressions per botanical pin

Cost per design

~$0.50

Gemini API + Etsy listing fee

Why I built this

I wanted a side income stream that runs without my daily attention. Printable products on Etsy fit the brief: zero physical inventory, instant delivery, and the product is generated entirely from a prompt. The hard part isn't the art, it's the operational loop around it.

So I built the loop. One command (create.py lavender) turns a plant name into 10 color variants, A4 + US Letter PDFs, 4 room mockups per color, a 6-section Etsy-tuned description, 13 tags, and an optional Etsy draft listing. Same pattern for landscape triptychs and Gelato-printed framed prints. Going from idea to listed takes a few minutes of attention plus a few minutes of compute.

No sales yet. The shop is pre-revenue while I run the sale-anchor pricing migration and rework opening lines on every listing (Etsy 2026 ranking weights photos and openers heavily for shops with no review history). Pinterest impressions are encouraging on botanicals. The coloring book line is being phased out as off-brand for the shop's minimalist-decor audience.

How the pipeline works

One command from prompt to Etsy draft. Same pattern across botanical, landscape, and Gelato-framed lines.

1

I pick a subject

Run create.py lavender (or any of 17 plant presets, or free-text like 'protea'). For landscapes it's create.py with --panoramic. For Gelato framed prints it's create_framed.py. Default is all 10 color presets, override with --colors.

2

Gemini generates the base image

Gemini 3 Pro renders a wide panoramic botanical line-art or landscape image (3:1 ratio for triptych). One high-res PNG per design. Hunyuan via fal.ai is the fallback for stricter line art.

3

Pipeline colorizes and slices

Pillow + ReportLab clean the image, swap black lines for the target color, optionally restyle the background, slice into 3 panels per triptych, and export A4 + US Letter PDFs at 300 DPI. 10 color variants per design by default.

4

Room mockups and SEO copy

Mockup generator composites each colored panel set into 4 room templates (living room, bedroom, hallway, etc). pipeline/seo.py asks Gemini 2.5 Flash for an Etsy-tuned title, 6-section description, and 13 tags per color variant.

5

Etsy API uploads as a draft

etsy_client.py posts the listing via Etsy API v3 with the right taxonomy, section, mockups, and PDF files. I review the draft, check the 'Made with AI' box manually (API can't set it), and publish. Or use the Gradio UI at localhost:7860 to drive the whole pipeline visually.

Product lines

Cherry Blossom triptych in a boho living room

10 active

Botanical wall art

Digital triptychs in 10 color variants each. Cherry Blossom shown. Catalogue: Monstera, Lavender, Olive, Eucalyptus, Peony, Fern, Pampas, Magnolia, Cotton.

Coastal Ocean watercolour triptych in a cozy bedroom

10 active

Nature wall art

Digital landscape triptychs. Coastal Ocean shown. Catalogue: Mountains, Forest, Desert Sunset, Sky, River, Snowy Winter, Spring Meadow, Autumn, Lake.

Dusty Blue Protea framed triptych in a boho living room

10 active

Framed prints (Gelato)

Physical framed prints printed and shipped via Gelato POD (EU-based). Sizes 27×35, 30×40, 40×50 cm. Botanical variants of the digital line.

A 4th line of 10 themed kids' coloring books is being phased out: incoherent with the shop's minimalist-decor audience. Local files kept, will relaunch as a separate shop later if there's demand.

Key features

One-command pipeline

create.py <plant> generates base image, 10 color variants, panels, A4 + US Letter PDFs, 4 room mockups per color, SEO + tags, and an optional Etsy draft

Gemini image generation

Gemini 3 Pro for base images, Gemini 2.5 Flash for SEO copy. Hunyuan via fal.ai is the fallback for stricter line art.

Gradio UI

app.py opens a local Gradio interface at localhost:7860 to drive the whole pipeline visually instead of CLI flags

Gelato POD integration

create_framed.py orchestrates physical framed prints via Gelato API. EU-based fulfillment, 3 frame sizes, margin-tested per destination.

Etsy API v3 client

OAuth 2.0 + PKCE with auto-refreshing tokens, draft uploads with correct taxonomy/section/images/PDFs, 401-retry wrapper

Bulk repricer + sale-anchor

bulk_reprice.py pushes new sale-anchor prices (list high, run 33% sale events) across all listings via Etsy API. FTC-safe 14-day anchor period built in.

Tech stack

Pipeline

PythonPillowReportLabGradio

create.py / create_framed.py / create_coloring.py orchestrate per-line workflows. Gradio app.py wraps the same pipeline in a local web UI.

AI

Gemini 3 ProGemini 2.5 FlashHunyuan

Gemini 3 Pro for base images, Gemini 2.5 Flash for SEO copy via direct API. Hunyuan via fal.ai as fallback for stricter line art.

Commerce

Etsy API v3Gelato API

Etsy v3 (OAuth 2.0 + PKCE) for draft uploads and bulk repricing. Gelato API for live wholesale price checks and POD framed-print fulfilment in DK/DE/UK/US.

Research (paused)

Telegram Bot APIpytrendsAPScheduler

trend_scanner.py polls Etsy search + Google Trends daily and pushes top topics to Telegram. Built for the coloring-book line, paused now that the line is being phased out.

Under the hood

I type in one plant or landscape name and the system does the rest: it draws the art, makes ten colour versions, builds the room photos, writes the shop copy, and prepares the listing. What used to take a full day now takes a few minutes.

The three product lines, prints, framed art, and colouring books, all run through one shared engine, so improving the engine improves everything at once instead of fixing the same thing three times.

Brand & creative

Marketing posters and animated creative

Shop posters and an animated 9:16 ad creative generated with Pomelli, Google's AI brand toolkit. Separate from the product imagery, which is generated through the main pipeline above.

Kepo Prints brand posterBrand poster
Kepo Prints value-prop posterValue prop
Animated MP4

Common questions

Is this a real shop or just a portfolio piece?+

Real Etsy shop, 40 listings (10 botanical + 10 nature + 10 framed + 10 coloring). KepoPrintsDesign on Etsy. Pre-revenue: I'm prioritizing pipeline + pricing migration over promotion right now.

What are the prices?+

Digital triptychs: €12.99 list / €8.99 on sale. Coloring books: €8.99 / €5.99 (being phased out anyway). Framed prints via Gelato: €87.99-€127.99 list / €59-€85 on sale depending on size. The pattern is anchor-then-sale, FTC-safe with a 14-day list-price period before any sale event.

How much does it cost to run?+

About €0.20 per Etsy listing (one-time) plus Gemini API costs of roughly €0.04-0.08 per generated image. No backend infra; the pipeline runs locally and uploads via API. The only subscriptions are Etsy's per-listing fee and the eventual transaction fees on sales.

Is everything AI-generated?+

The artwork is AI-generated via Gemini. The SEO copy is AI-generated via Gemini Flash. The pipeline orchestration, color processing, mockup compositor, Etsy API client, Gelato pricing logic, and bulk repricer are all hand-written Python.

How do you handle the "Made with AI" disclosure?+

Etsy requires sellers to disclose AI-assisted listings. Listings post as drafts via the API; I open each one in the Etsy dashboard, check the 'Made with AI' box (which the API can't set), then publish. Manual but quick.

Digital downloads or physical prints?+

Both. Digital triptychs are buy-once-print-anywhere at home or a local print shop (A4 + US Letter included). Framed prints are physical, printed and shipped via Gelato (EU-based, 3-5 day delivery in Europe). Same artwork across both lines.

What I learned

  • ·On Etsy, the first photo and the opening line of a listing matter far more than the tags. I wasted two days tweaking tags before realising the cover image moves sales many times more.
  • ·Pricing has to account for all the fees that get taken out. My early prices looked fine but actually lost money on the bigger framed sizes, so I switched to listing higher and running real sales.
  • ·The hardest part of a print shop is not making the art, it is getting people to find it. Traffic and good listings are a marketing problem, not a coding one.

What's next

Honest roadmap. Things I know are gaps, in priority order.

First sale

The biggest gap isn't code, it's traction. Need a Pinterest pin strategy that converts impressions into shop visits and Etsy SEO that converts visits into sales. Both are content problems, not engineering problems.

Push the sale-anchor migration

bulk_reprice.py is built and tested locally but hasn't been run against the live API yet (tokens went stale). Re-auth, dry-run, push, then create one 33%-off Sale event in the dashboard. Should unlock the relaunch.

Relaunch coloring as a separate shop

Coloring books are being dropped from KepoPrintsDesign because they don't fit the minimalist-decor audience. Local files kept. If trend-scanner signals demand, relaunch as a kid-focused sibling shop with its own brand.

Auto-publish once Etsy ships the AI field

Currently I manually check the 'Made with AI' box before publishing because the API can't set it. When Etsy ships an API field for it, the loop becomes fully autonomous with one approval step.

Let's talk about this project

More projects

PythonPillowReportLabGradioGemini 3 ProGemini 2.5 FlashHunyuanEtsy API v3Gelato APITelegram Bot APIpytrendsAPScheduler