Releases: profullstack/mynaposter
Release list
myna 0.3.2
A clipped copy of the sign-in link no longer breaks it
In paste mode the authorize link is copied out of a terminal by hand. A selection that stopped one character short sent LinkedIn scope=w_member_socia, which it refused as an unknown scope, because scope was the last parameter on the link. state is last now: clipping it costs nothing in paste mode, and loopback mode never copies the link. The callback page on mynaposter.com also decodes the provider's HTML-escaped error text. (#9)
Full changelog: v0.3.1...v0.3.2
myna 0.3.1
LinkedIn signs in through a fixed HTTPS callback
LinkedIn only accepts absolute HTTPS redirect URLs, so the loopback address every other OAuth network can use was never going to work for it. The LinkedIn app is now registered with one URL, https://mynaposter.com/api/linkedin/callback, and every LinkedIn sign-in ends on that page, which shows the code to paste back into myna. The exchange still happens on your machine with the client secret. The login prompt no longer asks whether the browser is elsewhere, since for LinkedIn there is only this route, and its note says which URL to register on the app. (#7)
Full changelog: v0.3.0...v0.3.1
myna 0.3.0
Repost from any account
myna repost <account> <post url or id>
A retweet on X, a boost on Mastodon and Pixelfed, a repost on Bluesky. Paste the post URL as copied from the network, or its native id. Mastodon resolves a post from another instance through search first, since a remote status has no local id until the instance has fetched it. Bluesky resolves the author's handle to a DID and fetches the post's cid, because a repost record points at one version of a post. Also in the TUI as /repost. (#4)
Login no longer dies on a headless server
myna login x (and every other browser-based login) printed the authorize link, then exited a moment later on any machine without xdg-open. The spawn failure arrived as an asynchronous error nobody was listening for. It is handled now; the link is printed regardless, and the paste-the-code prompt stays up. (#3)
Full changelog: v0.2.2...v0.3.0
myna 0.2.2
What's Changed
Full Changelog: v0.2.1...v0.2.2
myna 0.2.1
myna 0.2.0
curl -fsSL https://mynaposter.com/install.sh | shAlready installed? The same command upgrades in place.
Bluesky links and hashtags actually work now
Bluesky parses nothing out of post text. A URL stays plain text and a hashtag is
just a word starting with # unless the post carries a facet giving that
span's UTF-8 byte range. There is no flag to turn on.
0.1.0 built facets but got three things wrong, all of which crawlproof.com had
already found and which are now ported across with attribution:
- Facets must arrive sorted and non-overlapping. myna emitted every link,
then every tag, so a hashtag before a link came out unsorted. - A hashtag matched inside a URL fragment (
example.com/docs#install)
produced exactly the overlap the API rejects. - No tag validation and no truncation.
slice(0, 300)counts UTF-16 units, so
an emoji spends two of the 300 and a cut can split a surrogate pair into
invalid UTF-8. There is a separate 3000-byte record cap too.
Verified against a real account: the link facet resolves in Bluesky's own API.
Fixed: myna post hung outside a terminal
myna post "text" waited forever wherever stdin is not a TTY and nothing is
piped, because the argument parser read stdin unconditionally. That is cron and
CI, with no output and nothing to suggest why. Target and text are now resolved
before stdin is touched.
New
- tsbb, and a device-flow login kind. Works against any instance: the board
self-describes atGET /api/v1. 26 networks total. saveandloadto move an install between machines. Always encrypted
with a passphrase you type, never the machine-local keyfile. Additive by
default: an account already present is kept, not replaced by a stale token.- Optional cloud backup (
myna cloud). The bundle is sealed on your machine
before upload and the server refuses anything that is not; a compromise of the
server yields no token. - A performance screen with volume over time, delivery rate, per-network
breakdown, the hours you actually post, and your best posts.myna stats. - MCP over HTTP at
POST /api/mcp, for agents that cannot launch a
subprocess. Same tools as the stdio server, imported rather than restated. - Clickable tabs and target checkboxes in the TUI. They were pictures of
controls before: hqtui only registers a hit region when a handler is passed.
Housekeeping
The version was a literal in six files. It is one now, with a test asserting the
package.json files agree, because a release that updated five of them would ship
a binary reporting the wrong version and nothing would fail.
114 tests, 12 of them against a real Postgres.
myna 0.1.0
First release.
curl -fsSL https://mynaposter.com/install.sh | shA standalone binary with the runtime compiled in, so nothing else needs to be
installed first. Verify it yourself against SHA256SUMS if you would rather not
pipe a script.
What it does. Connect an account, write once, and post to 25 networks —
tailored to each one's character limit, threaded where threads exist, truncated
where they do not. Schedule posts, read timelines and mentions, and see exactly
what landed and what failed.
Logging in. myna login <network> asks for whatever that network actually
accepts: a real username and password for Bluesky, Mastodon, Reddit, Lemmy,
Matrix, Mattermost and WordPress; a token for Telegram, Discord, Slack, Nostr
and the blog targets; a browser sign-in for X, Facebook, Instagram, Threads,
LinkedIn, Pinterest and TikTok, which removed password APIs years ago.
Also in here. An optional AI writer that reads a link and drafts a post with
hashtags, an infographic generator that renders text deterministically rather
than letting an image model rewrite it, a desktop app, an HTTP API and an MCP
server.
Credentials are encrypted with AES-256-GCM in ~/.config/myna. There is no myna
account and no server in the path.
Which binary. myna-linux-x86_64 unless your CPU predates AVX2, in which
case -baseline. The installer picks for you.