Skill: ivangdavila/daily-news-digest (version 1.0.0)

--- name: Daily News Digest slug: daily-news-digest version: 1.0.0 homepage: https://clawic.com/skills/daily-news-digest description: Personalized news briefings from your chosen sources, delivered morning or evening, with voice option and smart filtering. metadata: {"clawdbot":{"emoji":"📰","requires":{"bins":[]},"os":["linux","darwin","win32"]}} --- # Daily News Digest 📰 Your AI News Chief of Staff. Multi-source aggregation, intelligent prioritization, time-aware delivery, and deep-dive on demand. Never miss what matters, never drown in noise. ## Setup On first use, read `setup.md` for integration guidelines. The setup process learns preferences through conversation. ## When to Use User asks for news updates, daily briefings, current events, or scheduled news delivery. Handles source selection, topic filtering, format preferences, and automated scheduling. ## Architecture Memory lives in `~/daily-news-digest/`. See `memory-template.md` for structure. ``` ~/daily-news-digest/ ├── memory.md # Preferences + delivery schedule + learned interests ├── sources.md # Configured sources + quality scores ├── archive/ # Past briefings for reference │ └── YYYY-MM-DD.md # Daily archives └── cache/ # Temporary fetch cache (auto-cleaned) ``` ## Quick Reference | Topic | File | |-------|------| | Setup process | `setup.md` | | Memory template | `memory-template.md` | | Source configuration | `sources.md` | | Briefing formats | `formats.md` | | Scheduling guide | `scheduling.md` | ## Core Rules ### 1. Multi-Source Aggregation Fetch from multiple source types for comprehensive coverage: | Source Type | Method | Best For | |-------------|--------|----------| | RSS feeds | Direct fetch | Established outlets, blogs | | Web search | Brave Search API | Breaking news, trending | | Public APIs | REST calls | Hacker News, Reddit public | Combine sources to avoid single-point-of-failure. If one fails, others compensate. ### 2. Intelligent Deduplication Same story appears across multiple outlets. Detect and merge: - Headline similarity >70% = same story - Keep version with most detail - Note which outlets covered it (credibility signal) - Never show duplicate stories in briefing ### 3. Priority Scoring Rank stories by importance, not just recency: | Signal | Weight | Rationale | |--------|--------|-----------| | User topic match | +40 | Personalization | | Multi-outlet coverage | +25 | Importance indicator | | Breaking/trending tag | +20 | Timeliness | | Trusted source | +15 | Quality signal | | Recency (last 6h) | +10 | Freshness | ### 4. Respect Preferences Memory stores learned preferences. Always check before fetching: - **Topics**: Include/exclude lists - **Sources**: Preferred/blocked outlets - **Geography**: Local emphasis level - **Schedule**: Delivery times + frequency Never override user preferences. If conflict, ask. ### 5. Format Adaptation Deliver in user's preferred format: | Format | When | Output | |--------|------|--------| | Brief | "quick update" | 3-5 headlines, 1 line each | | Standard | default | 8-12 stories, 2-3 sentences each | | Deep Dive | "full briefing" | All stories, full context | | Audio | "voice/listen" | TTS via elevenlabs or system | | Archive | "save this" | Markdown file in archive/ | ### 6. Time-Aware Delivery Adapt tone and content based on time of day: | Time | Mode | Behavior | |------|------|----------| | 6-11am | Morning | Energetic, forward-looking, "here's what's happening today" | | 12-5pm | Midday | Neutral, focused on breaking/developing stories | | 6-10pm | Evening | Reflective recap, "what you might have missed" | | Weekend | Relaxed | Lighter content, skip urgent tone, more features/analysis | ### 7. Interactive Deep-Dive End every briefing with: "Reply with any story number to dive deeper." When user replies with a number: 1. Fetch full article content 2. Summarize with more context 3. Show related stories 4. Offer: "Want the full article link?" ### 8. Scheduled Delivery Integrate with OpenClaw cron for automated briefings: ``` User: "Send me news every morning at 8am" → Create cron job with appropriate systemEvent → Briefing auto-delivers to configured channel ``` Track delivery history in memory. Don't duplicate if already sent. ### 9. Source Quality Tracking Maintain quality scores per source in sources.md: - Accuracy of headlines vs content - Paywall frequency - Ad density - Update freshness - User feedback signals Deprioritize low-quality sources over time. ### 10. Graceful Degradation Work with whatever is available. If a source fails: - Log the failure - Continue with other sources - Never fail completely because one source is down - Mention "X sources unavailable" only if significant ## Common Traps - **Overwhelming the user** → Default to Standard format (8-12 stories), not everything - **Stale news** → Always check story age, skip >24h unless explicitly requested - **Paywall frustration** → Detect paywalls, warn user, offer alternative source - **Missing local news** → Ask geography on first use, maintain local source list - **Duplicate stories** → Always run dedup before presenting - **Silent failures** → If source fetch fails, log and continue with others ## External Endpoints | Endpoint | Data Sent | Purpose | |----------|-----------|---------| | RSS feed URLs | None (GET only) | Fetch headlines | | Brave Search API | Query text | Trending/breaking news | | Hacker News API | None (GET only) | Tech news | | Reddit JSON API | None (GET only) | Public subreddit feeds | | ElevenLabs TTS (optional) | Briefing text | Voice synthesis | No other data is sent externally. **Credential handling:** Brave Search and ElevenLabs credentials are managed by OpenClaw platform configuration. RSS, Hacker News, and Reddit public APIs require no authentication. Scheduled deliveries use OpenClaw's built-in channel integrations. ## Security & Privacy **Data that leaves your machine:** - Search queries sent to Brave API for news discovery - Briefing text sent to TTS service (if voice enabled) **Data that stays local:** - All preferences in ~/daily-news-digest/ - Archive of past briefings - Source quality scores - No telemetry or analytics **This skill does NOT:** - Share reading habits with third parties - Store credentials in plain text - Access files outside ~/daily-news-digest/ - Modify itself or other skills ## Trust By using this skill with voice features, briefing text is sent to ElevenLabs. Only enable voice synthesis if you trust this service with your news content. ## Related Skills Install with `clawhub install <slug>` if user confirms: - `news` — personalized news with learning - `summarizer` — article summarization - `podcast` — audio content discovery - `schedule` — calendar and scheduling - `digest` — general content digests ## Feedback - If useful: `clawhub star daily-news-digest` - Stay updated: `clawhub sync`

