Daily-summary-agent A developer built a fully local AI agent that reads Slack messages and Gmail emails every morning and generates a prioritized daily summary using the Hermes3 open-source model running on Ollama. The agent, which processes 47 Slack messages and 23 emails in under 60 seconds, never sends data to external servers and requires no API keys or internet connection. The project demonstrates a private, cost-free alternative to cloud-based summarization tools for startups concerned about data security. This is a I Built a Private AI Agent That Reads My Slack & Gmail Every Morning — Runs 100% on My Laptop No API keys. No cloud. No monthly bill. Just Hermes3 running locally, summarizing my entire day before I drink my first coffee. Every morning I opened 47 Slack messages and 23 emails and spent 40 minutes figuring out what actually needed my attention. The obvious fix? Ask ChatGPT or Claude to summarize them. But wait — that means sending every private Slack message, every client email, every internal discussion to someone else's server. For a startup, that's a non-starter. So I built my own. Fully local. Fully private. Free forever. A Python agent that: Every morning at 9 AM, this runs automatically and gives me: šŸ”“ URGENT — ACTION NEEDED - Production server throwing 503s dev — Ravi needs help - Client contract must be signed by EOD — priya@client.com šŸ’¬ IMPORTANT DISCUSSIONS - Q3 roadmap debate ongoing in product - Partnership proposal from Zoho needs response šŸ“¢ FYI — ANNOUNCEMENTS - Monday is a public holiday HR, general šŸ—‘ļø LOW PRIORITY - 3 newsletters, 2 LinkedIn notifications In under 60 seconds. On my machine. No data leaving my laptop. This is the question worth answering properly. | ChatGPT / Claude API | Hermes3 Local | | |---|---|---| | Your data | Sent to their servers | Never leaves your machine | | Cost | ~$30–50/month at scale | Free forever | | Customization | Prompt only | Fine-tune on your own data | | Internet required | Always | Never | | Speed | Network latency | Pure local speed | | Restrictions | Content policies | Full control | Hermes3 is an open-source model by Nous Research, built on LLaMA 3. It's specifically fine-tuned to be excellent at instruction-following and summarization — exactly what this agent needs. Slack API + Gmail API ↓ Python agent ↓ Ollama local runner ↓ Hermes3 LLM ↓ Smart grouped summary Install Ollama curl -fsSL https://ollama.com/install.sh | sh Pull and run Hermes3 4.7GB download ollama run hermes3 Test it works: curl http://localhost:11434/api/generate \ -d '{"model": "hermes3", "prompt": "Say hello", "stream": false}' daily-summary-agent/ ā”œā”€ā”€ slack reader.py ā”œā”€ā”€ gmail reader.py ā”œā”€ā”€ summarizer.py ā”œā”€ā”€ main.py ā”œā”€ā”€ credentials.json ← Gmail OAuth file └── .env python slack reader.py import os from datetime import datetime from slack sdk import WebClient from dotenv import load dotenv load dotenv client = WebClient token=os.environ "SLACK BOT TOKEN" def get today messages : all messages = {} oldest = datetime.now .replace hour=0, minute=0, second=0 .timestamp result = client.conversations list types="public channel,private channel" for ch in result "channels" : if not ch.get "is member" : continue try: history = client.conversations history channel=ch "id" , oldest=oldest, limit=100 messages = m "text" for m in history "messages" if m.get "text" and not m.get "bot id" if messages: all messages ch "name" = messages except Exception as e: print f"Skipping {ch 'name' }: {e}" return all messages python gmail reader.py import os from datetime import datetime from google.oauth2.credentials import Credentials from google auth oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request from googleapiclient.discovery import build SCOPES = "https://www.googleapis.com/auth/gmail.readonly" def get gmail service : creds = None if os.path.exists "token.json" : creds = Credentials.from authorized user file "token.json", SCOPES if not creds or not creds.valid: if creds and creds.expired and creds.refresh token: creds.refresh Request else: flow = InstalledAppFlow.from client secrets file "credentials.json", SCOPES creds = flow.run local server port=0 with open "token.json", "w" as f: f.write creds.to json return build "gmail", "v1", credentials=creds def get today emails : service = get gmail service today = datetime.now .strftime "%Y/%m/%d" results = service.users .messages .list userId="me", q=f"after:{today}", maxResults=50 .execute emails = for msg in results.get "messages", : data = service.users .messages .get userId="me", id=msg "id" , format="full" .execute headers = data "payload" "headers" emails.append { "subject": next h "value" for h in headers if h "name" == "Subject" , "" , "from": next h "value" for h in headers if h "name" == "From" , "" , "snippet": data.get "snippet", "" } return emails This is where the magic happens. The prompt design is everything: python summarizer.py import requests def summarize slack data, email data : prompt = """You are a smart executive assistant. Analyze these messages and group them into exactly 4 sections: šŸ”“ URGENT — ACTION NEEDED deadlines, outages, decisions needed today šŸ’¬ IMPORTANT DISCUSSIONS ongoing debates, replies needed soon šŸ“¢ FYI — ANNOUNCEMENTS good to know, no action needed šŸ—‘ļø LOW PRIORITY newsletters, notifications, can ignore For each item write: channel/sender — one line summary. Be ruthlessly concise. Max 10 words per item. === SLACK ===\n""" for channel, msgs in slack data.items : prompt += f"\n {channel}:\n" + "\n".join f"- {m}" for m in msgs prompt += "\n\n=== EMAILS ===\n" for e in email data: prompt += f"- From: {e 'from' } | {e 'subject' } | {e 'snippet' :100 }\n" prompt += "\n\nNow give the grouped summary:" response = requests.post "http://localhost:11434/api/generate", json={ "model": "hermes3", "prompt": prompt, "stream": False } return response.json "response" python main.py from slack reader import get today messages from gmail reader import get today emails from summarizer import summarize from datetime import datetime def run agent : print f"\nšŸ¤– Daily Brief — {datetime.now .strftime '%B %d, %Y %I:%M %p' }" print "=" 50 print "šŸ“„ Reading Slack..." slack = get today messages print "šŸ“§ Reading Gmail..." emails = get today emails print "🧠 Thinking with Hermes3...\n" summary = summarize slack, emails print summary with open "daily summary.txt", "w" as f: f.write summary return summary if name == " main ": run agent Run at 9 AM every weekday crontab -e Add this line: 0 9 1-5 cd /path/to/daily-summary-agent && python3 main.py summary.log 2 &1 Before connecting Slack/Gmail, test Hermes summarization with fake data: python test summarizer.py from summarizer import summarize fake slack = { "dev": "Server is down 503 errors since 8am", "PR 234 needs review" , "general": "Team lunch at 1pm", "Please fill the feedback form" } fake emails = {"from": "boss@company.com", "subject": "Q3 Report Due Today", "snippet": "Submit by EOD"}, {"from": "newsletter@medium.com", "subject": "Top AI stories", "snippet": "Weekly digest..."} print summarize fake slack, fake emails Run it: python3 test summarizer.py No Slack token, no Gmail auth needed. Just Hermes running locally. āœ… šŸ”“ URGENT — ACTION NEEDED • dev — Server down, 503s since 8am, fix immediately • boss@company.com — Q3 report due today EOD šŸ’¬ IMPORTANT DISCUSSIONS • product — Q3 roadmap priorities debated, needs decision • partnerships@zoho.com — Integration call request this week šŸ“¢ FYI — ANNOUNCEMENTS • general — Monday public holiday, no standups • HR — Feedback form deadline Friday šŸ—‘ļø LOW PRIORITY • medium.com — Weekly AI newsletter • linkedin.com — 3 connection requests 40 minutes of inbox anxiety → 60 seconds of clarity. Every morning. Things I'm adding next: pyttsx3 We're in a moment where running a capable LLM locally is genuinely possible for any developer. Hermes3 on a MacBook M-series is fast, smart, and completely private. The real unlock isn't just summarization. It's your own AI that knows your context, your team, your language — without sending that context to anyone else. Every workflow you currently do with a cloud API, ask yourself: does this data need to leave my machine? Often the answer is no. Built this over a weekend. Still running every morning. Zero cloud costs. Have questions or improvements? Drop them in the comments — happy to help you set it up. Tags: ai python productivity ollama opensource submission for the Hermes Agent Challenge https://dev.to/challenges/hermes-agent-2026-05-15 : Write About Hermes Agent