Vibeleaderboard
Index / tool
Visit github.com
Category
Developer Tools
Rank
Pricing
Open Source
Type
TOOL
Use case
Productivity & Collaboration
Latest release
v2.2.0
Date

About

Apprise is a Python notification library that sends push notifications to many services, including Telegram, Discord, Slack, Amazon SNS and Gotify, through one common syntax. It lets a project support many notification targets without writing separate integrations for each.

What it does

Apprise turns every notification destination into a single URL. You write something like a Discord webhook address or an email login as one string, hand a list of them to the Python library or the bundled command line tool, and one call fans the message out to all of them in parallel. Each destination is a small plugin that knows how to read its own URL format, and the core handles retries, time limits, attachments and a per-service report of what succeeded, failed or timed out.

Why it's ranked here

This is mature infrastructure, not a weekend wrapper. The package declares itself production stable, ships under the permissive BSD two-clause license, supports Python 3.9 through 3.15 on both CPython and PyPy, and its keyword list names well over a hundred destinations, from Slack and Telegram to SMS gateways, PagerDuty and desktop popups. The core dependency list is short and ordinary. The delivery engine shows careful work: separate thread pools so coordinating jobs cannot starve the workers they wait on, and a clear success, partial, failure or timeout status for every batch.

What's good

Adding a channel is a config change, not a code change: a new URL in a file or an environment variable and the same send call reaches it. Results are honest about mixed outcomes, so a batch where Slack worked and SMS failed reports partial rather than a flat yes or no. Credentials are masked before URLs appear in results and logs. Heavy dependencies such as MQTT, XMPP, PGP encryption and USB light support sit in an optional extra, so the base install stays small. Custom notification plugins can be dropped into a plugins folder without forking.

Tradeoffs

Secrets live inside the URLs, so config files and environment variables holding them need the same care as a password store. HTTP redirects are followed by default, and the source itself notes this can forward credentials to a host you never configured; you have to switch it off. Default connect and read timeouts are four seconds each, which can cut off slow self-hosted endpoints unless raised per URL. A service that hits its deadline is abandoned, not killed, so its thread may keep running. XMPP support needs Python 3.11 or newer.

How to use it well

Reach for it when a script, cron job, home server or app needs to alert people on whatever channels they already use, and you do not want to own a dozen API clients. Keep the URLs in a config file or environment variable rather than in code, disable redirects for anything carrying credentials, and set explicit timeouts. Install the all-plugins extra only if you need encrypted or hardware destinations. For a shared service, the separate Apprise API server is the intended relay. It does not handle inbound messages, scheduling or delivery queues.

Technical notes+

pyproject.toml declares BSD-2-Clause, requires-python >=3.9, the console script apprise = apprise.cli:main, core deps requests, urllib3, requests-oauthlib, click, markdown, PyYAML and certifi, and an all-plugins extra (cryptography, PyNaCl, gntp, paho-mqtt, PGPy, hidapi, smpplib, slixmpp gated on Python 3.11). apprise/manager_plugins.py discovers plugins by scanning the plugins package for modules prefixed Notify. apprise/apprise.py keeps a shared service ThreadPoolExecutor and a separate coordinator pool, and tracks abandoned futures so the CLI can poll during a 5 second exit grace window (apprise/cli.py, CLI_TIMEOUT_EXIT_GRACE_SECONDS). apprise/dispatch.py takes the earlier of the asset service timeout and the call-wide timeout as the deadline, and aggregate_status ranks SUCCESS, PARTIAL, FAILURE, TIMEOUT. apprise/url.py sets socket_connect_timeout and socket_read_timeout to 4.0 and redirects to True, overridable per URL with cto, rto and redirect, or globally via the asset http_redirects flag. apprise/persistent_store.py caps a store file at 1048576 bytes, sets default_file_expiry to 2678400 seconds (31 days, though the comment says 30), and verifies cache entries with a 6 character truncated sha256, which detects corruption rather than providing security.

Observed

License
BSD 2-Clause
Language
Python, 3.9 and newer; CPython and PyPy classifiers
Interfaces
Python library and a bundled command line tool
Packaging
PyPI package with optional all-plugins and windows extras
Declared maturity
Development Status: Production/Stable
Extensibility
Custom notification plugins loaded from user and system plugin directories
Configuration
Service URLs from arguments, config files (text or YAML) or the APPRISE_URLS environment variable
Platform support
OS independent, with Windows-specific config and plugin search paths

Read from README.md, pyproject.toml, apprise/__init__.py, apprise/apprise.py, apprise/manager_plugins.py, apprise/url.py, apprise/dispatch.py, apprise/persistent_store.py, apprise/cli.py, apprise/plugins/__init__.py.

Tags

notificationspythonpushlibraryself-hostedmessaging

Tech Stack

Python

Media

Apprise

Comments (0)

No comments yet

Editorially curated, with community endorsements as a secondary signal. Corrections welcome.