I Tried to Move My Morning AI Briefings to Claude Code. Here’s Why I Didn’t.

By Devin Pillemer | March 18, 2026


Every morning at 6:05 AM Israel time, my AI assistant sends me 9 personalized emails — health data from Garmin, portfolio snapshot, job market alerts, a curated news brief, Facebook Marketplace deals, my calendar briefing, inbox zero coaching, and daily goals. All fully automated. All AI-generated.

Today I spent the entire day trying to make it better. Along the way I learned something I didn’t expect: simpler isn’t always cheaper, and cheaper isn’t always simple.

The Claude Code Temptation

Claude Code is genuinely impressive. You talk to it like a developer, it writes and runs code autonomously, and the DX is slick. When I looked at my morning email stack — 800+ lines of Python, multiple API integrations, OAuth token management — I thought: this would be a clean Claude Code project.

So I looked at the numbers.

The problem? Running a full email generation pipeline through Claude Code means the agent needs to:

  • Open files
  • Call APIs
  • Reason about outputs
  • Retry failures
  • Format and send

That’s easily 50,000–200,000 tokens per morning run. At Claude Sonnet rates, that’s $0.15–$0.60 per day. Over a month: $4.50–$18.00 just for morning emails.

My current setup with GPT-4o and Haiku? About $0.005/day.

The math doesn’t work. Claude Code is a brilliant developer tool. It’s not a daily automation runtime.

What I’m Actually Going Back To: n8n

Here’s the thing — before I built the Python stack, I had parts of this running on n8n. Visual workflow builder, built-in retry logic, native HTTP nodes, and a free self-hosted tier. It’s not as fun to build with as Python, but for production automation that runs every morning without drama, it’s hard to beat.

The plan: migrate the stable parts (news fetch, calendar pull, Garmin sync) back to n8n workflows, keep the LLM-heavy parts (content generation, insights) in Python. Best of both worlds. n8n handles the plumbing; GPT-4o handles the thinking.

What I Fixed Today (The Hard Parts)

Before even getting to the architecture debate, I had to fix what was actually broken.

The SIGTERM Problem

My email stack was dying mid-run with no useful error. Turned out GPT API calls were timing out at 90 seconds, hitting the process timeout, and taking the whole job down with them.

Fix: bumped timeout to 120 seconds, added exponential backoff retry with 3 attempts.


def gpt(prompt, timeout=120, max_retries=3):
    for attempt in range(max_retries):
        try:
            return client.chat.completions.create(...)
        except Exception:
            if attempt < max_retries - 1:
                time.sleep(2 ** attempt)  # 2s, 4s, 8s
    return None

The Silent Cron Failures

Three cron jobs were reporting “chat not found” errors. Cause: they were trying to deliver to @Devin as a Telegram username instead of a numeric chat ID. Telegram doesn’t resolve usernames in bot API calls. Changed to 5011556868. Done.

The Git Backup Phantom Push

My workspace backup was committing fine but failing silently on push — because there was no remote configured. The script just printed “completed successfully” and moved on. Added a remote check before pushing, graceful skip if not configured.

New Infrastructure Added

  • Daily health monitor — upgraded from weekly to daily, now checks API key validity, Strava token expiry (24h warning), disk space, and memory usage
  • Session cleanup cron — daily purge of stale sessions older than 48 hours
  • Cost tracking — daily estimate of token spend by model, logged and reviewable

The Auto-Deploy Pipeline

The nicest thing I built is the simplest: a bash runner that pulls the latest code from GitHub before each morning run. Push a fix from my phone at 10 PM, it’s live at 6 AM without touching the server.


GH_TOKEN=$(python3 config/get_gh_token.py)
git remote set-url origin "https://x-access-token:${GH_TOKEN}@github.com/DevinPillemer/devin-life-os"
git pull origin morning-emails
python3 morning_email_stack.py

What I Learned

Claude Code is a dev tool, not a runtime. The UX is incredible. The cost at scale is not. Use it to build; don’t use it to run production automation daily.

n8n is boring and that’s the point. Visual workflows, native error handling, built-in scheduling. Not exciting. Doesn’t break at 6 AM.

Every automated job needs explicit success reporting. “Completed successfully” is a lie until you verify the output. Add checksum assertions, email counts, delivery confirmations.

Retry logic is not optional for LLM workflows. The API is fast 95% of the time. But 6 AM is not the moment to discover the 5%.


Next step: rebuilding the n8n workflows and connecting them to the Python generation layer. The goal is 9 emails, zero babysitting, under $0.01/day.

Will report back when it’s running.


Devin Pillemer leads an SDR team and builds AI-powered productivity systems in Tel Aviv. Follow along at devinpillemer.com.

Similar Posts