Skip to content

myna 0.2.0

Choose a tag to compare

@ralyodio ralyodio released this 02 Sep 22:46
· 29 commits to main since this release
curl -fsSL https://mynaposter.com/install.sh | sh

Already 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 at GET /api/v1. 26 networks total.
  • save and load to 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.