This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
What I Built
This started with my grandmother. She grows peanuts and corn and sells them at the local market. But big supermarket chains have moved into rural areas too, and there is less and less room for sellers like her. She has never thought about selling online, because she doesn't know how to use the devices and apps it takes.
That's where the idea came from: something that lets her, and the people in her rural area, buy and sell easily, with as few steps as possible. Taking a photo and tapping a few buttons should be enough. Farm Post is built for people like her: people who know their harvest, not marketing.
Farm Post is a Telegram bot for small farms that already sell directly to their customers: a farm shop, a market stall, a family with a field of persimmons.
The farmer takes one photo and sends it to the bot. That's the only thing they have to do.
- Gemma 4 reads the photo and writes the whole post: a title, a short warm description and hashtags.
- Live online prices for similar products appear next to the question "How much?", so the farmer has a reference. They tap a price, a unit (per kg, per piece, per jarβ¦) and how many they have.
- Four ready-to-post designs are drawn from the farmer's real photo (banner, chalkboard, polaroid, magazine). No AI-generated images: what customers see is what they pick up.
- One more tap and the post is live in the farm's Telegram channel, with the date, a listing number and a π Reserve button.
- A customer taps Reserve and chooses how many. Stock goes down by itself, the post updates, and the farmer gets a message. They pay at pickup.
No website, no shop builder, no agency.
Who would pay for it?
I didn't want to guess, so I looked for research on farms that sell direct. A 2025 survey of 208 agricultural direct marketers in Germany found:
"a considerable proportion of farmers are still reluctant to actively use these channels. The most frequently cited barriers are lack of time, and technical expertise, as well as uncertainties regarding the creation and planning of content."
β When will I be successful? The use of social media in agricultural direct marketing in Germany, Agricultural and Food Economics 13, 23 (2025)
Farm Post is built around exactly those three barriers:
| Barrier from the study | Farm Post |
|---|---|
| No time | One photo, then taps. No typing. |
| No technical skills | It's just Telegram. No website to build. |
| Not sure what to post | Gemma writes the text, and you pick one of four designs. |
I'm building for two kinds of sellers. Some, like my grandmother, have never sold online and wouldn't know where to start. Others already have customers, but take orders by phone, one call at a time. Farm Post gives both a simple way to post what they have today and let customers reserve it. That's who I think would pay.
Demo
https://youtu.be/Ahk6svVCpEQ (1:39, English narration and captions)
Live demo channel: https://t.me/demofarmshop_lee (open it in Telegram and tap π Reserve under a post to try the customer side)
The video uses screenshots from a real run on 17 October 2026:
- Gemma 4 (
gemma-4-26b-a4b-it) wrote the persimmon post in 38 seconds. - The market line read: Online shops (DE) sell "fresh persimmon fruit" for β¬1.19 to β¬118.28, typical β¬15.95 (23 offers).
- The post went to the channel with a Reserve button, and the reservation reached the farmer's chat.
The four designs the bot made from that one persimmon photo:
Code
gracelee087
/
farm-post
One photo β a sales post in a farm's Telegram channel, with a Reserve button. Gemma 4 writes it, SerpApi shows market prices, runs on Render.
Farm Post
One photo β a finished sales post in the farm's Telegram channel, with a Reserve button For small rural sellers (one person or a family): vegetables, fruit, eggs, honey, jam, hand-knitted goods.
Built for the DEV Hacktoberfest Open-Source AI Challenge, Week 2 "Side Hustle".
Demo video: https://youtu.be/Ahk6svVCpEQ Β· Demo channel: https://t.me/demofarmshop_lee
How it works
- The seller sends a photo to the Farm Post bot on Telegram.
- Gemma 4 reads the photo and writes the title, text, tags and a search query (
generate.py). - Online prices for that query (SerpApi, via
price-proxy/) are shown; the seller taps a price, unit and stock. - Four designs are drawn from the real photo (
design.py); the seller picks one and taps Post. - Customers tap π Reserve under the post, choose an amount, and pay at pickup. Stock goes down and the seller gets a message.
The writing rules liveβ¦
| File | What it does |
|---|---|
bot.py |
The Telegram bot: photo β price β unit β stock β design β post β reservations |
generate.py |
Gemma 4 through the Gemini API, or local Ollama when no API key is set |
skills/farm-post/SKILL.md |
The writing rules Gemma follows, in the open Agent Skills format |
design.py |
Four designs from the real photo (Pillow) |
price-proxy/ |
A small server on Render that keeps the SerpApi key private |
How I Built It
Farmer's phone (Telegram)
photo βββΊ bot.py
βββΊ Gemma 4 (open weights) reads the photo + SKILL.md rules
β β title, description, hashtags, a 2-4 word search query
βββΊ price-proxy on Render ββΊ SerpApi Google Shopping
β β lowest / typical / highest price, number of offers
βββΊ farmer taps price, unit, stock
βββΊ design.py β 4 designs from the real photo
βββΊ Telegram channel post + π Reserve button
Customer taps Reserve β picks an amount β stock updates β farmer is notified
Gemma 4 is the core. It's the only AI step, and it does the part farmers find hardest: looking at a photo and turning it into a post. I use Gemma 4 26B (gemma-4-26b-a4b-it) through Google's Gemini API, and fall back to the 31B model if the API is busy. The prompt asks for strict JSON (item, title, body, tags, search query), so the bot can use every field directly.
The rules live in a plain file anyone can edit. What makes a good farm post is written down in SKILL.md: the title is the product plus one thing you can actually see, the body is 3β5 friendly sentences ending with "Send me a message to reserve yours", and the model must never invent prices, weights, origins or "organic". The bot reads those rules straight from the file. A farmer (or anyone) can change how posts are written without touching code.
Prices are never made up. The farmer taps the price. Gemma only writes a search query, and SerpApi looks up what online shops charge. The bot always says it's "only a rough guide for a farm or market stall".
SerpApi + Render. SerpApi gives the bot live Google Shopping results. The key must not sit in the bot, so a 185-line Python server (standard library only) on Render's free plan holds it. It caches each query for an hour and stops at 200 lookups a day so a free key can't be drained. The bot itself also runs on Render as a web service in webhook mode, defined in the same Blueprint (price-proxy/render.yaml).
Honest limits
- Writing a post takes about 30β40 seconds on Google's free tier (measured: 30 s and 38 s for the persimmon, 23β54 s in other tests).
- Online-shop prices are noisy. In one persimmon search in Germany the results also included seeds and young trees, which is why ranges can be so wide.
- Render's free plan sleeps when idle, so the first price lookup after a break can be slow. The bot retries.
- The demo video was recorded while the bot ran on my laptop. It now runs on Render. Reservations have only been tested from my own account so far.
- Google's free tier for the Gemini API may use the data to improve Google's products. A farmer who doesn't want that can run Gemma locally instead (see below).
Why Does Open Innovation Matter?
Because the farmer shouldn't be locked in.
Gemma 4's weights are open (Apache 2.0). Today Farm Post calls Gemma through Google's free API because that's the cheapest way to start. But if that ever changes, gets too expensive, or a farmer doesn't want their photos on someone else's server, the same model runs on their own computer: without an API key, generate.py switches to Gemma 4 through Ollama. Nothing else changes. With a closed model, the business would depend on one company's price list and terms.
Open weights also let me test models myself instead of trusting a model card. On my laptop (CPU only, no GPU), I ran the same three farm photos (potatoes, eggs, apples) through two open models, once each. Gemma 4 e4b took 71 seconds in total and Gemma 3 4B took 100 seconds. Both named all three products, but Gemma 3 added details that weren't in the photo, like "happy hens" and "German eggs". So the local fallback uses Gemma 4.
The same goes for the rules. They're in an open Agent Skills file, not hidden in a prompt on a server. Farmers know their products better than I do, and they can fix the wording themselves.
What's Next
- A customer-service agent. It would answer simple questions from the listing data (name, price, stock) and pass everything else to the farmer. It's not built yet. It needs pickup times and an address first, so it never makes up an answer.
- Run the bot on Render full-time and test reservations with real customers.
- Payments. Today customers pay at pickup. Later I'm thinking about connecting online payments and customer support, and turning Farm Post into a full product.
Prize Categories
-
Best Use of Gemma: Gemma 4 (
gemma-4-26b-a4b-it) reads every photo and returns one strict JSON with five fields (item, title, body, tags, search query). The persimmon post took 38 seconds. Without an API key, the same flow runs ongemma4:e4bthrough Ollama on a laptop. - Best Use of SerpApi: Google Shopping results sit next to the price question, so the farmer sees what real shops charge and the model never makes up a price. Gemma only writes a 2β4 word search query. For the persimmon: 23 offers, β¬1.19 to β¬118.28, typical β¬15.95.
-
Best Use of Render: one Blueprint (
price-proxy/render.yaml) defines two web services: the Telegram bot in webhook mode, and a 185-line price server that keeps the SerpApi key private, caches each query for an hour and stops at 200 lookups a day.


Top comments (0)