Tiny CLI to post simultaneously to Mastodon and Bluesky
Project description
Not my ex

Tiny app 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)
It used to have:
- A simple GUI (version 0.1.1), but dropped support to focus on CLI — there are other great GUI out there by now
Getting started
Requirements
- Python 3.9 or newer
Environment variables
General settings
Name | Description | Example | Default value |
---|---|---|---|
NOT_MY_EX_DEFAULT_LANG |
2-letter ISO 639-1 code | "pt" |
None |
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 post "Magic, madness, heaven, sin" --images /tmp/1989.gif
You can skip --images
or pass multiple images (e.g. --images taylor.jpg --images swift.gif
). Check --help
for more details on commands and subcommands.
API
from asyncio import gather
from httpx import AsyncClient
from not_my_ex.auth import EnvAuth
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():
auth = EnvAuth()
media_tasks = tuple(
Media.from_img(path, alt, auth.image_size_limit)
for path, alt in (("taylor.jpg", "Taylor"), ("swift.jpg", "Swift"))
)
media = await gather(*media_tasks)
post = Post("Magic, madness, heaven, sin", auth.limitm, media, "en")
async with AsyncClient() as http:
post_tasks = tuple(cls(http).post(post) for cls in (Bluesky, Mastodon))
await gather(*post_tasks)
In Post
, limit
, media
and lang
are optional. In Media
, both alt
and image_size_limit
are optional.
The usage of auth.limit
and auth.image_size_limit
makes sure the limits are set according to the authenticated clients.
Contributing
Requires uv
Python package manager. The tests include Ruff and Mypy:
$ uv run 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-1.1.2.tar.gz
.
File metadata
- Download URL: not_my_ex-1.1.2.tar.gz
- Upload date:
- Size: 71.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
060cc7df6348d602c608e86d32dc16a15e421721d40d8d6a25219b589e3e0196
|
|
MD5 |
3981d48823200f07e2b1e3a46e059c63
|
|
BLAKE2b-256 |
130aea798232482dcf2130359b09c890321a751ca14f00e531312a2e4fbd2d5c
|
File details
Details for the file not_my_ex-1.1.2-py3-none-any.whl
.
File metadata
- Download URL: not_my_ex-1.1.2-py3-none-any.whl
- Upload date:
- Size: 40.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.4
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
afc22a9208508e8e7d56d4388319610c473825b3093d50a470397f5a7efd983d
|
|
MD5 |
c938d2475837363ff874a85dc26d1f52
|
|
BLAKE2b-256 |
0b0c4bfcae17b348ef431b38b657d9517103e9f7fcdf6e2d3f643767af2c3fbb
|