Auto-post to social media from GitHub
How to auto-post to X, LinkedIn, Instagram, and every other channel straight from your repo: a working GitHub Actions recipe, then an honest comparison of schedulers, event-driven automation, and AI drafting for teams whose content is their shipped work.
What this solves
A developer with a GitHub repo wants to auto-post their releases or commits to social channels and is looking for either a DIY recipe or a tool built around GitHub as the trigger.
How S2P helps
A working GitHub Actions recipe that posts on release, plus an honest map of the three ways to automate posting - scheduler, event-driven, AI drafting - so you pick the one that matches where your content actually comes from.
Key takeaways
- Your repo is the trigger: a release, tag, or merge is a better content source than an empty calendar slot.
- A GitHub Actions workflow can post on release with nothing more than a webhook URL - the recipe below is complete and works today.
- Schedulers automate the publish click; event-driven automation starts a stage earlier and removes the drafting too.
- Pick the method that matches your content source: a calendar for opinions, your GitHub events for shipped work.
Section 1
Auto-post from GitHub on release: a working recipe
Skip the theory for a moment. Here is a complete GitHub Actions workflow that posts to a channel the instant you publish a release - no third-party service required to get started.
The `release` event with `types: [published]` fires whenever a release is published on the repo, and the event payload's `release` object carries everything a post needs, including `release.name` and `release.html_url` (both confirmed fields on GitHub's release object, per the REST API's release response schema). The workflow below reads those two fields and posts a one-line announcement to a Discord webhook - the same pattern works for Slack's incoming-webhook URL format with the payload shape adjusted, or any endpoint that accepts a JSON POST.
This is genuinely enough to auto-post your first release announcement today: create the webhook in your destination, add it as a repository secret, and paste the workflow in. What it will not do is adapt the message per channel, hold it for review, or handle more than one destination without you copying the step - which is exactly the gap the rest of this guide is about.
- Trigger: `on: release: types: [published]` - fires the moment you publish a release.
- `github.event.release.name` and `github.event.release.html_url` are both confirmed fields on the release object.
- Works with any webhook-shaped destination (Discord shown; Slack's incoming webhook takes the same approach).
- Honest limit: one channel, one message shape, no review step - fine for a first wire-up, not a real pipeline.
.github/workflows/announce-release.yml
name: Announce release
on:
release:
types: [published]
jobs:
announce:
runs-on: ubuntu-latest
steps:
- name: Post to Discord
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
RELEASE_NAME: ${{ github.event.release.name }}
RELEASE_URL: ${{ github.event.release.html_url }}
run: |
curl -H "Content-Type: application/json" \
-d "{\"content\": \"New release: ${RELEASE_NAME} - ${RELEASE_URL}\"}" \
"$DISCORD_WEBHOOK"Section 2
Scheduler vs event-driven vs AI drafting: which fits a GitHub-triggered post?
The recipe above is one instance of a pattern. The three families below automate different stages of the same pipeline, and the right one depends on whether your content comes from a calendar or from your repo.
Schedulers (Buffer, Hootsuite, Typefully, Postiz and the rest) automate the publish stage only: you still decide, write, and adapt, then queue everything to go out at chosen times - your repo never enters the picture. Event-driven automation, the family the recipe above belongs to, starts one stage earlier and at the source: a real GitHub event - a release, a merged pull request, a changelog update - triggers a draft automatically, so deciding and drafting are largely absorbed by the event itself. Pure AI drafting tools attack the blank page from a prompt, which helps when your content is editorial opinion rather than shipped work, but still needs someone to write the prompt.
The table below is the comparison to run before picking a method. If your content is your product - you ship, and the shipping is the story - event-driven automation triggered by your repo removes two more stages than a scheduler can, because the event carries the facts a draft needs.
- Schedulers automate the click; you still do all the writing and never touch GitHub.
- Event-driven automation is the only one of the three that can use your repo as the trigger.
- AI drafting removes the blank page but still needs a human prompt, not an event.
- Match the method to your content source: calendar for opinions, repo events for shipped work.
Trigger, removes, breaks, suits: the three methods compared
| Method | What triggers a post | What it removes from your week | What breaks it | Who it suits |
|---|---|---|---|---|
| Scheduler | A calendar slot you filled | The publish click, on every channel at once | An empty queue - nothing generates the drafts | Editorial calendars: opinions, tips, campaigns |
| Event-driven (your repo) | A GitHub release, tag, merge, or changelog update | Deciding what to post and drafting it, both | No events - quarterly shippers have gaps to fill | Teams whose content is their shipped work |
| AI drafting | A prompt you write | The blank page for opinion content | Prompts drifting into generic filler | Thought-leadership and opinion posts |
Section 3
Auto-posting from GitHub to specific platforms
The recipe generalizes, but each destination has its own quirks worth naming before you wire it up.
X and LinkedIn both require an authenticated API call rather than a plain webhook POST, since neither accepts anonymous incoming webhooks the way Discord and Slack do - the GitHub Actions recipe above needs an API client step in place of the `curl` call, with the platform's API credentials stored as repository secrets. Instagram and TikTok are a different case again: both are built around image or video posts first, so a text-only release announcement is a weak fit for either platform even once the API call works, which is worth knowing before you spend the setup time.
Reddit and Hacker News are deliberately not part of this recipe. Both communities penalize automated, identical-looking submissions, so a release-triggered auto-post is the wrong tool for either destination - see our Hacker News launch guide for why that channel specifically wants a human, not a script.
- Discord and Slack: plain webhook POST, no auth token beyond the secret webhook URL itself.
- X and LinkedIn: need an authenticated API call, not a webhook - store credentials as repo secrets.
- Instagram and TikTok: visual-first platforms; a text release note is a weak fit even with a working API call.
- Reddit and Hacker News: deliberately excluded from auto-posting - both penalize automated-looking submissions.
Section 4
How Ship 2 Post automates the pipeline from GitHub
S2P is the event-driven row of the table above, built specifically for teams whose trigger is a repo, with the per-platform API handling and review step the raw recipe does not have.
S2P connects to your GitHub and treats releases, tags, merged PRs, and changelog updates as the posting trigger. When a qualifying event fires - you control qualification with rules on semver, branch, path, or label, so dependency bumps stay quiet - it drafts channel-native posts in your brand voice for the channels you connect: 11 native platform integrations (LinkedIn, X, Threads, Bluesky, Mastodon, Reddit, Facebook, Instagram, YouTube, Discord, Slack) plus Hacker News, Substack, and custom webhooks - 14 channels in total. Drafts land in a review queue; nothing publishes until a human approves, unless you explicitly switch a channel to autonomous mode.
That design is the recipe above with the gaps filled in: authenticated API calls per platform instead of a single webhook, channel-native adaptation instead of one message shape, and an approval step instead of nothing. Pricing, as of July 2026: a free plan (one repo, two social channels, one post a day) to feel the loop, and paid plans from $5 per month billed yearly ($6 monthly) to remove the branding and add channels - details on the pricing page.
If you want to feel the drafting quality before connecting anything, the free changelog-to-social generator takes pasted release notes and produces posts for six channel styles in your browser, no login. And if you are technical enough to want the DIY route further, the honest build-vs-buy comparison lives in our GitHub Actions vs webhooks decision matrix - DIY, like the recipe above, is genuinely fine for one channel and a tolerance for maintenance.
- Trigger: GitHub releases, tags, PRs, changelog - qualified by your rules.
- 14 channels total: 11 native platform integrations plus Hacker News, Substack, and custom webhooks.
- Approval is the default; autonomous mode is opt-in per channel.
- Free plan to start; paid from $5/mo billed yearly (as of July 2026).
Section 5
How do you auto-post without sounding like a bot?
Everyone has muted an account that automated itself into a firehose. The failure pattern is consistent, and so is the fix.
Automated accounts feel robotic for three reasons, and none of them is automation itself. First, identical cross-posting: the same text, same hashtags, same link card on every channel reads as broadcast, because it is - a single webhook message posted verbatim to five platforms is the fastest way to trigger this. Second, volume without selection: when every commit or trivial patch becomes a post, followers learn that nothing you post is signal. Third, missing authorship: no reactions, no replies, no human in the comments - the account publishes but never participates.
The fixes are structural, not cosmetic. Adapt per channel so each post is native (a compressed line on X, context on LinkedIn, no hashtags on Reddit or Discord) - a raw webhook recipe cannot do this on its own, which is the real gap between a first wire-up and a real pipeline. Gate volume with qualification rules so only releases with a story go public. And keep a human on approval and in the replies: automation should hand you a finished draft, not take over your keyboard.
- Robot-voice comes from identical cross-posting, unfiltered volume, and absent authors.
- Channel-native adaptation is the single biggest de-botting fix - and the main thing a raw webhook recipe skips.
- Qualification rules keep patch releases from spamming your followers.
- Automate up to the approval, never past the replies.
FAQ
Questions this article answers
How do I auto-post from GitHub to social media?
The minimum viable version is a GitHub Actions workflow that triggers on `release: types: [published]` and posts to a webhook URL using the event's `release.name` and `release.html_url` fields - see the complete recipe above. For multiple platforms with proper API authentication, channel-native formatting, and a review step, that is what a purpose-built tool like S2P adds on top.
Can I auto-post from GitHub to X or LinkedIn?
Yes, but neither accepts a plain webhook POST the way Discord or Slack does - you need an authenticated API call, with credentials stored as GitHub Actions secrets, in place of the `curl` step in a webhook recipe. A tool that already holds the API integrations, like S2P, removes that setup per platform.
Does auto-posting from GitHub work for Instagram or TikTok?
Mechanically yes, once the API call works, but both platforms are built around image or video first, so a text-only release announcement is a weak content fit even when the automation itself works correctly. It is worth deciding whether the platform matches your content before wiring it up.
What is the difference between a social media scheduler and GitHub-triggered automation?
A scheduler automates the publish step only: you still write and adapt every post, it just clicks publish at chosen times, and your repo never enters the picture. GitHub-triggered automation also generates the draft, because the trigger is a real event - a release, tag, or merged PR - that already carries the facts a post needs.
Should I auto-post to Reddit or Hacker News from GitHub?
No. Both communities are built around participation, not broadcast, and penalize submissions that look automated or identical. A release-triggered auto-post is the wrong tool for either destination - submit to both manually, as yourself, in your own words.
How much does GitHub-triggered social automation cost?
The DIY GitHub Actions recipe above costs nothing beyond your existing GitHub plan. For a managed tool with more channels and a review step, S2P's free plan (as of July 2026) covers one repo, two social channels, and one post a day; paid plans start at $5 per month billed yearly ($6 monthly). Current numbers are always on the pricing page.
Related guides and pages
Where to go next
Hand-picked pages that go deeper on the workflow, channels, and tooling covered above.
