myna: 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.
36 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.
A newsletter, from the same terminal
myna newsletter create --list moshcode < issue.md writes the issue;
myna newsletter send mails it through your own SMTP server, a daily cap at a time,
and picks up where it stopped without mailing anyone twice. Every issue carries a one-click
unsubscribe (the header Gmail and Apple Mail turn into a button, and a link in the footer)
and your postal address. The unsubscribe page is hosted here and never sees an address.
Logging in, honestly
Most tools are vague about this, so here it is plainly. myna login <network>
asks for whatever that network actually accepts.
6 take a real password
Bluesky, Reddit, Lemmy, Matrix, Mattermost, WordPress.
You type a username and a password and you are in. Use an app password where the network offers one.
2 show you a code to approve
tsbb, Agentic Jobs.
The board prints a short code, you approve it in a browser, and it hands myna a token. No password crosses the terminal and no local port has to be free.
11 need a browser sign-in
X, Facebook, Instagram, Threads, LinkedIn, Pinterest, TikTok, YouTube, Mastodon, Pixelfed, bl0ggers.
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.
36 networks
| Command | Network | Login | Where the keys come from | Chars |
|---|---|---|---|---|
x |
X | browser sign-in | developer.x.com | 280 |
facebook |
browser sign-in | developers.facebook.com | 63206 | |
instagram |
browser sign-in | developers.facebook.com | 2200 | |
threads |
Threads | browser sign-in | developers.facebook.com | 500 |
bluesky |
Bluesky | username + password | bsky.app | 300 |
reddit |
username + password | reddit.com | 40000 | |
linkedin |
browser sign-in | linkedin.com | 3000 | |
pinterest |
browser sign-in | developers.pinterest.com | 500 | |
tiktok |
TikTok | browser sign-in | developers.tiktok.com | 2200 |
youtube |
YouTube | browser sign-in | console.cloud.google.com | 10000 |
mastodon |
Mastodon | browser sign-in | docs.joinmastodon.org | 500 |
misskey |
Misskey | paste a token | misskey-hub.net | 3000 |
pixelfed |
Pixelfed | browser sign-in | docs.joinmastodon.org | 2000 |
lemmy |
Lemmy | username + password | join-lemmy.org | — |
nostr |
Nostr | paste a token | nostr.how | — |
tsbb |
tsbb | approve a code | tsbb.dev | — |
agenticjobs |
Agentic Jobs | approve a code | agenticjobs.work | 600 |
moltbook |
Moltbook | paste a token | moltbook.com | 40000 |
colony |
The Colony | paste a token | thecolony.cc | 50000 |
4claw |
4claw | paste a token | 4claw.org | — |
moltexchange |
MoltExchange | paste a token | api.moltexchange.ai | — |
ugig |
ugig.net | paste a token | ugig.net | 5000 |
telegram |
Telegram | paste a token | t.me | 4096 |
discord |
Discord | paste a token | support.discord.com | 2000 |
slack |
Slack | paste a token | api.slack.com | 40000 |
matrix |
Matrix | username + password | matrix.org | — |
mattermost |
Mattermost | username + password | developers.mattermost.com | 16383 |
devto |
dev.to | paste a token | dev.to | — |
hashnode |
Hashnode | paste a token | hashnode.com | — |
ghost |
Ghost | paste a token | ghost.org | — |
wordpress |
WordPress | username + password | developer.wordpress.org | — |
microblog |
Micro.blog | paste a token | micro.blog | — |
tumblr |
Tumblr | app keys | tumblr.com | — |
gitblog |
Git blog | files on this machine | github.com | — |
htmlblog |
HTML blog | files on this machine | github.com | — |
bl0ggers |
bl0ggers | browser sign-in | bl0ggers.com | — |
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
What myna does
myna is a social media manager by Profullstack that runs on your own computer. You connect your social accounts once, write a post once, and myna publishes it to the networks you pick, now or on a schedule, each version fitted to that network. Your accounts and access tokens stay in an encrypted vault on your machine.
Optionally, myna can connect to Google Calendar: it then adds an event for each post you
schedule to your calendar, updates it if you move the post and deletes it if you cancel. You can also add
events and see your upcoming ones from the terminal (myna calendar add, myna calendar list).
It asks only for permission to manage events and to list your calendars so you can choose one, and never
stores or uploads your events. See exactly what myna does with Google data in the
privacy policy.