path: formats.md
content: # Briefing Formats — Daily News Digest

## Format Types

### Brief (2-3 minutes)
For quick updates on the go.

**Structure:**
```
📰 Morning Brief — Feb 22, 2026

1. [Headline 1] — One sentence summary
2. [Headline 2] — One sentence summary
3. [Headline 3] — One sentence summary
4. [Headline 4] — One sentence summary
5. [Headline 5] — One sentence summary

5 stories from 12 sources. Reply with # to expand.
```

**Triggers:** "quick update", "brief", "headlines only", "tldr"
**Story count:** 3-5
**Per story:** Headline + 1 sentence

### Standard (5-7 minutes)
Default format for daily briefings.

**Structure:**
```
📰 Daily News Digest — Saturday, Feb 22

☀️ Good morning! Here's what matters today.

🔴 BREAKING
1. [Headline] — [2-3 sentence summary]
   Source: Reuters | 2h ago

📌 TOP STORIES
2. [Headline] — [2-3 sentence summary]
   Source: BBC | 4h ago

3. [Headline] — [2-3 sentence summary]
   Source: HN | 3h ago

[...]

📍 YOUR INTERESTS
5. [Tech/AI/etc headline based on preferences]
   Source: The Verge | 1h ago

⚡ ALSO NOTABLE
• [Quick headline]
• [Quick headline]

---
8 stories from 15 sources. Reply # to dive deeper.
```

**Triggers:** "news", "briefing", "what's happening", default
**Story count:** 8-12
**Per story:** 2-3 sentences with source attribution

### Deep Dive (15+ minutes)
Comprehensive coverage for dedicated reading time.

**Structure:**
```
📰 Deep Dive Briefing — Feb 22, 2026

## 🔴 Breaking / Developing

### [Headline]
[Full context: 4-6 sentences, background, implications]
[Related stories or previous coverage]
Sources: Reuters, AP, BBC

## 🌍 World

### [Headline]
[Full context]
[...]

## 💼 Business

[...]

## 🔬 Tech & Science

[...]

## 📍 Local ([User's Region])

[...]

---
Analysis based on 45 sources. Saved to archive.
```

**Triggers:** "full briefing", "deep dive", "everything", "all news"
**Story count:** 15-25
**Per story:** Full context with multiple source corroboration

## Voice Format

When audio is requested, adapt for listening:

**Opening:**
> "Good morning. Here's your news briefing for Saturday, February 22nd."

**Per story:**
> "[Topic transition]. [Headline spoken naturally]. [2-3 sentence summary without source attribution mid-sentence]."

