DEV Community

Cover image for I stopped building daily AI digests when I realized they were just prettier spam
Lars Winstand
Lars Winstand

Posted on • Originally published at standardcompute.com

I stopped building daily AI digests when I realized they were just prettier spam

I knew this pattern was broken the first time I swiped away an AI-generated morning brief without reading a single line.

Not because it was bad.

Worse: it was competent.

It had bullets. It had categories. It had the right sources. It had that polished GPT-5 tone that says, “a machine worked hard on this.”

And I ignored it exactly like I ignore half my email.

That sent me down a rabbit hole through a bunch of AI workflow automation examples, and the most honest feedback wasn’t in product docs. It was on Reddit, where people admit what they actually stop using.

In one r/openclaw thread, a user said it better than most product pages ever will:

“Daily summaries/digest stuff. Thought I'd read every morning briefing religiously, but after a weel my brain just started auto-skipping them like marketing emails lol.”

That’s the whole problem.

Daily digests usually don’t fail because the automation broke. They fail because they recreate the overload they were supposed to fix.

Once you see that, the question changes from:

  • How do I summarize more?

To:

  • How do I only interrupt myself when something actually changed?

The real bug: schedule-first design

Microsoft has a useful phrase for the mess a lot of us are living in: digital debt.

In its 2023 Work Trend Index, 64% of people said they struggle with having the time and energy to do their job. Earlier Microsoft data also showed meetings per week were up 153% for the average Teams user since the pandemic started, with overlapping meetings up 46% year over year.

My take: a daily AI digest is often just well-formatted digital debt.

It demos beautifully because demos compress time.

You watch a clean summary arrive at 8:00 AM. You nod. You imagine your future self becoming one of those organized people who reviews a neat morning brief with coffee.

Then real life shows up.

Tuesday looks like Monday. Nothing important changed. But your workflow still generates a fresh wall of bullets asking for attention it didn’t earn.

That’s when the habit dies.

The Reddit examples were more useful than most tutorials

One of the better workflows I found came from an r/openclaw post where someone built an OpenClaw skill that:

  • checks around 30 AI YouTube channels every morning
  • uses an Apify actor to pull transcripts
  • runs analysis through the OpenClaw Gateway
  • writes 26 columns per video into Google Sheets
  • posts a short brief to Discord

The numbers were specific enough to trust:

  • about 22 minutes to run
  • around $0.20/day on Apify

But the smart part wasn’t the schedule.

It was the output design.

The user wrote:

“Runs in about 22 minutes, costs maybe $0.20 per day on Apify... Then it posts a short Discord brief with one-line summaries per video grouped by creator. I scan it in the morning, pick whatever triggers a reaction, draft a post from the sheet row.”

That works because it doesn’t pretend every item deserves the same attention.

  • Discord = skim layer
  • Google Sheets = deep structured storage
  • human = drills in only when something is interesting

Now compare that with another user who built an OpenClaw cron for GitHub notifications, PR comments, and Slack mentions, then sent a Telegram standup every morning.

Their verdict was brutal and correct:

“It worked flawlessly. The problem is I just started ignoring the Telegram message exactly the same way I was already ignoring the GitHub emails. Turns out automating the delivery of noise doesn't actually make it signal.”

That line should be taped above a lot of dashboards.

n8n already gives away the answer

If you build in n8n, the architecture difference is right there in the trigger model:

Option What it’s really good at
n8n Schedule Trigger Fixed interval or cron-based polling; good for periodic collection
n8n Webhook Event-driven execution when something actually happens
Compare Datasets + Filter/If Suppressing unchanged items and escalating only meaningful deltas

The mistake a lot of tutorials make is spending 90% of the time on ingestion.

They show:

  • trigger every morning
  • fetch data
  • summarize with GPT-5 or Claude
  • send to Slack

That’s easy to explain. It’s also where a lot of these workflows go wrong.

The hard part is not collection.

The hard part is decision logic after collection.

That’s the difference between:

  • summarize everything

and:

  • only interrupt me when the world moved

