passiveaggressive
Convert polite messages into subtly passive-aggressive ones — the kind of message you might get from an overly polite coworker, manager, or customer support rep. Funny without being mean, office-friendly, and built entirely from handcrafted phrase templates — no AI, no network calls, no runtime dependencies.
>>> from passiveaggressive import translate
>>> translate("Please update the documentation.") # one possible output
'Just a gentle reminder, update the documentation, if time allows. Thanks in advance.'
Installation
pip install passiveaggressive
Or, for local development:
git clone https://github.com/example/passiveaggressive.git
cd passiveaggressive
pip install -e ".[dev]"
Requires Python 3.10+.
Usage
Basic translation
from passiveaggressive import translate
translate("Send me the report.")
# "Whenever you have a moment, it would be appreciated if the report
# could finally be sent over."
Styles
Choose the personality delivering the message:
translate(text, style="coworker") # default
translate(text, style="manager")
translate(text, style="customer_support")
translate(text, style="british")
translate(text, style="parent")
translate(text, style="teacher")
| Style | Example output |
|---|---|
coworker |
"Just circling back on the PR. Thanks in advance." |
manager |
"Just checking in on this again since I haven't seen an update." |
customer_support |
"We wanted to follow up on your request. Much appreciated." |
british |
"Not to be a bother, but I was wondering whether this might be looked at when convenient." |
parent |
"I'll just leave this here in case anyone remembers." |
teacher |
"A gentle reminder, this was mentioned in class." |
Intensity
Dial the annoyance from 1 (barely-there politeness) to 5 (maximum office sarcasm):
translate(text, intensity=1) # "Whenever you have a chance..."
translate(text, intensity=3) # "Just following up since this seems to have been overlooked."
translate(text, intensity=5) # "No rush at all—as always—but it would be wonderful if this
# could happen sometime this century."
Randomization & determinism
Repeated calls vary naturally:
translate("Please review the PR.")
# "Just circling back on the PR."
# "Thought I'd mention this again in case it slipped through."
# "Whenever convenient, the PR is still waiting."
Pass a seed for reproducible output:
translate("Please review the PR.", seed=42)
Extra functions
from passiveaggressive import rewrite, email, subject, signoff
rewrite(text) # alias of translate()
email(text) # adds email-specific phrasing
subject() # e.g. "Gentle Reminder", "Following Up (Again)"
signoff() # e.g. "Kind regards,", "As always,"
CLI
Installing the package also installs the passiveaggressive command:
$ passiveaggressive "Please send the invoice."
Just checking in regarding the invoice whenever convenient.
$ passiveaggressive "Fix the bug" --style british --intensity 4
$ passiveaggressive "Reply to my email" --seed 10
Flags:
--style {coworker,manager,customer_support,british,parent,teacher}--intensity {1,2,3,4,5}--seed <int>
API documentation
translate(text, style="coworker", intensity=3, seed=None) -> str
Transforms text into a passive-aggressive message.
text(str, required) — the original message. Must be non-empty.style(str) — one of the six supported styles.intensity(int) — 1–5.seed(int | None) — optional seed for deterministic output.
Raises TypeError if text isn't a string, and ValueError if text is
empty/whitespace, style is unrecognized, or intensity is out of range.
rewrite(text, style="coworker", intensity=3, seed=None) -> str
Alias of translate().
email(text, style="coworker", intensity=3, seed=None) -> str
Like translate(), but layers in additional email-specific phrasing
(e.g. "Looking forward to hearing from you.").
subject(seed=None) -> str
Generates a passive-aggressive email subject line.
signoff(seed=None) -> str
Generates a passive-aggressive email signoff.
Random examples
"Just circling back on the PR."
"Thought I'd mention this again in case it slipped through."
"Whenever convenient, the PR is still waiting."
"The PR continues to exist, should anyone be interested."
Design philosophy
- Funny without being cruel
- Predictable and reproducible (via
seed) - Lightweight, pure Python, zero runtime dependencies
- Easy to extend with additional styles or phrases
- Beginner-friendly
Contributing
New styles are the most fun thing to add. See CONTRIBUTING.md for setup instructions and the checklist to run before opening a PR.
Changelog
See CHANGELOG.md.
License
MIT — see LICENSE. "# PassiveAggressive"
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file passiveaggressive-0.1.0.tar.gz.
File metadata
- Download URL: passiveaggressive-0.1.0.tar.gz
- Upload date:
- Size: 15.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c4bb7b9b43d776e2f4e71f92647338137c739dc14628b6cd871deb636c719ba
|
|
| MD5 |
908694409b04a16cc5eba69d20be441d
|
|
| BLAKE2b-256 |
8420cd5e5ac4cafc5d815a9aa21e04f1550f278306fd63d05492c2e42c3bcf09
|
File details
Details for the file passiveaggressive-0.1.0-py3-none-any.whl.
File metadata
- Download URL: passiveaggressive-0.1.0-py3-none-any.whl
- Upload date:
- Size: 12.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13cead611830802e437e478e6af943bf048927db3f9075a1b0d5e40adf97338e
|
|
| MD5 |
09b5ba74643f5aa6b491fb1c86b2f042
|
|
| BLAKE2b-256 |
10ece51ff21cf395307c720527c76d68a3d37ced7eda4bbb062acc3fdd0c0a68
|