◉CLAUDE LABJP
●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…●2.1.301 — Adds the vim % motion, LaTeX math rendering in the VS Code panel, and a retry-watchdog limit for usage-limit waits (10/15)●2.1.299 — Conversations over 200K tokens left idle about 54 minutes get compacted; MCP allow rules now match only the server they name●SONNET 4.5 — Retires on the Claude API on 11/30, 45 days left. Migrate to Sonnet 5.5●WINDOWS — Reports say hooks break silently only on Japanese-locale Windows; check the character encoding first●FAST MODE — Opus 5.5 fast mode is out of research preview and no longer needs the beta header (10/15)●NEW — I Put a Ten-Line Promise File at the To…
Articles/API & SDK
⬡ API & SDK/2026-05-21Advanced

A Morning Digest Agent across App Store Connect, Play Console, Crashlytics, and AdMob — 30 days of running it on Claude Agent SDK

Opening four dashboards each morning across six apps used to eat 30 to 50 minutes of my day. Here is the Claude Agent SDK recipe that compressed it into one email, with the measured numbers from a full month.

Claude Agent SDK13indie developer21App Store Connect3AdMob12Crashlytics8automation109

✦ Premium Article

For the last few years my mornings followed the same pattern. Open App Store Connect for yesterday's sales, then Play Console for ratings and crash-free rate, then Crashlytics for new issues, then AdMob for eCPM anomalies, then Gmail for user mail. Across six apps in active operation this took 30 to 50 minutes, and by the time my coffee was gone the entire morning had been spent on confirmation work instead of building anything.

In April 2026 I handed that ritual to a Claude Agent SDK session and compressed it into a single morning email. What follows is the design, the failure patterns that surfaced in the first 30 days, and the practical fixes for things like AdMob's reporting lag and Crashlytics payload bloat, all with measured numbers. I write as Masaki Hirokawa (Dolice), an indie developer working since 2014 across a catalog that has now passed 50 million cumulative downloads. The conclusion that shaped this work is simple: the most valuable time an indie developer can reclaim is not judgment time but confirmation time.

What the morning digest does — and what it deliberately does not do

I want to draw the line up front. The morning digest is responsible for compressing the time it takes to confirm five dashboards across six apps. Judgment stays with me. Earlier experiments where I let an LLM auto-reply to App Store reviews led to one warning about policy violations, and that experience pushed me toward a stricter scope. The agent's job is just three things:

  • Aggregate 6 apps × 5 sources = 30 cells per day into one email body
  • Highlight only the values that diverge from baseline (deltas)
  • Surface a short list of "TODO candidates" that need my judgment

Review reply drafting, automated Crashlytics dismissals, and refund decisions are all intentionally left out. My family roots are in carpentry — both of my grandfathers were temple carpenters — and the sense that "working with one's hands is a form of faith" runs underneath this catalog of apps. Delegating the judgment itself would betray that.

Architecture — Cloudflare Workers Cron + Agent SDK + 5 tools

A Cloudflare Workers cron fires at 6:50 JST and starts a Claude Agent SDK session. The agent calls five custom MCP tools in turn, accumulates their results, and finally formats a Markdown body that ships to me via SendGrid. The reason the digest goes to email and not Slack is just that I open Gmail first thing in the morning by habit, and habits matter more than tools when it comes to whether you actually read the digest.

// worker.ts — Cloudflare Workers cron trigger
import { ClaudeAgent } from "@anthropic-ai/agent-sdk";
import { tools } from "./digest-tools";
 
export default {
  async scheduled(event: ScheduledEvent, env: Env) {
    const agent = new ClaudeAgent({
      apiKey: env.ANTHROPIC_API_KEY,
      model: "claude-sonnet-4-6",
      systemPrompt: PERSONA_PROMPT, // static, eligible for prompt caching
      tools,
      maxIterations: 12,
    });
 
    const result = await agent.run({
      task: "Generate today's morning digest and ship it via send_email_digest.",
      metadata: { userId: "masaki", date: today() },
    });
 
    console.log("digest sent:", result.summary);
  },
};

The maxIterations: 12 cap is a safety valve. Early on I left it uncapped, and a day when the AdMob report was late produced an agent loop that retried 30 times before giving up. A fixed ceiling is cheaper than a fancy backoff strategy for a once-a-day cron.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦Concrete architecture (with code) that compresses App Store Connect / Play Console / Crashlytics / AdMob / Gmail into one email
✦Measured $14.20 monthly API spend with 92.3% prompt-cache hit rate on the static persona portion
✦Three real failure patterns from 30 days of operation — partial-failure swallow, AdMob 24h lag, and three false alerts — and the guardrails that fixed them
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⬡ API & SDK2026-09-06
The translation read perfectly and still crashed at runtime
When you translate app strings with the Claude API, the meaning can be right while the format specifiers quietly break. Here is a severity-aware acceptance check and a repair loop that only re-translates the broken lines.
⬡ API & SDK2026-05-20
Resolving Tool Name Collisions When Bundling Multiple MCP Servers in the Claude Agent SDK
When the GitHub MCP and Linear MCP both expose create_issue, Sonnet 4.6 cannot tell them apart. This article covers the structure of MCP tool name collisions, a TypeScript reconciler implementation, and a measured correction: the schemaHash I originally published missed all five schema drifts I tested it against.
⬡ API & SDK2026-05-16
Automating Multilingual App Review Replies with Claude API — Living with the App Store's Undocumented Limits
An indie developer running a portfolio of wallpaper and healing apps shares the full implementation of Claude API-powered multilingual review reply automation — including App Store's undocumented 8-second rule, session limits, and the three traps that can get you banned.