Schedule icon
Script icon
Docker icon
Parallel icon
SlackIncomingWebhook icon

Daily arXiv AI digest with keyword ranking

Schedule a Kestra flow that fetches new arXiv papers, ranks them by keyword relevance with Python, and posts a morning digest to Slack.

Categories
AI

Wake up to the papers that matter. This blueprint queries the arXiv API for the newest submissions in your categories every morning, scores each paper against your keyword list with a containerized Python script, computes category stats in parallel, and posts a ranked digest to Slack, no LLM API key required.

How it works

  1. fetch_papers (io.kestra.plugin.scripts.python.Script) calls the public arXiv API (Atom XML, no key) for the newest submissions in your categories and stores them as papers.json in Kestra internal storage.
  2. process (io.kestra.plugin.core.flow.Parallel) runs two branches concurrently:
    • rank_relevance scores every paper, keyword hits in the title count triple versus the abstract, and keeps the top N in ranked.json.
    • compute_stats aggregates per-category counts and exposes them as tracked outputs.
  3. format_digest renders the ranked papers as Slack mrkdwn with title, authors, categories, relevance score, and an arXiv link per paper.
  4. send_slack (io.kestra.plugin.slack.notifications.SlackIncomingWebhook) posts the digest to your channel.

What you get

  • A hands-free morning briefing on new AI papers, tuned by your own keywords
  • Deterministic, explainable ranking, no LLM API key or per-run inference cost
  • Tracked outputs (total, top_categories) you can chart over time
  • Full execution lineage: logs, metrics, and artifacts for every run

Who it's for

  • Researchers and engineers who track arXiv but drown in volume
  • ML teams that want a shared daily briefing in Slack
  • Anyone learning Kestra: triggers, parallel flows, Python scripts, and notifications in one blueprint

Why orchestrate this with Kestra

A cron job plus a script can fetch papers, but it cannot fan out scoring and stats in parallel, retry transient arXiv API hiccups, keep every artifact with lineage, or let you retune keywords from the UI without redeploying. Kestra gives you all of that declaratively, and the schedule trigger means it just runs.

Prerequisites

  • Docker available to the Kestra worker for the Python task runners
  • A Slack incoming webhook URL

Secrets

  • SLACK_WEBHOOK_URL: your Slack incoming webhook URL used to post the digest

Quick start

  1. Add the SLACK_WEBHOOK_URL secret to your Kestra instance.
  2. Tune categories, keywords, and top_n inputs to your interests.
  3. Save the flow under your namespace, the daily 08:00 UTC trigger is already attached.
  4. Run it once manually and check your Slack channel.

How to extend

  • Add a KV get/set pair to skip papers you have already seen on previous runs.
  • Swap keyword scoring for an LLM judge (io.kestra.plugin.ai) when you want semantic relevance.
  • Fan out per-category with io.kestra.plugin.core.flow.ForEach instead of one query.
  • Post to Discord or email with the matching notification plugin instead of Slack.
  • Persist ranked.json to S3/GCS for a searchable archive of every digest.

Links

See How

New to Kestra?

Use blueprints to kickstart your first workflows.