Tiny CLI to post simultaneously to Mastodon and Bluesky
Project description
Not my ex
Tiny CLI to post simultaneously to Mastodon and Bluesky.
Obviously, based on cuducos/from-my-ex
.
It supports:
- Post status updates to both networks with a simple CLI command
- Posting with images
- Including alt text for images
- Setting post language
It does not support:
- Tagging other users (they would have different IDs and servers in each platform)
Getting started
Requirements
- Python 3.9 or newer
uv
Python package manager
Environment variables
To post to Bluesky
Name | Description | Example | Default value |
---|---|---|---|
NOT_MY_EX_BSKY_AGENT |
Bluesky instance | "https://bsky.social" |
"https://bsky.social" |
NOT_MY_EX_BSKY_EMAIL |
Email used in Bluesky | "cuducos@mailinator.com" |
None |
NOT_MY_EX_BSKY_PASSWORD |
Password used in Bluesky | As created in App Passwords. | None |
Not setting NOT_MY_EX_BSKY_EMAIL
or NOT_MY_EX_BSKY_PASSWORD
disables posting to Bluesky.
To post to Mastodon
Name | Description | Example | Default value |
---|---|---|---|
NOT_MY_EX_MASTODON_INSTANCE |
Mastodon instance | "https://tech.lgbt" |
"https://mastodon.social" |
NOT_MY_EX_MASTODON_TOKEN |
Mastodon access token | Go to your Settings, Development and then create an app to get the access token. Select the write:statuses and write:media scopes. |
None |
Not setting NOT_MY_EX_MASTODON_TOKEN
disables posting to Mastodon.
Install
$ pip install not-my-ex
Usage
CLI
$ not-my-ex "Magic, madness, heaven, sin" --images /tmp/1989.gif
You can skip --images
or pass multiple images (e.g. --images taylor.jpg --images swift.gif
).
API
from asyncio import gather
from httpx import AsyncClient
from not_my_ex.bluesky import Bluesky
from not_my_ex.mastodon import Mastodon
from not_my_ex.media import Media
from not_my_ex.post import Post
async def main():
media_tasks = tuple(
Media.from_img(path, alt=alt)
for path, alt in (("taylor.jpg", "Taylor"), ("swift.jpg", "Swift"))
)
media = await gather(*media_tasks)
post = Post(text="Magic, madness, heaven, sin", media=media, lang="en")
async with AsyncClient() as http:
post_tasks = tuple(cls(http).post(post) for cls in (Bluesky, Mastodon))
await gather(*post_tasks)
In Post
, both media
and lang
are optional. In Media
, alt
is optional.
Contributing
The tests include Ruff and Mypy:
$ uv run python -m pytest
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file not_my_ex-0.0.6.tar.gz
.
File metadata
- Download URL: not_my_ex-0.0.6.tar.gz
- Upload date:
- Size: 44.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 61d2da049d58263c9a4455bf6b8a0eb55fd5d40266e608db233264b6829ba75b |
|
MD5 | bbaa7960c367116aa1e617d9f871e036 |
|
BLAKE2b-256 | 670c0bb08a90c37f1d4962bb7460ef8e9a7a1c86eaf3a607b7754837a05d119c |
File details
Details for the file not_my_ex-0.0.6-py3-none-any.whl
.
File metadata
- Download URL: not_my_ex-0.0.6-py3-none-any.whl
- Upload date:
- Size: 23.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 42ec037d64aa96f385740362a745cdf46aa928b9aa6793b16be6f1305dbd2e8a |
|
MD5 | f6283e39b9ee7f3bbeb2438087b2d228 |
|
BLAKE2b-256 | 6e737dc33510e213889d3b2bc1f9fb4fb3024361c45bf61aa76a2a430463c0c2 |