Inspiration
Every launch or update I ship gets announced on X, Bluesky, LinkedIn, Discord, Reddit and Steam. Each one wants a different length, tone, hashtag style and image shape. Rewriting the same post six times takes an hour, and somewhere along the way a number or date gets changed by accident. The draft and the screenshots are already on my storage, so the NAS should prepare the whole set.
What it does
Crosspost Kit takes one announcement file (devlog, release notes, launch post) and an optional image folder, and produces a ready-to-post pack:
- One version per platform (X, Bluesky, Mastodon, Threads, LinkedIn, Reddit, Discord, Instagram, Steam news), fitted to that platform's length, thread, link and hashtag rules.
- Facts locked from the source: numbers, dates, versions and links never change.
- Images chosen per platform by orientation and relevance, each with alt text written from what is actually in the image.
- Character counts checked, with one targeted retry for anything over the limit.
- After approval, one Markdown file per platform in a new folder next to the source, and optionally a
crosspostedtag on the sources.
It never posts anything. Posting stays with the creator.
How we built it
It's a Markdown-only orchestration Skill written to the Uliya Skill Development Standard, plus a platform rules reference:
file-agent: locate the source and images.document-agent: extract the core message, facts, links and call to action.photo-agent: dimensions, orientation, alt text and relevance score per image.document-agent: write every platform version from the locked facts.file-agentandknowledge-agent: create the pack folder and save one file per platform.file-agent: tag the sources.
I used Claude Code to read the Skill Developer Package and capability catalog, draft the Skill and rules table, and run the kit's static checker.
Challenges we ran into
- No capability in the kit reaches external networks, so auto-posting was off the table. I turned that into a feature: a private, review-first pack.
- Platform rules differ in subtle ways, for example X counting every link as 23 characters, or Instagram links not being clickable. I kept them in one editable table instead of scattering them through prompts.
- Static checker requirements differed from the kit's template; I read the checker source to get a clean pass.
Accomplishments that we're proud of
- Passes the official static checker with zero errors and zero warnings.
- A fact lock and alt text for every image, which most crossposting tools skip.
- Never overwrites: existing packs get a numbered folder.
What we learned
- Splitting "extract facts" from "write versions" is what keeps facts consistent across platforms.
- A small rules table beats long prompts: easy to audit and easy to update when platforms change.
What's next for Crosspost Kit: One Post, Every Platform
- Validate length accuracy and alt text quality on a real UGREEN AI NAS.
- Per-user rule overrides (paid X accounts, custom hashtag sets).
- Chain with Devlog Kit: devlog in, crosspost pack out.
Built With
- ai-agents
- alt-text
- claude-code
- markdown
- skills-hub
- ugos
- ugreen-ai-nas
- uliya
- vision-language-model