bluesky
Everything runs through the shipped CLI scripts/bluesky.py
— self-contained (requests + Pillow, both preinstalled in the sandbox). One
call creates the session, auto-computes clickable facets (links, #hashtags,
@mentions with correct UTF-8 byte offsets), and for image posts downloads the
file, resizes/recompresses it to Bluesky's ~1 MB blob limit, uploadBlobs it
and builds the app.bsky.embed.images embed — so there's no fragile
curl + jq + heredoc to hand-assemble (the old inline recipe kept breaking on
shell quoting, especially once an image + facets were involved).
Three connector credentials are injected: $BLUESKY_HANDLE
(e.g. name.bsky.social), $BLUESKY_APP_PASSWORD (an App Password from Bluesky
Settings → Privacy and Security → App Passwords, NOT the login password) and
$BLUESKY_SERVICE (PDS base URL, default https://bsky.social). The CLI reads
them from the env — never echo them.