DEV Community

Cover image for ListingLab: a local Gemma model that writes your Etsy and eBay listings and keeps your photos private
Sahan Dilshan
Sahan Dilshan

Posted on

ListingLab: a local Gemma model that writes your Etsy and eBay listings and keeps your photos private

Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle

What I Built

Writing listings is the part of selling online that eats the time. Every item needs a title that fits the platform's limit, a description, key details and a full set of tags, and then you do it all again for the next product.

ListingLab is a small web app that writes the first draft. You drop up to four product photos, add a few notes about the item, pick Etsy or eBay, a voice and a language, and it writes a listing you can paste into the marketplace. It runs on your own laptop with Gemma through Ollama, so your photos and notes never leave your machine, and each listing shows $0.00 in API fees.

ListingLab with four product photos, notes, and a generated eBay listing on a yellow price tag: a title with a 64 of 80 character meter, a description, key details and tags

What it does:

  • Writes the listing: title, a two-paragraph description, key details and tags.
  • Knows the marketplace rules: Etsy titles up to 140 characters with up to 13 tags of 20 characters or fewer, eBay titles up to 80 characters. A live meter shows how close the title is to the limit.
  • Lets you steer it: four voices (Warm, Minimal, Playful, Premium), four languages (English, Spanish, French, German), two alternative titles, and Regenerate, Shorter and More detail buttons.
  • Checks the result: a 0 to 100 score from six listing basics. It is a checklist, not a sales prediction.
  • Does the maths: a Profit tab turns your item cost, selling price, shipping and fee percentage into profit, margin and break-even price.
  • Keeps a history of recent listings, exports to .txt or CSV, and lets you click a photo to enlarge it.

Who would pay for it? My guess is sellers with a growing catalogue, such as small Etsy shops and people reselling items on eBay, for whom time per listing matters and who would rather not send product photos to a cloud service. Because it costs nothing to run per listing, it could be sold for a one-off price or a small monthly fee. I have not tested whether anyone would pay, so please read that as a hypothesis, not a result.

Demo

Live: https://listinglab-15yt.onrender.com/

An honest note about the hosted copy: it runs on Render's free tier, which cannot run a language model. There, the app says Model offline, template mode and builds a plain template from your notes. Everything else works, including the platform limits, the Check tab and the Profit tab. The first load can take up to a minute while the free instance wakes up. The real experience is the local one, where Gemma writes the listing.

The empty app, with the drop zone, notes box, platform switch, voice and language:

ListingLab's empty state: a photo drop zone, a notes box, an Etsy and eBay switch, voice chips and a language menu

The Check tab scoring a listing:

The Check tab showing a score of 50 out of 100 with a checklist of six listing basics

The Profit tab:

The Profit tab: item cost 2000, selling price 3000, shipping 50 and 5 percent fees give a profit of 800, a 27 percent margin and a break-even price of 2157.89

Code

ListingLab

Photos and a few notes in. A ready-to-paste Etsy or eBay listing out. It runs on the seller's own laptop, so product photos stay private and every listing costs nothing in API fees.

Built for the Hacktoberfest 2026 Open-Source AI Challenge, Week 2 (theme: Side Hustle).

The problem

Small sellers spend more time writing listings than making products. A good listing needs a title that fits the platform's limit, a clear description, key details and a full set of tags, repeated for every item. Paid AI tools charge per listing or per month, and they upload your photos and product ideas to someone else's server.

What ListingLab does

Feature Detail
Listing writer Title, two-paragraph description, key details and tags from up to 4 photos and your notes
Etsy and eBay rules Etsy: title up to 140 characters, up to 13 tags of at most 20 characters. eBay: title
…

How I Built It

  • Model: Gemma 3 4B (open weights), run locally with Ollama. The server calls Ollama's local chat API and asks for JSON.
  • Server: one Python standard-library file, no framework and no pip packages.
  • Interface: one HTML file with inline CSS and JavaScript. Photos are shrunk to 768 px in the browser before they are sent.
  • Deploy: a Dockerfile and a render.yaml blueprint for Render. The public demo sets LL_NO_HISTORY=1 so visitors never see each other's listings.

The model writes the words. Everything that has to be right is ordinary code. The marketplace rules live in a small table, and the server clips the title to the limit and cleans the tags (lowercase, no duplicates, at most 20 characters each):

RULES = {"etsy": (140, 13, "Etsy: title up to 140 characters, up to 13 tags, each tag at most 20 characters."),
         "ebay": (80, 8, "eBay: title up to 80 characters, factual and keyword-first, up to 8 keyword tags.")}
Enter fullscreen mode Exit fullscreen mode

The score and the profit maths are plain JavaScript, so they never depend on the model. If the model cannot read photos, the app falls back to your notes and says so. If Ollama is off, it uses a plain template and says so. It never pretends.

What I found when I tested it

I ran it on my own laptop with gemma3:4b. One run with four photos and a long set of notes took 18.7 seconds and 709 tokens, and the app showed $0.00 in API fees. Two honest things from that run:

  • The model did not read my photos. The copy of the model on my laptop could not take image input in that run, so ListingLab fell back to my notes and said so on screen ("Used your notes only"). Photo reading needs a vision-capable model. I have not verified photo reading end to end.
  • The model added a detail I did not give it. The title it wrote included a condition, "Excellent Condition", that was not in my notes. My prompt tells it not to invent facts, and a small model still does. That is why the Check tab exists and why the app is a drafting tool, not an autopilot: read every listing before you publish it.

The Check tab scored that listing 50 out of 100 and flagged a short description and too few key details. For the Profit tab, an item cost of 2000, a selling price of 3000, shipping of 50 and fees of 5% gave a profit of 800.00, a 27% margin and a break-even price of 2157.89. The numbers are currency-neutral, and you enter your platform's current fee percentage because fees change.

Why Does Open Innovation Matter?

A listing writer sees exactly what a seller is about to sell: unreleased products, handmade designs, photos of stock at home. With open weights, that all stays on the seller's machine. The app also works with the Wi-Fi off, because the model, the server and the page are all local.

Cost is the other reason. A seller with hundreds of products would pay per listing, or per month, to a closed API. Running the model locally means the marginal cost of one more listing is electricity, and the seller is not tied to someone else's pricing. The model is also one setting (LL_MODEL), so it can be swapped for a different open model, and in future fine-tuned on a shop's own best listings. I have not done that fine-tuning yet.

There is a trade-off, and I want to be straight about it. A 4B model writes less polished text than the biggest closed models and sometimes invents details, as my test showed. I leaned on that by keeping the limits, the score and the profit maths in code, and by labelling every fallback on screen.

My Agent Session

I built this with Claude as a coding assistant and AI-assisted drafting. I ran the app, tested it, took the screenshots and decided what to keep.

Prize Categories

  • Best Use of Gemma: Gemma 3 4B runs locally through Ollama and writes every listing the app produces on my machine.
  • Best Use of Render: the web app is deployed on Render from a Docker blueprint in the repo. The model does not run on Render, so the hosted demo uses the template fallback.

Top comments (0)