{"id":25150114,"url":"https://github.com/2boom-ua/watchdigest","last_synced_at":"2025-10-11T05:11:36.297Z","repository":{"id":275340577,"uuid":"925737120","full_name":"2boom-ua/watchdigest","owner":"2boom-ua","description":"WatchDigest is a monitoring tool that scans local Docker containers, checks whether their images are outdated, and optionally updates those images. It can notify you across a wide range of messaging platforms when updates are available or have been applied.","archived":false,"fork":false,"pushed_at":"2025-09-28T11:34:17.000Z","size":1502,"stargazers_count":24,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-28T13:25:04.085Z","etag":null,"topics":["discord","docker","docker-image","gotify","matrix","notifications","ntfy","pushbullet","pushover","python","rocketchat","self-hosted","telegram"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/2boom-ua.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-02-01T16:17:58.000Z","updated_at":"2025-09-28T11:27:53.000Z","dependencies_parsed_at":"2025-02-16T06:21:35.639Z","dependency_job_id":"0dbeb999-0e2d-49d3-9646-58c0919fd30a","html_url":"https://github.com/2boom-ua/watchdigest","commit_stats":null,"previous_names":["2boom-ua/watchdigest"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/2boom-ua/watchdigest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2boom-ua%2Fwatchdigest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2boom-ua%2Fwatchdigest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2boom-ua%2Fwatchdigest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2boom-ua%2Fwatchdigest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/2boom-ua","download_url":"https://codeload.github.com/2boom-ua/watchdigest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2boom-ua%2Fwatchdigest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279006349,"owners_count":26084084,"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-10-11T02:00:06.511Z","response_time":55,"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":["discord","docker","docker-image","gotify","matrix","notifications","ntfy","pushbullet","pushover","python","rocketchat","self-hosted","telegram"],"created_at":"2025-02-08T22:16:54.212Z","updated_at":"2025-10-11T05:11:36.290Z","avatar_url":"https://github.com/2boom-ua.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cdiv align=\"center\"\u003e  \n    \u003cimg src=\"https://github.com/2boom-ua/watchdigest/blob/main/screenshot.png?raw=true\" alt=\"\" width=\"800\" height=\"268\"\u003e\n\u003c/div\u003e\n\n*The idea for this software was inspired by* [containrrr/watchtower]([https://github.com/petersem/monocker](https://github.com/containrrr/watchtower))\n\n\n## WatchDigest\n\n**WatchDigest** is a lightweight Python-based tool that monitors your Docker containers for outdated image digests and optionally updates them. It can notify you across various messaging platforms when updates are available or have been applied.\n\n### Features\n- Scans local Docker containers and checks if images are outdated\n- Compares image digests with those from registries like Docker Hub, GitHub Container Registry, GitLab, etc.\n- Optionally pulls and upgrades containers with the latest image\n- Sends notifications to:\n  - Telegram, Discord, Gotify, Ntfy\n  - Pushbullet, Pushover, Slack\n  - Matrix, Mattermost, Pumble\n  - Rocket.Chat, Zulip, Flock, Custom\n  - Any Apprise-compatible endpoint\n  - Includes a simple web interface (Flask) to view container status and logs\n  - Configurable check and update schedule\n  - Designed to run as a Linux service or Docker container.\n\n- **Customizable polling interval** through a configuration file (`config.json`).\n\n### Requirements\n- Python 3.X or higher\n- Docker installed and running\n- Dependencies: `docker`, `requests`, `schedule`, `Flask`\n\n### View\n**https://your_domain_name or http://server_ip:5151**\n\n---\n\n### Edit config.json:\nYou can use any name and any number of records for each messaging platform configuration, and you can also mix platforms as needed. The number of message platform configurations is unlimited.\n\n[Configuration examples for Telegram, Matrix, Apprise, Pumble, Mattermost, Discord, Ntfy, Gotify, Zulip, Flock, Slack, Rocket.Chat, Pushover, Pushbullet](docs/json_message_config.md)\n```\n    \"CUSTOM_NAME\": {\n        \"ENABLED\": false,\n        \"WEBHOOK_URL\": [\n            \"first url\",\n            \"second url\",\n            \"....\"\n        ],\n        \"HEADER\": [\n            {first JSON structure},\n            {second JSON structure},\n            {....}\n        ],\n        \"PAYLOAD\": [\n            {first JSON structure},\n            {second JSON structure},\n            {....}\n        ],\n        \"FORMAT_MESSAGE\": [\n            \"markdown\",\n            \"html\",\n            \"....\"\n        ]\n    },\n```\n| Item | Required | Description |\n|------------|------------|------------|\n| ENABLED | true/false | Enable or disable Custom notifications |\n| WEBHOOK_URL | url | The URL of your Custom webhook |\n| HEADER | JSON structure | HTTP headers for each webhook request. This varies per service and may include fields like {\"Content-Type\": \"application/json\"}. |\n| PAYLOAD | JSON structure | The JSON payload structure for each service, which usually includes message content and format. Like as  {\"body\": \"message\", \"type\": \"info\", \"format\": \"markdown\"}|\n| FORMAT_MESSAGE | markdown,\u003cbr\u003ehtml,\u003cbr\u003etext,\u003cbr\u003esimplified | Specifies the message format used by each service, such as markdown, html, or other text formatting.|\n\n- **markdown** - a text-based format with lightweight syntax for basic styling (Pumble, Mattermost, Discord, Ntfy, Gotify),\n- **simplified** - simplified standard Markdown (Telegram, Zulip, Flock, Slack, RocketChat).\n- **html** - a web-based format using tags for advanced text styling,\n- **text** - raw text without any styling or formatting.\n\n```\n    \"STARTUP_MESSAGE\": false,\n    \"NOTIFY_ENABLED\": true,\n    \"UPGRADE_MODE\": true,\n    \"START_TIMES\": [\"06:00\", \"14:00\", \"22:00\"],\n    \"COMPOSE_FILES\": [\"compose.yaml\", \"compose.yml\", \"docker-compose.yaml\", \"docker-compose.yml\"]\n    \"DEFAULT_DOT_STYLE\": true,\n```\n| Item   | Required   | Description   |\n|------------|------------|------------|\n| STARTUP_MESSAGE | true/false | On/Off startup message. | \n| NOTIFY_ENABLED | true/false | On/Off notification via messaging platforms. | \n| UPGRADE_MODE       | true/false   | Automatically pull and restart containers with updated images if enabled.  |\n| START_TIMES        | list[string] | Specific times (24h format) to run the script if scheduled.                 |\n| COMPOSE_FILES      | list[string] | Compose filenames to detect and use when recreating containers.            |\n| DEFAULT_DOT_STYLE | true/false | Round/Square dots. |\n---\n\n### Clone the repository:\n```\ngit clone https://github.com/2boom-ua/watchdigest.git\ncd watchdigest\n```\n---\n## Docker\n```bash\n  touch data.db\n```\n```bash\n  docker build -t watchdigest .\n```\nor\n```bash\n  docker pull ghcr.io/2boom-ua/watchdigest:latest\n```\n### Dowload and edit config.json\n```bash\ncurl -L -o ./config.json  https://raw.githubusercontent.com/2boom-ua/watchdigest/main/config.json\n```\n### docker-cli\n```bash\ndocker run --name watchdigest -p 5151:5151 -v ./config.json:/watchdigest/config.json -v ./data.db:/watchdigest/data.db -v /var/run/docker.sock:/var/run/docker.sock -e TZ=Etc/UTC --restart always ghcr.io/2boom-ua/watchdigest:latest \n```\n### docker-compose\n```\nservices:\n  watchdigest:\n    image: ghcr.io/2boom-ua/watchdigest:latest\n    container_name: watchdigest\n    ports:\n      - 5151:5151\n    volumes:\n      - ./config.json:/watchdigest/config.json\n      - ./data.db:/watchdigest/data.db\n      - /var/run/docker.sock:/var/run/docker.sock\n    environment:\n      - TZ=Etc/UTC\n    restart: unless-stopped\n```\n\n```bash\ndocker-compose up -d\n```\n---\n\n## Running as a Linux Service\nYou can set this script to run as a Linux service for continuous monitoring.\n\n### Install required Python packages:\n```\npip install -r requirements.txt\n```\n\nCreate a systemd service file:\n```\nnano /etc/systemd/system/watchdigest.service\n```\nAdd the following content:\n\n```\n[Unit]\nDescription=check docker update status\nAfter=multi-user.target\n\n[Service]\nType=simple\nRestart=always\nExecStart=/usr/bin/python3 /opt/watchdigest/watchdigest.py\n\n[Install]\nWantedBy=multi-user.target\n```\nStart and enable the service:\n\n```\nsystemctl daemon-reload\n```\n```\nsystemctl enable watchdigest.service\n```\n```\nsystemctl start watchdigest.service\n```\n### License\nThis project is licensed under the MIT License - see the [MIT License](https://opensource.org/licenses/MIT) for details.\n\n### Author\n- **2boom** - [GitHub](https://github.com/2boom-ua)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F2boom-ua%2Fwatchdigest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F2boom-ua%2Fwatchdigest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F2boom-ua%2Fwatchdigest/lists"}