Build a delta detector, not a digest

The better pattern is simple:

  1. Collect events or snapshots from GitHub, Slack, YouTube, RSS, Jira, or wherever your work lives.
  2. Compare current state to prior state.
  3. Suppress unchanged items.
  4. Score significance.
  5. Route only the survivors.
  6. Optionally send a low-frequency recap for context.

That’s it.

Not a digest.

A delta detector.

A practical n8n pattern

If the upstream system can push events, use a Webhook.

If it can’t, use Schedule Trigger for polling, but treat polling as ingestion, not the product.

Example flow

Schedule Trigger / Webhook
  -> Fetch latest state
  -> Load previous snapshot
  -> Compare Datasets
  -> Filter low-signal changes
  -> LLM classify severity
  -> Route to Slack / Discord / Telegram
  -> Persist new snapshot
Enter fullscreen mode Exit fullscreen mode

Example webhook-first setup

curl -X POST https://your-n8n-instance/webhook/github-events \
  -H "Content-Type: application/json" \
  -d '{
    "repo": "acme/api",
    "event": "pull_request",
    "action": "opened",
    "title": "Add retry logic to webhook processor"
  }'
Enter fullscreen mode Exit fullscreen mode

Example significance filter logic

const importantLabels = ["production", "incident", "security", "customer-impacting"];

function shouldEscalate(item) {
  if (item.type === "pull_request" && item.comments > 10) return true;
  if (item.type === "issue" && importantLabels.some(l => item.labels?.includes(l))) return true;
  if (item.type === "youtube_video" && item.topicScore > 0.85) return true;
  if (item.diffRatio && item.diffRatio > 0.4) return true;
  return false;
}
Enter fullscreen mode Exit fullscreen mode

Example changed-only summary prompt

You are classifying changes for alerting.

Given the previous state and current state:
- ignore cosmetic changes
- ignore repeated items
- identify only materially new information
- return severity: low, medium, high
- explain the delta in one sentence
Enter fullscreen mode Exit fullscreen mode

That one-sentence delta is usually more useful than a 500-word AI brief.

Queue mode matters if you’re running a lot of automations

If you’re running n8n at any real volume, separate ingestion from execution.

export EXECUTIONS_MODE=queue
export N8N_ENCRYPTION_KEY=<main_instance_encryption_key>
Enter fullscreen mode Exit fullscreen mode

In queue mode, the main n8n instance handles timers and webhook calls, then pushes execution IDs through Redis to workers.

That’s a good fit for agent-style workflows because it keeps trigger handling lightweight and lets workers process the heavy stuff.

It also reinforces the main point:

cron is just an input source.

The value comes from what happens after the trigger.

Why daily summaries feel smart at first

Because they promise relief.

That’s why they demo so well.

You watch OpenClaw or n8n gather ten sources, run GPT-5 or Claude Opus over them, and produce a tidy brief. It looks like leverage.

But a lot of these workflows are secretly assigning you unpaid review work every day.

One commenter in the same OpenClaw discussion described a nightly /log cron that interviewed them about what they worked on, what they wished they had worked on, plus weekly and monthly check-ins.

They quit after four days.

Not because the prompts were bad.

Because there was no dashboard, no visible trend, no feedback loop.

That failure mode is everywhere.

People build AI agent workflows around collection instead of decisions.

The workflow keeps asking for input. It keeps producing output. But nothing changes because the system never turns that data into a meaningful next action.

That’s when “helpful” starts feeling like homework.

The best use of LLMs here is not what most people think

I’m not arguing against GPT-5, Claude, Grok, Qwen, or Llama in automations.

I’m arguing against using expensive models to generate polished summaries of things that are basically identical to yesterday.

Use the model budget on:

  • change detection
  • deduplication
  • thresholding
  • severity scoring
  • routing
  • human approval only when needed

That’s where model intelligence actually compounds.

If you’re running a lot of these workflows, pricing matters too.

Per-token billing pushes people toward weird behavior:

  • over-optimizing prompts to save pennies
  • avoiding useful context because it might cost more
  • turning down automation volume because every run feels like a meter is spinning

