Schedule icon
OutputValues icon
Parallel icon
Download icon
Script icon
If icon
ChatCompletion icon
Anthropic icon
SlackIncomingWebhook icon
Set icon

Developer Mention Radar with AI Triage for Hacker News, Stack Overflow, GitHub and dev.to

Track mentions of your project on Hacker News, Stack Overflow, GitHub and dev.to, triage them with AI and post an urgency-grouped Slack digest.

Categories
AIBusiness

People talk about your open-source project every day without telling you. A security write-up appears on dev.to, a Hacker News thread compares you with a competitor, a Stack Overflow question goes unanswered, or a GitHub issue in another repository reports that your integration broke. Nobody has time to search four sites every few hours, so most of these go unseen. Paid tools exist for this. This blueprint gives developer relations teams, founders and maintainers the same signal from free public APIs. An LLM sorts each mention so the team only reads what needs attention.

How it works

  1. checkpoints (io.kestra.plugin.core.output.OutputValues) reads the state from the KV store: where each source's last successful search stopped, and the IDs of recently reported mentions. Before the first run it looks back first_run_lookback_hours.
  2. search (io.kestra.plugin.core.flow.Parallel) queries all four sources at once with io.kestra.plugin.core.http.Download, each with retries and allowFailure, so one site being down never blocks the others:
    • hacker_news: Algolia search for stories and comments containing the exact keyword;
    • stack_overflow: Stack Exchange search for new questions;
    • github: issue and pull request search, excluding your own organization and bot authors;
    • devto: the latest articles with your tag.
  3. normalize (io.kestra.plugin.scripts.python.Script) puts every source into one format and drops mentions already reported. It neutralizes template markers in the untrusted text and caps the batch at max_mentions, oldest first. It then computes new checkpoints: a source that failed keeps its old checkpoint, and a source with mentions beyond the cap only moves up to the newest one sent, so nothing is skipped.
  4. triage (io.kestra.plugin.core.flow.If) stops here when there is nothing new, so quiet runs make no model call.
  5. classify (io.kestra.plugin.ai.completion.ChatCompletion with the Anthropic provider) labels the whole batch in one call. Each mention gets a category (security, bug, question, comparison, praise or other), a relevance flag to drop a different product with the same name, a one-line summary and a suggested action.
  6. route (io.kestra.plugin.scripts.python.Script) joins the labels back onto the mentions by ID, so every link comes from the source and never from the model. It writes mentions.jsonl and builds the digest, with security and bugs first. Minor and unrelated mentions are counted but not listed.
  7. post_digest (io.kestra.plugin.slack.notifications.SlackIncomingWebhook) posts the digest when notify is on and something is worth attention.
  8. store_state (io.kestra.plugin.core.kv.Set) saves the new checkpoints and reported IDs only after everything above succeeded.
  9. On failure, alert_failure posts the flow, execution, failed task, error and a link to Slack. No state is saved, so the next run retries the same mentions.

Prerequisites

  • Outbound HTTPS from the Kestra worker to hn.algolia.com, api.stackexchange.com, api.github.com, dev.to and api.anthropic.com.
  • Docker on the worker for the two Python script tasks (the default task runner).
  • Secrets:
    • ANTHROPIC_API_KEY: Anthropic API key used by classify.
    • GITHUB_TOKEN: GitHub token used only to raise the search rate limit. A fine-grained token with no repository permissions is enough.
    • SLACK_WEBHOOK_URL: Slack incoming webhook for the digest and the failure alert.

Inputs

  • keyword (STRING, default kestra): the exact term to watch, usually your project name. Each keyword keeps its own state.
  • devto_tag (STRING, default kestra): the dev.to tag to follow. dev.to has no full-text search.
  • exclude_github_org (STRING, default kestra-io): your own organization, so your own issues and pull requests are not reported.
  • first_run_lookback_hours (INT, default 24): how far back to search before any state exists.
  • max_mentions (INT, default 40): mentions sent to the model per run. The rest wait for the next run.
  • notify (BOOL, default true): false is a dry run that searches and classifies but posts nothing and saves no state.

Quick start

  1. Add the three secrets and save the flow. Change the input defaults to your project name, tag and organization.
  2. Run it once with notify set to false and first_run_lookback_hours set to 168 for a week of history. Read the digest in the route outputs without posting anything.
  3. Run it again with notify set to true to post the digest and save the state.
  4. Leave the every_six_hours schedule on. Each run only looks at what is new since the last one.

Outputs

  • {{ outputs.new_mentions }} / {{ outputs.normalize.vars.new_count }}: new mentions found in this run.
  • {{ outputs.mentions_file }} / {{ outputs.route.outputFiles['mentions.jsonl'] }}: every new mention with its source, link, author, date, category, relevance, summary and action, one JSON object per line.
  • {{ outputs.route.vars.counts }}: mentions per category.
  • {{ outputs.route.vars.digest }}: the Slack digest text.
  • {{ outputs.normalize.vars.failed_sources }} and left_for_next_run: sources that were unreachable and mentions deferred to the next run.
  • KV key mention-radar-<keyword>: per-source checkpoints and the last 1,000 reported mention IDs.

Common pitfalls

  • Choose a distinctive keyword. A common word returns mostly noise. The model drops unrelated mentions, but they still count toward max_mentions and the model cost.
  • The model call happens only when there are new mentions, and its cost grows with max_mentions. Tested with Claude Haiku 4.5, a batch of 40 mentions cost about $0.02. The default claude_model is Claude Sonnet 5.5; set the claude_model variable to a smaller model for high-volume keywords.
  • To start over, delete the KV key mention-radar-<keyword>.
  • Stack Exchange allows 300 requests a day per IP without a key, which is far more than a six-hour schedule needs. GitHub search allows 30 requests a minute with a token.
  • Reddit and Bluesky are not included because both block unauthenticated search.

How to extend

  • Add Reddit or Bluesky with an OAuth app as one more Download task in search and one more block in normalize.
  • Route categories to different channels, for example security to the security team's channel, with a Switch after route.
  • Load mentions.jsonl into a warehouse to track mention volume and sentiment over time.
  • Watch competitors' names with one execution per keyword. Each keyword keeps its own state.

Links

See How

New to Kestra?

Use blueprints to kickstart your first workflows.