New to Kestra?
Use blueprints to kickstart your first workflows.
Automatically extract and check all HTTP/HTTPS links in a Markdown file. Get Slack alerts for dead links and handle timeouts, redirects, and retries.
Dead links in READMEs and documentation erode user trust and cause frustration. This blueprint automates link checking by downloading a Markdown file, extracting all URLs, and testing them for accessibility. It handles rate limits, redirects, and server rejections elegantly, alerting you in Slack when links rot.
download (io.kestra.plugin.core.http.Download) fetches the raw Markdown file to Kestra's internal storage.check_links (io.kestra.plugin.scripts.python.Script) runs a slim Python script in a Docker container. It deduplicates links, skips local addresses, and uses HEAD requests to verify URLs quickly, falling back to GET for servers that block HEAD.evaluate (io.kestra.plugin.core.flow.If) branches based on the results. If dead links are found, it posts a detailed JSON payload to Slack and conditionally fails the execution. If all links pass, it logs a success message.errors block acts as a safety net, sending a Slack alert if the flow itself fails to execute.405 Method Not Allowed or 403 Forbidden on HEAD requests.Instead of relying on a fragile local script or a CI job that hides results in logs, orchestrating this with Kestra gives you scheduled execution, automatic Slack alerts, and a clear audit trail. You get visibility into how many links were checked and exactly what failed, right in the Kestra UI and your team's Slack channel.
docker run command or Docker service for Kestra to run the Python image.SLACK_WEBHOOK_URL: The Slack webhook URL used to send notifications for dead links and flow failures. Note: Secrets are passed as environment variables prefixed with SECRET_ and base64-encoded (example: SECRET_SLACK_WEBHOOK_URL=<base64 of the url>).markdown_url: The URL of the Markdown file to check.timeout_seconds: The timeout for each HTTP request.fail_on_dead_links: Whether to fail the Kestra execution if any dead links are found.{{ outputs.download.uri }}: The internal storage path of the downloaded Markdown file.{{ outputs.check_links.vars.dead_count }}: The total number of dead links found.{{ outputs.check_links.vars.dead_links }}: A JSON array containing the dead URLs and their error messages.SLACK_WEBHOOK_URL secret.weekly_schedule trigger to monitor your links automatically.ForEach task to check multiple documentation files in parallel.disabled: false to run it automatically.urllib library handles standard redirects automatically, but complex JavaScript redirects will not be followed.outputs.check_links.vars.dead_count exactly match the emitted outputs.