{"id":29722527,"url":"https://github.com/nikhilbadyal/release-tracker","last_synced_at":"2025-07-24T17:33:06.387Z","repository":{"id":296419131,"uuid":"977178791","full_name":"nikhilbadyal/release-tracker","owner":"nikhilbadyal","description":"multi-platform release monitoring system that tracks software releases","archived":false,"fork":false,"pushed_at":"2025-07-16T03:13:49.000Z","size":88,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-17T06:00:16.374Z","etag":null,"topics":["bot","python","release-automation","scraper","telegram"],"latest_commit_sha":null,"homepage":"http://www.nikhilbadyal.com/release-tracker/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nikhilbadyal.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-03T15:50:09.000Z","updated_at":"2025-07-16T03:13:51.000Z","dependencies_parsed_at":"2025-07-16T09:55:17.963Z","dependency_job_id":"c12190ec-6f5c-43f5-adc2-e0d045c8eaec","html_url":"https://github.com/nikhilbadyal/release-tracker","commit_stats":null,"previous_names":["nikhilbadyal/release-tracker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nikhilbadyal/release-tracker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilbadyal%2Frelease-tracker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilbadyal%2Frelease-tracker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilbadyal%2Frelease-tracker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilbadyal%2Frelease-tracker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nikhilbadyal","download_url":"https://codeload.github.com/nikhilbadyal/release-tracker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nikhilbadyal%2Frelease-tracker/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266878609,"owners_count":23999621,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bot","python","release-automation","scraper","telegram"],"created_at":"2025-07-24T17:33:05.711Z","updated_at":"2025-07-24T17:33:06.374Z","avatar_url":"https://github.com/nikhilbadyal.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🔔 Release Tracker\n\nA comprehensive, multi-platform release monitoring system that tracks software releases across different platforms and sends notifications when new versions are available. Built with Python and designed for reliability, extensibility, and ease of use.\n\n## 🚀 Quick Start\n\n```bash\n# Clone the repository\ngit clone https://github.com/your-username/release-tracker.git\ncd release-tracker\n\n# Install dependencies\npip install -r requirements.txt\n\n# Copy and configure the example config\ncp config.example.yaml config.yaml\n# Edit config.yaml with your settings\n\n# Run the tracker\npython main.py\n```\n\n## 📋 Table of Contents\n\n- [Features](#-features)\n- [Supported Platforms](#-supported-platforms)\n- [Installation](#-installation)\n- [Configuration](#-configuration)\n- [Docker Deployment](#-docker-deployment)\n- [CLI Usage](#-cli-usage)\n- [Watchers](#-watchers)\n- [Persistence Backends](#-persistence-backends)\n- [Notification Systems](#-notification-systems)\n- [Configuration Reference](#-configuration-reference)\n- [Environment Variables](#-environment-variables)\n- [Usage Examples](#-usage-examples)\n- [Documentation](#-documentation)\n- [Extending the System](#-extending-the-system)\n- [Troubleshooting](#-troubleshooting)\n- [Contributing](#-contributing)\n\n## ✨ Features\n\n- **Multi-Platform Monitoring**: Track releases from GitHub, GitLab, PyPI, APKMirror, APKPure, and F-Droid\n- **Smart Deduplication**: Only notify on new releases using persistent state storage\n- **Asset Downloading**: Automatically download release assets (binaries, APKs, packages)\n- **Flexible Notifications**: Send alerts via 80+ services using Apprise\n- **Robust Architecture**: Built-in retry logic, error handling, and graceful degradation\n- **Multiple Config Sources**: Load configuration from local files, HTTP(S) URLs, or S3/R2\n- **Environment Variable Support**: Dynamic configuration with `${VAR}` placeholder expansion\n- **Docker Ready**: Full containerization with Docker Compose support\n- **Extensible Design**: Easy to add new platforms, persistence backends, and notifiers\n\n## 🌐 Supported Platforms\n\n| Platform      | Type           | Authentication   | Asset Support | Status |\n|---------------|----------------|------------------|---------------|--------|\n| **GitHub**    | Git Repository | Token (optional) | ✅             | Stable |\n| **GitLab**    | Git Repository | Token (optional) | ✅             | Stable |\n| **PyPI**      | Python Package | None             | ✅             | Stable |\n| **APKMirror** | Android APK    | Token            | ✅             | Stable |\n| **APKPure**   | Android APK    | None             | ✅             | Stable |\n| **F-Droid**   | Android APK    | None             | ✅             | Stable |\n\n## 🛠 Installation\n\n### Prerequisites\n\n- Python 3.12+\n- Redis (for persistence)\n- Docker (optional, for containerized deployment)\n\n### Local Installation\n\n```bash\n# Clone the repository\ngit clone https://github.com/your-username/release-tracker.git\ncd release-tracker\n\n# Create virtual environment\npython -m venv .venv\nsource .venv/bin/activate  # On Windows: .venv\\Scripts\\activate\n\n# Install dependencies\npip install -r requirements.txt\n```\n\n### Environment Setup\n\nCreate a `.env` file for sensitive configuration:\n\n```bash\n# GitHub (optional, for higher rate limits)\nGH_TOKEN=ghp_your_github_token\n\n# GitLab (optional, for private repos)\nGITLAB_TOKEN=glpat-your_gitlab_token\n\n# Apprise notification URL\nAPPRISE_URL=discord://webhook_id/webhook_token\n\n# Redis connection (if using external Redis)\nREDIS_HOST=localhost\nREDIS_PORT=6379\nREDIS_DB=0\n\n# AWS credentials (if loading config from S3)\nAWS_ACCESS_KEY_ID=your_access_key\nAWS_SECRET_ACCESS_KEY=your_secret_key\nAWS_REGION=us-east-1\n```\n\n## ⚙️ Configuration\n\nThe system uses YAML configuration files with support for environment variable expansion. Configuration can be loaded from:\n\n- **Local file**: `config.yaml` (default)\n- **HTTP(S) URL**: `https://example.com/config.yaml`\n- **S3/R2 bucket**: `s3://bucket-name/config.yaml`\n\n### Basic Configuration Structure\n\n```yaml\n# Platform-specific watchers\nwatchers:\n  github:\n    type: github\n    config:\n      token: \"${GH_TOKEN}\"  # Optional, for higher rate limits\n\n  pypi:\n    type: pypi\n    config: {}  # No authentication needed\n\n# Repositories to monitor\nrepos:\n  - name: \"Example GitHub Repo\"\n    repo: \"owner/repository\"\n    watcher: github\n    config:\n      upload_assets: true\n\n  - name: \"Python Package\"\n    repo: \"package-name\"\n    watcher: pypi\n    config:\n      upload_assets: false\n\n# State persistence\npersistence:\n  type: redis\n  config:\n    host: \"${REDIS_HOST:-redis}\"\n    port: ${REDIS_PORT:-6379}\n    db: ${REDIS_DB:-0}\n\n# Notification configuration\nnotifiers:\n  - type: apprise\n    config:\n      url: \"${APPRISE_URL}\"\n    format: \"markdown\"  # or \"text\", \"html\"\n\n# Global settings\nupload_assets: false  # Default for all repos\n```\n\n## 🐳 Docker Deployment\n\n### Using Docker Compose (Recommended)\n\n```yaml\n# docker-compose.yml\nversion: '3.8'\n\nservices:\n  release-tracker:\n    build: .\n    environment:\n      - CONFIG_SOURCE=config.yaml\n      - GH_TOKEN=${GH_TOKEN}\n      - APPRISE_URL=${APPRISE_URL}\n    volumes:\n      - ./config.yaml:/app/config.yaml\n      - ./downloads:/app/downloads\n    depends_on:\n      - redis\n    restart: unless-stopped\n\n  redis:\n    image: redis:7-alpine\n    restart: unless-stopped\n    volumes:\n      - redis_data:/data\n\nvolumes:\n  redis_data:\n```\n\nRun with:\n```bash\ndocker-compose up -d\n```\n\n### Manual Docker Build\n\n```bash\n# Build the image\ndocker build -t release-tracker .\n\n# Run with Redis\ndocker run -d --name redis redis:7-alpine\ndocker run -d --name release-tracker \\\n  --link redis:redis \\\n  -v $(pwd)/config.yaml:/app/config.yaml \\\n  -v $(pwd)/downloads:/app/downloads \\\n  -e GH_TOKEN=\"$GH_TOKEN\" \\\n  -e APPRISE_URL=\"$APPRISE_URL\" \\\n  release-tracker\n```\n\n## 💻 CLI Usage\n\nThe Release Tracker supports both full checking mode and single repository mode via command-line interface.\n\n### Check All Repositories (Default)\n```bash\npython main.py\n```\n\n### Check Single Repository\n```bash\n# Check a GitHub repository (explicit watcher)\npython main.py -r microsoft/vscode -w github\n\n# Check a repository configured in config.yaml (automatic watcher detection)\npython main.py -r microsoft/vscode\n\n# Check a PyPI package\npython main.py -r django -w pypi\n```\n\n### Available Options\n- `-r, --repo`: Repository identifier (format varies by platform)\n- `-w, --watcher`: Platform type (optional if repo is in config.yaml)\n- `--help`: Show help message\n\n**Note:**\n- If `--watcher` is not provided, the tool looks for the repository in your `config.yaml` file to determine the watcher type\n- All other configuration (asset downloading, notifications, etc.) comes from your `config.yaml` file\n\nFor detailed CLI documentation, see [docs/CLI_USAGE.md](docs/CLI_USAGE.md).\n\n## 👁️ Watchers\n\nWatchers are platform-specific components that fetch release information. Each watcher implements the same interface but handles different APIs and data formats.\n\n### GitHub Watcher\n\nMonitors GitHub repository releases using the GitHub REST API.\n\n```yaml\nwatchers:\n  github:\n    type: github\n    config:\n      token: \"${GH_TOKEN}\"  # Optional, increases rate limits\n      base_url: \"https://api.github.com\"  # Optional, for GitHub Enterprise\n\nrepos:\n  - name: \"Docker\"\n    repo: \"docker/docker\"  # Format: owner/repository\n    watcher: github\n    config:\n      upload_assets: true\n```\n\n**Features:**\n- Automatic asset detection (binaries, source archives)\n- Rate limiting handling\n- Support for private repositories (with token)\n\n### GitLab Watcher\n\nMonitors GitLab repository releases using the GitLab API.\n\n```yaml\nwatchers:\n  gitlab:\n    type: gitlab\n    config:\n      token: \"${GITLAB_TOKEN}\"  # Optional, for private repos\n      base_url: \"https://gitlab.com/api/v4\"  # Configurable for self-hosted\n\nrepos:\n  - name: \"GitLab CE\"\n    repo: \"gitlab-org/gitlab\"  # Format: namespace/project\n    watcher: gitlab\n```\n\n**Features:**\n- Support for self-hosted GitLab instances\n- Asset link extraction\n- Private repository access\n\n### PyPI Watcher\n\nMonitors Python package releases on the Python Package Index.\n\n```yaml\nwatchers:\n  pypi:\n    type: pypi\n    config: {}  # No authentication required\n\nrepos:\n  - name: \"Requests Library\"\n    repo: \"requests\"  # Just the package name\n    watcher: pypi\n    config:\n      upload_assets: true  # Downloads .whl and .tar.gz files\n```\n\n**Features:**\n- No authentication required\n- Automatic detection of wheels and source distributions\n- Version string parsing\n\n### APKMirror Watcher\n\nMonitors Android app releases on APKMirror.\n\n```yaml\nwatchers:\n  apkmirror:\n    type: apkmirror\n    config:\n      auth_token: \"${APKMIRROR_TOKEN}\"\n      user_agent: \"release-tracker\"\n      api_url: \"https://www.apkmirror.com/wp-json/apkm/v1/app_exists/\"\n\nrepos:\n  - name: \"WhatsApp\"\n    repo: \"com.whatsapp\"  # Android package name\n    watcher: apkmirror\n```\n\n**Features:**\n- APK file downloading\n- Version code tracking\n- Multiple APK variants support\n\n### APKPure Watcher\n\nMonitors Android app releases on APKPure using web scraping.\n\n```yaml\nwatchers:\n  apkpure:\n    type: apkpure\n    config:\n      user_agent: \"Mozilla/5.0 (compatible; release-tracker)\"\n\nrepos:\n  - name: \"Telegram\"\n    repo: \"org.telegram.messenger\"  # Package identifier\n    watcher: apkpure\n```\n\n**Features:**\n- Web scraping based\n- No API key required\n- Version extraction from HTML\n\n### F-Droid Watcher\n\nMonitors open-source Android app releases on F-Droid.\n\n```yaml\nwatchers:\n  fdroid:\n    type: fdroid\n    config:\n      base_url: \"https://f-droid.org/en/packages/\"\n      repo_url: \"https://f-droid.org/repo/\"\n      user_agent: \"release-tracker\"\n\nrepos:\n  - name: \"Signal\"\n    repo: \"org.thoughtcrime.securesms\"  # F-Droid package ID\n    watcher: fdroid\n```\n\n**Features:**\n- Open-source apps only\n- Direct APK downloads\n- No authentication required\n\n## 💾 Persistence Backends\n\nPersistence backends store the last seen release version to prevent duplicate notifications.\n\n### Redis Backend (Recommended)\n\n```yaml\npersistence:\n  type: redis\n  config:\n    host: \"localhost\"\n    port: 6379\n    db: 0\n    password: \"${REDIS_PASSWORD}\"  # Optional\n```\n\n**Features:**\n- High performance\n- Distributed deployment support\n- Automatic expiration support\n\n### File Backend\n\n```yaml\npersistence:\n  type: file\n  config:\n    path: \"./releases.json\"\n```\n\n**Features:**\n- No external dependencies\n- Simple setup\n- Suitable for single-instance deployments\n\n## 📢 Notification Systems\n\nThe system uses [Apprise](https://github.com/caronc/apprise) for notifications, supporting 80+ services.\n\n### Apprise Notifier\n\n```yaml\nnotifiers:\n  - type: apprise\n    config:\n      url: \"${APPRISE_URL}\"\n    format: \"markdown\"  # Options: text, markdown, html\n```\n\n### Supported Services\n\nPopular notification services include:\n\n- **Discord**: `discord://webhook_id/webhook_token`\n- **Slack**: `slack://token_a/token_b/token_c`\n- **Telegram**: `tgram://bot_token/chat_id`\n- **Email**: `mailto://user:pass@smtp.gmail.com`\n- **Pushover**: `pover://user@token`\n- **Microsoft Teams**: `msteams://token_a/token_b/token_c`\n\nSee the [Apprise documentation](https://github.com/caronc/apprise/wiki) for the complete list.\n\n## 📝 Configuration Reference\n\n### Global Configuration\n\n```yaml\n# Global asset download setting\nupload_assets: false\n\n# Force notifications (ignore duplicate checking)\n# Controlled by FORCE_NOTIFY environment variable\n```\n\n### Repository Configuration\n\n```yaml\nrepos:\n  - name: \"Display Name\"           # Human-readable name\n    repo: \"identifier\"             # Platform-specific identifier\n    watcher: \"watcher_name\"        # Which watcher to use\n    config:\n      upload_assets: true          # Override global setting\n      # Watcher-specific options can go here\n```\n\n### Watcher Configuration\n\nEach watcher type has its own configuration schema:\n\n```yaml\nwatchers:\n  watcher_name:\n    type: \"watcher_type\"\n    config:\n      # Watcher-specific configuration\n      # See individual watcher documentation\n```\n\n## 🔧 Environment Variables\n\nThe Release Tracker supports multiple environment variables for configuration and authentication. Here's a quick reference:\n\n| Variable                | Description                                | Default       |\n|-------------------------|--------------------------------------------|---------------|\n| `CONFIG_SOURCE`         | Configuration file location                | `config.yaml` |\n| `FORCE_NOTIFY`          | Force notifications even for seen releases | Not set       |\n| `GH_TOKEN`              | GitHub personal access token               | Not set       |\n| `GITLAB_TOKEN`          | GitLab personal access token               | Not set       |\n| `DOCKER_TOKEN`          | Docker Hub authentication token            | Not set       |\n| `APKMIRROR_TOKEN`       | APKMirror API authentication token         | Not set       |\n| `APPRISE_URL`           | Apprise notification URL                   | Not set       |\n| `REDIS_HOST`            | Redis server hostname                      | `localhost`   |\n| `REDIS_PORT`            | Redis server port                          | `6379`        |\n| `REDIS_DB`              | Redis database number                      | `0`           |\n| `REDIS_PASSWORD`        | Redis authentication password              | Not set       |\n| `AWS_ACCESS_KEY_ID`     | AWS access key for S3 config               | Not set       |\n| `AWS_SECRET_ACCESS_KEY` | AWS secret key for S3 config               | Not set       |\n| `AWS_REGION`            | AWS region for S3 config                   | Not set       |\n| `S3_ENDPOINT_URL`       | Custom S3 endpoint (CloudFlare R2, MinIO)  | Not set       |\n\nFor detailed information, usage examples, and best practices, see **[Environment Variables Documentation](docs/ENVIRONMENT_VARIABLES.md)**.\n\n## 📚 Usage Examples\n\n### Monitor Popular Python Packages\n\n```yaml\nwatchers:\n  pypi:\n    type: pypi\n    config: {}\n\nrepos:\n  - {name: \"Django\", repo: \"django\", watcher: pypi}\n  - {name: \"Flask\", repo: \"flask\", watcher: pypi}\n  - {name: \"Requests\", repo: \"requests\", watcher: pypi}\n  - {name: \"FastAPI\", repo: \"fastapi\", watcher: pypi}\n\npersistence:\n  type: redis\n  config: {host: redis, port: 6379, db: 0}\n\nnotifiers:\n  - type: apprise\n    config: {url: \"${DISCORD_WEBHOOK}\"}\n    format: markdown\n```\n\n### Monitor Development Tools\n\n```yaml\nwatchers:\n  github:\n    type: github\n    config: {token: \"${GH_TOKEN}\"}\n\nrepos:\n  - {name: \"Docker\", repo: \"docker/docker\", watcher: github, config: {upload_assets: true}}\n  - {name: \"Kubernetes\", repo: \"kubernetes/kubernetes\", watcher: github}\n  - {name: \"Terraform\", repo: \"hashicorp/terraform\", watcher: github, config: {upload_assets: true}}\n  - {name: \"VS Code\", repo: \"microsoft/vscode\", watcher: github}\n```\n\n### Android App Monitoring\n\n```yaml\nwatchers:\n  fdroid:\n    type: fdroid\n    config: {}\n  apkpure:\n    type: apkpure\n    config: {}\n\nrepos:\n  - {name: \"Signal\", repo: \"org.thoughtcrime.securesms\", watcher: fdroid}\n  - {name: \"Telegram\", repo: \"org.telegram.messenger\", watcher: apkpure}\n  - {name: \"Firefox\", repo: \"org.mozilla.firefox\", watcher: fdroid}\n```\n\n## 📚 Documentation\n\nFor detailed information about specific topics, see the following documentation files:\n\n- **[CLI Usage](docs/CLI_USAGE.md)** - Comprehensive CLI command reference and examples\n- **[Watchers](docs/WATCHERS.md)** - Detailed watcher configurations and platform-specific features\n- **[Configuration Sources](docs/CONFIG_SOURCES.md)** - Advanced configuration loading from various sources\n- **[Environment Variables](docs/ENVIRONMENT_VARIABLES.md)** - Complete reference for all supported environment variables\n- **[Redis Utils](docs/REDIS_UTILS.md)** - Redis setup, management, and troubleshooting utilities\n\n## 🔌 Extending the System\n\n### Adding a New Watcher\n\n1. Create a new watcher class in `watcher/your_platform.py`:\n\n```python\nfrom watcher.base import ReleaseAsset, ReleaseInfo, Watcher\n\nclass YourPlatformWatcher(Watcher):\n    def __init__(self, config=None):\n        # Initialize with platform-specific config\n        pass\n\n    def fetch_latest_release(self, repo_id: str) -\u003e ReleaseInfo:\n        # Implement platform-specific logic\n        # Return ReleaseInfo with tag and assets\n        pass\n```\n\n2. Register the watcher in `utils.py`:\n\n```python\nfrom watcher.your_platform import YourPlatformWatcher\n\ndef build_watcher(watcher_type: str, config: dict[str, Any]) -\u003e Watcher:\n    # ... existing watchers ...\n    if watcher_type == \"your_platform\":\n        return YourPlatformWatcher(config)\n```\n\n3. Document the new watcher and update configuration examples.\n\n### Adding a New Persistence Backend\n\n1. Create a backend class in `persistence/your_backend.py`:\n\n```python\nfrom persistence.base import PersistenceBackend\n\nclass YourBackend(PersistenceBackend):\n    def get_last_release(self, key: str) -\u003e str | None:\n        # Implement retrieval logic\n        pass\n\n    def set_last_release(self, key: str, release: str) -\u003e None:\n        # Implement storage logic\n        pass\n```\n\n2. Register in `utils.py`:\n\n```python\ndef get_backend(config: dict[str, Any]) -\u003e PersistenceBackend:\n    if config[\"type\"] == \"your_backend\":\n        return YourBackend(**config[\"config\"])\n```\n\n### Adding a New Notifier\n\n1. Create a notifier class in `notifier/your_notifier.py`:\n\n```python\nfrom notifier.base import Notifier\n\nclass YourNotifier(Notifier):\n    def send(self, title: str, body: str, attachments: list = None) -\u003e bool:\n        # Implement notification logic\n        # Return True on success, False on failure\n        pass\n```\n\n2. Register in `utils.py`:\n\n```python\ndef get_notifier(config: dict[str, Any]) -\u003e Notifier:\n    if config[\"type\"] == \"your_notifier\":\n        return YourNotifier(config[\"config\"])\n```\n\n## 🔍 Troubleshooting\n\n### Common Issues\n\n**Configuration not found:**\n```bash\n# Check config file location\nexport CONFIG_SOURCE=/path/to/config.yaml\n# Or use HTTP URL\nexport CONFIG_SOURCE=https://example.com/config.yaml\n```\n\n**Redis connection failed:**\n```bash\n# Check Redis status\nredis-cli ping\n# Verify connection settings in config\n```\n\n**GitHub rate limiting:**\n```bash\n# Add GitHub token to increase limits\nexport GH_TOKEN=ghp_your_token_here\n```\n\n**Assets not downloading:**\n- Ensure `upload_assets: true` in repo config\n- Check download permissions and disk space\n- Verify network connectivity to asset URLs\n\n### Debug Mode\n\nRun with verbose output:\n```bash\npython main.py --verbose\n```\n\nForce notifications (ignore seen releases):\n```bash\nFORCE_NOTIFY=1 python main.py\n```\n\n### Log Analysis\n\nThe application outputs detailed logs including:\n- Repository processing status\n- API requests and responses\n- Asset download progress\n- Notification delivery status\n- Error messages with context\n\n## 🤝 Contributing\n\n1. Fork the repository\n2. Create a feature branch: `git checkout -b feature/amazing-feature`\n3. Make your changes and add tests\n4. Ensure code quality: `ruff check . \u0026\u0026 ruff format .`\n5. Commit your changes: `git commit -m 'Add amazing feature'`\n6. Push to the branch: `git push origin feature/amazing-feature`\n7. Open a Pull Request\n\n### Development Setup\n\n```bash\n# Install development dependencies\npip install -r requirements.txt\npip install ruff mypy pre-commit\n\n# Set up pre-commit hooks\npre-commit install\n\n# Run tests\npython -m pytest\n\n# Run linting\nruff check .\nruff format .\n```\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🙏 Acknowledgments\n\n- [Apprise](https://github.com/caronc/apprise) - Multi-platform notification library\n- [Tenacity](https://github.com/jd/tenacity) - Retry logic library\n- [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/) - HTML parsing for web scraping watchers\n- All the platform APIs that make this monitoring possible\n\n---\n\n**Made with ❤️ for developers who want to stay updated on their favorite software releases.**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikhilbadyal%2Frelease-tracker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnikhilbadyal%2Frelease-tracker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnikhilbadyal%2Frelease-tracker/lists"}