--- name: orbites-ai-newsletters description: Curate daily AI, Online Marketing, SEO, and AI×Marketing Research news digest. For OrbitOS. Use when user says 'AI news', 'marketing news', 'SEO news', 'newsletter digest', 'what's new in AI', 'ข่าว AI', 'ข่าว marketing', 'สรุปข่าว'. --- # OrbitOS: Daily News Digest — AI · Marketing · SEO · Research Fetch, deduplicate, and rank news from 5 curated topic areas into a daily digest saved to the OrbitOS vault. ## Source Configuration ### 🔵 AI News | Source | URL | Type | |--------|-----|------| | TLDR AI | `https://bullrich.dev/tldr-rss/ai.rss` | RSS | | The Rundown AI | `https://rss.beehiiv.com/feeds/2R3C6Bt5wj.xml` | RSS | ### 🟢 Online Marketing | Source | URL | Type | |--------|-----|------| | Marketing AI Institute | `https://www.marketingaiinstitute.com/blog/rss.xml` | RSS | | HubSpot Marketing | `https://blog.hubspot.com/marketing/rss.xml` | RSS | | Search Engine Land | `https://searchengineland.com/feed` | RSS | ### 🟡 SEO | Source | URL | Type | |--------|-----|------| | Search Engine Journal | `https://www.searchenginejournal.com/feed/` | RSS | | Ahrefs Blog | `https://ahrefs.com/blog/feed/` | RSS | | Semrush Blog | `https://www.semrush.com/blog/feed/` | RSS | | Moz Blog | `https://feedpress.me/mozblog` | RSS | | Neil Patel | `https://neilpatel.com/blog/feed/` | RSS | ### 🟣 Marketing & AI Research | Source | URL | Type | |--------|-----|------| | arXiv (AI + marketing) | `https://export.arxiv.org/api/query?search_query=all:marketing+AND+all:AI&sortBy=submittedDate&sortOrder=descending&max_results=10` | API | | Web search | Execute: `web_search("AI marketing research 2026 generative AI")` + `web_search("marketing AI agent study 2026")` | Search | ## Workflow 1. **Check cache**: Look for `50_Resources/Newsletters/YYYY-MM/YYYY-MM-DD-Digest.md` (relative to vault root). If exists with today's date, return cached content. 2. **Fetch feeds** (see Provider Fallbacks for exact curl commands): - RSS sources: Use `curl` via terminal on each URL. Parse title, link, pubDate, description from XML. Fall back to `web_extract` if configured. - arXiv: Use `curl` on the API URL. Parse `` elements. - Web search: Run via `web_search` if configured; otherwise skip this section. 3. **Classify each item** into topic buckets: - `ai` — LLMs, GPT, Claude, agents, ML, AI tools - `marketing` — digital marketing, paid ads, content strategy, brand, B2B marketing - `seo` — search rankings, Google updates, SERP features, technical SEO, GEO - `research` — academic papers, studies, surveys, reports with data/statistics 4. **Deduplicate**: Items with 70%+ title word overlap across sources → merge into one entry tracking all source URLs. 5. **Rank within each bucket** by: - Relevance to the topic cluster - Content creation potential (can I write a post about this?) - Novelty (penalize if similar item in recent archives) - Recency 6. **Generate digest** — bilingual Thai/English: ```markdown # 📰 Daily Digest — YYYY-MM-DD ## 🔵 AI — Top 3 - **[Title]** — 1-line summary. [Source] → *Angle:* content idea in Thai ... ## 🟢 Online Marketing — Top 3 ... ## 🟡 SEO — Top 3 ... ## 🟣 Marketing & AI Research — Top 2 ... ## 💡 Content Creation Opportunities Top 5 across all buckets ranked by post potential: 1. ... ``` 7. **Save files** (all paths relative to vault root): - `50_Resources/Newsletters/YYYY-MM/YYYY-MM-DD-Digest.md` — curated digest - `50_Resources/Newsletters/YYYY-MM/Raw/` — raw extracted content per source if substantial 8. **Curate high-value articles → migrate to 30_Research/** - After generating the digest, scan Content Creation Opportunities and related articles - For each article worth keeping for future content creation: 1. Copy/save as `30_Research/.md` with frontmatter `type: article` + source URL 2. Remove from `Raw/` folder (don't keep raw dumps there long-term) 3. Add a note in the Research file linking back to the digest - The user confirmed this: **`Raw/` = processing cache, `30_Research/` = permanent collection** - Pitfall: Don't let Raw/ accumulate — it's a temp folder, not an archive - See `references/article-curation-workflow.md` for the full process ## Output Format **Manual invocation (user asks directly):** Display full digest with all 4 topic sections + content opportunities. **From start-my-day cron (07:00):** Return condensed list: ``` **📰 Morning Briefing:** 🔵 AI: [N items] — top headline 🟢 Marketing: [N items] — top headline 🟡 SEO: [N items] — top headline 🟣 Research: [N items] — top headline Full digest: [[YYYY-MM-DD-Digest]] ``` ## Provider Fallbacks `web_extract` and `web_search` may be unavailable (no provider configured). **Primary approach is `curl` via terminal.** Only use `web_extract`/`web_search` if they return data. ### Fetch commands (preferred — curl + terminal) ```bash # RSS feeds: curl + parse XML inline curl -sL --max-time 15 "https://bullrich.dev/tldr-rss/ai.rss" | head -500 curl -sL --max-time 15 "https://rss.beehiiv.com/feeds/2R3C6Bt5wj.xml" | head -500 curl -sL --max-time 15 "https://www.marketingaiinstitute.com/blog/rss.xml" | head -500 curl -sL --max-time 15 "https://blog.hubspot.com/marketing/rss.xml" | head -500 curl -sL --max-time 15 "https://searchengineland.com/feed" | head -500 curl -sL --max-time 15 "https://www.searchenginejournal.com/feed/" | head -500 curl -sL --max-time 15 "https://ahrefs.com/blog/feed/" | head -500 curl -sL --max-time 15 "https://www.semrush.com/blog/feed/" | head -500 curl -sL --max-time 15 "https://feedpress.me/mozblog" | head -500 curl -sL --max-time 15 "https://neilpatel.com/blog/feed/" | head -500 # arXiv API (XML — parse elements) curl -sL --max-time 15 "https://export.arxiv.org/api/query?search_query=all:marketing+AND+all:AI&sortBy=submittedDate&sortOrder=descending&max_results=10" | head -300 # For truncated large feeds, extract titles only: curl -sL --max-time 15 "https://rss.beehiiv.com/feeds/2R3C6Bt5wj.xml" | grep -o '[^<]*' | head -15 ``` ## Source Health Notes | Source | Status | Note | |--------|--------|------| | TLDR AI | ✅ Active | `bullrich.dev/tldr-rss/ai.rss` — reliable, rich descriptions | | The Rundown AI | ✅ Active | `rss.beehiiv.com` — HTML entities in titles (`'`), use grep for title extraction if truncated | | Marketing AI Institute | ✅ Active | Blog posts weekly, HubSpot-hosted | | HubSpot Marketing | ✅ Active | Very large feed, head -500 sufficient for recent items | | Search Engine Land | ✅ Active | WordPress RSS, standard format | | Search Engine Journal | ✅ Active | WordPress RSS, frequent updates | | Ahrefs Blog | ✅ Active | Fresh content, enterprise SEO focus | | Semrush Blog | ✅ Active | Data-driven SEO, frequent posts | | Moz Blog | ✅ Active | **Fixed in June 2026** — URL changed from `moz.com/blog/feed` → `feedpress.me/mozblog` | | Neil Patel | ✅ Active | Marketing + SEO insights, daily posts | | Google Search Central | ❌ Permanently broken | `developers.google.com/search/blog/feed` 404 — blog discontinued/unhosted as of 2026 | | arXiv API | ✅ Active | XML Atom feed, parse `` elements | | Web Search | ⚠️ Config-dependent | Requires `web.search_backend` configured via `hermes tools` | ## Cron Mode Constraints - **`execute_code` is BLOCKED in cron mode.** Use individual `terminal` calls instead. Batch parallel `curl` fetches as separate tool calls in one response. - **`web_search` and `web_extract` may be unavailable** if not configured at the profile level. - When a tool fails with "No provider configured", silently fall back to `curl` + `terminal` — do not abort. ## Content Creation Bridge After generating the digest, the user may ask to write articles from the news items. When doing so, follow the **Research-First** approach documented in `references/news-to-article.md`. ### Research-First: News → Article Pipeline 1. **Identify the source articles** linked in each news item — don't write from the digest summary alone 2. **Read the original source articles** — use `curl -sL --max-time 20` with `python3 -c` for HTML text extraction; fall back to `browser_navigate` for Cloudflare/Vercel-protected sites 3. **Extract key data**: specific numbers, quotes, mechanisms, and causal relationships 4. **Synthesize multiple sources** into a coherent single narrative — don't just restate one article 5. **Write in Thai** with: - 📌 "Takeaway" callout boxes per section (labeled by topic, e.g. "GEO Takeaway", "Content Strategy Takeaway") - Data tables with comparison columns and emoji indicators (✅/❌/🟢/🟡/🔴) - A summary table of actionable takeaways at the end (with bulletproof reasoning column) - Source citations at the bottom linking back to originals 6. **Save article** to `~/vault/60_Articles//article.md` with title/description/date/category/tags in frontmatter 7. **Save brief** — optionally create a brief.md in the same 60_Articles// directory with the research notes and source summaries ### Research fallback handling When `web_extract` and `web_search` have no provider configured (common in this profile): - **Generic HTML articles**: `curl -sL --max-time 20 "" | python3 -c "import sys,re; html=sys.stdin.read(); html=re.sub(r']*>.*?', '', html, flags=re.DOTALL); html=re.sub(r']*>.*?', '', html, flags=re.DOTALL); text=re.sub(r'<[^>]+>', ' ', html); text=re.sub(r'\s+', ' ', text).strip(); print(text[:15000])"` - **Sites with article tag**: Target `
` element specifically: `re.search(r']*>(.*?)
', html, re.DOTALL)` then strip tags - **Cloudflare/Vercel blocked sites**: Fall back to `browser_navigate` + `browser_snapshot(full=true)` or browser_scroll for longer articles - **VentureBeat**: Known to have Vercel security checkpoint; always use browser tools (curl won't work) - See `orbites-ai-products` skill for the HN Algolia API and GitHub Search API curl patterns ### Thai content conventions - Title: Hook-driven, ≤ 60 chars, includes curiosity gap or contrarian claim - Opening paragraph: Hook that breaks reader expectation (not throat-clearing) - Structure per section: Data table → explanation paragraph → 📌 Takeaway box - End with: "ที่มา:" section listing all source articles as markdown links - Avoid: generic "ในโลกดิจิทัลวันนี้" openings, artificial FAQ, keyword stuffing ## Error Handling - One source down: Skip, note in section header "(1 source unavailable)" - All sources in a topic down: Show "⚠️ No new items today" for that section - All sources down: Use yesterday's digest with warning - arXiv returns empty: Skip research section gracefully - Web search rate-limited: Use cached web results or skip - Terminal output truncated (>50KB): Use `grep` to extract key fields (titles, links) - Google Search Central 404: Skip silently, note in source summary - Moz stale: Skip entirely unless user asks for historical SEO content