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.

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                          
                                                                        
                                                                        
                                                                        
╰────────────────────────────────────────────────────────────────────────╯
│                                                                                          │
╰──────────────────────────────────────────────────────────────────────────────────────────╯
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.

25 networks

Major 8 Fediverse 5 Forums 2 Chat 5 Long-form 5
CommandNetworkLoginChars
x X browser sign-in 280
facebook Facebook browser sign-in 63206
instagram Instagram browser sign-in 2200
threads Threads browser sign-in 500
bluesky Bluesky username + password 300
reddit Reddit username + password 40000
linkedin LinkedIn browser sign-in 3000
pinterest 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