**Closing:**
> "That's your briefing. [Number] stories from [number] sources. Have a great day."

**Pacing:**
- Pause between stories
- No visual formatting references
- Natural speech patterns, not reading

**Triggers:** "read it to me", "voice", "audio", "listen"

## Archive Format

Saved to `~/daily-news-digest/archive/YYYY-MM-DD.md`:

```markdown
# Daily News Digest — YYYY-MM-DD

Generated: HH:MM
Format: [standard|deep]
Stories: [count]
Sources: [count]

## Stories

### [Headline 1]
[Summary]
URL: [link]
Source: [source]
Topics: [tags]

[...]

## Statistics
- Top source: [source] (X stories)
- Main topics: [topic1], [topic2]
- Earliest: [time] | Latest: [time]
```

## Format Selection Logic

| User Says | Format |
|-----------|--------|
| "news" / "briefing" | Standard |
| "quick" / "brief" / "headlines" | Brief |
| "full" / "deep dive" / "everything" | Deep Dive |
| "voice" / "audio" / "read" | Voice (Standard content) |
| "save this" / "archive" | Current + Archive |

## Adapting to User

Observe and learn:
- Do they ask for more detail? → Lean toward Deep Dive
- Do they skip long summaries? → Default to Brief
- Morning vs evening → Different comprehensiveness
- Device context → Mobile = Brief, Desktop = Standard

## Time-Aware Modes

### Morning Mode (6am-11am)
```
☀️ Good morning! Here's what matters today.
```
- Energetic, forward-looking tone
- Focus on breaking news and day-ahead implications
- "What you need to know before your meetings"

### Midday Mode (12pm-5pm)
```
📰 Midday Update — Here's what's developing.
```
- Neutral, focused tone
- Breaking/developing stories since morning
- Skip stories from the morning briefing

### Evening Mode (6pm-10pm)
```
🌙 End of Day Recap — What you might have missed.
```
- Reflective, summarizing tone
- "Today's biggest stories"
- Preview of tomorrow if available

### Weekend Mode (Saturday/Sunday)
```
☕ Weekend Read — The stories worth your time.
```
- Lighter, more relaxed tone
- Skip "urgent" framing
- More features, analysis, long-reads
- Fewer breaking news, more curated content

## Interactive Dive-Deeper

When user replies with a story number:

```
User: "3"

📖 DEEP DIVE — Story #3

[Full context: 6-8 sentences]
[Background: why this matters]
[What's next: implications]

🔗 Related:
• [Related story 1]
• [Related story 2]

📎 Full article: [URL]

Reply 'back' for main briefing.
```


path: memory-template.md
content: # Memory Template — Daily News Digest

Create `~/daily-news-digest/memory.md` with this structure:

```markdown
# Daily News Digest Memory

## Status
status: ongoing
version: 1.0.0
last: YYYY-MM-DD
integration: pending

## Interests
<!-- Topics to emphasize, natural language -->
<!-- Example: Tech and AI news, especially startups and product launches -->

## Exclusions
<!-- Topics to filter out -->
<!-- Example: Crypto, celebrity gossip, sports -->

## Geography
<!-- Location and regions of interest -->
<!-- Example: Based in Madrid, also follows US tech scene -->

## Format
<!-- Preferred briefing style -->
<!-- Example: Standard format, 8-10 stories with context -->

## Voice
<!-- Audio preferences -->
<!-- Example: Enabled for morning briefings, uses ElevenLabs -->

## Schedule
<!-- Automated delivery times -->
<!-- Example: Morning briefing at 8am to Telegram, no evening -->

## Sources
<!-- Preferred and blocked sources -->
<!-- Example: Prefer Hacker News, The Verge. Block Daily Mail. -->

## Notes
<!-- Internal observations from behavior -->
<!-- Example: Skips long-form articles, prefers bullet points -->
<!-- Example: Always asks follow-up on AI stories -->

---
*Updated: YYYY-MM-DD*
```

## Status Values

| Value | Meaning | Behavior |
|-------|---------|----------|
| `ongoing` | Still learning | Gather context opportunistically |
| `complete` | Has enough context | Work normally |
| `paused` | User said "not now" | Don't ask, work with what you have |
| `never_ask` | User said stop | Never ask for more context |

## Key Principles

- **No config keys visible** — use natural language sections, not "topics: [array]"
- **Learn from behavior** — if they skip sports stories, note in Exclusions
- **Most users stay `ongoing`** — always learning new preferences, that's fine
- Update `last` on each briefing delivery
- Interests/Exclusions evolve over time — old entries can be removed if outdated


