Three months ago I was spending almost three hours a day on tasks a script could do. Email triage, inbox checks, calendar reminders, weather lookups, market data refreshes. Nothing creative. Nothing that needed my brain. Just... mechanical.
I didn't want another SaaS subscription. I didn't want to glue together Zapier and Notion and hope it worked. I wanted something I owned, running on hardware I already had, costing me nothing after setup.
So I built it. And it actually works.
Here's what I automated, how I built it, and what broke along the way.
| Task | Before | After |
|---|---|---|
| Check 3 email accounts for urgent stuff | ~25 min | Agent alerts me only when something matters |
| Fiverr inbox — new inquiries + scams | ~20 min | Hourly scan, instant Telegram notification |
| Calendar — what's happening today? | ~10 min | Morning summary at 9 AM, prep alerts 30 min before |
| Weather check before leaving | ~5 min | Agent tells me if I need an umbrella |
| Market data for my watch face | ~15 min | Live data every 15 min, zero interaction |
| Code review on my own repos | ~45 min | Automated PR summaries in 12 seconds |
Total: ~2 hours 40 minutes → ~10 minutes of actual attention
The 10 minutes is me reading alerts and deciding what to do. The agent doesn't make decisions. It surfaces information.
Everything runs on a Mac Mini M4 I already owned. No cloud VMs, no rented GPUs for this part.
Mac Mini M4 (always on, ~8W idle)
├── Ollama (local LLM)
│ ├── qwen3.5:9b — general reasoning
│ └── qwen3-coder:30b — code analysis (via network GPU)
├── Python scripts + cron jobs
├── Telegram Bot API — notifications
└── Background services (Garmin updater, health checks)
Monthly cost for the AI layer: $0. The Mac Mini was already running 24/7 for other projects.
Let's be honest: "AI agent" is an overused term. What I built is a collection of Python scripts that use a local LLM for the parts that need understanding, and plain old regex/cron for everything else.
The agent isn't one thing. It's a system:
That's it. No autonomous web browsing. No decision-making without my input. Just: see → understand → tell me.
I sell automation services on Fiverr. Checking the inbox was eating 20 minutes a day. Worse: half the messages were scams ("contact me on WhatsApp for big project").
My agent now:
Is this a legitimate business inquiry or a scam?
Scam indicators: external contact requests, generic greeting + immediate project offer,
poor grammar with urgent tone, requests to communicate off-platform.
Message: {message_text}
Respond: LEGITIMATE or SCAM with one-sentence reasoning.
Results after 3 months:
The LLM handles the nuance. Regex would miss edge cases. A human would get bored and slip up.
I have API keys for OpenAI, Anthropic, and Google. I use them for complex reasoning tasks. But for automation?
Cost math:
That's not nothing for a side project. But more importantly: latency. Local inference is faster for simple tasks, doesn't need internet, and doesn't send my emails/Fiverr messages to a third party.
The cloud is my fallback for tasks the 9B model can't handle. Maybe 5% of queries.
Week 1: The Fiverr login session expired after 48 hours. I was running headless Chrome with saved cookies. Fiverr's session management is aggressive.
Fix: Switched to Safari with AppleScript automation. No session issues since — Apple's keychain handles authentication transparently.
Week 2: Alert fatigue. I set the agent to notify on every email. Bad idea.
Fix: Two-tier system. "Urgent" alerts (from known contacts, specific keywords) → instant notification. "Everything else" → digest at 9 AM and 6 PM. Unsubscribe-style filtering.
Week 3: The weather API I was using (free tier) rate-limited me.
Fix: Added a fallback chain. Primary → wttr.in → OpenWeatherMap (rarely hit). The agent doesn't care which source works.
Month 2: LLM started hallucinating calendar events that didn't exist.
Fix: Added validation layer. LLM extracts event details → script queries the actual calendar API → confirms before alerting. LLM suggests, system verifies.
#!/usr/bin/env python3
"""Main agent loop — runs every hour via cron"""
import schedule
import time
from agents import email_agent, fiverr_agent, calendar_agent, weather_agent
from notifier import telegram_alert
def run_all_checks():
"""Run all agents and collect alerts"""
alerts = []
alerts.append(email_agent.check())
alerts.append(fiverr_agent.check())
alerts.append(calendar_agent.check())
alerts.append(weather_agent.check())
urgent = [a for a in alerts if a and a[1] == "urgent"]
batch = [a for a in alerts if a and a[1] == "normal"]
for alert in urgent:
telegram_alert(alert[0], priority="high")
if batch:
digest = "📊 Agent Digest\n\n" + "\n\n".join([a[0] for a in batch])
telegram_alert(digest, priority="normal")
if __name__ == "__main__":
run_all_checks()
php
import ollama
def should_alert(email_data: dict) -> tuple[bool, str]:
"""Use local LLM to decide if an email warrants immediate notification"""
prompt = f"""You are an email triage assistant. Analyze this email:
From: {email_data['sender']}
Subject: {email_data['subject']}
Preview: {email_data['preview'][:200]}
Rules:
- ALERT if: from known contact, contains "urgent/meeting/action required",
payment-related, or from a service I actively use
- SILENT if: newsletter, promotional, automated notification,
no action needed
Respond ONLY with: ALERT: [reason] or SILENT: [reason]"""
response = ollama.chat(
model="qwen3.5:9b",
messages=[{"role": "user", "content": prompt}]
)
result = response['message']['content'].strip()
is_alert = result.startswith("ALERT")
reason = result.split(": ", 1)[1] if ": " in result else "No reason given"
return is_alert, reason
bash
#!/bin/bash
BOT_TOKEN="..."
CHAT_ID="..."
MESSAGE="$1"
PRIORITY="${2:-normal}"
curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
-d chat_id="${CHAT_ID}" \
-d text="${MESSAGE}" \
-d parse_mode="HTML" > /dev/null
The agent is informational, not autonomous.
I don't let it:
The rule: The agent tells me what I need to know. I decide what to do. This isn't laziness — it's risk management. AI is excellent at detection, mediocre at judgment.
Time saved: ~2.5 hours/day = ~75 hours/month. That's almost two full work weeks.
What I did with the time:
Unexpected benefit: I make better decisions because I'm not decision-fatigued. When you've already spent mental energy on inbox triage, your judgment on actual work suffers.
Cost: $0 for AI, ~12 hours initial setup, ~30 minutes/week maintenance.
If you're spending >1 hour/day on mechanical tasks: probably yes.
If you're expecting a magic "AI agent" that runs your life: no. This is scripting with a smart layer on top. The LLM handles ambiguity. Everything else is just... code.
Start with one task. Get it reliable. Add the next. I began with just email triage. Two weeks later I added Fiverr. Then calendar. Then weather. Each one took an evening.
The compound effect is what matters.
I write about building automation systems that actually work — local AI, self-hosted tools, and side projects that make money while you sleep.
→ Check out my automation work on Fiverr
→ Follow CelebiBots on Telegram