Merge OrbitOS into project — one install, everything ready
- Added 15 OrbitOS skills (bundled in skills/orbitos/) - Added vault structure templates (views, templates, prompts) - Added install.sh (macOS + Linux) - Removed references/orbitos-skills.md (no longer needed) - Updated README: 30 skills total, unified install flow Total: 9 mm* + 6 dependencies + 15 orbitos = 30 skills
This commit is contained in:
209
skills/orbitos/orbites-ai-newsletters/SKILL.md
Normal file
209
skills/orbitos/orbites-ai-newsletters/SKILL.md
Normal file
@@ -0,0 +1,209 @@
|
||||
---
|
||||
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 `<entry>` 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/<slug-title>.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 <entry> 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 '<title>[^<]*</title>' | 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 `<entry>` 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/<slug>/article.md` with title/description/date/category/tags in frontmatter
|
||||
7. **Save brief** — optionally create a brief.md in the same 60_Articles/<slug>/ 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 "<URL>" | python3 -c "import sys,re; html=sys.stdin.read(); html=re.sub(r'<script[^>]*>.*?</script>', '', html, flags=re.DOTALL); html=re.sub(r'<style[^>]*>.*?</style>', '', html, flags=re.DOTALL); text=re.sub(r'<[^>]+>', ' ', html); text=re.sub(r'\s+', ' ', text).strip(); print(text[:15000])"`
|
||||
- **Sites with article tag**: Target `<article>` element specifically: `re.search(r'<article[^>]*>(.*?)</article>', 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
|
||||
@@ -0,0 +1,64 @@
|
||||
# Article Curation Workflow — Daily Digest → 30_Research/
|
||||
|
||||
## Why
|
||||
|
||||
The daily digest generates a raw dump in `50_Resources/Newsletters/YYYY-MM/Raw/`.
|
||||
The user confirmed that high-value articles should **not** stay in Raw/ — they belong in `30_Research/` as permanent reference files.
|
||||
|
||||
User's exact words: *"จำเรื่องนี้ไว้เลยนะ"* (remember this). The confirmed flow:
|
||||
|
||||
```
|
||||
Raw/ (temp cache)
|
||||
↓ select high-value articles
|
||||
30_Research/<slug-title>.md (permanent)
|
||||
↓
|
||||
Referenced from future digest or content planning
|
||||
```
|
||||
|
||||
## Selection Criteria
|
||||
|
||||
From the digest's Content Creation Opportunities section or notable articles:
|
||||
|
||||
- High content creation potential (LinkedIn post, blog, tutorial)
|
||||
- Novel research or data-driven insights
|
||||
- Actionable for the user's SEO/marketing work (brand visibility, AI search, GEO)
|
||||
- Topic fits the user's niche (AI × Marketing, SEO, agentic systems)
|
||||
|
||||
## File Format
|
||||
|
||||
```markdown
|
||||
---
|
||||
type: article
|
||||
source: https://example.com/article
|
||||
source_digest: "[[50_Resources/Newsletters/YYYY-MM/YYYY-MM-DD-Digest]]"
|
||||
captured: YYYY-MM-DD
|
||||
tags: [article, ai-marketing, brand-visibility]
|
||||
---
|
||||
|
||||
# [Article Title]
|
||||
|
||||
## Key Takeaways
|
||||
- ...
|
||||
- ...
|
||||
|
||||
## Why This Matters for Moreminimore
|
||||
- ...
|
||||
- ...
|
||||
|
||||
## Action Items
|
||||
- [ ] Consider for LinkedIn post
|
||||
- [ ] Reference in [project name] content plan
|
||||
```
|
||||
|
||||
## Cleanup
|
||||
|
||||
- Remove the source raw file from `Raw/` after migrating
|
||||
- If multiple articles from same raw file, remove after last migration
|
||||
- Keep the digest itself (it's the curated summary, not the cache)
|
||||
|
||||
## Example
|
||||
|
||||
Article `chatgpt-opens-ads-all.md` was moved from:
|
||||
```
|
||||
50_Resources/Newsletters/2026-06/Raw/ → 30_Research/chatgpt-opens-ads-all.md
|
||||
```
|
||||
@@ -0,0 +1,138 @@
|
||||
# News-to-Article Workflow Reference
|
||||
|
||||
Full workflow for taking news items / content ideas from a digest and writing in-depth articles.
|
||||
|
||||
## Article Directory Structure
|
||||
|
||||
```
|
||||
~/vault/60_Articles/
|
||||
├── YYYY-MM-DD-<slug>/
|
||||
│ ├── article.md # Full article with frontmatter (title, description, date, category, tags, status: draft)
|
||||
│ ├── brief.md # Optional: research notes, source summaries, angles considered
|
||||
│ └── images/ # Featured + inline images
|
||||
│ └── featured.png
|
||||
└── YYYY-MM-DD-<slug2>/
|
||||
...
|
||||
```
|
||||
|
||||
## Article Frontmatter Template
|
||||
|
||||
```yaml
|
||||
---
|
||||
title: "Hook-driven title (≤ 60 chars, Thai)"
|
||||
description: "SEO meta description (120-160 chars)"
|
||||
slug: "yyyy-mm-dd-kebab-case-slug"
|
||||
date: YYYY-MM-DD
|
||||
category: SEO | AI | Marketing | Research
|
||||
author: Macky
|
||||
tags: [Tag1, Tag2, Tag3, Tag4]
|
||||
status: draft
|
||||
---
|
||||
```
|
||||
|
||||
## Research Phase (do this first, before writing)
|
||||
|
||||
### Step 1: Identify source articles
|
||||
From the digest's news items, find the original source URLs. Never write from the digest summary alone — always read the originals.
|
||||
|
||||
### Step 2: Read each source article
|
||||
Use this curl technique for most sites:
|
||||
|
||||
```bash
|
||||
curl -sL --max-time 20 "<URL>" | python3 -c "
|
||||
import sys, re
|
||||
html = sys.stdin.read()
|
||||
# Strip scripts and styles
|
||||
html = re.sub(r'<script[^>]*>.*?</script>', '', html, flags=re.DOTALL)
|
||||
html = re.sub(r'<style[^>]*>.*?</style>', '', html, flags=re.DOTALL)
|
||||
# Try to get <article> content first
|
||||
match = re.search(r'<article[^>]*>(.*?)</article>', html, re.DOTALL)
|
||||
if match:
|
||||
text = re.sub(r'<[^>]+>', ' ', match.group(1))
|
||||
else:
|
||||
text = re.sub(r'<[^>]+>', ' ', html)
|
||||
text = re.sub(r'\s+', ' ', text).strip()
|
||||
print(text[:15000])
|
||||
"
|
||||
```
|
||||
|
||||
For Cloudflare-protected sites (e.g. VentureBeat):
|
||||
- Fall back to `browser_navigate` → `browser_snapshot(full=true)` → `browser_scroll` as needed
|
||||
|
||||
### Step 3: Extract key data per source
|
||||
For each source, extract:
|
||||
- **Numbers** — all specific metrics, percentages, dollar amounts
|
||||
- **Quotes** — direct statements from researchers/executives
|
||||
- **Mechanisms** — how something works (the causal chain)
|
||||
- **Contrasts** — before/after, old/new, claimed vs actual
|
||||
|
||||
### Step 4: Synthesize across sources
|
||||
Organize findings into a coherent narrative:
|
||||
1. What's the core insight/problem each article describes?
|
||||
2. How do the sources overlap, complement, or contradict each other?
|
||||
3. What's the single actionable takeaway that readers can use today?
|
||||
|
||||
## Writing Phase
|
||||
|
||||
### Thai Content Structure (per article)
|
||||
|
||||
```
|
||||
# [Hook-driven title]
|
||||
|
||||
> [Hook paragraph — 1-2 sentences, breaks reader expectation]
|
||||
|
||||
## 📚 สารบัญ
|
||||
- [Section 1]
|
||||
- [Section 2]
|
||||
- ...
|
||||
|
||||
## [Section 1 — Core insight]
|
||||
[Data table with comparison columns]
|
||||
[Explanation paragraph — 2-4 sentences]
|
||||
📌 [Topic] Takeaway: [Actionable insight in 1-2 sentences]
|
||||
|
||||
## [Section 2 — Mechanism]
|
||||
[Data table with before/after]
|
||||
[Explanation]
|
||||
📌 [Topic] Takeaway: [...]
|
||||
|
||||
...
|
||||
|
||||
## สรุป Actionable Takeaways
|
||||
| สิ่งที่ต้องทำ | เหตุผล |
|
||||
|:---|:---|
|
||||
| ✅ [Action] | [Why — bulletproof reasoning] |
|
||||
| ❌ [Avoid] | [Why — the trap to dodge] |
|
||||
|
||||
---
|
||||
|
||||
**ที่มา:**
|
||||
- [Author], "[Title]" — [Publication], [Date]
|
||||
```
|
||||
|
||||
### Thai Writing Conventions
|
||||
|
||||
| Element | Convention |
|
||||
|:---|:---|
|
||||
| **Title** | Hook-driven ≤ 60 chars. Curiosity gap or contrarian claim. Include target keyword naturally |
|
||||
| **Opening** | Break expectation — "ถ้าคุณคิดว่า X — คุณคิดผิด" / "ไม่ใช่แค่ X — มันคือ Y" |
|
||||
| **Section labels** | 📌 "GEO Takeaway" / "Content Strategy Takeaway" / "Business Takeaway" |
|
||||
| **Tables** | Comparison columns with emoji indicators (✅ ❌ 🟢 🟡 🔴 🏆) |
|
||||
| **Code/terms** | Use backticks for English technical terms (`result_source`, `turn_use_case`) |
|
||||
| **Numbers** | Bold the headline number — "เร่งความเร็วได้ **85%**" |
|
||||
| **Sources footer** | "**ที่มา:**" section listing all source articles as markdown links |
|
||||
|
||||
### Avoid
|
||||
- Generic openings: "ในโลกดิจิทัลวันนี้", "ด้วยความก้าวหน้าของเทคโนโลยี"
|
||||
- Artificial FAQ sections — don't add them unless the content genuinely raises questions
|
||||
- Keyword stuffing — use Thai synonyms naturally
|
||||
- Over-explaining — trust the reader to connect simple dots
|
||||
|
||||
## Pitfalls
|
||||
|
||||
1. **web_extract / web_search may not be configured** — always have curl+browser fallback ready. Script/security warnings from pipe-to-python are a real risk; get auto-approval or use inline parsing.
|
||||
2. **Majority of articles are in the 60_Articles/<slug>/article.md format** — check existing structure before saving. Never invent a new format.
|
||||
3. **Source article may be behind paywall or bot-block** — curl can't read everything. Browser tools handle Cloudflare/Vercel. YouTube and social platforms need different approaches.
|
||||
4. **Content date ≠ publish date** — use the source research date or the article's original publication date, not today's date, for the article slug and frontmatter.
|
||||
5. **Multiple articles from one digest session** — batch them in parallel via delegate_task if independent; write sequentially if they share data.
|
||||
6. **arXiv API returns Atom XML, not RSS** — parse `<entry>` elements specifically; the `head -300` approach in the newsletter skill truncates at a fixed line count, so use `python3 -c` for proper XML parsing.
|
||||
Reference in New Issue
Block a user