listwright
A command-line Etsy copywriting tool built on the open-weight Gemma model. It takes product photos and factual descriptions as input and outputs titles, tags, and descriptions. A built-in rule checker separates generation from validation, flagging potential risks for human confirmation.
Timeline (last 90 days)
listwright is an open-source command-line tool that uses the Gemma 4 model to generate Etsy product titles, 13 tags, and three-paragraph descriptions from product photos and factual inputs.
listwright's core design is the separation of generation and validation: the model is only responsible for generating copy, and a checker written in pure Python (rules.py) is responsible for classifying output into ready, confirm, or not ready before the user sees the result.
The author tested with 12 real listings run twice each for 24 generations in total, of which 17 were ready on the first pass, 7 entered confirm, 0 failed, with an average time of 5.5 seconds and a total cost of $0.0035.
Of the 7 confirms, 5 came from "lazy-version" inputs (the model read dimensions and date information from the photo that the user had not provided) and 2 came from 'personalised' printed items (each of the two factual inputs triggered one).
Because it uses open-weight models, when the author's local GPU driver failed, they pointed the calls to the hosted version of the same Gemma 4 family (26B) by changing environment variables, continuing without rewriting any code.
The listwright implementation contains only three core files: model.py (makes model calls), draft.py (sends photos and facts and handles retries), and rules.py (a pure rule checker), with no external dependencies.
listwright's checker does not know whether a tag is 'good' and once labeled a moon poster as 'astrology art', causing a shelf error; tag quality still requires human judgment.
listwright's spelling-check strategy is to check only place names appearing mid-sentence, abandoning general full-sentence spell checking to avoid false positives between real words such as includes/included and covers/coders.
listwright's checker skips negation contexts to avoid misjudging negative sentences like 'you are getting a digital file, not a physical print' as false claims.
listwright is installed via pip install git+https://github.com/casareanderson/listwright.
2 more timeline events
All Facts (12)
listwright is an open-source command-line tool that uses the Gemma 4 model to generate Etsy product titles, 13 tags, and three-paragraph descriptions from product photos and factual inputs.
50%Unverifiedlistwright's core design is the separation of generation and validation: the model is only responsible for generating copy, and a checker written in pure Python (rules.py) is responsible for classifying output into ready, confirm, or not ready before the user sees the result.
50%UnverifiedThe author tested with 12 real listings run twice each for 24 generations in total, of which 17 were ready on the first pass, 7 entered confirm, 0 failed, with an average time of 5.5 seconds and a total cost of $0.0035.
50%UnverifiedOf the 7 confirms, 5 came from "lazy-version" inputs (the model read dimensions and date information from the photo that the user had not provided) and 2 came from 'personalised' printed items (each of the two factual inputs triggered one).
50%UnverifiedBecause it uses open-weight models, when the author's local GPU driver failed, they pointed the calls to the hosted version of the same Gemma 4 family (26B) by changing environment variables, continuing without rewriting any code.
50%UnverifiedThe listwright implementation contains only three core files: model.py (makes model calls), draft.py (sends photos and facts and handles retries), and rules.py (a pure rule checker), with no external dependencies.
50%Unverifiedlistwright's checker does not know whether a tag is 'good' and once labeled a moon poster as 'astrology art', causing a shelf error; tag quality still requires human judgment.
50%Unverifiedlistwright's spelling-check strategy is to check only place names appearing mid-sentence, abandoning general full-sentence spell checking to avoid false positives between real words such as includes/included and covers/coders.
50%Unverifiedlistwright's checker skips negation contexts to avoid misjudging negative sentences like 'you are getting a digital file, not a physical print' as false claims.
50%Unverifiedlistwright is installed via pip install git+https://github.com/casareanderson/listwright.
50%Unverifiedlistwright by default calls the local gemma4 model via Ollama, through an abstraction layer compatible with the OpenAI chat API, and switching to a remote hosted endpoint only requires changing environment variables.
50%Unverifiedlistwright is a Hacktoberfest side project that so far only the author has used, and it only supports Etsy's rules.
50%