"Reconnect" showed up six times on that screen. Every one was a diagnosis, never a cure. One was a tooltip on something you couldn't even click. Fixed. Reconnect is now a button that does the thing. OAuth accounts re-auth in place. Manual ones open the form and tell you what to type.
UTM tagging was off on every single one of my five repos. Not a bug—just a switch nobody flips five times. Now you set it once at the account level and every repo inherits it. Tagged links carry a via=mergetel marker, so you can tell your traffic from a hand-typed post's traffic.
Opening a draft used to dump you into a textarea, like the app assumed you wanted to type before you'd read the thing. Fixed that. Drafts open as plain readable prose. Click Edit when you actually mean to edit. Cancel bails clean. Failed save keeps your edits on screen instead of eating them.
Kept getting asked why one merge turns into five posts instead of a single "publish to channels" button. Fair question, but it's not a feature — it's the shape of the whole thing. New page for it. Diagram included. One merge, traced to every draft it produces, and why.
You’ve never shipped more. Nobody’s heard a thing.
18 new features, three rewrites, 25 bugs fixed. From outside your repo, that month looks like a month where you shipped nothing. Merge & Tell reads your merged pull requests and writes the post, so the work shows up where people can see it.
A pull request you merged
The post it drafted
Twelve connected accounts used to be twelve identical boxes. Now they’re one grid, one row per account and one column per fact, so you can scan a column instead of reading tiles. Sets are a partition: every account is in exactly one.
The point
A year of it, in one picture.
Every square is a day. It goes blue when something you built reached an audience, and it stays empty when nothing did. The left of this grid is what shipping in silence looks like. The right is what a merge that publishes itself looks like a few months later.
Example: a year of publishing on autopilot
Example data, not a real account
Why
Nobody sees your best work.
Everyone ships more than they did two years ago. Nobody tells anyone more than they did two years ago. AI moved the bottleneck. Building got fast, and saying you built it stayed exactly as slow and as awkward as it always was.
So nobody grades you on your commit history. They grade you on what they saw, and mostly they saw nothing. Every merged PR is already a finished thing with a real diff behind it. The announcement is sitting right there, unwritten. Merge & Tell writes it. Distribution costs you a merge you were doing anyway.
I built this because I was afraid of the telling part. Not the code. Shipping was fine. Saying “I made this” out loud was the bit I would skip, every time, and there is always a reason to skip it. Now I merge and the post is written before I can talk myself out of it. The only move I have left is to approve it.
How it works
Merge. Draft. Publish.
You merge a PR
Ship code like you always do. Merge & Tell watches your merged GitHub pull requests. Nothing new to remember.
It drafts the post
Claude reads the diff and writes the marketing copy for you, tuned to the length and voice of each channel.
You review & publish
Tweak it, approve it, done. It posts to the accounts you connect. Nothing goes out until you say so, unless you switch a repo to autopost yourself.
Features
Everything it does for you
It all does one job. The work you already did reaches the people you’re building for, in your voice. Each entry links to how it works.
Writes the post
A merge is the trigger. What comes out is copy about the lines that changed, aimed at someone specific, in a voice you chose.
- Drafts from the real diffA merge fires a webhook and Claude reads the changed lines. One pass for what shipped, one per channel for how to say it. Not your PR title reworded.
- Founder voice and company voiceOne merge can go out twice, in different words, once from the company account and once from yours. Copy written as a person never auto-publishes.
- Written for your buyerPoint it at your product site and it drafts the ideal-customer profile: who they are, what hurts, the words they use. Every draft is framed for them.
- Small PRs become a roundupA ten-line fix is not an announcement. Merge & Tell holds those merges and flushes them into one "this week we shipped" draft across your repos.
Decides what counts
Most merges are not announcements. Which ones get through is a setting you write once, not a call you make every time.
- Noise never becomes a postBot authors, lockfile churn, paths you marked publish: never, and anything labelled marketing:skip are dropped before a token is spent.
- Split by who changes itThe repo owns its skip labels and per-path rules in a .marketing.yml. The app owns voice, ICP, hashtags and where it posts. A block in the PR body overrides both for that PR, and the posting mode it asks for can only be stricter, never looser.
- Hide a repo, completelyOne switch and a repo records nothing, publishes nothing, and stops appearing in every list and picker. Queued posts for it are cancelled.
Sends it
To your own accounts, at the size each network really allows, when you say so. One switch stops all of it.
- Every channel, sized to fitX, Bluesky, Mastodon, LinkedIn, Discord and your own changelog. Each one written to that network’s real limit, counted the way that network counts it.
- Your accounts, not a middlemanConnect X, Bluesky, Mastodon, LinkedIn and a Discord webhook. Merge & Tell posts as you; the tokens stay encrypted server-side and never reach the browser.
- Each repo posts where it shouldGroup connected accounts into named sets and point a repo at one. A set that has gone missing publishes nothing, never "everywhere" by accident.
- A queue with a stop buttonPublish now, at a time, or in the next free slot of your week. Retries back off, an attempt it cannot confirm is never re-sent, and one switch pauses the whole account.
- Post things that were not PRsThe composer writes an ad-hoc post through the same voices, sets, schedule and queue, with a live per-network preview before it goes.
Proves it worked
The part most tools skip. Where the clicks came from, a feed anyone can read, and an honest number for how much of the copy you kept.
- Links tagged for attributionOpt-in UTM tagging, applied per network as each post is queued, so your analytics can tell a Bluesky click from a LinkedIn one.
- Your own changelog feedThe same drafts render as a public Atom and JSON feed at your own URL, for the humans reading it and the agents watching it.
- Proof it is worth itKept-rate: how much generated copy you publish, and how much you rewrote first. If the drafts are bad, the number says so.
Reads from GitHub · posts to the accounts you connect
- GitHub
- X
- Bluesky
- Mastodon
- Discord
Receipts
We point it at ourselves.
Everything below was written by Merge & Tell from a merged pull request in this repository, and published to accounts we own. Live off each network’s public API, not a screenshot and not curated.