Short text posts are the cheapest thing to write and the most annoying to publish. You have one thought, and now it needs pasting into Bluesky, then Mastodon, then Threads, three composers with three character limits. After a week you stop doing all three, and one account quietly goes silent.
This recipe turns that into a queue. You write posts whenever you feel like it and drop them in a folder. Each weekday morning a WorkBuddy automation takes the oldest one, fits it to each platform, publishes it to Bluesky, Mastodon and Threads, checks that all three posts exist, and writes the links down.
When you’re done you’ll have:
- a
postsfolder withqueue/(waiting),posted/(done) andlog.md(links), - a weekday automation that publishes at most one post a day and does nothing when the queue is empty,
- rules written into the prompt for the awkward parts: the 300-character Bluesky limit, links, and what to do when one platform fails,
- a first post you watched go out yourself.
Setup takes about 20 minutes, most of it signing in and one supervised first run.
Who this fits: people who write for an audience that is split across Bluesky, the fediverse and Threads (developers, writers, open-source maintainers, newsletter authors) and want a steady daily presence on all three without writing things three times. It publishes text, with one optional image per post. It doesn’t write your posts for you, and it works through your own signed-in accounts on your own computer, like a post you’d click by hand.
The recipe
You’ll paste this into WorkBuddy in step 2. Replace mastodon.social with the server your account is on.
Read https://www.publishport.app/skill.md and follow it to set up PublishPort for me, then check that Bluesky, Mastodon (my account is on mastodon.social) and Threads are connected. In this folder, create queue/, posted/ and log.md. Each post is a .md file in queue/. Take the oldest one, show me the exact text you will send to each of the three platforms (Bluesky allows 300 characters, so shorten it for Bluesky without adding anything new), and once I approve, publish it to all three one after another, verify each link, move the file to posted/ and add a line to log.md. After that, help me turn this into a WorkBuddy automation that does the same every weekday at 10:00.
The skill file is a short public instruction sheet. It tells the AI how to install itself, ask you for one authorization click, check which accounts are connected, publish, and confirm the post exists. Every AI you authorize shows on your account page, where you can revoke it.
Step 0: Get three things ready
1. WorkBuddy. Download and sign in from workbuddy.ai. Automations are saved in the desktop app and run on your computer, so it has to be on and WorkBuddy running when the time comes, per the automation docs. Automation runs also use WorkBuddy credits; see its credits page.
2. The PublishPort desktop app, signed in to the three platforms. Install it from the download page, open Platform accounts, and sign in to Bluesky and Threads in the window that opens (walkthrough). Mastodon is the odd one: there’s no single mastodon.com, so the account lives on a particular server. Give the AI your server’s address, as in the recipe, and the Mastodon sign-in opens that server’s login page for you.
3. Node.js and an empty folder. The publishing command runs on Node.js: check node -v, or install the LTS release from nodejs.org. Make a folder called posts with a queue folder inside, and write your first post.
A post file is plain text. The first lines are optional settings, then a line with ---, then the post:
image: images/desk.png
cw: Work talk
---
Shipped the new importer today. The part that took longest was not the code, it was deciding what to do with half-valid rows. Answer: show them, don't drop them.
image (one file, optional) and cw (a content warning for Mastodon, optional) can be left out. If you leave out the --- line, the whole file is the post.
Step 1: What each platform’s command can do
Check this before you write your queue (checked against the PublishPort command set, publishport-opencli 1.0.40):
| Bluesky | Mastodon | Threads | |
|---|---|---|---|
| Text length | 300 characters | 500 by default; your server may differ | Check the platform’s current cap |
| Images | Up to 4, JPG/PNG/GIF/WebP, 1 MB each | Up to 4, plus video | One image |
| Content warning | No | Yes | No |
| Visibility choice | No | Public, unlisted, followers-only, direct | No |
| Scheduled time on the platform | No | No | No |
Two things to plan around:
- Length. Bluesky’s cap is the tight one. The command refuses anything over 300 characters rather than cutting it. That’s why the recipe tells the AI to write a shortened Bluesky version and show it to you before the first post goes out. Mastodon’s documentation says the default is 500 characters and an instance can change it.
- Links and hashtags on Bluesky. Bluesky stores links and tags as separate “facets” attached to the text, and the Bluesky command sends the text only. So a link in your post may appear as plain, untappable text there. Watch for this in your first run, and if it matters, keep the link on Mastodon and Threads and make the Bluesky version stand on its own.
None of the three platforms has a scheduled-time option in these commands, which is fine: the timing comes from the WorkBuddy automation, and each post goes out when it runs.
Step 2: Supervised first run
Open WorkBuddy, start a new task, choose the posts folder as the workspace, and paste the recipe. The workspace is the folder the task reads and writes, per the permission docs. What happens next:
- WorkBuddy installs the PublishPort skill and runs the login. Under Default Permissions it asks you to confirm before running commands. Confirm while you’re watching.
- It gives you an authorization link and a confirmation code. Open the link, sign in or create a PublishPort account, check the code matches and click Authorize. The link lasts 10 minutes; ask for a new one if it expires.
- It checks your computer and tells you which of the three platforms show as signed in. For any that doesn’t, sign in again and ask it to re-check.
- It reads your oldest post and shows you the exact text for each platform, including the shortened Bluesky version. Edit freely, then approve.
- It publishes to the three platforms one after another and verifies each by looking the post up. You get three links. Click all three.
Seeing the same post live on all three is your proof that the chain works.
Step 3: Create the weekday automation
In WorkBuddy open Automation in the sidebar and create a new one (the docs describe hourly, daily, weekly and one-time schedules; button names shift between versions). Or ask WorkBuddy to set it up, as the last line of the recipe does. Pick the posts folder as the workspace and a weekday 10:00 schedule. If your version only offers daily, use that and the prompt below skips weekends itself.
Name it weekday-posts and paste:
This is a pre-approved publishing task. Publish without asking me to confirm, but only as the rules below allow.
1. If today is Saturday or Sunday, stop.
2. Look in queue/ for .md files. If there are none, write "queue empty" and stop.
3. Take the oldest one by file name. If log.md already has a line dated today, stop: one post per day.
4. Read it. Lines before the "---" line are settings (image, cw); the rest is the post. For each of Bluesky, Mastodon and Threads, run `publishport guide <platform>` to read the current options.
5. Bluesky allows 300 characters. If the post is longer, write a shorter version of the same point for Bluesky only. Never add claims, links or hashtags that are not in the original. Mastodon and Threads get the original text.
6. Publish to Bluesky, then Mastodon, then Threads, one after another. Use the absolute path for the image if there is one. If cw is set, use it as the Mastodon content warning.
7. If any command fails or times out, do NOT run it again. Look at that account's latest posts first and retry once only if the post is not there. Never publish the same post twice.
8. Verify each post exists. Move the file to posted/ only if all three succeeded; otherwise leave it in queue/. Append one line to log.md: date, file name, the links that worked, and which platform failed, if any.
9. Give me a two-line summary.
Then run it once by hand if the app offers a test run. The “one post per day” rule will stop a second run on the same day, so for a test, add a second post to queue/ and delete today’s line from log.md first. WorkBuddy’s own advice is to start a new automation at low frequency; running it on only a few days at first is a good way to do that.
The rules in the prompt are the point. Each run starts cold and nobody is watching, so permission to publish has to be written into it (PublishPort’s skill otherwise has the AI show you the content before the first publish of a session). The guards (one a day, never blindly retry, only move the file after all three succeed) keep a bad morning from turning into a duplicate post.
Step 4: Watch the first scheduled run
Under Default Permissions, WorkBuddy pauses for confirmation before running commands, and publishing is done by commands. Nobody is there to click on an automated run. So be at the computer for the first scheduled run and open the run record:
- It finished and the posts are live: you’re done.
- It stopped at a confirmation: you need to allow command execution for this task. The permission dropdown under the new-task input offers Full Access. WorkBuddy’s docs say to use it only for trusted, recoverable work in an isolated folder. The
postsfolder holds nothing but drafts and a log, which fits; don’t point a Full Access task at your Documents folder.
Your weekly rhythm
- Whenever you have a thought: save it as a file in
queue/. Name them01-…,02-…if order matters. - Every weekday: one post goes out on all three. Skim
log.mdor the summary. - Sunday, 5 minutes: count what’s left in
queue/. Under five means it’s time to write.
If you also want to steer it from your phone, WorkBuddy’s Assistant takes messages from apps such as Slack, Telegram and Discord and runs them on your computer, so “skip today’s post” works from anywhere. The computer still has to be on.
If something doesn’t run
- Nothing was posted today: the computer was asleep, or WorkBuddy wasn’t running. Check the automation’s run history.
- The AI says no device is online: the PublishPort app isn’t running. It normally starts with your computer; start it by hand if not.
- One platform says you’re signed out: sessions expire. Sign in again and ask the AI to retry that platform only. The log shows which one failed.
- Bluesky rejects the post: it’s over 300 characters. Check that rule 5 is in your prompt.
- Mastodon posts on the wrong server: say the server address explicitly in the prompt, e.g. “my Mastodon account is on fosstodon.org”.
- A link on Bluesky isn’t tappable: expected, see step 1.
- The run stalls on a confirmation: see step 4.
Taking it further
Posting is half the job. Once posts are flowing, the per-platform details are in the guides for Bluesky, Mastodon and Threads. Then add a weekly analytics review to see which posts landed, and use that to decide what to write next week.
The free plan covers setting this up; plan limits and pricing are on the pricing page.
