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.

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.
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.
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.
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.
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.
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

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.

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

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
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 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 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)
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.
Brand poster
Value propCommon 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.