This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle
What I Built
review-concierge drafts thoughtful, multilingual replies to guest reviews — entirely offline, on the machine already sitting at the hotel's front desk, at a marginal cost of exactly €0 per reply.
Who pays for this? Small independent hotels. My family runs one: a 28-room hotel near Luxembourg City's train station, with 280+ Google reviews written in five languages (French, German, English, Dutch, Portuguese). Replying to reviews is one of the highest-ROI tasks in hospitality — and the closed-source answer to it, MARA, costs €70–100 per property per month. That's a real line item for a family business. The core of that job — a well-written, on-brand draft in the guest's own language — is something an open-weight model now does for free.
The side-hustle angle cuts both ways: it's a tool a small business would pay for, and it's only viable because open weights make the marginal cost zero.
Demo
Real run, real review (one of our actual 3★ Google reviews, mentioning a broken shower holder and mould in the bathroom):
$ python reply.py --file reviews_yasha_sample.csv --out replies_yasha.csv
[3/10] done (438 chars)
→ We're so sorry to hear about the issues you experienced with the bathroom
and shower head, and thank you for pointing out the broken holder – we
appreciate you finding a resourceful solution! We sincerely apologize that
the air-conditioning wasn't working as advertised and for the inconvenience
this caused. We're immediately addressing the mildew and mould, and
replacing the shower head holder. Thank you for your feedback; we truly
value it and hope to welcome you back for a much better experience.
The Yasha Hotel team
Notice what it did: acknowledged the specific problems, thanked the guest instead of arguing, named a concrete fix — and did it in English, because the review was in English. The French reviews get French replies, the German ones German, the Dutch one Dutch. I verified all 10 drafts against 10 real reviews: 10/10 in the correct language, 10/10 specific, zero arguments with guests. The full input/output table is in the repo's README.
There's also a tiny web UI (app.py, ~70 lines) so a non-technical front-desk person can paste a review and get a draft in ~20 seconds — no terminal required.
Code
Code: codeberg.org/veysel-devia/review-concierge
The core is reply.py — ~120 lines, Python standard library only. It talks to a local llama.cpp server running Gemma 3 4B (QAT, Q4_0), Google's open-weight model, on a plain CPU (no GPU, ~12 tok/s, a full draft in ~20 s).
How I Built It
Two model calls per draft, both against the local OpenAI-compatible endpoint:
- Language detection — the model itself classifies the review (temperature 0, ISO 639-1 out). No extra dependency, no langid/fasttext baggage.
- Reply drafting — a system prompt that encodes a reputation-manager playbook: reply entirely in the detected language (hard constraint, restated in the user message), 40–80 words, acknowledge one specific detail, apologise without arguing, name a concrete fix for maintenance issues, never discuss the neighbourhood, sign as the hotel.
The one real bug I hit is instructive: my first version said "reply in the same language as the review" — and Gemma 4B, primed by the Luxembourg hotel context, answered roughly half the English reviews in French. The fix was making the constraint explicit and mechanical (detect first, then inject "the review is in English, reply in English"). Small-model prompting is engineering, not vibes.
Why Does Open Innovation Matter?
Three reasons, and they're the whole business case:
- €0 marginal cost is the product. A review-reply SaaS charges per property per month because every reply costs them an API call. With open weights, the hundredth reply costs exactly as much as the first: nothing. That's what turns "nice AI demo" into "tool a 28-room hotel can actually afford."
- Guest data never leaves the building. Reviews contain personal data — names, stay dates, occasionally health details in complaints. Under GDPR, piping them through a third-party API is a compliance conversation most small hoteliers don't want to have. Local inference means there is no conversation: the data stays on the machine, verified working with all egress blocked.
- The voice is a text file, not a paywall. The hotel's tone, apology policy and signature live in a system prompt the owner can edit. With closed tools, that's an enterprise tier.
My First User
The first user is my family's hotel — which is also how I knew what to build. I ran the tool against 10 of its real, currently-unanswered Google reviews (the exact mix a small property faces: a glowing 5★ from a returning business traveller, a furious 1★ in French about a mattress, a 3★ in Dutch). The drafts it produced are good enough to post after a 30-second human read — which is the correct workflow anyway: the AI drafts, the human owns the reply. Would they pay for it? They already pay with something scarcer than money: the reviews were sitting unanswered because nobody at the front desk has time to craft careful replies in five languages. Now the time cost is a paste and a skim.
Prize Categories
- Best Use of Gemma — the entire product runs on Gemma 3 4B, Google's open-weight model, served locally through llama.cpp. Open weights are not an implementation detail here; they're what makes the economics and the privacy story work.
Top comments (1)
detect then inject is the right fix. llama-server can lock it down further with a grammar, so the detect call can only ever return a two letter code and never chat back. are you reusing the cached system prompt between drafts, or does each one pay the full prefill on cpu?