Echowide

Cross-posting for creators

Post once, echo wide.

Lands onX, Bluesky, Threads, Mastodon, LinkedIn, Facebook, Instagram, YouTube Shorts, TikTok

Post where you already like posting. We republish it everywhere else you keep an audience, and tell you plainly what landed.

Connect an accountNothing publishes until you switch a flow on.
One post, three destinationswhere you actwhat we do
Origin · Bluesky@mara.dev

Spent the morning reading the firehose. Every post on the network, arriving as it happens. Still the most underrated thing about this place.

14:02:11 · you posted this

Mastodonpublished0.4s
Xpublished0.9s
Threadspublished, image remuxed1.2s

An illustration. The timings are the shape of a real delivery: Bluesky and Mastodon push to us on an open socket, so detection costs nothing and what is left is one write per destination. A poller would still be waiting.

platforms, with their real limits held in one file
10platforms, with their real limits held in one file
to Bluesky and Mastodon, on a socket we keep open
0.4sto Bluesky and Mastodon, on a socket we keep open
characters, the widest limit the splitter works to
63,206characters, the widest limit the splitter works to

How it works

Three steps, and only one of them is yours.

  1. ORIGIN
    01

    Connect an account

    Pick the account you post from and the ones you want it echoed to. Bluesky takes an app password, the rest use OAuth. Nothing publishes until you switch a flow on.

  2. 129 / 300Post
    02

    Post as you always do

    Keep posting where you like posting. We notice it there. Or compose here once and send it out to every destination together. This step is the only one that is yours.

  3. you postbluesky 0.4 sthreads 41 sx skipped
    03

    Watch it land everywhere

    Each destination reports back in a sentence you can act on: when it arrived, or why it did not. Not a spinner, and not a dashboard you have to refresh.

Why it is faster

We hold the socket open.

A tool running on serverless functions cannot keep a connection to anything. It wakes on a timer, asks each of your accounts whether something happened, and goes back to sleep. A shorter timer is then something it can sell you. We run one long-lived process on our own hardware, so on the platforms that push, there is no timer to shorten.

Time from your post to the first echoboth bars, one scale
Polling, whoever is doing itup to 5 min

What a serverless competitor does for every account you own, including the two that could have pushed. The wait is the poll interval, and the shorter one is a paid tier.

Echowide on Bluesky and Mastodonunder 1 sec

Bluesky's Jetstream firehose and Mastodon's streaming API push each new post to a socket we already have open. Included on every plan, because it costs us less than polling did.

01m2m3m4m5m

One second is 0.33% of five minutes. At this width the teal bar is about three pixels, and that is the honest drawing of it — not a shortened bar standing in for a shorter wait.

Where the sub-second figure applies

Bluesky and Mastodon only. Those are the two platforms that hand us a stream. On X, Threads, Instagram, YouTube Shorts, TikTok and Twitch there is no free push to subscribe to, so we poll — tightening the interval after a burst of activity and backing off while an account is quiet. That is fast. It is not instant, and we will not print “instant” next to it.

Fail closed

We would rather miss a post than publish one you did not mean to share.

A missed cross-post is one click to fix. An unwanted one is public, permanent, and occasionally a disclosure problem. So when a rule cannot decide, the answer is no — and the ledger tells you which rule decided it and why.

  • bluesky09:14

    Rough cut of the cover, still deciding on the type #noferry

    Skipped#noferry — skipped, as you asked

    Anywhere in the post, in any case. You can set a phrase of your own instead, and it works the same way.

  • bluesky11:02

    Completely agree with this — @someone else said it better than I could

    SkippedReply to @someone else — not carried

    A reply drags a stranger's context to an audience that cannot see it. Replies inside your own thread are carried.

  • instagram16:47

    Two weeks with the new pack and it has not let me down #ad

    SkippedContains #ad — skipped by default

    A disclosure that fails to travel with the post is a regulatory problem, not a styling one. You can turn this off per flow. It is never off to start with.

Before anything goes out

A dry run shows exactly what would publish, to which accounts, split into which threads. Flows start switched off. You turn one on when the preview is what you expected, and not before.

And never twice

Each delivery is recorded against the post that caused it, so a retry after a platform outage cannot double-post. An edit is matched by content hash: the same post does not go out again wearing new words.

Every rule, in full

#noferry, or a phrase you choose
Skipped, case-insensitive, anywhere in the post.
A reply to someone else
Skipped. Replies inside your own thread carry through.
A quote of someone else
Skipped. Quoting yourself is carried.
#ad or #BrandPartner
Skipped by default, and never off to start with.
Over the character limit
Skipped, unless you asked for threads on that platform.
An edit of something already sent
Matched by content hash. The same post never goes twice.
Instagram trial reels
Skipped. They are hidden from your own followers on purpose.
Composed in Echowide
Never ingested back in. The tool does not feed itself.

Platforms

10 platforms, and the limits that come with them.

These are the exact numbers the rules engine works from, read from the one file that holds them. A post that will not fit is stopped here, before a platform rejects it out there. 2 of the 10 push their posts to us; the rest are polled.

  • Xpolled

    280 characters

    No free push exists here, so we poll adaptively.

  • Blueskyreal-time

    300 characters

    The platform pushes; we hear it in under a second.

  • Threadspolled

    500 characters

    No free push exists here, so we poll adaptively.

  • Mastodonreal-time

    500 characters

    The platform pushes; we hear it in under a second.

  • LinkedInpolled

    3,000 characters

    No free push exists here, so we poll adaptively.

  • Facebookpolled

    63,206 characters

    No free push exists here, so we poll adaptively.

  • Instagrampolled

    2,200 characters

    No free push exists here, so we poll adaptively.

  • YouTube Shortspolled

    no text limit

    No free push exists here, so we poll adaptively.

  • TikTokpolled

    2,200 characters

    No free push exists here, so we poll adaptively.

  • Twitchpolled

    no text limit

    No free push exists here, so we poll adaptively.

Substack is missing on purpose. The only way to post there is a session cookie that grants full access to your account, expires without warning, and sits outside their terms. We would rather be one platform short.

Post once. Echo wide.

Connect one account, make one post, and watch the ledger fill in. Switch the flow on when you are satisfied it does what you expected, and not before.

Nothing publishes until you switch a flow on.