{"id":36849416,"url":"https://github.com/dewey/webhook-receiver","last_synced_at":"2026-01-12T14:36:14.526Z","repository":{"id":55662200,"uuid":"212889303","full_name":"dewey/webhook-receiver","owner":"dewey","description":"Automatically post new RSS feed items to Twitter and Mastodon, triggered by an incoming web hook.","archived":false,"fork":false,"pushed_at":"2023-06-12T21:15:50.000Z","size":9904,"stargazers_count":5,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-06-19T19:41:55.630Z","etag":null,"topics":["netlify","rss","twitter","webhook"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dewey.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-10-04T19:34:34.000Z","updated_at":"2024-06-18T09:27:47.000Z","dependencies_parsed_at":"2024-06-19T19:01:29.535Z","dependency_job_id":"ccd79620-393e-4d8d-9855-05724816a49b","html_url":"https://github.com/dewey/webhook-receiver","commit_stats":{"total_commits":70,"total_committers":3,"mean_commits":"23.333333333333332","dds":0.4714285714285714,"last_synced_commit":"f04d08d8b207fe5ce86e3ee9ffcec3af97209ff7"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/dewey/webhook-receiver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dewey%2Fwebhook-receiver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dewey%2Fwebhook-receiver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dewey%2Fwebhook-receiver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dewey%2Fwebhook-receiver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dewey","download_url":"https://codeload.github.com/dewey/webhook-receiver/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dewey%2Fwebhook-receiver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28340403,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T12:22:26.515Z","status":"ssl_error","status_checked_at":"2026-01-12T12:22:10.856Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["netlify","rss","twitter","webhook"],"created_at":"2026-01-12T14:36:14.453Z","updated_at":"2026-01-12T14:36:14.517Z","avatar_url":"https://github.com/dewey.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Web hook Receiver: Post to Twitter or Mastodon from RSS feed\n\nThis is a service that acts as a receiver for web hooks. Once it's getting hit by an incoming web hook (For example from [Netlify](https://www.netlify.com/docs/webhooks/) on a successful build) fetches an RSS feed and tweets/toots out the items that haven't been tweeted/tooted yet. It does this by keeping a local cache db of things it tweeted/tooted so it'll only do it once.\n\nThere's alternatives like [Zapier](https://zapier.com/app-directory/rss/integrations/twitter) and [IFTTT](https://ifttt.com/twitter) but they don't have a way to customize the Tweet/Toot format. Their defaults don't look that nice too.\n\n## Use Case / Features\n\nMy use case is a [Hugo](https://gohugo.io) blog deployed on [Netlify](https://www.netlify.com), once I push a new blog post it'll:\n\n1) Build the blog on Netlify  \n2) The build is successful  \n3) Netlify hits `webhook-receiver` running on `webhooks.example.com`  \n4) Then `webhook-receiver` fetches the RSS feed on `example.com/feed.xml`  \n5) It checks the local cache db which items haven't been posted to Twitter  \n6) It tweets/toots one feed item that hasn't been posted yet and adds it to the cache. If there's multiple items that are not published yet it'll only post one. The next one will be posted on the next web hook trigger  \n7) It goes back to listening for new web hooks from Netlify\n\n## Caveats\n\n- Currently only using [Atom](https://validator.w3.org/feed/docs/atom.html#requiredFeedElements) fields, make sure your feed has the right fields set (`\u003csummary\u003e` and `\u003clink\u003e` are currently used)\n\n## Deploy\n\nThere are the environment variables that can be set. \n\n```\nexport WR_ENVIRONMENT=development\nexport WR_PORT=8080\nexport WR_CACHE_DATABASE_PATH=/cache\nexport WR_FEED_URL=https://example.com/feed.xml\nexport WR_HOOK_TOKEN=changeme\nexport WR_TWITTER_CONSUMER_KEY=changeme\nexport WR_TWITTER_CONSUMER_SECRET_KEY=changeme\nexport WR_TWITTER_ACCESS_TOKEN=changeme\nexport WR_TWITTER_ACCESS_TOKEN_SECRET=changeme\nexport WR_TWITTER_USERNAME=changeme\nexport WR_MASTODON_SERVER=changeme\nexport WR_MASTODON_CLIENT_KEY=changeme\nexport WR_MASTODON_CLIENT_SECRET=changeme\nexport WR_MASTODON_ACCESS_TOKEN=changeme\n```\n\n\nThere's also a `Dockerfile` and Docker Compose file included so you can easily run it via `docker-compose -f docker-compose.yml up -d`. Create the `cache` file in the location where your volume maps to (`touch /your/volume/location/cache`.\n\nThe Twitter credentials can be generated by setting up a new \"App\" on [developer.twitter.com](https://developer.twitter.com/en/apps).\n\n\n\n## Development\n\nIf you want to look at the content of the incoming web hook use [webhook.site](https://webhook.site).\n\nTo hit your web hook receiver running locally use [ngrok](https://dashboard.ngrok.com/get-started) and set it up as a web hook on the third party service you are testing it with.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdewey%2Fwebhook-receiver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdewey%2Fwebhook-receiver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdewey%2Fwebhook-receiver/lists"}