Apprise
github.com/caronc/apprise- Category
- Developer Tools
- Rank
- No. 780Tools index
- Pricing
- Open Source
- Type
- TOOL
- Use case
- Productivity & Collaboration
- GitHub
- 17.8k stars
- 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
Tech Stack
Media
Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.