path: scheduling.md
content: # Scheduling Guide — Daily News Digest

## OpenClaw Cron Integration

This skill integrates with OpenClaw's cron system for automated briefings.

### Setting Up Scheduled Briefings

When user requests automation:

```
User: "Send me news every morning at 8am"

Agent action:
1. Confirm time and channel
2. Create cron job via OpenClaw
3. Log schedule in memory.md
```

### Cron Job Configuration

Use OpenClaw's cron tool with isolated session:

```json
{
  "schedule": {
    "kind": "cron",
    "expr": "0 8 * * *",
    "tz": "Europe/Madrid"
  },
  "payload": {
    "kind": "agentTurn",
    "message": "Deliver scheduled morning news briefing. Read ~/daily-news-digest/memory.md for preferences. Use Standard format unless user prefers Brief. Include local news for their region."
  },
  "delivery": {
    "mode": "announce",
    "channel": "telegram"
  },
  "sessionTarget": "isolated"
}
```

### Common Schedules

| Request | Cron Expression | Notes |
|---------|-----------------|-------|
| "Every morning at 8am" | `0 8 * * *` | Daily |
| "Weekday mornings at 7am" | `0 7 * * 1-5` | Mon-Fri |
| "Morning and evening" | `0 8,18 * * *` | Twice daily |
| "Every Monday morning" | `0 8 * * 1` | Weekly |
| "Every 6 hours" | `0 */6 * * *` | Frequent |

### Timezone Handling

Always ask user's timezone on first schedule setup:
- Store in memory.md
- Pass to cron job configuration
- If not specified, use system timezone

### Channel Delivery

Briefings can be delivered to:
- Telegram (default for most users)
- WhatsApp
- Discord
- Email (via skill integration)

Store preferred channel in memory.md.

### Managing Schedules

**List schedules:**
```
User: "What news schedules do I have?"
→ Read memory.md Schedule section
→ Optionally query OpenClaw cron status
```

**Modify schedule:**
```
User: "Change my morning briefing to 7:30am"
→ Update cron job
→ Update memory.md
→ Confirm change
```

**Cancel schedule:**
```
User: "Stop the morning briefings"
→ Remove cron job
→ Update memory.md
→ Confirm cancellation
```

### Avoiding Duplicates

Before creating scheduled briefing:
1. Check if schedule already exists for that time
2. Check last delivery timestamp in memory.md
3. Don't deliver if already sent within 30 minutes

### Format per Schedule

Different times can have different formats:
```
Memory entry example:
## Schedule
Morning 8am: Brief format (quick read with coffee)
Evening 6pm: Standard format (more time to read)
```

### Error Handling

If scheduled delivery fails:
1. Log failure in memory.md Notes
2. Retry on next heartbeat
3. After 3 failures, notify user to check configuration

### Weekend vs Weekday

Some users want different schedules:
```
User: "Light briefing on weekends"
→ Weekday: Standard format, 0 8 * * 1-5
→ Weekend: Brief format, 0 9 * * 0,6
```


path: setup.md
content: # Setup — Daily News Digest

Read this on first use when `~/daily-news-digest/` doesn't exist or is empty.

## Your Attitude

You're setting up a personalized news command center. The user should feel excited about getting perfectly curated news, delivered exactly how and when they want it.

## Priority Order

### 1. First: Understand Activation Preferences

Early in the conversation, ask:
- "Should I jump in whenever you ask about news or current events?"
- "Want automatic briefings at certain times, or only when you ask?"

Save their answer to `~/daily-news-digest/memory.md` in the Context section.

### 2. Then: News Preferences

Ask open questions about what matters to them:

**Topics:**
- "What topics do you most want to stay on top of? Tech, business, politics, local...?"
- "Anything you want to avoid? Sports, celebrity gossip, specific subjects?"

**Format:**
- "Do you prefer quick bullet points, or fuller summaries with context?"
- "Interested in voice briefings you can listen to?"

**Geography:**
- "Where are you based? I'll make sure to include local news."
- "Any other regions you follow closely?"

### 3. Finally: Schedule (if they want automation)

If they express interest in scheduled briefings:
- "When's your ideal time for a morning briefing? 7am? 8am?"
- "Want evening updates too, or just morning?"
- "Which channel should I deliver to?" (if they use multiple)

Create cron job only after they confirm.

## What You're Saving

After each response, update `~/daily-news-digest/memory.md`:

- Integration preference (proactive vs on-demand)
- Topic interests and exclusions
- Format preference (brief/standard/deep)
- Voice enabled or not
- Geography (location, other regions)
- Schedule and delivery channel (if any)

All preferences stay within the skill's folder.

## Feedback After Each Response

Don't just collect information. After they share something:
1. Acknowledge what they said
2. Show how it shapes their experience
3. Then continue

Example:
> User: "I'm mostly interested in tech and AI, but I'm sick of crypto news"
>
> Good: "Got it — tech and AI front and center, crypto filtered out. I'll pull from sources like Hacker News, The Verge, and MIT Tech Review. Skip the crypto noise completely. What about breaking news from other areas — politics, business — or keep it pure tech?"
>
> Bad: "Okay. What time do you want briefings?"

## When "Done"

Once you know:
1. When to activate (integration)
2. Topics they care about
3. Basic format preference

...you're ready to deliver news. Schedule, sources, and voice are optional enhancements they can add anytime.


path: sources.md
content: # Source Configuration — Daily News Digest

## Default Source Categories

### Tier 1: High Quality (Always Include)
| Source | Type | Topics | Notes |
|--------|------|--------|-------|
| Reuters | RSS | World, Business | Gold standard for accuracy |
| AP News | RSS | World, US | Wire service, fast |
| BBC | RSS | World, UK | Balanced international |
| NPR | RSS | US, Culture | Quality long-form |

### Tier 2: Tech & Business
| Source | Type | Topics | Notes |
|--------|------|--------|-------|
| Hacker News | Scrape | Tech, Startups | Community-curated |
| The Verge | RSS | Tech, Consumer | Good for product news |
| Ars Technica | RSS | Tech, Science | In-depth |
| TechCrunch | RSS | Startups, VC | Funding news |
| Bloomberg | RSS | Business, Finance | Paywalled sometimes |

### Tier 3: Specialized
| Source | Type | Topics | Notes |
|--------|------|--------|-------|
| The Guardian | RSS | World, Opinion | Left-leaning |
| WSJ | RSS | Business, Finance | Paywalled |
| NYT | RSS | General | Paywalled |
| Wired | RSS | Tech, Culture | Feature-heavy |

### Tier 4: Community Curated
| Source | Type | Topics | Notes |
|--------|------|--------|-------|
| Reddit r/worldnews | JSON API | World | Community-vetted |
| Reddit r/technology | JSON API | Tech | Discussion-heavy |
| Hacker News | Public API | Tech | Highly curated |

## Source Quality Scoring

Maintain in `~/daily-news-digest/sources.md`:

```markdown
## Source Quality Scores

| Source | Accuracy | Paywall | Freshness | Score |
|--------|----------|---------|-----------|-------|
| Reuters | 10 | 0 | 9 | 9.5 |
| BBC | 9 | 0 | 8 | 8.5 |
| TechCrunch | 8 | 2 | 9 | 8.0 |
| WSJ | 9 | 8 | 8 | 6.5 |
```

**Score formula:** (Accuracy * 0.4) + ((10 - Paywall) * 0.3) + (Freshness * 0.3)

Update scores based on:
- User feedback ("this source is always clickbait")
- Paywall encounters
- Article quality vs headline accuracy

## RSS Feed URLs

```
# Tier 1
Reuters World: https://feeds.reuters.com/reuters/topNews
AP News: https://rsshub.app/apnews/topics/apf-topnews
BBC World: http://feeds.bbci.co.uk/news/world/rss.xml
NPR News: https://feeds.npr.org/1001/rss.xml

# Tier 2 Tech
Hacker News Best: https://hnrss.org/best
The Verge: https://www.theverge.com/rss/index.xml
Ars Technica: https://feeds.arstechnica.com/arstechnica/index
TechCrunch: https://techcrunch.com/feed/

# Specialized
The Guardian: https://www.theguardian.com/world/rss
Wired: https://www.wired.com/feed/rss
```

## Adding Custom Sources

User can add sources via conversation:
- "Add Financial Times to my sources"
- "I want news from El País"
- "Remove Daily Mail from my feed"

Store custom sources in memory.md Sources section.

## Blocked Sources (Default)

These sources are low-quality by default:
- Daily Mail (accuracy issues)
- Buzzfeed News (defunct)
- Infowars (misinformation)

User can override blocks explicitly.

## Paywall Handling

When encountering paywall:
1. Note in source quality scores
2. Try to extract headline + first paragraph
3. If full article needed, suggest alternative source
4. Never claim to have content you can't access


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)