That’s especially painful for agents and automations running 24/7 in n8n, Make, Zapier, OpenClaw, or custom workers.

This is exactly why flat-rate API access is interesting.

If you’re using Standard Compute as a drop-in OpenAI-compatible endpoint, you can keep the same SDKs and HTTP clients while routing heavy automation workloads through a predictable monthly plan instead of staring at token usage all day.

That changes how you design workflows.

You stop asking:

  • can I afford to run this classifier on every event?

And start asking:

  • will this reduce noise enough to be worth building?

That’s a much better engineering tradeoff.

A concrete changed-only pattern for GitHub alerts

Here’s a simple version you can build in n8n or any worker framework.

Inputs

  • GitHub webhook events
  • previous snapshot in Redis, Postgres, or a file store

Logic

function summarizeDelta(prev, curr) {
  if (!prev) {
    return { changed: true, severity: "medium", message: "New item detected" };
  }

  const changedFields = [];

  if (prev.state !== curr.state) changedFields.push(`state: ${prev.state} -> ${curr.state}`);
  if (prev.comments !== curr.comments) changedFields.push(`comments: ${prev.comments} -> ${curr.comments}`);
  if (prev.reviewDecision !== curr.reviewDecision) changedFields.push(`review: ${prev.reviewDecision} -> ${curr.reviewDecision}`);

  if (changedFields.length === 0) {
    return { changed: false };
  }

  const severity = curr.reviewDecision === "changes_requested" || curr.state === "failed"
    ? "high"
    : changedFields.length > 1
      ? "medium"
      : "low";

  return {
    changed: true,
    severity,
    message: changedFields.join(", ")
  };
}
Enter fullscreen mode Exit fullscreen mode

Output

Only send a Slack or Telegram alert if:

  • changed === true
  • severity is medium or high
  • the item hasn’t already been escalated recently

That one rule kills a huge amount of noise.

Are daily digests always bad?

No.

Some things really are periodic.

Examples:

  • overnight incident summary
  • market-open prep brief
  • end-of-day ops handoff
  • executive brief where the expectation is already one snapshot per day

Those are fine.

The mistake is forcing daily cadence onto sources where most days have no meaningful delta.

If your GitHub repos, Slack mentions, Jira board, or YouTube subscriptions don’t materially change every day, then a daily summary is usually just ritualized interruption.

Technically correct.

Behaviorally wrong.

And behavior is the only scoreboard that matters.

What I’d build now

If I were rebuilding one of these systems from scratch, I’d do this:

  1. Event-first where possible via webhooks.
  2. Snapshot polling only where webhooks don’t exist.
  3. Store previous state explicitly.
  4. Compare before calling an LLM.
  5. Use the LLM only on the changed subset.
  6. Send one-sentence alerts, not essays.
  7. Add a weekly recap for context.
  8. Keep the compute layer cheap and predictable enough that I don’t hesitate to automate aggressively.

That last point matters more than people admit.

A lot of good automation ideas die because the pricing model makes every extra run feel suspicious.

For agent-heavy setups, flat monthly compute is often a better fit than per-token billing because you can let the system watch continuously without worrying that every classification pass is adding another line item.

The feed that earns attention

The most useful automations don’t just save time.

They respect attention.

That OpenClaw YouTube workflow earned attention because it paired structured storage with a tiny Discord brief and let the human decide when to go deeper.

The GitHub-to-Telegram standup lost attention because it turned existing noise into fresh noise.

That’s the whole game.

If you’re building in n8n, OpenClaw, Make, Zapier, or your own agent stack, stop asking how to make your morning digest smarter.

Ask how to make it quieter.

Build workflows that notice change, not workflows that perform busyness on a timer.

Weirdly, that usually makes the system feel more intelligent, not less.

When a message only appears because something genuinely shifted, you read it.

You trust it.

You start treating the workflow like a sensor instead of a newsletter.

And once you’ve experienced that, it’s very hard to go back to daily AI spam with better formatting.

Top comments (0)