ShriD5/claude-mods/tree/main/ship-log
ship-log
/ship turns what you built in this Claude Code session into a build-in-public post.
About this mod
/ship turns what you built in this Claude Code session into a build-in-public post for X or LinkedIn. It reads commits and the diffstat since the session started plus your prompts, and has a fast model write a single post (lowercase, first person, one concrete number, under 280 characters, no hashtags or em dashes). Variants include /ship again and /ship linkedin. Drafts are validated against the rules, retried once if they break them, and copied to your clipboard. Options (model, webhookUrl, webhookToken) are set via /config. It saves HEAD on session.start, tracks prompt.submit, and uses git log/git diff --stat, $.model.complete, and $.ui.copy.
Installation
Check the author's README for the marketplace and plugin name first. Commands may change as the repository evolves.
claude plugin marketplace add ShriD5/claude-mods claude plugin install ship-log
Original text / README
ship-log
/ship turns what you built in this Claude Code session into a build-in-public post.
It reads the commits and the diffstat since the session started, plus a short list of what you asked Claude for, and has a fast model write one X post: lowercase, first person, one concrete number, under 280 characters, no hashtags, no em dashes, none of the "officially / game-changer / excited to announce" voice. The draft shows up as the command's output and goes to your clipboard.
/ship an X post
/ship again another take, a different angle from the last one
/ship linkedin a longer LinkedIn version (sentence case, short paragraphs, up to 1,300 chars)
A draft that still breaks a rule (too long, a banned phrase, emoji spam) is sent back once with the problems named. If it is still too long after that, it gets cut at the last sentence that fits.
Install
claude --plugin-dir ./ship-log
or add this repo as a marketplace and install it with /plugin.
Options
Set them in /config (or pluginConfigs["ship-log"].options in settings):
| option | default | what it does |
| --- | --- | --- |
| model | haiku | The model that writes the post: an alias (haiku, sonnet) or a full model id. |
| webhookUrl | empty | If set, every draft is POSTed here as { "platform": "x" \| "linkedin", "text": "...", "source": "ship-log" }, so it can drop straight into a content calendar or a drafts queue. |
| webhookToken | empty | Sent as Authorization: Bearer <token> with that POST. Stored as a secret. |
How it works
It saves HEAD in $.state on session.start and keeps every prompt you type (prompt.submit). /ship runs git log <start>..HEAD and git diff --stat <start> through $.process.run, so uncommitted work counts too, then writes the post with $.model.complete and copies it with $.ui.copy.
