Post to every network
from your terminal.
myna is a social media manager that lives where you already work. Connect an account, write once, and it goes everywhere — tailored to each network's limits, not truncated to the smallest one.
curl -fsSL https://mynaposter.com/install.sh | sh
A single binary with its runtime built in — no Bun, Node or npm needed.
Linux, macOS and Windows. Already have a package manager?
bun add -g @profullstack/myna.
Read the script before you pipe it, as you should with any of these.
25 networks. Credentials encrypted on your own machine. MIT.
compose accounts queue history feed networks help all 5 ╭─ Compose ───────────────────────────────────────────────────────────╮ ╭─ Goes to ────────────────────────╮ │ myna posts to every network I use from one terminal window. │ │ bluesky:alice.bsky… 160/300 │ │ │ │ mastodon:@alice@ha… 160/500 │ │ One command, tailored per network. It reads a link and drafts the … │ │ x:@alicechen 161/280 │ │ │ │ reddit:u/alicechen 160/40000 │ │ https://mynaposter.com │ │ nostr:npub1a4k… 160 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ written from the link, edit before posting │ │ │ ╰─────────────────────────────────────────────────────────────────────╯ ╰──────────────────────────────────╯ ╭─ Command ────────────────────────────────────────────────────────────────────────────────────────────────╮ │ /link https://example.com/blog/shipping-myna │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯ myna / for commands Enter to edit the post Ctrl+S to send accounts 5
The right pane counts the way each network counts. X reads one character higher than the others here because it bills every URL at 23 characters regardless of length.
One post, every network
Character limits, URL weighting, threads where they exist and truncation where they do not. A 900-character post becomes a four-part thread on Bluesky, one post on Mastodon, and an article on your blog.
Schedule and forget
myna schedule "tomorrow 9am" queues it. The scheduler sends it while the TUI is
open, or run myna run as a daemon and close the terminal.
Read back
Home timelines, mentions, per-post engagement, and a history of exactly what landed and what failed — with the error, not a shrug.
Logging in, honestly
Most tools are vague about this, so here it is plainly. myna login <network>
asks for whatever that network actually accepts.
8 take a real password
Bluesky, Reddit, Mastodon, Pixelfed, Lemmy, Matrix, Mattermost, WordPress.
You type a username and a password and you are in. Use an app password where the network offers one.
7 need a browser sign-in
X, Facebook, Instagram, Threads, LinkedIn, Pinterest, TikTok.
Not a limitation of myna. These removed password APIs years ago, and scraping a login session breaks without warning and violates their terms. myna does a normal OAuth round trip through your browser instead.
╭─ myna ───────────────────────────────────────────────────────────────────────────────────╮ │ Conne╭─────────────────────────── Connect Bluesky ────────────────────────────╮ │ │ │ │ │ │ │ Create an App Password at Settings, Privacy and Security, App │ │ │ │ Passwords. Your main password works but is a bad idea. │ │ │ │ │ │ │ │ Handle * alice.bsky.social │ │ │ │ App password * ••••••••••••••••••• │ │ │ │ PDS https://bsky.social │ │ │ │ │ │ │ │ Tab next field Enter connect Esc cancel │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰────────────────────────────────────────────────────────────────────────╯ │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────╯
A TUI and a CLI, same commands
Every slash command in the TUI is also a subcommand, so anything you can do by hand you can put in a script or a cron job.
myna # the TUI
myna login bluesky # connect an account
myna post all "the release notes are up"
echo "shipping today" | myna post bluesky,mastodon
myna link https://example.com/post --to all
myna schedule "tomorrow 9am" "good morning" --to mastodon
myna accounts --json | jq '.[].id'
An optional writer
Paste a link and myna reads the page and drafts a post about it, with hashtags that suit each network and none where they would look out of place. It drafts; you edit; you post. It never posts on its own.
Anthropic by default, or OpenAI, or a local model through Ollama. Turned off entirely unless you configure a provider — myna is a perfectly good poster without it.
Infographics with real text
The model picks the copy; myna renders the graphic. The words on the image are exactly the words in the copy.
This is not a stylistic choice. Ask an image model to draw a chart with labels and it rewrites the labels: invented figures, misspelled names, quotes nobody said. Separating the two removes that failure rather than hoping against it.
25 networks
| Command | Network | Login | Chars |
|---|---|---|---|
x |
X | browser sign-in | 280 |
facebook |
browser sign-in | 63206 | |
instagram |
browser sign-in | 2200 | |
threads |
Threads | browser sign-in | 500 |
bluesky |
Bluesky | username + password | 300 |
reddit |
username + password | 40000 | |
linkedin |
browser sign-in | 3000 | |
pinterest |
browser sign-in | 500 | |
tiktok |
TikTok | browser sign-in | 2200 |
mastodon |
Mastodon | username + password | 500 |
misskey |
Misskey | paste a token | 3000 |
pixelfed |
Pixelfed | username + password | 2000 |
lemmy |
Lemmy | username + password | — |
nostr |
Nostr | paste a token | — |
telegram |
Telegram | paste a token | 4096 |
discord |
Discord | paste a token | 2000 |
slack |
Slack | paste a token | 40000 |
matrix |
Matrix | username + password | — |
mattermost |
Mattermost | username + password | 16383 |
devto |
dev.to | paste a token | — |
hashnode |
Hashnode | paste a token | — |
ghost |
Ghost | paste a token | — |
wordpress |
WordPress | username + password | — |
microblog |
Micro.blog | paste a token | — |
tumblr |
Tumblr | app keys | — |
Where your credentials live
In ~/.config/myna/vault.json, encrypted with AES-256-GCM, on your machine. There is
no myna account and no server in the path. The only thing that leaves your computer is the post
you asked to send.
curl -fsSL https://mynaposter.com/install.sh | sh