Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Daily-scheduled AI news tracker. Collects updates from 80+ AI entities across 6 sources every 24 hours (default 08:00 UTC+8). Generates scored, deduplicated Markdown reports. Supports unattended cron/scheduled execution with date-stamped idempotent output.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 540% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 633% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 429% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 607% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 2815% | 0% |
> Permissions overview: Collects public data from Reddit, Hacker News, GitHub, HuggingFace, arXiv, and X/Twitter. Requires optional API keys configured in .env or ~/.config/morning-ai/.env. Writes report files to the current working directory. See Configuration for details.
Track 80+ AI entities across 6 sources. Collect updates from the past 24 hours, score and deduplicate them, and generate a structured Markdown daily report. Covers 4 types: Product (feature launches, version releases), Model (new models, open-source weights), Benchmark (leaderboard changes, papers), Funding (rounds, acquisitions, milestones).
--intro — Product IntroductionIf the user passes --intro, display the following introduction and stop (do not proceed to data collection):
MorningAI — Daily AI news tracker that monitors 80+ entities across 6 sources.
What it does:
Sources (all free, no API keys required for basic usage): | Source | Method | API Key | |--------|--------|---------| | Reddit | Public JSON | Not needed | | Hacker News | Algolia API | Not needed | | GitHub | REST API | Optional (GITHUB_TOKEN for higher rate limits) | | HuggingFace | Public API | Not needed | | arXiv | Public API | Not needed | | X/Twitter | Web search | Not needed |
Quick start:
/morning-ai # Run with defaults (English, all types)
/morning-ai --lang zh # Chinese report
/morning-ai --depth deep # Comprehensive collection
/morning-ai --exclude Funding # Skip funding newsOptional features (require API keys):
IMAGE_GEN_PROVIDER + provider API keySOCIAL_ENABLED=trueMESSAGE_ENABLED=trueEMAIL_ENABLED=true + SMTP credentials (Gmail/QQ/Outlook/etc.)Config file: ~/.config/morning-ai/.env — run /morning-ai without config to trigger guided setup.
Version: 1.3.0 | GitHub | ClawHub
After displaying the introduction, stop. Do not proceed to Step 0 or data collection.
Run this command FIRST before doing anything else:
bashif [ -f "$HOME/.config/morning-ai/.env" ] || [ -f ".claude/morning-ai.env" ] || [ -f ".env" ]; then echo "CONFIG_STATUS=READY"; else echo "CONFIG_STATUS=MISSING"; fi
Branch on the output:
CONFIG_STATUS=READY — read the config file, report which sources are active, then proceed to Step 1.CONFIG_STATUS=MISSING — STOP. You MUST complete the First-Time Onboarding below before proceeding to Step 1.MISSING)> CRITICAL: STOP HERE. > You MUST complete all onboarding steps below interactively with the user. > Do NOT run Step 1 (data collection) until a config file exists and the gate check returns READY. > Running data collection without configuration will produce incomplete results.
Walk the user through setup interactively, waiting for their response at each step:
GITHUB_TOKEN for higher rate limits)| Key | Source | Get it at | |-----|--------|-----------| | GITHUB_TOKEN | GitHub releases & repos (higher rate limit) | https://github.com/settings/tokens |
| Key | Description | |-----|-------------| | IMAGE_GEN_PROVIDER | Provider: gemini \| minimax \| none (default: none) | | IMAGE_STYLE | Style: classic \| dark \| glassmorphism \| newspaper \| tech | | GEMINI_API_KEY | Google Gemini/Imagen (https://aistudio.google.com/apikey) | | MINIMAX_API_KEY | MiniMax global(https://www.minimax.io) | | MINIMAX_API_KEY | MiniMax cn (https://platform.minimaxi.com) |
SOCIAL_ENABLED=true~/.config/morning-ai/social_channels.json (see skills/gen-social/SKILL.md for schema). For quick single-channel setup, just set SOCIAL_PLATFORM, SOCIAL_STYLE, and SOCIAL_LANG env vars.MESSAGE_ENABLED=trueMESSAGE_MIN_SCORE (default 5), MESSAGE_MAX_ITEMS (default 10), MESSAGE_LINKS (bottom or inline), MESSAGE_CATEGORY_BALANCE (default true, distributes slots across content types)~/.config/morning-ai/.env in KEY=value format (one per line). Create the directory if needed: mkdir -p ~/.config/morning-aiCONFIG_STATUS=READY:bash if [ -f "$HOME/.config/morning-ai/.env" ] || [ -f ".claude/morning-ai.env" ] || [ -f ".env" ]; then echo "CONFIG_STATUS=READY"; else echo "CONFIG_STATUS=MISSING"; fi Only proceed to Step 1 if the output is READY.
bash mkdir -p ~/.config/morning-ai && echo "# morning-ai config — free sources only" > ~/.config/morning-ai/.env
| Parameter | Default | Example | |-----------|---------|---------| | --lang | en (English) | --lang zh (Chinese), --lang ja (Japanese) |
Rules:
--lang is explicitly specified, the report MUST be written entirely in English. All report text — titles, summaries, section headers, table labels, bullet points, "Why It Matters" analysis, and all other human-readable content — must be in English.--lang is specified, use that language for all human-readable content instead.--lang setting also applies to infographic prompt content (see Step 4).> Prerequisite: Step 0 must have returned CONFIG_STATUS=READY. If you have not completed Step 0, go back and run it now.
Run the Python collector to gather data from automated sources:
bashcd {SKILL_DIR} && python3 skills/tracking-list/scripts/collect.py --date {YYYY-MM-DD} --depth default -o {CWD}/data_{YYYY-MM-DD}.json
Parameters:
--date: Target date, default today (YYYY-MM-DD)--depth: Collection depth — quick (fast, fewer results), default, or deep (comprehensive)--skip: Sources to deliberately skip — e.g. --skip arxiv. Default: skip nothing. Deny-list on purpose: previous --sources allow-list let agents silently drop a collector by forgetting to list it (arxiv was missing from prod for 5 days that way). Naming the skipped source makes the omission visible.-o: Output JSON file pathWhat it does:
[Yesterday 08:00, Today 08:00) UTC+8Timeout: Allow up to 5 minutes for default depth, 10 minutes for deep.
If the user provides --exclude types (e.g. --exclude Funding), note which content type to filter out in Step 3 (this is a Step 3 filter on item types, not a collect.py flag).
After the automated collection completes, use web search to discover recent X/Twitter updates from tracked entities. The tracked X handles are listed in {SKILL_DIR}/lib/entities.py under X_HANDLES.
Search X/Twitter in three layers, in priority order:
Layer 1 — Official Accounts (highest priority): Search for recent posts from official company/product accounts. Handles are listed in entity files under {SKILL_DIR}/entities/.
Layer 2 — CEO / Core Personnel Accounts: Check key people's accounts for announcements, previews, and context that official accounts may not cover. Listed as "Key People" in each entity file.
Layer 3 — KOLs & Benchmark Institutions: Check AI opinion leaders and evaluation accounts for independent analysis, benchmark results, and trending discoveries. See {SKILL_DIR}/entities/kol.md and {SKILL_DIR}/entities/benchmarks-academic.md.
For each search depth:
| Depth | Layer 1 (Official) | Layer 2 (Personnel) | Layer 3 (KOLs) | |-------|-------------------|--------------------|-----------------| | quick | Top 5 entities by priority | Skip | Skip | | default | All major entities (~20) | Top CEO accounts (~10) | Top KOLs (~5) | | deep | All entities with X handles | All personnel accounts | All KOLs + benchmark accounts |
Use web search queries like:
site:x.com @{handle} since:{yesterday} — for specific account postssite:x.com "{entity name}" AI announcement — for broader discoverysite:x.com AI model release OR benchmark OR open-source {date} — for trending AI newsWhen a discovered post is a retweet (RT) or quote tweet:
[Yesterday 08:00, Today 08:00) UTC+8source_url, not the RT/quote URLsource_label (e.g., "@AnthropicAI on X (via @karpathy RT)")[Yesterday 08:00, Today 08:00) UTC+8| Priority | Source Type | Credibility | |----------|-----------|-------------| | 1 | Official blog / changelog | Highest | | 2 | Official X/Twitter account | High | | 3 | API changelog / docs | High | | 4 | Official GitHub release | High | | 5 | CEO / core personnel X account | Medium-High | | 6 | Benchmark institution X account | Medium | | 7 | KOL X account | Reference only — requires cross-verification |
Items sourced only from KOL accounts (Priority 7) should be scored conservatively and flagged for cross-verification with an official source.
For each verified X/Twitter update:
source: "x", source_url pointing to the original tweet, and source_label as "@{handle} on X"cross_ref rather than creating a duplicate — this strengthens the verification scoreis_kol_voice: true on the item. Do NOT dedup-merge into official-source items even if discussing the same topic — the KOL's take is the value, not the underlying news. Score conservatively (4-7 typically) but keep as a standalone item.cross_ref to the official item (existing behavior). Do NOT set is_kol_voice.After data collection completes, read the tracking specification to understand scoring criteria, record format, and timeliness rules:
Read {SKILL_DIR}/skills/tracking-list/SKILL.mdThis specification defines:
Internalize the specification before writing the report. Pay special attention to the scoring reference tables and type classification guide.
Read {SKILL_DIR}/templates/report.mdreport_{YYYY-MM-DD}.md in the working directoryReport generation rules:
--lang is explicitly specified. If source data is in a different language, translate it. Entity names (proper nouns) stay as-is.[Source Name](URL) pointing to the original content. This applies to all sections: TLDR, detailed entries, and compact table rows.skills/tracking-list/SKILL.md → "Factual Detail Verification" for the full protocol. Never write a number from memory or inference — omit unverifiable details.--exclude was specified)[[Source](URL)] at the end.is_kol_voice: true (set during Step 1 KOL voice detection), select the top 3-5 by score, capped to max 1 item per KOL handle (no double-dipping). For each item write:--lang) explaining why this view matters or what's the unique angle[[Original]({source_url})]If fewer than 3 items qualify, list what's available + append _(Today's KOL channels were quiet — only N items qualified.)_. If 0 qualify, write _Today's KOL channels were quiet._
This step is optional. Skip if no image generation capability is available or configured.
Read {SKILL_DIR}/skills/gen-infographic/SKILL.md
skills/gen-infographic/SKILL.md):IMAGE_GEN_TYPES=auto): only types with 7+ score items. Exception: the KOL section image is generated whenever ≥1 item has is_kol_voice: true (regardless of score), since KOL voices are scored conservatively (4-7) by design — applying the 7+ gate would suppress the section image even when the report has a populated KOL Voices block.news_infographic_{YYYY-MM-DD}_kol.png. Insert at the top of the report's ## KOL Voices section (the template already has a stub: ).IMAGE_GEN_TYPES=all for all types, none for cover onlyOption A — Native tool (Claude Code or other tools with built-in image generation): Use your tool's built-in image generation capability, one call per image. Then stitch sections together.
Option B — Python script batch mode (any environment, requires IMAGE_GEN_PROVIDER configured): Build a manifest JSON with all prompts and outputs, then run: bash cd {SKILL_DIR} && python3 skills/gen-infographic/scripts/gen_infographic.py --batch {CWD}/manifest.json --stitch Supported providers: gemini, minimax. See Configuration for API keys. Requires pip install Pillow.
The final output is news_infographic_YYYY-MM-DD_combined.png — a single long image containing cover + all section images.
Skip this step if SOCIAL_ENABLED is not true or no social channels are configured.
Generate platform-optimized copy and images for social media distribution (X, Xiaohongshu, etc.).
Read {SKILL_DIR}/skills/gen-social/SKILL.md
SOCIAL_CHANNELS_FILE exists → read the JSON channel listSOCIAL_PLATFORM env var is set → build a single channel from SOCIAL_PLATFORM + SOCIAL_STYLE + SOCIAL_LANGa. Read the channel's template: {SKILL_DIR}/skills/gen-social/templates/{platform}/{style}.md b. Select top items from the report data (filter by min_score, limit by items, translate if lang differs from source) c. Generate copy following the template's format rules, tone, and character limits d. Validate character counts — each tweet ≤ 280 chars, Xiaohongshu title ≤ 20 chars, body ≤ 1000 chars e. Write copy to {CWD}/social/social_{YYYY-MM-DD}_{channel_id}.md f. If channel has image: true — generate platform-adapted images using the same providers as Step 4
g. Write images to {CWD}/social/social_{YYYY-MM-DD}_{channel_id}_{N}.png
{CWD}/social/social_{YYYY-MM-DD}_manifest.json listing all generated filesChannel config examples: See skills/gen-social/SKILL.md for the full JSON schema and quick-setup env vars.
Skip this step if MESSAGE_ENABLED is not true.
Generate a concise, share-friendly message digest suitable for messaging platforms (WeChat, Telegram, Slack, etc.). The digest provides bold titles with one-line summaries and reference links — optimized for copy-paste sharing.
Read {SKILL_DIR}/skills/gen-message/SKILL.md
Read {SKILL_DIR}/skills/gen-message/templates/digest.md
data_{YYYY-MM-DD}.json):MESSAGE_MIN_SCORE (default: 5)MESSAGE_CATEGORY_BALANCE=true (default): per-type slot caps (product max 4, model max 3, benchmark max 2, financing max 2), fill remaining with top-scoring itemsMESSAGE_MAX_ITEMS (default: 10)MESSAGE_LANG for language (default: from --lang){CWD}/message_{YYYY-MM-DD}.md🔗 URL) after each item by default (or grouped at bottom if MESSAGE_LINKS=bottom)IMAGE_GEN_PROVIDER is configured):{CWD}/message_{YYYY-MM-DD}.png using the same image generation method as Step 4 (native tool or Python script)Output files:
message_{YYYY-MM-DD}.md — copy-paste text for messagingmessage_{YYYY-MM-DD}.png — accompanying image (only if image generation is configured)Skip this step if EMAIL_ENABLED is not true.
Deliver the daily digest as multipart HTML email via SMTP to a configured recipient list. This is the only step that performs network egress to subscribers — gen-message / gen-social only generate local files.
Read {SKILL_DIR}/skills/gen-email/SKILL.md
bash python3 {SKILL_DIR}/skills/gen-email/scripts/send_email.py --date {YYYY-MM-DD} The script:
data_{YYYY-MM-DD}.json and applies the same selection rules as gen-message (filter by EMAIL_MIN_SCORE, category balance, sort by importance, cap at EMAIL_MAX_ITEMS)EMAIL_RECIPIENTS (env, comma-separated) or EMAIL_RECIPIENTS_FILE (default .claude/recipients.json)email_{YYYY-MM-DD}.html and email_{YYYY-MM-DD}.txtEMAIL_DRY_RUN=true: stops after writing previews (no SMTP traffic)message_{YYYY-MM-DD}.png when present, sleeps EMAIL_RATE_LIMIT_DELAY seconds between sendsemail_{YYYY-MM-DD}_manifest.json with per-recipient status (sent / failed) and error textEMAIL_SMTP_HOST, EMAIL_SMTP_USER, EMAIL_SMTP_PASSWORDEMAIL_RECIPIENTS or EMAIL_RECIPIENTS_FILEOutput files:
email_{YYYY-MM-DD}.html / email_{YYYY-MM-DD}.txt — local previews of what was sentemail_{YYYY-MM-DD}_manifest.json — send status per recipient (for retry / monitoring)See skills/gen-email/SKILL.md for full configuration and docs/email-setup.md for SMTP provider quick-start (Gmail / QQ / Outlook / Alibaba Cloud Enterprise Mail).
The entities/ directory contains detailed entity registries organized by tracking group:
| File | Scope | Entities | |------|-------|----------| | entities/ai-labs.md | Frontier AI Labs + China AI | OpenAI, Anthropic, Google, Meta AI, xAI, Microsoft, Qwen, DeepSeek, + 11 more | | entities/model-infra.md | Model Infrastructure | NVIDIA, Mistral, Cohere, Perplexity, AWS, Together, Groq, Apple | | entities/coding-agent.md | Coding Agent | Cursor, Cline, OpenCode, Droid, OpenClaw, Windsurf, + 5 more | | entities/ai-apps.md | AI Applications | v0, bolt.new, Lovable, Replit, Lovart, Manus, + 2 more | | entities/vision-media.md | Vision & Media | Midjourney, Runway, Pika, FLUX, ElevenLabs, + 7 more | | entities/benchmarks-academic.md | Benchmarks & Academic | LMSYS, HuggingFace, arXiv channels, industry media | | entities/kol.md | Key Opinion Leaders | Andrej Karpathy, AK, Andrew Ng, Swyx, Simon Willison, + 3 more | | entities/trending-discovery.md | Trending Discovery | GitHub Trending, Product Hunt, Hacker News, Reddit |
Each file lists X/Twitter accounts, key people, official blogs, changelogs, GitHub repos, and other source URLs for every tracked entity. Read these files when you need to verify or supplement the automated collection.
Users can add their own tracked entities by placing markdown files in entities/custom/ (or ~/.config/morning-ai/entities/, or a path set via CUSTOM_ENTITIES_DIR). Custom entity files use a simplified format — see entities/custom-example.md for the template. Custom entities are automatically merged into the built-in registries at runtime and collected alongside the default 80+ entities.
Morning-AI is designed for daily automated execution. Each run produces date-stamped files (report_YYYY-MM-DD.md, data_YYYY-MM-DD.json), making it safe to run on a recurring schedule.
Use --schedule to set a custom cron expression (default: 0 8 * * *):
| Parameter | Format | Default | Example | |-----------|--------|---------|---------| | --schedule | Cron expression (5-field) | 0 8 * * * (daily 8am) | 0 9 * * 1-5 (weekdays 9am) |
The schedule is passed to the agent's native scheduler (CronCreate, /loop, system cron, etc.). Morning-AI itself does not run a scheduler — it relies on the host agent or system to trigger runs.
Claude Code (CronCreate / loop):
/loop 24h /morning-aiWith custom schedule:
/morning-ai --schedule "0 9 * * 1-5"System cron (manual setup):
bash0 8 * * * cd /path/to/workspace && claude -p "/morning-ai"
OpenClaw / always-on bot:
yamlschedule: "0 8 * * *" skill: morning-ai
.env in skill directory~/.config/morning-ai/.envbash# ~/.config/morning-ai/.env GITHUB_TOKEN=ghp_xxx
| Source | API | Rate Limit | |--------|-----|-----------| | Reddit | Public JSON | Generous | | Hacker News | Algolia API | Generous | | GitHub | Public API (optional token for higher limits) | 60 req/hr (unauthenticated) | | HuggingFace | Public API | Generous | | arXiv | Public API | Generous | | X/Twitter | Web search | Generous |
See skills/gen-message/SKILL.md for message digest configuration variables (MESSAGE_ENABLED, MESSAGE_MIN_SCORE, MESSAGE_MAX_ITEMS, MESSAGE_CATEGORY_BALANCE, etc.).
See skills/gen-email/SKILL.md for the full list of email variables (EMAIL_ENABLED, EMAIL_RECIPIENTS, EMAIL_SMTP_HOST/PORT/USER/PASSWORD/TLS, EMAIL_FROM, EMAIL_LANG, EMAIL_MIN_SCORE, EMAIL_DRY_RUN, etc.) and docs/email-setup.md for SMTP provider walkthroughs.
.env files. Never transmitted except to their respective APIs.report_*.md, data_*.json), message digest files (message_*.md, message_*.png), and cache files to the skill/working directory.Other measured skills in the registry, with their headline benchmark lift.