Digest Diario de Noticias AI con Claude Code CLI y Obsidian — Cero Dependencias
Cómo construí un agente diario de investigación de noticias con un script bash de 6 líneas, modo headless de Claude Code y macOS launchd.
TL;DR
Un script bash de 6 líneas que ejecuta Claude Code CLI en modo headless cada mañana a las 9:00. Busca noticias en 11 temas configurables, filtra el ruido y escribe un digest markdown formateado directamente en un Obsidian vault sincronizado vía iCloud. Cero dependencias. ~100 líneas de configuración total.
El Problema
Como desarrollador, mantenerse al día con múltiples tecnologías es un impuesto diario. Los feeds RSS son ruidosos, Twitter consume tiempo, los newsletters llegan cuando estás en estado de flujo. Necesitaba algo que hiciera la investigación por mí.
La solución típica es construir un pipeline de scraping: un programador, un crawler, un pipeline NLP, una base de datos, un servicio de notificaciones. Eso son semanas de trabajo. Yo quería algo que pudiera hacer en una tarde.
Arquitectura
Todo el sistema son 4 archivos y cero dependencias:
macOS launchd (9:00 AM daily)
│
└── digest.sh
│
└── claude -p "$(cat prompt.md)" --max-turns 20 --allowedTools Read,WebSearch,WebFetch,Write
│
├── Reads topics.yaml (11 configurable topics)
├── WebSearch → finds news for each topic (last 24-48h)
├── WebFetch → reads full articles
├── Filters noise: old tutorials, promos, AI spam
└── Write → saves digest to Obsidian Vault
│
└── ~/Obsidian Vault/digests/2026-04-12.md
│
└── iCloud sync → available on all devicesEl Código (todo)
El proyecto es intencionalmente mínimo.
Punto de entrada: digest.sh
Toda la aplicación es un script bash de 6 líneas:
#!/bin/bash
DIGEST_DIR="$HOME/Developer/news-digest"
claude -p "$(cat "$DIGEST_DIR/prompt.md")" \
--max-turns 20 \
--allowedTools Read,WebSearch,WebFetch,WriteLos flags clave: -p ejecuta Claude en modo headless, --max-turns 20 da suficientes turnos al agente, --allowedTools restringe al agente a lectura, búsqueda y escritura.
El Cerebro: prompt.md
Aquí vive la inteligencia. El prompt convierte a Claude en un agente de investigación de noticias:
# News Digest Agent
You are a news research agent. Your job is to find today's most important
and interesting news for a senior frontend developer.
## Instructions
1. Read the topics file at ~/Developer/news-digest/topics.yaml
2. For EACH topic, search the web for news from the last 24-48 hours
3. Filter: only include genuinely new and noteworthy items
4. Write the digest as a markdown file to Obsidian Vault digests/YYYY-MM-DD.md
5. IMPORTANT: Use the Write tool to save the file. Do NOT output to stdout.
## Rules
- Language: Ukrainian for summaries, English for titles and technical terms
- If there's no real news for a topic — SKIP IT ENTIRELY
- Prioritize: releases > breaking changes > security > new patterns > discussions
- Max 5 items per topic, sorted by importance
- Include direct links to sources
- Skip promotional content, generic tutorials, and AI-generated spamConfiguración: topics.yaml
Los temas son totalmente configurables — agrega uno nuevo y estará en el digest de mañana:
topics:
- name: better-auth
context: "auth library for TypeScript. New releases, breaking changes"
- name: Next.js
context: "GitHub issues, releases, App Router, Turbopack, performance"
- name: SolidJS
context: "SolidStart, releases, ecosystem, comparison with React"
- name: Tailwind CSS
context: "v4 updates, new utilities, plugins"
- name: Claude AI
context: "Anthropic announcements, Claude Code, new models, MCP, API"
- name: GPT AI
context: "OpenAI announcements, new models, ChatGPT features"
- name: React
context: "React 19+, Server Components, new patterns, ecosystem"
- name: Apple
context: "Hardware, software, WWDC, developer tools, Apple Intelligence"
- name: Notable People
context: >
Latest tweets from: Elon Musk, Dario Amodei, Sam Altman,
Jensen Huang, Andrej Karpathy, Simon Willison, Swyx...
- name: AI Global
context: "Major AI news, new models, regulations, open-source AI"Programación con launchd
En macOS, launchd es la forma nativa de programar tareas recurrentes:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.news-digest</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/you/Developer/news-digest/digest.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>9</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/you/Developer/news-digest/logs/stdout.log</string>
<key>StandardErrorPath</key>
<string>/Users/you/Developer/news-digest/logs/stderr.log</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin</string>
<key>HOME</key>
<string>/Users/you</string>
</dict>
</dict>
</plist>Instalar con launchctl load ~/Library/LaunchAgents/com.news-digest.plist. El script se ejecuta diariamente a las 9:00.
Cómo se ve el resultado
Cada mañana aparece un nuevo archivo markdown en el Obsidian vault:
---
date: 2026-04-12
---
# News Digest — 2026-04-12
## Next.js
### Next.js 16.1 Released with Improved Turbopack Caching
Нова версія Next.js 16.1 включає покращене кешування для Turbopack,
що зменшує час холодного старту на ~40%.
[Посилання](https://nextjs.org/blog/next-16-1)
### Critical Memory Leak Fix in App Router
Виправлено витік пам'яті в App Router при частому перемиканні
між динамічними маршрутами.
[GitHub Issue](https://github.com/vercel/next.js/issues/...)
## Claude AI
### Claude Code 1.5 — MCP Server Auto-Discovery
Anthropic випустив оновлення Claude Code з автоматичним
виявленням MCP серверів у проєкті.
[Блог](https://www.anthropic.com/news/...)En números
| Metric | Value |
|---|---|
| Total files in project | 4 (digest.sh, prompt.md, topics.yaml, .gitignore) |
| Lines of code | ~100 |
| External dependencies | 0 |
| Setup time | ~10 minutes |
| Daily execution time | 2-5 minutes |
| Cost per run | ~$0.10-0.30 (Claude API usage) |
Decisiones clave de diseño
- Claude Code CLI en vez de API — sin gestionar API keys, clientes HTTP o parseo de respuestas
- Obsidian en vez de email — los digests son buscables, enlazables y permanentes
- launchd en vez de cron — programador nativo de macOS con manejo de ejecuciones perdidas
- YAML para temas — un nuevo tema es un cambio de 2 líneas
- Saltar temas vacíos — sin noticias = sin sección
Cómo construir el tuyo
Listo en 10 minutos:
- Instalar Claude Code CLI y autenticarse
- Clonar el repo:
git clone https://github.com/oleksiimazurenko/news-digest - Editar
topics.yamlyprompt.md - Editar el plist y
launchctl load - Esperar a las 9:00 — o probar manualmente con
bash digest.sh
Conclusiones
Lo más interesante de este proyecto es lo que no tiene. Sin base de datos, sin servidor API, sin Docker, sin npm, sin Python, sin parser HTML, sin pipeline NLP.
Así es construir con agentes AI: defines el qué y el dónde, el agente maneja el cómo. Tiempo total: unas 2 horas.
Fuentes
- news-digest on GitHub — full source code
- Claude Code Documentation — headless mode and CLI flags
- Apple Developer — creating launchd jobs
- Obsidian — markdown knowledge base