| name | gen-message |
| version | 1.3.0 |
| description | Generate concise message digest with image for sharing on messaging platforms (WeChat, Telegram, Slack, etc.) |
Objective
Transform the daily AI news report data into a concise, copy-paste-friendly message digest optimized for sharing on messaging platforms. Produces two output files:
- Text digest (
message_{DATE}.md) โ bold titles, one-line summaries, source links
- Digest image (
message_{DATE}.png) โ 9:16 portrait infographic with compact card layout
The message digest shares the same data pipeline as the full report โ all items go through the standard collect โ score โ deduplicate โ cross-source link โ verification pipeline. The only difference is the final output format: the full report produces a detailed multi-section Markdown document, while the message digest condenses the same verified data into a compact, share-friendly format.
Factual integrity applies to all items: Every item in the digest โ regardless of score โ must have a traceable, authoritative source (source_url). Items with score 7+ additionally require cross-source verification (verified == true, 2+ independent sources). Never include an item whose factual claims cannot be linked to a concrete primary source.
Output Specs
Text File: message_{DATE}.md
| Property | Value |
|---|
| Format | Markdown (renders as plain text in most messaging apps) |
| Encoding | UTF-8 |
| Sections | Header โ Items (with source links) โ Footer |
Image File: message_{DATE}.png
| Property | Value |
|---|
| Format | PNG |
| Aspect Ratio | 9:16 portrait (optimized for mobile chat) |
| Layout | Single-column vertical card stack |
| Content | Same items as text digest, compact visual format |
Configuration
| Variable | Type | Default | Description |
|---|
MESSAGE_ENABLED | bool | false | Master switch for message digest generation |
MESSAGE_MIN_SCORE | float | 5 | Minimum importance score to include an item |
MESSAGE_MAX_ITEMS | int | 10 | Maximum number of items in the digest |
MESSAGE_LANG | string | (from --lang) | Language override for the digest |
MESSAGE_IMAGE_STYLE | string | (from IMAGE_STYLE) | Visual style override for the digest image |
MESSAGE_LINKS | string | inline | Link placement: inline (after each item) or bottom (reference list at end) |
MESSAGE_CATEGORY_BALANCE | bool | true | Distribute slots across content types to prevent single-type domination |
Content Selection Rules
- Read data: Load
data_{DATE}.json from the working directory (this data has already been scored, deduplicated, and cross-source verified by the collection pipeline)
- Filter by score: Only items with
importance >= MESSAGE_MIN_SCORE
- Verify & ensure source link: Every item included in the digest MUST have a valid
source_url. This is a hard requirement โ no item may appear in the digest without an accompanying source link.
- If an item has a
source_url in the data โ use it directly
- If an item has no
source_url but has verify_sources or cross_refs โ use the best available URL from those fields
- If an item has no URL at all โ search for an authoritative source URL (official blog, GitHub repo, announcement post, HuggingFace page) before including it. Construct the URL from known patterns when possible (e.g.,
https://huggingface.co/{model_id} for HF models, https://github.com/{owner}/{repo} for GitHub projects)
- If no credible URL can be found after the above steps โ drop the item entirely โ do NOT include it without a link
- For items with score 7+, additionally confirm
verified == true (2+ independent sources)
- Zero-link items are a critical formatting error โ every item in the final output must end with a source link line
- Balance by category (when
MESSAGE_CATEGORY_BALANCE is true, default):
a. Group qualifying items by content_type
b. Apply per-type slot caps: product max 4, model max 3, benchmark max 2, financing max 2
c. From each type, select the highest-scoring items up to the type's cap
d. If a type has fewer qualifying items than its cap, its unused slots become available as overflow
e. Fill remaining slots (up to MESSAGE_MAX_ITEMS total) with the next highest-scoring items from any type, regardless of whether that type has already hit its cap
f. If MESSAGE_CATEGORY_BALANCE is false, skip this step and use pure top-N by score
- Sort: Final selected items by importance score descending (highest first)
- Limit: Ensure total does not exceed
MESSAGE_MAX_ITEMS
- Translate: If data language differs from
MESSAGE_LANG, translate summaries. Entity names (proper nouns) stay unchanged.
Text Generation Rules
Language-Specific Headers
| Language | Header Text | Item Count Format |
|---|
zh | MorningAI {DATE} | ๅ
ฑ {N} ๆก้่ฆๆดๆฐ |
en | MorningAI {DATE} | {N} notable updates today |
ja | MorningAI {DATE} | ๆฌๆฅใฎๆณจ็ฎ {N} ไปถ |
Emoji Markers by Score
| Score Range | Emoji | Meaning |
|---|
| 9-10 | ๐ฅ | Major / breakthrough |
| 7-8 | โญ | Important |
| 5-6 | ๐ท | Notable |
Item Format
Each item follows this structure:
{emoji} **{Entity} {Event description}**
{One to two sentence summary: what it IS/DOES + why it matters.}
๐ {source_url}
Rules:
- Title is bold, includes entity name + concise event description
- Summary is 1-2 sentences max โ must answer TWO questions:
- What is it / what does it do? โ the core capability, function, or purpose (e.g., "Code generation model specialized for multi-file edits", "Open-source text-to-video model supporting 10-second 1080p clips")
- Why is it interesting / what's notable? โ the differentiator, breakthrough, or key advancement (e.g., "first open-weight model to beat GPT-4o on SWE-bench", "runs locally on consumer GPUs with 8GB VRAM")
- Prioritize technical substance over popularity metrics: benchmark scores, parameter counts, context window, architecture innovations, licensing, pricing, speed improvements
- Do NOT lead with vanity metrics like download counts, likes, stars, or follower counts โ these say nothing about what the thing does. Only mention them if the surge itself IS the news (e.g., "hit 100K stars in 48 hours")
- No score numbers displayed โ the emoji conveys importance level
- Each item MUST end with a
๐ {source_url} line โ this is non-negotiable. An item without a source link is a formatting error. If the data lacks a source_url, construct one from known URL patterns (HuggingFace model page, GitHub repo, official blog) or search for an authoritative link. If no URL can be found, drop the item rather than publishing it without a link.
- Items separated by a blank line
Special Formatting
For GitHub Trending items or items with notable engagement metrics:
๐ฅ **GitHub Trending: {repo-name}**
{What it does + why it's trending.} โญ {star_count}(+{delta})
๐ {source_url}
Note: even for trending items, lead with what the project does, then append the star count as supporting context โ not the other way around.
Link Placement
MESSAGE_LINKS=inline (default):
Each item ends with a source link line:
๐ฅ **Anthropic Releases Claude 4.5 Sonnet**
New mid-tier model with +18% SWE-Bench, 200K context, 40% faster output.
๐ https://anthropic.com/news/claude-4-5-sonnet
MESSAGE_LINKS=bottom (alternative โ groups links at the end):
Links grouped as a numbered reference list at the bottom, items do NOT include inline links:
---
[1] {Entity Event} - {URL}
[2] {Entity Event} - {URL}
Footer
---
Powered by MorningAI | Full report: report_{DATE}.md
Image Generation
When to Generate
Generate message_{DATE}.png only if image generation is available (i.e., IMAGE_GEN_PROVIDER is configured and not none). If unavailable, skip image generation and produce text only.
Image Specifications
| Property | Value |
|---|
| Aspect Ratio | 9:16 portrait |
| Layout | Single-column vertical card stack |
| Cards | One card per item, compact format |
| Card Content | Emoji marker + bold title + one-line summary |
| Style | From MESSAGE_IMAGE_STYLE or IMAGE_STYLE config |
Image Prompt Template
9:16 portrait infographic, {HEADER_TEXT} {YYYY-MM-DD}, ALL text content in {LANG}.
Purpose: Compact message digest for mobile sharing on messaging apps.
Total news items: {N}
News cards (display EXACTLY {N} cards, compact vertical layout):
Card 1: {emoji} {Entity name} {Event description}
- {One-line summary with key metrics}
Card 2: {emoji} {Entity name} {Event description}
- {One-line summary with key metrics}
(... list all {N} items ...)
CRITICAL RULES:
- ALL text on this image MUST be in {LANG}
- Entity names are proper nouns (OpenAI, DeepSeek, Cursor) โ keep as-is, do NOT translate
- Each card has: emoji marker + bold title + one-line summary (NOT multi-line bullets)
- Use ๐ฅ for top items, โญ for important items, ๐ท for regular items
- Compact single-column vertical stack โ one card below another
- Title font: 18pt bold, summary font: 13pt regular
- Cards separated by thin divider or subtle spacing (12px)
- Card width fills 90% of image width
- Do NOT display score numbers, badges, or importance markers
- Do NOT invent items not listed
- Maximize content area โ minimize decorative elements
- Header: "{HEADER_TEXT} {YYYY-MM-DD}" at top
- Footer: small gray text "Powered by MorningAI" at bottom
- Optimized for screenshot sharing in messaging apps
{STYLE_BLOCK}
Message digest layout adaptation:
- Single-column vertical stack (NOT grid layout)
- Each card: title line + summary line only (compact, no multi-line bullets)
- Tight vertical spacing between cards
- Clean, uncluttered, high information density
- Mobile-optimized: large enough text to read on phone screens
Variable substitution:
{HEADER_TEXT}: See Language-Specific Headers table above
{LANG}: "Chinese" for zh, "English" for en, "Japanese" for ja
{STYLE_BLOCK}: Injected from existing style presets (see skills/gen-infographic/scripts/styles.py)
Image Generation Method
Use the same methods as Step 4 (gen-infographic):
Option A โ Native tool (if supported):
Generate using built-in image generation capability with the prompt above.
Option B โ Python script:
cd {SKILL_DIR} && python3 skills/gen-infographic/scripts/gen_infographic.py --prompt "{prompt}" -o {CWD}/message_{YYYY-MM-DD}.png
Workflow Summary
- Check
MESSAGE_ENABLED=true โ skip if not enabled
- Read
data_{DATE}.json from the working directory
- Read this specification and the digest template (
templates/digest.md)
- Select items: filter by score >=
MESSAGE_MIN_SCORE, apply category balance (if enabled), sort desc, limit to MESSAGE_MAX_ITEMS
- Generate text digest โ write to
{CWD}/message_{DATE}.md
- If image generation available โ build prompt from template, generate โ
{CWD}/message_{DATE}.png
Example Output
MorningAI 2026-04-14
8 notable updates today
๐ฅ **Anthropic Releases Claude 4.5 Sonnet**
New mid-tier model with +18% SWE-Bench, 200K context, 40% faster output. Available via API and claude.ai.
๐ https://x.com/AnthropicAI/status/example
โญ **Google Gemini 2.5 Flash Enters Public Preview**
Flash-tier model with native multimodal reasoning, 1M context. Free tier on AI Studio.
๐ https://x.com/GoogleDeepMind/status/example
โญ **Cursor Background Agents Now Generally Available**
Autonomous background agents for multi-file refactoring, test generation, and PR creation. Max 10 concurrent on Pro.
๐ https://cursor.com/changelog/background-agents-ga
โญ **DeepSeek Open-Sources V3-0407 Model**
Updated V3 with 671B MoE architecture, MIT license. Weights available on HuggingFace.
๐ https://github.com/deepseek-ai/DeepSeek-V3
โญ **OpenAI Open-Sources Codex CLI**
Terminal-based coding agent with suggest, auto-edit, and full-auto modes. MIT license.
๐ https://github.com/openai/codex
โญ **LMSYS Chatbot Arena April Rankings Update**
Claude 4.5 Sonnet enters #2 overall (ELO 1287). Gemini 2.5 Pro holds #1 in coding.
๐ https://lmarena.ai
โญ **GitHub Copilot Coding Agent Public Preview**
Autonomous agent handles issues and creates PRs in secure cloud sandbox. Free for Pro+ and Enterprise.
๐ https://github.blog/changelog/copilot-coding-agent
โญ **Windsurf Raises $200M Series C at $3B Valuation**
Largest round in AI coding tools space. Plans to hire 200 engineers and expand enterprise features.
๐ https://techcrunch.com/2026/04/07/windsurf-raises-200m
---
Powered by MorningAI | Full report: report_2026-04-14.md
Notes
- The text digest reads from
data_{DATE}.json directly โ it does NOT depend on the report being generated first
- All summaries must be condensed to 1-2 sentences โ prioritize explaining what the thing IS and why it matters, not popularity metrics (downloads, likes, stars)
- Entity names are always preserved as proper nouns regardless of language setting
- The image is optional โ if no image generation provider is configured, only the text file is produced
- When
MESSAGE_LINKS=bottom, the reference numbers are implicit (ordered by item appearance) โ do NOT add [1] markers in the item body, and do NOT include ๐ lines after each item