{"id":19345197,"url":"https://github.com/twsl/whos-there","last_synced_at":"2025-10-08T19:09:28.568Z","repository":{"id":37098872,"uuid":"424334185","full_name":"twsl/whos-there","owner":"twsl","description":"The spiritual successor to knockknock for PyTorch Lightning, get notified when your training ends","archived":false,"fork":false,"pushed_at":"2024-05-13T01:36:56.000Z","size":3024,"stargazers_count":74,"open_issues_count":16,"forks_count":5,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-05-14T00:15:39.093Z","etag":null,"topics":["deep-learning","lightning","machine-learning","python","pytorch","pytorch-lightning"],"latest_commit_sha":null,"homepage":"https://twsl.github.io/whos-there/","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/twsl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-11-03T18:16:03.000Z","updated_at":"2024-07-23T17:28:18.818Z","dependencies_parsed_at":"2024-02-28T00:27:19.550Z","dependency_job_id":"d363e4ad-dc67-463e-942f-70b84380bc5d","html_url":"https://github.com/twsl/whos-there","commit_stats":{"total_commits":248,"total_committers":4,"mean_commits":62.0,"dds":"0.16129032258064513","last_synced_commit":"f647d700297588624ec532dca8bbc112f28958de"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twsl%2Fwhos-there","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twsl%2Fwhos-there/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twsl%2Fwhos-there/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twsl%2Fwhos-there/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twsl","download_url":"https://codeload.github.com/twsl/whos-there/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250372462,"owners_count":21419719,"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","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":["deep-learning","lightning","machine-learning","python","pytorch","pytorch-lightning"],"created_at":"2024-11-10T04:05:19.781Z","updated_at":"2025-10-08T19:09:23.547Z","avatar_url":"https://github.com/twsl.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Who's there?\n\n[![Build](https://github.com/twsl/whos-there/actions/workflows/build.yaml/badge.svg)](https://github.com/twsl/whos-there/actions/workflows/build.yaml)\n[![Documentation](https://github.com/twsl/whos-there/actions/workflows/docs.yaml/badge.svg)](https://github.com/twsl/whos-there/actions/workflows/docs.yaml)\n![GitHub Release](https://img.shields.io/github/v/release/twsl/whos-there?include_prereleases)\n[![PyPI - Package Version](https://img.shields.io/pypi/v/whos-there?logo=pypi\u0026style=flat\u0026color=orange)](https://pypi.org/project/whos-there/)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/whos-there?logo=pypi\u0026style=flat\u0026color=blue)](https://pypi.org/project/whos-there/)\n[![Dependencies Status](https://img.shields.io/badge/dependencies-up%20to%20date-brightgreen.svg)](https://github.com/twsl/whos-there/pulls?utf8=%E2%9C%93\u0026q=is:pr%20author:app/dependabot)\n[![Conda - Platform](https://img.shields.io/conda/pn/conda-forge/whos-there?logo=anaconda\u0026style=flat)](https://anaconda.org/conda-forge/whos-there)\n[![Conda (channel only)](https://img.shields.io/conda/vn/conda-forge/whos-there?logo=anaconda\u0026style=flat\u0026color=orange)](https://anaconda.org/conda-forge/whos-there)\n[![Docs with MkDocs](https://img.shields.io/badge/MkDocs-docs?style=flat\u0026logo=materialformkdocs\u0026logoColor=white\u0026color=%23526CFE)](https://squidfunk.github.io/mkdocs-material/)\n[![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/)\n[![linting: ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](.pre-commit-config.yaml)\n[![Checked with pyright](https://microsoft.github.io/pyright/img/pyright_badge.svg)](https://microsoft.github.io/pyright/)\n[![security: bandit](https://img.shields.io/badge/security-bandit-yellow.svg)](https://github.com/PyCQA/bandit)\n[![Semantic Versions](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--versions-e10079.svg)](https://github.com/twsl/whos-there/releases)\n[![Copier](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/copier-org/copier/master/img/badge/badge-grayscale-border.json)](https://github.com/copier-org/copier)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n\nThe spiritual successor to [knockknock](https://github.com/huggingface/knockknock) for [PyTorch Lightning](https://github.com/PyTorchLightning/pytorch-lightning), to get a notification when your training is complete or when it crashes during the process with a single callback.\n\n\n## Features\n\n- Supports E-Mail, Discord, Slack, Teams, Telegram\n\n\n## Installation\n\nWith `pip`:\n```bash\npython -m pip install whos-there\n```\n\nWith [`poetry`](https://python-poetry.org/):\n```bash\npoetry add whos-there\n```\n\nWith `conda`:\n\n```bash\nconda install conda-forge::whos-there\n```\nCheck [here](https://github.com/conda-forge/whos-there-feedstock) for more information.\n\n\n## How to use it\n\n```python\nimport lightning.pytorch as pl\nfrom whos_there.callback import NotificationCallback\nfrom whos_there.senders.debug import DebugSender\n\ntrainer = pl.Trainer(\n    callbacks=[\n        NotificationCallback(senders=[\n            # Add your senders here\n            DebugSender(),\n        ])\n    ]\n)\n```\n\n### E-Mail\nRequires your e-mail provider specific SMTP settings.\n\n```python\nfrom whos_there.senders.email import EmailSender\n# ...\nEmailSender(\n    host=\"smtp.example.de\",\n    port=587,\n    sender_email=\"from@example.com\",\n    password=\"*********\",\n    recipient_emails=[\n        \"to1@example.com\",\n        \"to2@example.com\",\n    ]\n)\n```\n\n### Discord\nRequires your Discord channel's [webhook URL](https://support.discordapp.com/hc/en-us/articles/228383668-Intro-to-Webhooks).\n\n```python\nfrom whos_there.senders.discord import DiscordSender\n# ...\nDiscordSender(\n    webhook_url=\"https://discord.com/api/webhooks/XXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"\n)\n```\n\n### Slack\nRequires your Slack room [webhook URL](https://api.slack.com/incoming-webhooks#create_a_webhook) and optionally your [user id](https://api.slack.com/methods/users.identity) (if you want to tag yourself or someone else).\n\n```python\nfrom whos_there.senders.slack import SlackSender\n# ...\nSlackSender(\n    webhook_url=\"https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX\",   # gitleaks:allow\n    channel=\"channel_name\",\n    user_mentions=[\n        \"XXXXXXXX\"\n    ]\n)\n```\n\n### Teams\nRequires your Team Channel [webhook URL](https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/connectors/connectors-using).\n\n```python\nfrom whos_there.senders.teams import TeamsSender\n# ...\nTeamsSender(\n    webhook_url=\"https://XXXXX.webhook.office.com/\",\n    user_mentions=[\n        \"twsl\"\n    ]\n)\n```\n\n### Telegram\nYou can also use Telegram Messenger to get notifications. You'll first have to create your own notification bot by following the three steps provided by Telegram [here](https://core.telegram.org/bots#6-botfather) and save your API access `TOKEN`.\nTelegram bots are shy and can't send the first message so you'll have to do the first step. By sending the first message, you'll be able to get the `chat_id` required (identification of your messaging room) by visiting `https://api.telegram.org/bot\u003cYourBOTToken\u003e/getUpdates` and get the `int` under the key `message['chat']['id']`.\n\n```python\nfrom whos_there.senders.telegram import TelegramSender\n# ...\nTelegramSender(\n    chat_id=1234567890,\n    token=\"XXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXX\"\n)\n```\n\n\n## Docs\n\n```bash\npoetry run mkdocs build -f ./docs/mkdocs.yml -d ./_build/\n```\n\n\n## Conda\n\nThe conda repository is maintained [here](https://github.com/conda-forge/whos-there-feedstock).\n\n\n## Update template\n\n```bash\ncopier update --trust\n```\n\n## Credits\n\nThis project was generated with [![🚀 A generic python project template.](https://img.shields.io/badge/python--project--template-%F0%9F%9A%80-brightgreen)](https://github.com/twsl/python-project-template)\n\nBig thanks to [knockknock](https://github.com/huggingface/knockknock) for the idea and code snippets.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwsl%2Fwhos-there","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwsl%2Fwhos-there","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwsl%2Fwhos-there/lists"}