AI-powered Etsy listing studio. Upload a product photo, get SEO-tuned copy (title, description, 13 tags, materials, alt text), then optionally create a draft listing in your Etsy shop via the Open API.
No deploy required — run it locally on your machine with your own OpenAI API key.
Try the hosted demo: contentsy.onrender.com
The term Etsy is a trademark of Etsy, Inc. This application uses the Etsy API but is not endorsed or certified by Etsy, Inc.
product image
│
▼
Vision Analyst → niche, style, materials, audience
│
▼
SEO Strategist → high-intent Etsy search keywords
│
▼
Copywriter → title, description, tags, materials, category
│
▼
You review & edit
│
▼
Etsy Open API → draft listing + image upload (optional, OAuth per seller)
- Category playbooks (jewelry, digital, home decor, …) with real Etsy taxonomy paths
- Keyword scoring (Google Autocomplete when available)
- OAuth 2.0 + PKCE shop connection (
listings_r,listings_w,shops_r) - Terms & Privacy acceptance before Etsy connect
- Web UI and CLI — copy generation works without Etsy credentials
| Required | Optional |
|---|---|
| Python 3.12+ | Etsy app credentials — only for draft publish |
| Your own OpenAI API key |
API usage is billed to your OpenAI account. Etsy setup is not needed to generate listing copy.
git clone https://github.com/eisenheiim/contentsy.git
cd contentsy
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .envEdit .env — minimum:
OPENAI_API_KEY=sk-your-key-here
CLIPCHEF_WEB_DEBUG=1
CLIPCHEF_WEB_DEBUG=1 disables the free-trial gate so you can generate without limits locally.
Start the web UI:
python -m clipchef.web
# → http://127.0.0.1:5050Upload a product photo, pick a category template, and click Generate copy.
python main.py --image ./product.jpg --context "handmade ceramic mug"
python main.py --image ./product.jpg --no-fill # skip Etsy publishOnly needed if you want Create Etsy draft in the UI.
- Create an app at developers.etsy.com
- Add this redirect URL (must match exactly):
http://127.0.0.1:5050/etsy/callback
- Scopes:
listings_r listings_w shops_r - Add to
.env:
ETSY_API_KEY=your-keystring
ETSY_SHARED_SECRET=your-shared-secret
ETSY_REDIRECT_URI=http://127.0.0.1:5050/etsy/callback
- Restart the app, click Connect Etsy, then publish a draft.
| Variable | Required | Default | Notes |
|---|---|---|---|
OPENAI_API_KEY |
yes | — | Your OpenAI API key |
CLIPCHEF_WEB_DEBUG |
no | 0 |
Set 1 locally to skip trial limit |
ETSY_API_KEY |
publish | — | Etsy app keystring |
ETSY_SHARED_SECRET |
publish | — | Etsy app shared secret |
ETSY_REDIRECT_URI |
publish | http://127.0.0.1:5050/etsy/callback |
Must match Etsy app exactly |
CLIPCHEF_MODEL |
no | gpt-4o-mini |
SEO + Copywriter |
CLIPCHEF_VISION_MODEL |
no | gpt-4o-mini |
Image analysis |
CLIPCHEF_PUBLISH_MODE |
no | api |
Etsy API publish (default) |
See [.env.example](.env.example) for the full list.
clipchef/
agent.py # Vision → SEO → Copywriter pipeline
web.py # Flask app + OAuth routes
etsy_api.py # Etsy Open API v3 client
taxonomy.py # Etsy seller taxonomy (24h cache)
templates/ # Web UI + legal pages
main.py # CLI entry
.env.example # Env template (safe to commit)
MIT — see LICENSE.
