Local model chore: draft a sensitive message in private
Ask a free, offline model to draft or soften a delicate message (a note about money, a reply to a doctor, a careful complaint) knowing the contents stay on your machine.
Run this workflow
CI-verified, 2/2 fixtures passing.
Build this with your agent
One copy-paste hands Claude Code, Codex, or Cursor the full recipe, steps included, nothing to fetch.
Intended Use
Anyone wording a delicate message who wants it kept private. CI installs Ollama, pulls a real small Gemma 3 model, and runs the actual 'soften this' prompt offline, asserting a non-empty answer with a clean exit (no key, no cloud). gemma3:4b is recommended for real use; CI uses gemma3:270m for speed. The wording's QUALITY is fenced.
Not for
- Sending the draft unread, always reread a sensitive message before it goes out
- Expecting CI to judge tone, only that a local model ran and produced a draft offline
The Stack
Tested Against
ollama@0.30gemma3:270mgemma3:4b (recommended for real use)Side effects & data flow
- Network
- ollama.com, model pull only; inference is fully offline
- Writes
- ~/.ollama/ (downloaded model)
- Credentials
- none required
Data privacy
- nobody (fully local after the one-time model download) ← the message contents (retention: stays on device; goes to no company's servers)
Prerequisites
- A laptop with ~8GB RAM
Steps
- 1
Soften the message on a real local model (offline)
Install Ollama, pull a Gemma 3 model, and ask it to rewrite a heated message to be calmer. After the download this runs with wifi off, so the contents stay on the machine. CI runs exactly this on gemma3:270m and checks a real draft came back.
command -v ollama >/dev/null 2>&1 || curl -fsSL https://ollama.com/install.sh | sh curl -s http://localhost:11434/api/version >/dev/null 2>&1 || (ollama serve >/tmp/ollama-serve.log 2>&1 &) for i in $(seq 1 60); do curl -s http://localhost:11434/api/version >/dev/null 2>&1 && break; sleep 1; done ollama pull gemma3:270m >/dev/null 2>&1 OUT=$(ollama run gemma3:270m "Rewrite this message to sound calmer and more polite, keep it short and sincere: I am extremely frustrated that the invoice is wrong again and I need this fixed today.") if [ -n "$OUT" ]; then echo "chore3 OK: gemma3:270m drafted a $(printf '%s' "$OUT" | wc -c | tr -d ' ')-char softened message offline (quality fenced)" else echo "EMPTY OUTPUT"; exit 1 fi - 2
Use the recommended size and reread it (the quality step, not checked by CI)
For real messages, pull gemma3:4b or larger for better tone, then always reread before sending. The draft's quality is non-deterministic, so CI never claims it.
Eval, 2 fixtures
Last passed: verified todayran-offlinecontainstimeout 600s · max $0Expected:
chore3 OK: gemma3:270m drafted aclean-exitexit_codetimeout 600s · max $0Expected:
0
Results
The chore the privacy angle was made for: soften the wording of a difficult message with nothing going to any company's servers.
Did this work for you?
Our CI checks the setup runs. You tell us if the whole thing worked. Tell us straight.
Liked this workflow?
Get new verified workflows in WebAfterAI, three issues a week (Tue, Thu, Sat).