Cross-posting for creators
Post once. We cross-post it.
Keep posting where you already post — each new post lands on up to twelve other places, fastest on Bluesky and Mastodon.
X, Bluesky, Threads, Mastodon, LinkedIn, Facebook, Instagram, YouTube Shorts, TikTok, Discord, Telegram and Nostr.
Nothing publishes until you switch a flow on.
Spent the morning reading the firehose. Every post on the network, as it happens.
14:02:11 · you posted this
An illustration. The handle is invented and no real post has travelled this route.
- destinations, one post
- 12destinations, one post
- places you can post from
- 5places you can post from
- that push straight to us*
- 2that push straight to us*
* Bluesky and Mastodon push to us. Everywhere else we poll, which is fast, not instant.
The problem
Five tabs, one video.
Posting one clip everywhere means five uploads and five captions rewritten by hand.
Illustration. The captions below are sample text.
- Bluesky
Three months of cutting this down to ninety seconds.
rewrite to 300 chars
- Mastodon
Three months of cutting this down to ninety seconds. Full notes in the thread.
rewrite to 500 chars
- Threads
Three months of cutting this down to ninety seconds — here it is.
rewrite to 500 chars
- Instagram
Three months of cutting this down to ninety seconds.
rewrite to 2,200 chars
- LinkedIn
Three months of cutting this down to ninety seconds. What I learned, in order.
rewrite to 3,000 chars
Five tabs · five uploads of the same file · five captions cut to five limits.
once, as normal
- Every destination you switched on
How it works
Three steps, one is yours.
- 01
Connect the accounts you keep
One origin, as many destinations as you like.
- 02
Post exactly as you do now
Keep posting where you like. This step is yours.
- 03
Watch it land everywhere
When it arrived, or which rule stopped it.
One post, every platform
The same post, six ways.
Below is a 611-character message and exactly what our splitter does with it at each destination’s own limit.
After three months of rebuilding the workshop, the frame jig is finally square. I measured it four ways and it holds to a tenth of a millimetre over the full length, which is better than the shop I trained in ever managed. First frame off it is a fillet-brazed road bike for a rider in Ghent. Slack head angle, long chainstays, clearance for 32mm tyres. I am writing the whole build up as I go: the mitres, the fixtures I had to make first, and the two things I got wrong and had to redo. If you want the long version, with the drawings and every measurement, it goes out on the newsletter on Friday morning.
- X280 max
3 posts
- 1/3222/280
After three months of rebuilding the workshop, the frame jig is finally square. I measured it four ways and it holds to a tenth of a millimetre over the full length, which is better than the shop I trained in ever managed.
- 2/3266/280
First frame off it is a fillet-brazed road bike for a rider in Ghent. Slack head angle, long chainstays, clearance for 32mm tyres. I am writing the whole build up as I go: the mitres, the fixtures I had to make first, and the two things I got wrong and had to redo.
- 3/3119/280
If you want the long version, with the drawings and every measurement, it goes out on the newsletter on Friday morning.
Split into 3 parts, posted as one native thread.
- Bluesky300 max
3 posts
- 1/3293/300
After three months of rebuilding the workshop, the frame jig is finally square. I measured it four ways and it holds to a tenth of a millimetre over the full length, which is better than the shop I trained in ever managed. First frame off it is a fillet-brazed road bike for a rider in Ghent.
- 2/3196/300
Slack head angle, long chainstays, clearance for 32mm tyres. I am writing the whole build up as I go: the mitres, the fixtures I had to make first, and the two things I got wrong and had to redo.
- 3/3119/300
If you want the long version, with the drawings and every measurement, it goes out on the newsletter on Friday morning.
Split into 3 parts, posted as one native thread.
- Mastodon500 max
2 posts
- 1/2490/500
After three months of rebuilding the workshop, the frame jig is finally square. I measured it four ways and it holds to a tenth of a millimetre over the full length, which is better than the shop I trained in ever managed. First frame off it is a fillet-brazed road bike for a rider in Ghent. Slack head angle, long chainstays, clearance for 32mm tyres. I am writing the whole build up as I go: the mitres, the fixtures I had to make first, and the two things I got wrong and had to redo.
- 2/2119/500
If you want the long version, with the drawings and every measurement, it goes out on the newsletter on Friday morning.
Split into 2 parts, posted as one native thread.
- Discord2000 max
1 post
- 1/1611/2000
After three months of rebuilding the workshop, the frame jig is finally square. I measured it four ways and it holds to a tenth of a millimetre over the full length, which is better than the shop I trained in ever managed. First frame off it is a fillet-brazed road bike for a rider in Ghent. Slack head angle, long chainstays, clearance for 32mm tyres. I am writing the whole build up as I go: the mitres, the fixtures I had to make first, and the two things I got wrong and had to redo. If you want the long version, with the drawings and every measurement, it goes out on the newsletter on Friday morning.
Fits whole, exactly as written.
- LinkedIn3000 max
1 post
- 1/1611/3000
After three months of rebuilding the workshop, the frame jig is finally square. I measured it four ways and it holds to a tenth of a millimetre over the full length, which is better than the shop I trained in ever managed. First frame off it is a fillet-brazed road bike for a rider in Ghent. Slack head angle, long chainstays, clearance for 32mm tyres. I am writing the whole build up as I go: the mitres, the fixtures I had to make first, and the two things I got wrong and had to redo. If you want the long version, with the drawings and every measurement, it goes out on the newsletter on Friday morning.
Fits whole — and LinkedIn has no thread, so anything longer is held back.
- Telegram4096 max
1 post
- 1/1611/4096
After three months of rebuilding the workshop, the frame jig is finally square. I measured it four ways and it holds to a tenth of a millimetre over the full length, which is better than the shop I trained in ever managed. First frame off it is a fillet-brazed road bike for a rider in Ghent. Slack head angle, long chainstays, clearance for 32mm tyres. I am writing the whole build up as I go: the mitres, the fixtures I had to make first, and the two things I got wrong and had to redo. If you want the long version, with the drawings and every measurement, it goes out on the newsletter on Friday morning.
Fits whole, exactly as written.
Sample content — the workshop and the rider are invented, the split is not.
Every part above was produced by the same splitter the publish pipeline calls, at the limits in the file the rules engine reads.
Short-form video
One clip, three vertical feeds.
The same video reaches TikTok, Instagram Reels and YouTube Shorts, cut to each one’s documented cap.
An illustration — one stock still standing in for the clip, in all three frames.
The caps are read from the same file the transcoder targets; no counts are shown, because we have none.
Why it is faster
Under a second on two platforms.
We hold the socket open, so there is no timer to wake and nothing to ask.
The wait is the poll interval, and a shorter one is a paid tier.
A socket we already have open, not an alarm clock we set.
* Sub-second on Bluesky and Mastodon — the 2 platforms that push to us.
Everywhere else we poll. That is fast, and it is never called instant.
What’s supported
Every platform, every limit.
Filter it, sort it, open a row — these are the numbers the rules engine works from.
| 300 | native threading | 3 min | real-time | an origin | a destination | |
We hold a socket open, so your post reaches us as you publish it. | ||||||
| 2,000 | not native threading | — | not read | not an origin | a destination | |
A destination. We publish to it and never read from it. | ||||||
| 63,206 | not native threading | — | not read | not an origin | a destination | |
A destination. We publish to it and never read from it. | ||||||
| 2,200 | not native threading | 15 min | held | not an origin | a destination | |
We can read it and do not: its API will not say whether a post was public. | ||||||
| 3,000 | not native threading | — | not read | not an origin | a destination | |
A destination. We publish to it and never read from it. | ||||||
| 500 | native threading | — | real-time | an origin | a destination | |
We hold a socket open, so your post reaches us as you publish it. | ||||||
| no limit | native threading | — | not read | not an origin | a destination | |
A destination. We publish to it and never read from it. | ||||||
| 4,096 | not native threading | — | not read | not an origin | a destination | |
A destination. We publish to it and never read from it. | ||||||
| 500 | native threading | 5 min | held | not an origin | a destination | |
We can read it and do not: its API will not say whether a post was public. | ||||||
| 2,200 | not native threading | 10 min | held | not an origin | a destination | |
We can read it and do not: its API will not say whether a post was public. | ||||||
| no limit | not native threading | 1 min | polled | an origin | not a destination | |
No push feed exists here, so we poll on a tightening interval and echo on the next pass. | ||||||
| 280 | native threading | — | polled | an origin | a destination | |
No push feed exists here, so we poll on a tightening interval and echo on the next pass. | ||||||
| no limit | not native threading | 3 min | polled | an origin | a destination | |
No push feed exists here, so we poll on a tightening interval and echo on the next pass. | ||||||
Sorted by platform, ascending. 13 of 13 platforms shown.
Unverified image caps stay blank on purpose — a guessed limit silently drops pictures.
Read from the same file the rules engine reads.
Fail closed
We would rather miss it.
A missed post is one click to fix. An unwanted one is public and permanent.
- bluesky09:14
Rough cut of the cover, still deciding on the type #noferry
Skipped#noferry — skipped, as you askedAnywhere in the post, in any case. Or set a phrase of your own.
- bluesky11:02
Completely agree with this — @someone else said it better than I could
SkippedReply to @someone else — not carriedReplies inside your own thread are carried. Other people's are not.
- instagram16:47
Two weeks with the new pack and it has not let me down #ad
SkippedContains #ad — skipped by defaultA disclosure that fails to travel is a regulatory problem. Off per flow.
Everything that stops a post
- #noferry, or your own phrase
- Replies to other people
- Quotes of other people
- #ad or #BrandPartner
- Over the character limit
- Edits of something already sent
- Instagram trial reels
- Anything composed in Echowide
Flows start switched off. A dry run shows what would publish, before it does.
The product
See it working
- Mastodon@mara@hachyderm.ioOn
- X@maraOn
- Threads@mara.devOn
- LinkedIn@mara-devlinOff
- Thread posts that do not fit
- Skip anything tagged #ad
- Also skip #pressonly
Pick where you post, then pick where it lands. Toggle any destination off.
Sample content — these creators are fictional.
The whole list
Everything, and where it stands.
Nothing hidden, including the parts we are still building and the ones waiting on a platform.
- Live
- Built, needs your credentials
- In progress
- Planned
- Not supported, on purpose
Platforms
- Live
Cross-post from Bluesky and Mastodon, as you publish
- Live
Publish to Bluesky, Mastodon, Discord, Telegram and Nostr
- Built, needs your credentials
Publish to X, Threads, LinkedIn, Facebook, Instagram, YouTube Shorts and TikTok
- Built, needs your credentials
Cross-post from X, YouTube Shorts and Twitch, polled
Adaptive interval, cursor kept per account, first pass never back-fills.
- Not supported, on purpose
Cross-post from Threads, Instagram and TikTok
Their read API will not say whether a post was public, and the engine will not guess. They stay destinations.
- Not supported, on purpose
Substack
Its only write path is a session cookie granting full account access.
What happens to a post
- Live
Sync flows — one origin, any destinations, switched per platform
- Live
Fail-closed rules engine — twenty reasons a post is held back
- Live
Custom skip phrase, per flow
- Live
Sponsored and #ad posts skipped by default
- Live
Thread splitting on X, Bluesky, Threads, Mastodon and Nostr
Grapheme-accurate, never breaks a word or a URL.
- Live
Dry run — what would publish, before anything does
On the compose screen, running the real rules engine and never a write endpoint.
- Live
Video transcoding to each destination's own cap
Probe, remux and re-encode, one at a time. A video we cannot carry leaves the text intact.
- Live
Compose inside Echowide, every limit counted at once
Every destination previewed as you type, with the real split, not a warning.
- Live
Scheduling and a planner calendar
Your own time zone, with both daylight-saving boundaries decided rather than guessed.
What you can see
- Live
Delivery ledger — every destination, and the reason for every skip
- Live
Retries that cannot double-post
- Live
Resume a part-sent thread where it stopped
- Live
Creator analytics — reach and delivery outcomes per flow
- Live
Accounts, flows, dashboard and ledger screens
- Planned
A live ledger that updates without a refresh
- Planned
A public status page
Trust and operations
- Live
Encrypted credential vault, keys you can revoke yourself
AES-256-GCM, fresh IV per write, nothing readable in a stolen database dump.
- Live
Admin panel — users, queue, content, audit log and site settings
Operator surface, not a creator one.
- Live
Visitor analytics, heatmaps, error and log capture
Nothing a person typed is stored, and Do Not Track ends the request.
- Live
An MCP endpoint for Claude, Codex and Cursor
Every write tool is a dry run unless the caller passes `confirm: true`.
- Planned
Team workspaces
- Planned
Paid plans and billing
Needing your credentials means the code is written and tested, and the platform has not yet approved a developer application.
All thirteen platforms are read from one file, which is the same file the rules engine reads.
Pricing
Priced per person.
Start free with no card, no trial clock and no expiry date on the free plan.
Free
forever$0 — free for as long as you use it
One origin, two destinations, fifty cross-posts a month. No card, no trial clock, no expiry.
Solo
Most picked/ month$9 / month
One person posting everywhere they keep an audience, video included.
Studio
/ month$19 / month
A few brands or side projects run from one account, with an API behind them.
Agency is $39 a month. Instant sync and the fail-closed rules engine are on every plan, including free.
Questions
The awkward ones first.
What we refuse to do is as much a feature as what we send.
Its only write path is a raw session cookie granting full account access, outside Substack's own terms.
We will not ask you for one.
We retry, and every delivery is keyed to one post and one account, so a retry cannot double-post.
The ledger shows the attempt and the platform's own reason.
OAuth tokens, and for Bluesky an app password you can revoke without touching your real one.
Encrypted at rest, never written to a log, never passed on an argument.
No — Twitch is a source only, and we read Featured clips from it.
We never publish to it, because nothing we send would belong in a channel feed.
Only when it has to be, and then to each destination's own documented cap.
One transcode runs at a time, so a long upload cannot hold up everyone else's.
Start with one account.
Fifty cross-posts a month on the free plan, with no card and no expiry date.
Nothing publishes until you switch a flow on.