ai-newsletter
by @j3ffyang
Generate a daily AI news newsletter from fresh web sources. Use when the user asks for a current AI digest, AI news roundup, curated newsletter, or daily AI...
clawhub install ai-newsletterπ About This Skill
name: ai-newsletter-daily description: > Generate a daily AI news newsletter from fresh web sources. Use when the user asks for a current AI digest, AI news roundup, curated newsletter, or daily AI briefing. version: 1.3.0 author: Jeff Yang (https://github.com/j3ffyang) user-invocable: true category: content license: MIT metadata: openclaw: skillKey: ai-newsletter-daily emoji: "ποΈ" required-tools: - web_search - web_fetch requires: env: - BRAVE_API_KEY - FIRECRAWL_API_KEY commands: - name: ai-newsletter description: Generate a daily AI news digest in Markdown and JSON. arg-mode: raw
AI Newsletter Daily
Generate a concise daily AI newsletter from fresh web sources.
Use this skill only for current AI/ML news, releases, research, funding, product launches, model updates, regulation, benchmarks, or practitioner-relevant developments.
Do not use for evergreen explainers, non-AI topics, or long-form research that is not intended to become a curated newsletter.
Inputs
Defaults:
target_news_count = 20search_query = "latest AI news today"search_time_window_days = 2max_search_results = 60min_articles_required = 10include_domains = []exclude_domains = ["youtube.com", "reddit.com", "facebook.com", "x.com", "twitter.com"]summary_model = "host-default"max_scrape_retries = 2Bounds:
target_news_count: 1..50search_time_window_days: 1..14max_search_results: 20..120min_articles_required: 1..50max_scrape_retries: 0..5If min_articles_required > target_news_count, set it to target_news_count.
Batch policy
max_search_results candidates.target_news_count * 2 candidates for fetch attempts.target_news_count verified items.Required outputs
Return:
1. newsletter_items as a list of objects.
2. markdown_newsletter as a string.
3. json_newsletter as an object.
Each item must include:
titleurldomainpublished_atsummaryrelevance_scoresource_queryUse "unknown" for missing published_at.
Workflow
1. Resolve inputs.
- Apply defaults and bounds.
- Initialize warnings = [], seen_canonical_urls = set(), processed_urls = set().
2. Search.
- Run web_search with search_query.
- If no usable results, retry once with:
- "{search_query} generative AI LLM model open source enterprise"
- If still no usable results, fail clearly.
3. Normalize and filter.
- Keep only results with non-empty title and URL.
- Canonicalize URLs: lowercase host, remove tracking parameters, normalize safe trailing slashes.
- Drop duplicates by canonical URL.
- Apply include_domains and exclude_domains.
- Prefer results likely within search_time_window_days.
- Keep unknown dates, but score them lower.
4. Rank.
- Score each candidate from 0 to 100:
- AI-topic relevance: 0..50
- Freshness: 0..30
- Title/snippet clarity: 0..20
- Sort by:
- relevance_score desc
- published_at desc, unknown last
- url asc
- Keep the top target_news_count * 2 candidates.
5. Verify and summarize.
- Process candidates in ranked order until target_news_count verified items are collected.
- Skip candidates whose canonical URL is already in processed_urls.
- Attempt web_fetch up to max_scrape_retries + 1 times.
- If fetch fails, add a warning with the URL and reason, then continue.
- Cross-check search result vs fetched page using:
- title similarity,
- domain consistency,
- topic alignment,
- published date when available.
- If the page appears materially inconsistent, skip it and warn.
- Summarize in one plain-text paragraph, max about 80 words.
- Focus on why it matters to AI practitioners.
- If summary generation fails, warn and continue.
- Append the enriched item.
6. Minimum quality gate.
- If collected items are fewer than min_articles_required, run one fallback search with:
- "AI news today machine learning model release funding research"
- Process only new candidates not already seen or processed.
- Repeat filtering, ranking, verification, and summarization.
7. Final integrity check.
- Ensure every final item has non-empty title, url, domain, summary, source_query, and numeric relevance_score.
- Ensure each URL appears once.
- Ensure markdown_newsletter and json_newsletter match in item count.
- Remove and warn on any invalid item.
8. Finalize.
- Sort by relevance_score desc, then published_at desc.
- Truncate to target_news_count.
- Render markdown_newsletter.
- Assemble json_newsletter.
- Return all outputs.
Verification rules
Accept an item only if it passes these checks:
Markdown format
markdown_newsletter must use:
Example:
AI Newsletter Daily β 2026-04-28
1. Article title
Summary paragraph.Source: link
Warnings
Only include this section when needed.
Failure policy
Hard fail only when:
Soft fail and continue when:
published_at is missing.Partial success is acceptable when the result count is between min_articles_required and target_news_count.
Always include actionable warnings with URL, short reason, and whether fallback search was used.
Safety rules
Return shape
json_newsletter must contain:
datequerycountarticleswarnings