New to Kestra?
Use blueprints to kickstart your first workflows.
Poll a Tiny Tiny RSS public feed every 10 minutes and post new items to Mastodon, using Kestra KV store to track the last-posted item and prevent duplicates.
Automatically cross-post new RSS feed items to Mastodon on a schedule. This blueprint polls a Tiny Tiny RSS (tt-rss) public published feed every 10 minutes, parses the feed XML for new entries, and posts each one as a Mastodon status (toot) with its title and link. It uses Kestra's built-in KV store to remember the last item already posted, so the same article is never tooted twice even if the feed lags or the flow re-runs. It solves the toil of manually copying blog posts, release notes, or curated links into the fediverse.
every_ten_minutes trigger (io.kestra.plugin.core.trigger.Schedule) fires on the */10 * * * * cron.fetch_rss_feed (io.kestra.plugin.core.http.Request) does a GET against the rss_feed_url input and returns the raw RSS XML.get_last_posted_id (io.kestra.plugin.core.kv.Get) reads the rss_mastodon_last_id key with errorOnMissing: false, so the first run starts cleanly with no stored value.parse_new_items (io.kestra.plugin.scripts.python.Script) installs defusedxml, parses the feed, and walks each item collecting its guid, title, and link, stopping at the last posted id so only newer entries are kept.post_new_items (io.kestra.plugin.core.flow.ForEach) iterates the new items with concurrencyLimit: 1 and, for each, the toot_item HTTP POST calls the Mastodon /api/v1/statuses endpoint with a bearer token.update_last_id (io.kestra.plugin.core.kv.Set) writes the latest item id back to KV so the next poll resumes exactly where this one finished.concurrencyLimit: 1) so items appear in feed order.A feed reader can show you new items but cannot act on them. Kestra closes that gap: the Schedule trigger drives the poll, KV state makes the flow idempotent across runs, retries can recover from transient Mastodon or network errors, and every execution is logged with full lineage so you can see exactly what was posted and when. The whole pipeline is declarative YAML, version-controllable and reviewable, instead of a cron script gluing together curl and a database.
write:statuses scope.MASTODON_ACCESS_TOKEN: bearer token for your Mastodon application, used to authorize the status POST.MASTODON_ACCESS_TOKEN secret to your Kestra instance.rss_feed_url input to your tt-rss public feed URL.mastodon_instance input to your Mastodon domain.rss_feed_url for any standard RSS feed, not just tt-rss.toot_item.every_ten_minutes to poll more or less often.