myna

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                          │        │
│        │                                                                        │        │
│        │                                                                        │        │
│        │                                                                        │        │
│        ╰────────────────────────────────────────────────────────────────────────╯        │
│                                                                                          │
╰──────────────────────────────────────────────────────────────────────────────────────────╯
Two things worth knowing before you plan a workflow. Facebook and Instagram cannot post to a personal profile at all — Facebook needs a Page you administer, Instagram a Business or Creator account linked to one. And Reddit script apps and Mastodon's password grant are both refused on accounts with two-factor enabled; those fall back to a token.

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

Major 9 Fediverse 7 Forums 7 Chat 5 Long-form 8
CommandNetworkLoginWhere the keys come fromChars
x X browser sign-in developer.x.com 280
facebook Facebook browser sign-in developers.facebook.com 63206
instagram 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 Reddit username + password reddit.com 40000
linkedin LinkedIn browser sign-in linkedin.com 3000
pinterest 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.