Skip to main content

passiveaggressive

CI PyPI Python versions License: MIT

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

passiveaggressive-0.1.0.tar.gz (15.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

passiveaggressive-0.1.0-py3-none-any.whl (12.6 kB view details)

Uploaded Python 3

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

Hashes for passiveaggressive-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9c4bb7b9b43d776e2f4e71f92647338137c739dc14628b6cd871deb636c719ba
MD5 908694409b04a16cc5eba69d20be441d
BLAKE2b-256 8420cd5e5ac4cafc5d815a9aa21e04f1550f278306fd63d05492c2e42c3bcf09

See more details on using hashes here.

File details

Details for the file passiveaggressive-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for passiveaggressive-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 13cead611830802e437e478e6af943bf048927db3f9075a1b0d5e40adf97338e
MD5 09b5ba74643f5aa6b491fb1c86b2f042
BLAKE2b-256 10ece51ff21cf395307c720527c76d68a3d37ced7eda4bbb062acc3fdd0c0a68

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page