RippleContent Repurposer
What it does for you
One blog post becomes five social posts.
One small business blog post in, five platform drafts out, each fitted to real limits with a live counter, a fit score, and a printable content pack, plus an optional Claude mode graded by the same scorer.

Who it's for
Small businesses with a blog, or someone who handles social posts for local clients every month. It writes drafts that fit each platform and never posts on its own.
Screenshots

In more detail
Ripple turns one small business blog post into five drafts: LinkedIn, an X or Threads thread, Instagram, Facebook, and an email blurb. Each one already fits its platform's limits and comes with a fit score and the checks behind it. It never posts anything. It's built as a service tool: something a builder could run monthly for local clients.
Honest limits
Claude mode was never run against the live API. It's covered by prompt and parser tests and a hand-written fixture in the API's response shape. Platform limits are the published ones at build time. The sample posts are fictional, and the home care one is general information, not medical advice. It's made and tested, not hammered.
How I built it
I told Claude Cowork to one-shot all the Cowork projects and set the frame for this one: a content service for small business clients, not my own brand or channels. It specced Ripple, then built, tested, screenshotted, and documented it in one pass, about 0.7 hours. It wrote the core first (repurpose.js), ran it against two fictional sample posts (a home care agency and a bakery), revised where the drafts read badly, and only then wrote the page and the tests.
The engine is local and deterministic. It pulls out the post's structure, scores every sentence, keeps the top points, and picks a hook under 125 characters. The thread counts length the way X does (links 23, emoji 2) and never splits a word or URL. Counting uses grapheme clusters, so emoji don't throw off the meters.
There's an optional Claude mode that sends the post and voice settings to the Claude API, then runs the result through the exact same fitter and scorer, so local and Claude drafts get graded side by side. The pack exports to Markdown, JSON, or a print view rendered as a sample PDF.
What I learned
- One scorer should judge everything: local drafts, hand edits, and Claude drafts. It includes a "no numbers that aren't in the source" check, which caught the invented "24/7" claim we planted in the Claude fixture on purpose.
- That same honesty check flagged my own output. The thread's "1/7" numbering looked like invented numbers, so numbering gets stripped before scoring.
- An abbreviation list cuts both ways. Treating "a.m." as never ending a sentence glued two sentences together. Now a.m., p.m., and etc. end a sentence when the next word is capitalized.
- Filling LinkedIn toward 1,300 characters duplicated sentences and pulled in the post's own call-to-action paragraph. The bakery post still lands at 1,133 characters, and the scorer says so instead of padding.
- Thread numbering is a fixed-point problem: "1/9 " is shorter than "1/10 ", so reserving room can change the part count. Re-split until the count holds.
What carried forward
Same core-plus-verify.mjs pattern as every tested build, and the same local-first, optional-Claude shape. The build also hit a parallel-work snag: scratch scripts in a shared temp folder got overwritten by other builds running at the same time, so they moved to a project-specific folder. No later project imports Ripple's code.
If I took it further
Run Claude mode with a real key, feed failed checks back so the model revises its own drafts, and add per-client voice presets so a monthly client keeps the same hashtags and call to action.
#057 Built with Claude Cowork September 23, 2026 255 automated checks