DEV Community

Kane
Kane

Posted on

Sloth-Butler: Replies to the client messages you dread

Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission 🦥

This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady

What I Built

Sloth-Butler handles the messages you dread replying to.

If you sell your time or your products, you know these messages. A client wants "just one more page" for free. A customer asks for 30% off. An invoice is three weeks late and the client wants another month. None of these are hard decisions. The hard part is the wording, so the reply sits in your inbox for days.

Sloth-Butler writes that reply in a few seconds: polite, firm, and with exactly one counter-offer, such as a paid option, a later date or a partial yes. It quotes your real rates, not numbers it made up.

What it handles:

  • Situations: scope creep (free extra work), discount requests, late or unpaid invoices, pay-later or credit requests, last-minute favours or meetings, and "I'll get back to you". Each situation tells the model what a sensible counter-offer looks like.
  • Your terms, enforced on the server. You save your rate, minimum project price, biggest discount you'll give, payment terms, late fee and next availability. They go with every request. The server then checks the reply in code: if it quotes a price below your minimum (including after a discount) or a discount above your limit, it regenerates once, and if that still fails it appends a line with your real terms. The model's numbers are never the only safeguard.
  • Follow-ups. For late invoices and clients who went quiet, one button plans a friendly nudge, a firmer reminder and a final notice with your late fee, at +3, +7 and +14 days (editable). They land on a Follow-ups board with copy, voice note, mark-sent and mark-paid buttons.
  • A protected log. When you send a reply, log the hours and money it protected. Totals add up on the page. It's stored only in your browser.
  • 6 languages: English, Spanish, French, Portuguese, German and Nigerian Pidgin.
  • Selectable currency, USD by default (EUR, GBP, CAD, AUD, INR, JPY and more).
  • Voice. Play any reply in the ElevenLabs voice Alice, or download it as an mp3 voice note for chat apps.

An example. Situation: free extra work, tone firm, terms $60/hour and $900 minimum.

Since you're already doing the logo, could you also put together a few social media banners? Should be quick for you.

I can't add the banners to the logo project. I can quote them separately at $60 an hour if you'd like them this month.

There's no account and no database, and message text isn't logged.

Demo

Live: https://sloth-butler.vercel.app (guide and FAQ at /guide)

How to use it:

  1. Open the site and press Write a reply.
  2. Fill in Your terms once and save them.
  3. Pick the situation and paste the message you received.
  4. Add the amount or a deadline if it matters, pick a tone (soft, firm, maybe-later) and a language.
  5. Press Write my reply. Copy it, play it, or download the mp3.
  6. For a late invoice, press Plan follow-ups and work through the board.
  7. After sending, log the hours and money it protected.

Always read the reply before sending. The model doesn't know your contract or calendar, so make sure the counter-offer is one you'll honour.

Further down the page, Compare with the untrained model runs the same message through plain Qwen3-8B and through Sloth-Butler side by side, next to the test results.

Code

GitHub logo comzzy / sloth-butler

Fine-tuned open-weight model (Qwen3-8B LoRA) that writes kind, firm 'not now' replies in English or Nigerian Pidgin

Sloth-Butler

Sloth-Butler handles the messages you dread replying to.

Live: https://sloth-butler.vercel.app · Demo video: https://sloth-butler.vercel.app/demo.mp4 · Guide and FAQ: https://sloth-butler.vercel.app/guide

Demo music: "Late Night Radio" by Kevin MacLeod (incompetech.com), licensed under CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/).

If you sell your time or your products, you know these messages. A client asks you to "just add one more page" for free. A customer wants 30% off. An invoice is three weeks late and the client asks for another month. Someone wants the order today and to pay you "at the end of the month". A call request lands with ten minutes' notice.

None of these are hard decisions. The hard part is the wording: staying polite without giving ground, not over-apologising, and not opening a long back-and-forth. So the reply sits in your inbox for days. Sloth-Butler writes it for you in a few seconds: a polite, firm answer with…

MIT licensed: dataset, training and eval scripts, raw eval outputs, and the Next.js app.

How I Built It

Tinker: the fine-tune

