# Alert After Pro π
*Read this in other languages: [English](README.md), [δΈζ](README_zh.md)*
Get notified when your commands complete! Simply prefix any command with `aa` and receive notifications via Telegram, SMS, DingDing (ιι), Ntfy, or Pushover.
Perfect for long-running builds, tests, deployments, or any command you want to monitor remotely.
## β¨ Features
- **Super Simple**: Just prefix your command with `aa`
- **Multiple Channels**: Telegram, SMS (Twilio), DingDing, Ntfy, Pushover
- **Rich Notifications**: Command status, duration, exit code, hostname
- **Cross-platform**: Works on Linux, macOS, and Windows
- **Zero Dependencies**: Minimal core dependencies
- **Configurable**: Optional command output capture, multiple simultaneous channels
## π Quick Start
### Installation
```bash
pip install alert-after-pro
```
That's it! One line installation.
### Setup
Run the configuration wizard:
```bash
aa --setup
```
Choose your notification channels and provide the necessary credentials.
### Usage
Simply prefix any command with `aa`:
```bash
# Examples
aa make build
aa pytest tests/
aa docker-compose up
aa "sleep 10 && echo done"
aa npm install && npm run build
```
## π± Supported Notification Channels
### Telegram
1. Create a bot via [@BotFather](https://t.me/BotFather)
2. Get your bot token
3. Send a message to your bot
4. Get your chat ID from: `https://api.telegram.org/bot<TOKEN>/getUpdates`
### Ntfy (ntfy.sh or self-hosted)
- **Server**: Use `https://ntfy.sh` or your own server
- **Topic**: Any topic name (e.g., "my-alerts")
- **Auth**: Optional username/password for private servers
### DingDing (ιι)
1. Create a robot in your DingDing group
2. Get the webhook URL
3. Optional: Enable signature verification with secret
### SMS (via Twilio)
1. Sign up at [Twilio](https://www.twilio.com)
2. Get your Account SID and Auth Token
3. Get a phone number
### Pushover
1. Sign up at [Pushover](https://pushover.net)
2. Create an application
3. Get your app token and user key
## π§ Command Options
```bash
aa --help # Show help
aa --setup # Run configuration wizard
aa --test # Send test notification
aa --silent <command> # Run command without notifications
```
## π Configuration
Configuration is stored in `~/.aa/config.yaml`:
```yaml
enabled_notifiers:
- telegram
- ntfy
capture_output: false
telegram:
bot_token: "your_bot_token"
chat_id: "your_chat_id"
ntfy:
server: "https://ntfy.sh"
topic: "my-alerts"
username: "optional"
password: "optional"
dingding:
webhook: "https://oapi.dingtalk.com/robot/send?access_token=..."
secret: "optional_secret"
sms:
provider: "twilio"
account_sid: "your_account_sid"
auth_token: "your_auth_token"
from_number: "+1234567890"
to_number: "+0987654321"
pushover:
app_token: "your_app_token"
user_key: "your_user_key"
```
## π What You'll Get
Rich notifications include:
- β
/β Command status (success/failure)
- π₯οΈ Hostname
- π» Full command
- β±οΈ Execution duration
- π Exit code
- π Start and end times
- π Command output (optional)
- β Error messages (on failure)
## π οΈ Development
### Local Development
```bash
git clone https://github.com/alert-after-pro/alert-after-pro
cd alert-after-pro
pip install -e .
```
### Testing
```bash
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Test specific notifier
aa --test
```
### Project Structure
```
alert-after-pro/
βββ src/alert_after_pro/
β βββ main.py # Entry point
β βββ config.py # Configuration management
β βββ notifiers/ # Notification implementations
β βββ base.py # Abstract base class
β βββ telegram.py
β βββ ntfy.py
β βββ dingding.py
β βββ sms.py
β βββ pushover.py
βββ setup.py
βββ requirements.txt
```
## π€ Contributing
Contributions are welcome! Please feel free to submit a Pull Request. Areas for contribution:
- New notification channels
- Improved error handling
- Better message formatting
- Documentation improvements
- Testing
## π License
MIT License - see [LICENSE](LICENSE) file for details.
## π Acknowledgments
Inspired by [alert-after](https://github.com/frewsxcv/alert-after). Built for developers who want to be notified when their long-running commands complete.
---
**Happy coding! π**
Made with β€οΈ for developers who like to step away from their terminals.
Raw data
{
"_id": null,
"home_page": "https://github.com/MatrixA/alert-after-pro",
"name": "alert-after-pro",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "notification alert command monitoring telegram sms dingding ntfy",
"author": "Alert After Pro Team",
"author_email": "alert@afterpro.dev",
"download_url": "https://files.pythonhosted.org/packages/97/15/3b43285b5a568e43d0209aeaa41261867dab85f1eb160679e0ac558dcdfe/alert_after_pro-0.2.2.tar.gz",
"platform": null,
"description": "# Alert After Pro \ud83d\ude80\n\n*Read this in other languages: [English](README.md), [\u4e2d\u6587](README_zh.md)*\n\nGet notified when your commands complete! Simply prefix any command with `aa` and receive notifications via Telegram, SMS, DingDing (\u9489\u9489), Ntfy, or Pushover.\n\nPerfect for long-running builds, tests, deployments, or any command you want to monitor remotely.\n\n## \u2728 Features\n\n- **Super Simple**: Just prefix your command with `aa`\n- **Multiple Channels**: Telegram, SMS (Twilio), DingDing, Ntfy, Pushover\n- **Rich Notifications**: Command status, duration, exit code, hostname\n- **Cross-platform**: Works on Linux, macOS, and Windows\n- **Zero Dependencies**: Minimal core dependencies\n- **Configurable**: Optional command output capture, multiple simultaneous channels\n\n## \ud83d\ude80 Quick Start\n\n### Installation\n\n```bash\npip install alert-after-pro\n```\n\nThat's it! One line installation.\n\n### Setup\n\nRun the configuration wizard:\n\n```bash\naa --setup\n```\n\nChoose your notification channels and provide the necessary credentials.\n\n### Usage\n\nSimply prefix any command with `aa`:\n\n```bash\n# Examples\naa make build\naa pytest tests/\naa docker-compose up\naa \"sleep 10 && echo done\"\naa npm install && npm run build\n```\n\n## \ud83d\udcf1 Supported Notification Channels\n\n### Telegram\n1. Create a bot via [@BotFather](https://t.me/BotFather)\n2. Get your bot token\n3. Send a message to your bot\n4. Get your chat ID from: `https://api.telegram.org/bot<TOKEN>/getUpdates`\n\n### Ntfy (ntfy.sh or self-hosted)\n- **Server**: Use `https://ntfy.sh` or your own server\n- **Topic**: Any topic name (e.g., \"my-alerts\")\n- **Auth**: Optional username/password for private servers\n\n### DingDing (\u9489\u9489)\n1. Create a robot in your DingDing group\n2. Get the webhook URL\n3. Optional: Enable signature verification with secret\n\n### SMS (via Twilio)\n1. Sign up at [Twilio](https://www.twilio.com)\n2. Get your Account SID and Auth Token\n3. Get a phone number\n\n### Pushover\n1. Sign up at [Pushover](https://pushover.net)\n2. Create an application\n3. Get your app token and user key\n\n## \ud83d\udd27 Command Options\n\n```bash\naa --help # Show help\naa --setup # Run configuration wizard\naa --test # Send test notification\naa --silent <command> # Run command without notifications\n```\n\n## \ud83d\udcc1 Configuration\n\nConfiguration is stored in `~/.aa/config.yaml`:\n\n```yaml\nenabled_notifiers:\n - telegram\n - ntfy\n\ncapture_output: false\n\ntelegram:\n bot_token: \"your_bot_token\"\n chat_id: \"your_chat_id\"\n\nntfy:\n server: \"https://ntfy.sh\"\n topic: \"my-alerts\"\n username: \"optional\"\n password: \"optional\"\n\ndingding:\n webhook: \"https://oapi.dingtalk.com/robot/send?access_token=...\"\n secret: \"optional_secret\"\n\nsms:\n provider: \"twilio\"\n account_sid: \"your_account_sid\"\n auth_token: \"your_auth_token\"\n from_number: \"+1234567890\"\n to_number: \"+0987654321\"\n\npushover:\n app_token: \"your_app_token\"\n user_key: \"your_user_key\"\n```\n\n## \ud83d\udccb What You'll Get\n\nRich notifications include:\n- \u2705/\u274c Command status (success/failure)\n- \ud83d\udda5\ufe0f Hostname\n- \ud83d\udcbb Full command\n- \u23f1\ufe0f Execution duration\n- \ud83d\udcca Exit code\n- \ud83d\udd50 Start and end times\n- \ud83d\udccb Command output (optional)\n- \u274c Error messages (on failure)\n\n## \ud83d\udee0\ufe0f Development\n\n### Local Development\n\n```bash\ngit clone https://github.com/alert-after-pro/alert-after-pro\ncd alert-after-pro\npip install -e .\n```\n\n### Testing\n\n```bash\n# Install with dev dependencies\npip install -e \".[dev]\"\n\n# Run tests\npytest\n\n# Test specific notifier\naa --test\n```\n\n### Project Structure\n\n```\nalert-after-pro/\n\u251c\u2500\u2500 src/alert_after_pro/\n\u2502 \u251c\u2500\u2500 main.py # Entry point\n\u2502 \u251c\u2500\u2500 config.py # Configuration management\n\u2502 \u2514\u2500\u2500 notifiers/ # Notification implementations\n\u2502 \u251c\u2500\u2500 base.py # Abstract base class\n\u2502 \u251c\u2500\u2500 telegram.py\n\u2502 \u251c\u2500\u2500 ntfy.py\n\u2502 \u251c\u2500\u2500 dingding.py\n\u2502 \u251c\u2500\u2500 sms.py\n\u2502 \u2514\u2500\u2500 pushover.py\n\u251c\u2500\u2500 setup.py\n\u2514\u2500\u2500 requirements.txt\n```\n\n## \ud83e\udd1d Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request. Areas for contribution:\n\n- New notification channels\n- Improved error handling\n- Better message formatting\n- Documentation improvements\n- Testing\n\n## \ud83d\udcc4 License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## \ud83d\ude4f Acknowledgments\n\nInspired by [alert-after](https://github.com/frewsxcv/alert-after). Built for developers who want to be notified when their long-running commands complete.\n\n---\n\n**Happy coding! \ud83c\udf89**\n\nMade with \u2764\ufe0f for developers who like to step away from their terminals.\n",
"bugtrack_url": null,
"license": null,
"summary": "Get notified when your commands complete - supports Telegram, SMS, DingDing, Ntfy, and more",
"version": "0.2.2",
"project_urls": {
"Bug Reports": "https://github.com/MatrixA/alert-after-pro/issues",
"Homepage": "https://github.com/MatrixA/alert-after-pro",
"Source": "https://github.com/MatrixA/alert-after-pro"
},
"split_keywords": [
"notification",
"alert",
"command",
"monitoring",
"telegram",
"sms",
"dingding",
"ntfy"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "f2a6d268c99cba741b20015c9d63ad3c60723c0f0e3a1bf2f58a9f8116c98ec2",
"md5": "bcac5044d0eb97b3b1ab0eb60f38dc8c",
"sha256": "9b09e7278f13fb92f7d33553bd7aa770bc0a2a240ff5e2683fdebf1142933f12"
},
"downloads": -1,
"filename": "alert_after_pro-0.2.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "bcac5044d0eb97b3b1ab0eb60f38dc8c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 17546,
"upload_time": "2025-08-23T10:51:27",
"upload_time_iso_8601": "2025-08-23T10:51:27.536039Z",
"url": "https://files.pythonhosted.org/packages/f2/a6/d268c99cba741b20015c9d63ad3c60723c0f0e3a1bf2f58a9f8116c98ec2/alert_after_pro-0.2.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "97153b43285b5a568e43d0209aeaa41261867dab85f1eb160679e0ac558dcdfe",
"md5": "080be06fefa7a616fcf2673bcfc0dd5c",
"sha256": "4a06a6d64e18ea45abfb44c443dca65fc76ac98d7dbf62a706ab9be3258b408d"
},
"downloads": -1,
"filename": "alert_after_pro-0.2.2.tar.gz",
"has_sig": false,
"md5_digest": "080be06fefa7a616fcf2673bcfc0dd5c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 15793,
"upload_time": "2025-08-23T10:51:29",
"upload_time_iso_8601": "2025-08-23T10:51:29.166365Z",
"url": "https://files.pythonhosted.org/packages/97/15/3b43285b5a568e43d0209aeaa41261867dab85f1eb160679e0ac558dcdfe/alert_after_pro-0.2.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-23 10:51:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "MatrixA",
"github_project": "alert-after-pro",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "requests",
"specs": [
[
">=",
"2.25.0"
]
]
},
{
"name": "PyYAML",
"specs": [
[
">=",
"5.4.0"
]
]
}
],
"lcname": "alert-after-pro"
}