This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
What I Built
ListingLocal is an offline listing writer for small Daraz sellers. You type a product name, add a few facts (material, size, colors, price), optionally upload a photo, and get back:
- a keyword-rich title (max 90 characters)
- 5 highlight bullets
- an English description
- a Roman Urdu description
- 8 search tags
Who would pay for it? Small online sellers in Pakistan who run their own store and write every listing by hand. I run a Daraz store myself, so this is a task I know well: writing listings is slow, repetitive and has to be done for every SKU. Roman Urdu matters because many buyers search and read that way, and generic tools handle it poorly.
The model is told to use only the facts the seller gives it or what is clearly visible in the photo, so it doesn't invent specs or warranties.
Demo
It runs locally at http://127.0.0.1:5000. Enter a product, click Write listing, and the result appears in a few seconds to a minute depending on your hardware.
Code
ListingLocal
An offline product-listing writer for Daraz (and similar marketplace) sellers. Enter a product name, add a few facts, optionally upload a photo, and get a ready-to-paste listing in English and Roman Urdu.
It runs on an open-weight model through Ollama, so your product data, supplier prices and photos never leave your laptop.
Built for the open-source AI "Side Hustle" challenge.
What you get
For each product:
- Title: up to 90 characters, keyword-rich, no ALL CAPS
- 5 highlights: short bullet points
- Description: two short paragraphs in English
- Roman Urdu description: the same content in natural Roman Urdu
- 8 search tags
The model is instructed to use only the facts you provide or what is clearly visible in the photo. It should not invent specs, warranties or materials. Always review the output before publishing.
Requirements
- Python 3.9+
- Ollama installed and running
- A vision-capable model (default:
gemma3:4b…
It is a single-file Flask app (app.py) plus a README.
How I Built It
-
Model: an open-weight vision model served by Ollama. The default is
gemma3:4b, and you can change it withMODEL=qwen2.5vl:7b python app.py. -
Backend: Flask with one
POST /generateendpoint. It takes the product name, facts and optional photo, base64-encodes the photo, and sends everything to Ollama's/api/chat. -
Structured output: Ollama's
format: "json"option forces valid JSON. Any missing keys get empty defaults, so the UI never breaks. - Prompting: a system prompt sets the Daraz style, the "only use given facts" rule and the exact output schema.
- Frontend: one inline HTML page with a form and a results box. No build step.
Setup is three commands:
ollama pull gemma3:4b
pip install flask requests
python app.py
Why Does Open Innovation Matter?
- Cost: there is no per-listing fee. A seller with hundreds of SKUs can regenerate and tweak as often as they like. With a paid API, every rewrite costs money, which hurts most for low-margin sellers.
- Privacy: supplier prices, unreleased products and product photos stay on the seller's laptop.
- No lock-in: changing models is one environment variable. If a better model comes out, or a seller wants better Roman Urdu, they swap it in without changing code or pricing plans.
- Fine-tuning: because the weights are open, a seller's best-performing listings could be used to adapt the model to their niche, which a closed API doesn't offer.
- Offline: it works without internet, which helps during outages and load-shedding.
What's Next
- CSV batch mode (one row per product, one listing each), which is the feature I would charge for.
- Few-shot examples from a seller's own top listings.
- A validation pass for title length and banned words.
Top comments (0)