Digest zilnic de știri AI cu Claude Code CLI și Obsidian — zero dependențe
Cum am construit un agent zilnic de documentare a știrilor cu un script bash de 6 linii, modul headless Claude Code și macOS launchd. Caută 11 subiecte și scrie digesturi direct în Obsidian.
TL;DR
Un script bash de 6 linii care rulează Claude Code CLI în mod headless în fiecare dimineață la ora 9:00. Caută știri pe web pentru 11 subiecte configurabile, filtrează zgomotul și scrie un digest markdown formatat direct într-un Obsidian vault sincronizat prin iCloud. Zero dependențe. ~100 de linii de configurare în total.
Problema
Ca dezvoltator, să rămâi la curent cu mai multe tehnologii este o taxă zilnică. Feedurile RSS sunt zgomotoase, Twitter îți fură timpul, newsletterele ajung fix când ești adânc în flow. Aveam nevoie de ceva care să facă documentarea în locul meu și să prezinte rezultatele acolo unde deja lucrez — în Obsidian vault-ul meu.
Soluția tipică este să construiești un pipeline de scraping: un scheduler, un crawler, un pipeline NLP, o bază de date, un serviciu de notificări. Sunt săptămâni de muncă pentru ceva care se poate strica atunci când un site își schimbă HTML-ul. Voiam ceva ce pot construi într-o după-amiază.
Arhitectura
Întregul sistem înseamnă 4 fișiere și zero dependențe. Iată cum funcționează de la un capăt la altul:
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 devicesCodul (tot)
Proiectul este intenționat minimal. Fiecare linie își merită locul.
Punctul de intrare: digest.sh
Întreaga aplicație este un script bash de 6 linii:
#!/bin/bash
DIGEST_DIR="$HOME/Developer/news-digest"
claude -p "$(cat "$DIGEST_DIR/prompt.md")" \
--max-turns 20 \
--allowedTools Read,WebSearch,WebFetch,WriteFlag-urile cheie: -p rulează Claude în mod headless (fără terminal interactiv), --max-turns 20 îi dă agentului spațiu suficient pentru a documenta toate subiectele, iar --allowedTools restrânge agentul doar la citirea fișierelor, căutarea pe web și scrierea rezultatului.
Creierul: prompt.md
Aici trăiește inteligența. Promptul transformă Claude într-un agent de documentare a știrilor, cu instrucțiuni precise despre ce să caute, cum să filtreze și unde să salveze:
# 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 spamConfigurare: topics.yaml
Subiectele sunt complet configurabile — adaugi un subiect nou și apare în digestul de mâine. Fiecare subiect are un nume și un context opțional care ghidează căutarea AI-ului:
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"Programare cu launchd
Pe macOS, launchd este modalitatea nativă de a programa sarcini recurente (precum cron pe Linux). Fișierul plist definește când și cum rulează scriptul:
<?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>Îl instalezi cu launchctl load ~/Library/LaunchAgents/com.news-digest.plist. Scriptul rulează în fiecare zi la ora 9:00, chiar dacă erai deconectat — launchd va executa sarcinile ratate atunci când sistemul se trezește.
Cum arată rezultatul
În fiecare dimineață, un nou fișier markdown apare în Obsidian vault cu știri structurate și prioritizate:
---
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/...)În cifre
| 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) |
Decizii cheie de design
- Claude Code CLI în loc de API — nu e nevoie să gestionezi chei API, clienți HTTP sau parsarea răspunsurilor. CLI-ul se ocupă din start de autentificare, execuția uneltelor și recuperarea după erori
- Obsidian în loc de email — digesturile pot fi căutate, legate între ele și rămân permanente. Trăiesc lângă notițele mele, nu se îneacă într-un inbox
- launchd în loc de cron — launchd este schedulerul nativ pe macOS. Gestionează curat rulările ratate, logarea și variabilele de mediu
- YAML pentru subiecte — adăugarea unui subiect nou înseamnă o modificare de 2 linii. Fără schimbări de cod
- Sari peste subiectele goale — dacă nu există știri reale, secțiunea este omisă complet. Fără umplutură, fără conținut întins artificial
Cum îți construiești propriul agent
Îl poți avea funcțional în 10 minute:
- Instalează Claude Code CLI și autentifică-te
- Clonează repo-ul:
git clone https://github.com/oleksiimazurenko/news-digest - Editează
topics.yamlcu interesele tale șiprompt.mdcu calea ta de salvare - Editează fișierul plist cu numele tău de utilizator și căile tale, apoi rulează
launchctl load - Așteaptă ora 9:00 — sau testează manual cu
bash digest.sh
Concluzii
Cel mai interesant lucru la acest proiect este ceea ce nu se află în el. Nicio bază de date, niciun server API, niciun container Docker, niciun pachet npm, niciun virtualenv Python, niciun parser HTML, niciun pipeline NLP. Doar un prompt, o listă de subiecte și un script de 6 linii care deleagă toată munca grea unui agent AI.
Așa arată să construiești cu agenți AI în practică: tu definești ce și unde, iar agentul se ocupă de cum. Timpul total de dezvoltare a fost de aproximativ 2 ore, incluzând iterațiile pe prompt pentru a obține o filtrare de calitate.
Surse
- news-digest on GitHub — full source code
- Claude Code Documentation — headless mode and CLI flags
- Apple Developer — creating launchd jobs
- Obsidian — markdown knowledge base