moonlight-lupin/agent-skills/news-monitoring
Claude Code and agent skill by moonlight-lupin/agent-skills
- community
Checking that the SKILL.md file is still in the repository.
Use when a topic or news stream needs recurring monitoring — cover it with web search, multi-language sources, digest formatting, and automated delivery via Hermes cron jobs. Covers search strategy, source selection, Chinese-language platforms, and digest templates.
Install
npx vskill@latest install moonlight-lupin/agent-skills/news-monitoringSKILL.md
News Monitoring & Digest Delivery
Set up recurring topic/news monitoring that searches the web for recent articles, compiles a headline digest, and delivers it to a messaging channel or document pipeline.
Workflow
Step 1 — Define Topic
Work with the user to define:
- Subject: what to monitor (e.g. PBSA in Hong Kong, AI regulation, self-hosting tools)
- Geography: which region(s) matter (e.g. Hong Kong, Singapore, global)
- Angles: which aspects to track — investment/deals, policy/regulation, supply/pipeline, occupancy/rental, general commentary
- Velocity: how fast-moving the field is — determines acceptable article age (see Step 5)
Step 2 — Create Search Keywords
Build search queries from the topic definition:
- Multi-angle: one query per angle (investment, policy, supply, etc.)
- Multi-language: English keywords + native language keywords for each geography
- Time-bounded: specify recency in the query where possible (e.g. "2026", "latest")
- Keep queries concise — 3-7 terms works best. Overly long queries return thin results.
Step 3 — Select Sources
Identify which sources matter for the topic and geography:
- English-language: international outlets, local English press, industry publications
- Native-language: local press in the geography's primary language(s) — these often break news first
- Industry-specific: trade publications, research houses, REIT/sector-specific sites
- Closed-ecosystem platforms (小红书, 抖音, 微信公众号): content is NOT web-indexed. Be upfront about this limitation — options are manual monitoring or third-party analytics tools.
Record the source list in the topic's reference file (see Reference Files section).
Step 4 — Run Searches
Date grounding (mandatory). Before running any search, ground the model in the real current date. LLMs default to training-cutoff years in queries — this produces stale results. Inject:
Today's date is {current date as "DD Month YYYY"}. When a search query needs a year or refers to "latest"/"current"/"this year", use {current year} or relative wording — never a year inferred from training data.
Primary method: use the harness `web_search` tool.
The tool uses whatever backend is configured in config.yaml (e.g. SearXNG → DDGS fallback). The skill is backend-agnostic — it does not prescribe which search engine to use. Run one web_search call per query from Step 2.
Advanced option: SearXNG direct curl for news-specific filters.
When you need news-category filtering, language selection, or time bounding that web_search doesn't expose:
Key SearXNG parameters:
format=json— mandatory (omitting returns 403)categories=news— news-only resultslanguage=zh-Hant/language=entime_range=day|week|month|year- Results include direct source URLs (no proxy resolution needed)
RSS feeds for curated must-track sources that search engines may not surface quickly:
Parse <item> blocks for <title>, <pubDate>, <link>, <description>.
Step 5 — Process Results
Go through all search results and:
- Quality filter — before any ranking, discard low-quality results:
- Thin content: page is a landing page, aggregator stub, or has no substantive text (<100 words of actual article content)
- Irrelevant: result doesn't match any defined topic angle despite keyword overlap (e.g. "port" matching "transport" when the topic is about a seaport)
- Duplicate URLs: same article appearing in multiple search results (keep the first occurrence)
- Non-article: video-only pages, image boards, login walls with no preview
- Use word-boundary matching for topic terms to avoid false-relevance from substring matches (e.g. "us" matching "business")
- Deduplicate — same article appearing across multiple queries or engines appears once (match by title similarity, not just exact URL)
- Sort by the user's priority order:
- Recency: most recent first (default)
- Relevance: how directly it matches the topic angles
- Source priority: Tier 1 sources rank higher (see topic reference files)
- Rank — assign each article a priority/impact score based on recency × relevance × source tier
- Flag stale content — highlight to the user when results are dated relative to the field's velocity:
- Fast-moving fields (AI, crypto, tech regulation): articles >2-3 months old may be stale — flag them or exclude
- Slow-moving fields (real estate, infrastructure, policy): articles up to 6 months old may still be relevant
- Use the velocity defined in Step 1 to calibrate
- Filter — remove articles outside the topic scope, outside the geography, or behind the recency threshold
Step 6 — Compare With Previous Digests
If this is a recurring digest (cron job), check for overlap:
- Use
context_fromon the cron job to inject the previous digest output as context (see Cron Setup section) - Compare new results against the previous digest — match by title similarity, not exact string match
- Remove articles that already appeared in the previous run
- For niche/low-activity topics where overlap is high, consider broadening scope or reducing frequency
Step 7 — Compile Digest
Format the ranked, deduplicated results into a readable digest:
Formatting rules:
- Always include the publish date on every item
- Headline + 1-2 line summary (not a paragraph analysis)
- Sort by priority/impact (highest first)
- Source links as 🔗 + direct URL to the publisher's site — never Google News proxy URLs or Bing apiclick URLs
- Use 🆕 for articles from the last 7 days
- Max items: 5 by default (configurable per topic). Reduce frequency rather than padding with stale content.
- Key themes summary at the bottom — one-line takeaways of dominant trends
URL rules:
- Every link MUST resolve directly to the article on the publisher's website
- Google News RSS links (
news.google.com/rss/articles/CBMi...) are protobuf-encoded proxy URLs — unresolvable by any method. If using Google News RSS for discovery only, resolve the actual source URL via SearXNG title-search orweb_searchbefore including. - Bing News RSS links are
apiclick.aspxredirects — extract the real URL from theurl=parameter. - If resolution fails: include the article with
⚠️ Direct link unavailable — search [SOURCE] for: [title]
Step 8 — Delivery
Deliver the digest to the user via one of:
- Chat channel (Telegram, WhatsApp) — most common. Use
deliverparameter on cron jobs (e.g.deliver=telegram,deliver=whatsapp:<HANDLE>). WhatsApp requires an explicit target — baredeliver=whatsappfails. - Document generation — pass the compiled digest to a document generation skill to produce a formatted PDF, slide deck, or article. The skill should output the digest content in a structured format (markdown) that the downstream skill can consume.
For one-off digests: deliver directly in the current chat. For recurring digests: set up a cron job (see below).
Step 9 — Cron Setup (Reference)
For recurring digests, create a scheduled job using the cronjob tool. This is optional — one-off digests don't need it.
Key parameters:
schedule: cron expression (e.g.0 9 1,15 * *for biweekly at 9am,0 3 */3 * *for every 3 days)prompt: self-contained instructions including topic, search queries, source lists, digest format, output language, and output disciplinedeliver: target channel (telegram,whatsapp:<HANDLE>, etc.)context_from: list of job IDs whose previous output should be injected as context (for dedup — typically the job's own ID for self-referencing)enabled_toolsets: restrict to["web", "terminal"]to reduce token overhead
Cron prompt template:
Dedup via context_from: Set context_from: ["<job_id>"] on the cron job (using the job's own ID) so each run receives the previous digest. Add to the prompt: "Review the previous digest output (provided as context). Do NOT include any article that already appeared — match by title similarity, not exact string match."
Frequency tuning:
- High-volume topics: daily or every 2-3 days
- Medium topics: weekly
- Niche/low-activity topics: biweekly (1st and 15th) — allows more content to accumulate, reduces overlap
Source Selection Reference
Hong Kong Sources
English: SCMP, The Standard HK, Hong Kong Business, Mingtiandi, Colliers/JLL/CBRE/Savills research, ResearchAndMarkets
Chinese (Traditional): HK01, 香港經濟日報 HKET, 明報 Ming Pao, 文匯報 Wen Wei Po, 東方日報 on.cc, Now財經, 信報 HKEJ, 香港商報
Industry-specific: PBSA News, Global Student Living, Centurion announcements (SGX-listed PBSA REIT)
Pitfalls
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingresearch/news-monitoring/SKILL.md
Popularity
- Repository stars
- 76
- Repository forks
- 12
- 7-day trend score
- 22
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/moonlight-lupin/agent-skills/news-monitoring)