A prompt alone didn't reliably give me one short counter-offer that respects the user's numbers, in natural Pidgin. So I trained it in.

Setting Value
Base model Qwen3-8B (thinking disabled)
Method LoRA, rank 32, supervised fine-tuning on Tinker
Training examples 1,101 across 6 languages
Held-out test set 100 messages, never used in training
Schedule 204 steps, 3 epochs, batch 16, learning rate 2e-4 decaying to 0
Train loss 2.90 at step 0, 0.44 at the last step

The training loop is adapted from tinker-cookbook's supervised recipe. The app samples from the trained adapter through Tinker's OpenAI-compatible /completions endpoint, using the same prompt format and qwen3_disable_thinking template it was trained on, plus a line with the situation and the user's terms.

ElevenLabs: the voice

POST /api/voice turns a reply into speech with the ElevenLabs voice Alice and caches the mp3. A lot of client and customer conversations happen in WhatsApp-style chats, where a short voice note is the normal reply, so you can play it or download it and send it as is. Follow-ups have a voice-note button too.

Results: before vs after training

Base Qwen3-8B and the fine-tune answered the same 100 held-out messages with the same prompt, temperature 0.7 and seed 2026. A judge model (gpt-oss-120b) scored each reply 1 to 5 per criterion; a pass is 4 or more.

Criterion Before (Qwen3-8B) After (Sloth-Butler)
Passes all five 41% 63%
Sendable 84% 93%
Firm but polite 84% 97%
Has a counter-offer 74% 90%
Fits the situation 67% 76%
Correct language 90% 94%
Pidgin sounds natural (10 replies) 10% 50%
Average words per reply 51 34
Blind side-by-side preference 56/100 for the fine-tune

The clearest signals are the "passes all five" jump and the counter-offer gain. Replies also got about a third shorter, which matters when the goal is a message you can send without editing.

Stack

Next.js on Vercel, Qwen3-8B + LoRA trained and served on Tinker, ElevenLabs text-to-speech, gpt-oss-120b for data generation and judging, browser local storage for terms, follow-ups and the log.

Limits

  • The model can still get numbers wrong. For example, it sometimes offers a discount when the job is already at your minimum price. The server-side guard catches that and corrects the reply, but it's a code check, not the model getting it right.
  • The judge is a single LLM from the same family that wrote the training replies, so it may favour the fine-tune's style. No human rating yet.
  • 100 test messages is small; a few points on one criterion is within noise.
  • Pidgin went from 10% to 50% natural on just 10 replies, not checked by native speakers. Better, still not good.
  • Test messages were generated the same way as the training data, so real inboxes may be harder.

What's next

Human ratings from freelancers and native Pidgin speakers, more real-world test messages, a second training round focused on Pidgin and on staying within the user's terms without the guard, and reminders for follow-ups that are due.

Why Does Open Innovation Matter?

Open weights are what made this possible. I could fix the behaviour I wanted by training a small adapter, not by asking a vendor for a feature. Nigerian Pidgin is spoken by tens of millions of people and the base model handled it poorly; with an open model, one person with a dataset can start closing that gap. The teacher and judge are open-weight too, so anyone can rerun the pipeline, check the numbers, or swap the base model. And an 8B model writing about 34 words costs very little per reply.

The Lazy Payoff

The time saved isn't in typing. It's the days a message sits unanswered because you don't know how to say no, or ask for your money, without sounding rude. With Sloth-Butler that's about ten seconds: paste, pick the situation, copy. Follow-ups for unpaid invoices are planned for you, and the log shows the hours and money you didn't give away.

Prize Categories

  • Best Use of Tinker: the core of the project is a Qwen3-8B LoRA fine-tune trained and served on Tinker, with a before/after evaluation on 100 held-out messages.
  • Best Use of ElevenLabs: every reply and follow-up can be played or downloaded as a voice note in the ElevenLabs voice Alice.

Credits

Qwen3-8B by the Qwen team. Tinker and tinker-cookbook by Thinking Machines Lab. gpt-oss-120b. ElevenLabs for the voice.

Top comments (0)