{"slug": "spare-thumbs-gemma-4-answers-can-we-move-the-meeting-in-my-words-from-my-real-me", "title": "Spare Thumbs: Gemma 4 answers \"can we move the meeting?\" in my words, from my real calendar, and never double-books me", "summary": "A developer built Spare Thumbs, a local agent that runs Gemma 4 (gemma4:e4b) through Ollama with native function calling and five tools to read incoming Gmail meeting-move requests, check the user's real Google Calendar, and draft replies in the user's own voice, moving events only when the client confirms. In a ten-request test, Gemma 4 alone offered already-booked times in 7 of 10 drafts, while Spare Thumbs, which validates every proposed time in code, produced 0 of 10 conflicts. EmbeddingGemma retrieves the five most similar past replies from 63 messages to mimic the user's writing style, and all processing stays on the laptop except the Gmail draft.", "body_md": "*This is a submission for the [Hacktoberfest Open-Source AI Challenge, Week 3: Slow and Steady](https://dev.to/challenges/hacktoberfest-week3-2026-10-19).*\n\nClients move meetings at night. \"Something came up Thursday, could we do Friday 10h instead?\" To answer, I open my calendar, find a gap, and type the same reply I always type. It happens about once a week, across email, WhatsApp and Discord.\n\nSpare Thumbs answers for me. Gemma 4 runs on my laptop and watches my Gmail. When a client asks to move a meeting, it finds the meeting, checks my real Google Calendar, and leaves a reply in the Gmail thread as a draft, written the way I write. If their time is free, it says yes. If not, it offers times I am actually free. When the client says \"11h works\", it moves the event in Google Calendar and drafts the confirmation.\n\nThe lazy part: I tap send.\n\nIn the video, a second address of mine plays a client called Sam. Its two messages were placed in my inbox with the Gmail API (I could not send from that account while filming). Everything after that is live: Gemma's steps in the terminal, the draft in the thread, the send, and the calendar move. The calendar is my real one: Friday 10h is a real call about a scratched tile, so Gemma has to work around it.\n\nGemma 4 on its own is happy to agree to anything. I gave it ten \"can we move it?\" requests against a busy week, once without my calendar and once as Spare Thumbs:\n\n|  | Drafts that offer a time I am already booked | \n|---|---|\n| Gemma 4 without my calendar | **7 of 10** | \n| Spare Thumbs | **0 of 10** | \n\nSame model, same voice examples, same requests. The only difference is that Spare Thumbs looks before it answers, and the code checks every time it writes.\n\n| The client asked | Gemma 4 without my calendar | Spare Thumbs | \n|---|---|---|\n| move our 10h to 13h? | \"no problem at all, 13h on monday works for me! thx :)\" (13h is the insurance assessor) | \"i can't do 13h cuz i have another meeting then, but i'm free at 14h30 or 15h.\" | \n| Friday 11h works for me, does it for you? | \"friday 11h works for me! perfect. thx\" (11h is the accountant) | \"sorry, 11h is taken for me. how about 10h or 14h on friday instead?\" | \n| Wednesday 14h instead? | \"wednesday at 14h is good. thx!\" (on site all afternoon) | \"14h on wednesday is booked for me, sorry! how about 11h or 17h instead?\" | \n\n**Gemma 4 decides every step.** `gemma4:e4b` runs through Ollama with native function calling and five tools: `find_meetings`, `check_calendar`, `draft_reply`, `move_event` and `hand_off`. For each new message it chooses which day to check, reads what is booked, then accepts, offers other times, asks one question, or leaves the message for me. When the client replies, the same loop runs again with what it offered earlier, and it chooses to move the event and confirm. The loop ends when Gemma stops calling tools.\n\n**The code makes sure.** The prompt asks Gemma to only offer free times, but a prompt cannot promise anything. So `draft_reply` and `move_event` refuse any time that overlaps my calendar, falls on a weekend, sits outside 9h to 18h, or is in the past. They also refuse a time written in the reply that was never passed in to be checked (an early version wrote \"17h\" in the text and skipped the check), and French words in a reply to an English message. A refusal goes back to Gemma as an error and it tries again. In the ten-request test, the gate caught one busy slot and one French slip before they ever reached a draft.\n\n**EmbeddingGemma gives it my voice.** I have 63 messages of my own across WhatsApp and Discord, which is too few to fine-tune on and plenty to retrieve from. For each incoming message, EmbeddingGemma finds the five replies I wrote to the most similar messages, and Gemma 4 sees them as examples, along with a short style card it wrote from all of my replies. Every reply I send gets added to the examples.\n\n**Nothing leaves my laptop** except the draft itself, which goes into my own Gmail. Both models run locally. Raw chats, tokens and examples live in a folder outside the repo, and passwords, emails, links, phone numbers, names and company names are redacted before anything reaches a prompt.\n\nI did not want the result to wait on friends filling in a form, so a model from another family played the friend. Qwen 3.5 (4B) read 8 of my real messages, then saw a message, my real reply, Gemma's reply with my examples, and Gemma's reply without them, and picked the one I wrote. Each of 15 held-out messages was asked in all 6 orders, so a judge that likes \"A\" gains nothing.\n\nIt picked Spare Thumbs as me 56% of the time, my real reply 33%, and plain Gemma 11%. Turning off my examples and the style card drops it from 56% to 11%.\n\nA second judge, Qwen 2.5 (7B), disagreed: it picked plain Gemma 53% of the time, Spare Thumbs 36%, and my real reply only 11%. It prefers the polished AI reply over my own messages, so it cannot recognise how I write. I am reporting it anyway.\n\nMy clients' messages are my clients' business. The reason I can run this at all is that Gemma 4 and EmbeddingGemma are open weights I can run on my own laptop: the mail, the calendar and my 63 real replies never go to a hosted model. Open weights also make the gate possible. I can wrap a model in code that refuses, retries and logs every step, and show the loop in a 100-line file instead of a black box.\n\nA reschedule used to cost me about five minutes: open the calendar, find a gap, type the reply, then come back for the confirmation and move the event. Now it costs one tap on Send. It ran this week on my real inbox and calendar: the demo above is the first live run, with no retake on the agent's side.\n\nBest Use of Gemma: Gemma 4 (`gemma4:e4b`) runs the agent loop through native function calling, and EmbeddingGemma retrieves the voice examples. Both run locally through Ollama.\n\nClients move meetings at night. Spare Thumbs answers \"can we move the meeting?\" for me, in my words, from my real calendar.\n\nGemma 4 runs on my laptop through Ollama and watches my Gmail. When a client asks to move a meeting, it finds the meeting, checks my Google Calendar, and leaves a reply as a draft in the Gmail thread. If their time is free it says yes; if not, it offers times I am actually free. When the client confirms, it moves the event in Google Calendar and drafts the confirmation. I tap send.\n\nTen reschedule requests against a busy week, answered twice by Gemma 4 with my voice examples on:\n\n| Drafts that offer a time I am already booked |  | \n|---|---|\n| Gemma 4 without my calendar | 7 of 10 (11 of 14 times offered) | \n| Spare Thumbs | 0 of 10 (0 of | \n\nThe longer write-up is on my site: [https://jonathanandrei.com/blog/spare-thumbs-gemma-4-reschedule-replies-real-calendar/](https://jonathanandrei.com/blog/spare-thumbs-gemma-4-reschedule-replies-real-calendar/)", "url": "https://wpnews.pro/news/spare-thumbs-gemma-4-answers-can-we-move-the-meeting-in-my-words-from-my-real-me", "canonical_source": "https://dev.to/jonathansolvesstuff/spare-thumbs-gemma-4-answers-can-we-move-the-meeting-in-my-words-from-my-real-calendar-and-4p52", "published_at": "2026-10-25 13:35:29+00:00", "updated_at": "2026-10-25 13:42:37.846702+00:00", "lang": "en", "topics": ["artificial-intelligence", "large-language-models", "ai-agents", "ai-tools", "generative-ai"], "entities": ["Gemma 4", "Ollama", "EmbeddingGemma", "Google Calendar", "Gmail", "Spare Thumbs"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/spare-thumbs-gemma-4-answers-can-we-move-the-meeting-in-my-words-from-my-real-me", "markdown": "https://wpnews.pro/news/spare-thumbs-gemma-4-answers-can-we-move-the-meeting-in-my-words-from-my-real-me.md", "text": "https://wpnews.pro/news/spare-thumbs-gemma-4-answers-can-we-move-the-meeting-in-my-words-from-my-real-me.txt", "jsonld": "https://wpnews.pro/news/spare-thumbs-gemma-4-answers-can-we-move-the-meeting-in-my-words-from-my-real-me.jsonld"}}