Turn GitHub Commits into Tweets: The Content Engine for Builders
TL;DR
- Every meaningful commit is a tweet you did not write. The translation cost is what kills the content engine — not the writing.
- The signal-to-noise rules:
feat:commits closing a user-visible loop are always content,fix:commits with a story are usually content,refactor:/chore:/docs:almost never are.- The 30-minute window after a commit lands is when the post writes itself. Miss the window and the post never ships.
The most reliable predictor of whether a builder posts consistently is not their writing skill or their audience size — it is whether they have a system that translates commits to content while the context is still fresh. This cluster sits inside our GitHub-to-content automation pillar and is the operational core of the vibecoder distribution playbook.
Why most builders cannot turn commits into tweets
The pattern that kills the content engine: a commit lands, you mean to write a post about it, you tell yourself you will write it tonight, you do not, and by tomorrow the context is gone. The why-it-matters that made the commit interesting has decayed; without it, the post becomes generic and you skip it.
This happens because writing a post about a commit is not actually about the writing. It is about reconstructing:
- Why the change mattered to users (not what it does technically)
- What the broken state was that made the change necessary
- The specific moment or insight that triggered the fix
- The story arc — what made this commit different from yesterday's commit
Reconstructing any of that more than 24 hours after the commit lands costs ~10x the energy it would have cost in the 30-minute window. Most builders, correctly judging the cost, skip the post entirely.
The signal-to-noise rules: which commits are content
Not every commit deserves a post. The rules:
Always a post:
feat:commits that close a user-visible loopfeat:commits that add a noticeably new capabilityfix:commits where the bug was funny, embarrassing, or revealing ("Stripe webhook was charging users twice for 3 hours")- Commits that ship a user-requested feature with the original request quoted
Sometimes a post:
fix:commits that improved performance materially (specify the before/after)feat:commits that are part of a larger feature shipping in 2-3 days (queue these for the rollup post)- Migration commits with a story ("finally migrated off the prototype Supabase schema")
- Commits that triggered an external integration update (Stripe webhook, OAuth flow change)
Almost never a post:
refactor:commits (internal noise unless the refactor enabled something user-visible)chore:commits (dependency bumps, lint config changes)style:commits (formatting only)docs:commits (internal — though a public docs page launch is content)- WIP commits, merge commits, revert commits
This filtering is what Dev Cards automates: every commit flows through a quality classifier that determines whether to surface it as a draft post or silently archive it.
The 30-minute window
The single most important operational insight: posts about commits write themselves in the 30 minutes after the commit lands. After that window, they get progressively harder to write until they stop being written entirely.
What is true in the 30-minute window that is not true later:
- The why is still in your working memory
- The previous broken state is still visible in your terminal scrollback
- The user-visible outcome is fresh (you just tested it)
- Your emotional state — frustration, satisfaction, surprise — is intact and translatable
What is gone an hour later:
- The specific moment that triggered the fix
- The exact phrasing of the bug or feature request
- The mental model of the broken state
The operational implication: the content workflow has to fire automatically when a commit lands, while you are still in the chair. Manual processes that require "remember to write the post tonight" fail at scale.
The translation from commit to post
A commit message like:
feat(stripe): handle webhook retries for duplicate charge events
Translates to a draft post like:
shipped: stripe webhook now correctly handles retry events.
caught this because a user got charged twice last week. turns out stripe retries webhooks if your endpoint responds slowly, and our handler was idempotent only on the customer level, not the event level.
4 lines of code. 3 hours of debugging. classic.
The translation requires:
- The user-visible reframe (charged twice, not "duplicate event handling")
- The "why this matters" context that does not appear in the commit message
- The honest method (debugging time, not just shipped time)
- The voice (lowercase, conversational, builder-to-builder)
This is what Loudy does at the post-drafting layer once Dev Cards has identified the commit as content-worthy. The combination produces a draft that you approve and ship in 60-90 seconds instead of staring at a blank tweet for 20 minutes.
The five posts per week minimum
For the content engine to actually compound — for the X algorithm and the LinkedIn algorithm to recognize your account as worth surfacing — you need to ship 4-5 posts per week minimum. Below that volume the algorithms decay your reach.
A repository shipping 10-30 commits per week with the signal-to-noise rules applied typically produces 3-6 content-worthy commits per week. If you ship the post for every content-worthy commit, you hit the 4-5 posts/week minimum naturally. If you ship the post for half of them, you do not.
The implication: the bottleneck is rarely commit volume. It is the post-drafting friction. Removing the friction is the entire win.
What does not work
- Manual scripts that auto-tweet every commit. The signal-to-noise is too low; followers tune out.
- End-of-week rollup posts that compress 10 commits into one. Loses the story arc; reads like a changelog.
- AI-generated posts that paste the commit message verbatim. The reframe step is non-negotiable.
- Posts that explain what the code does technically. Operators do not care about the code; they care about the outcome.
Sibling clusters
- Build in public with Cursor — for the Cursor-specific commit-to-content workflow
- Build in public with Claude Code — for the Claude-Code-native commit pattern
- Commit messages as marketing — writing commits that double as drafts
- Automate build in public — the levels of automation
FAQ
Do I have to write posts for every meaningful commit? No. The realistic discipline is shipping a post for 60-70% of content-worthy commits. The remaining 30-40% — when you are out of energy, when the commit lands at midnight, when you are in deep focus on the next thing — can be skipped without breaking the cadence. The trap is shipping for under 30% of content-worthy commits, at which point you fall below the 4-5/week minimum.
How do I write the post without breaking my flow state? The post writes itself if you start it within 30 minutes of the commit. The actual writing time is 2-4 minutes per post when you stay in the window — far shorter than the "go grab a coffee" detour you would take anyway. If you genuinely cannot leave flow, voice-memo the why and the context, then return to it within an hour to draft.
What if my commits are not visible / are private to my company? The technique still works — you are just reframing internal commits to external-facing posts. Strip anything proprietary, focus on user-visible outcomes, and use the universal patterns ("shipped a thing that fixes X") rather than internal codenames. The exception: avoid posting about anything covered by an NDA or security-sensitive context.
Should I batch commits and post once per day instead of after each one? No. The 30-minute window applies to each commit individually. Batching loses the specific context for the commits that landed earlier in the day. Better: post each content-worthy commit when it lands, then space the publishing if you want to throttle frequency.
How does this work for vibe-coded apps where commits are AI-generated? Even better, because the commits include the prompt context that triggered them. AI-generated commits have more story material than manually-written commits — the prompt + the iterations + the final solution are all naturally captured. The signal-to-noise filter still applies; not every AI-generated commit is content.
Building is no longer the bottleneck. Visibility is. buildinpublic.so is narrative infrastructure that runs inside your building workflow — Dev Cards classifies commits and surfaces only the content-worthy ones, Loudy reframes the commit message into a voice-matched post, and the 30-minute window stops being a window you have to remember and becomes a workflow that fires automatically.