{"id":25705222,"url":"https://github.com/aporia-ai/mlnotify","last_synced_at":"2025-04-05T01:08:56.241Z","repository":{"id":39654533,"uuid":"359409673","full_name":"aporia-ai/mlnotify","owner":"aporia-ai","description":"🔔 No need to keep checking your training - just one import line and you'll know the second it's done.","archived":false,"fork":false,"pushed_at":"2022-05-29T07:20:30.000Z","size":10715,"stargazers_count":344,"open_issues_count":15,"forks_count":19,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-03-29T00:06:00.685Z","etag":null,"topics":["data-science","deep-learning","deeplearning","machine-learning","machinelearning","machinelearning-python","ml","notification","notifications","opensource","python","python3","tool","tools"],"latest_commit_sha":null,"homepage":"https://mlnotify.aporia.com","language":"Vue","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/aporia-ai.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":"CODEOWNERS","security":"SECURITY.md","support":null}},"created_at":"2021-04-19T09:55:44.000Z","updated_at":"2025-02-21T04:46:35.000Z","dependencies_parsed_at":"2022-08-28T10:01:10.630Z","dependency_job_id":null,"html_url":"https://github.com/aporia-ai/mlnotify","commit_stats":null,"previous_names":[],"tags_count":56,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aporia-ai%2Fmlnotify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aporia-ai%2Fmlnotify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aporia-ai%2Fmlnotify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aporia-ai%2Fmlnotify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aporia-ai","download_url":"https://codeload.github.com/aporia-ai/mlnotify/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247271532,"owners_count":20911587,"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":["data-science","deep-learning","deeplearning","machine-learning","machinelearning","machinelearning-python","ml","notification","notifications","opensource","python","python3","tool","tools"],"created_at":"2025-02-25T06:38:42.896Z","updated_at":"2025-04-05T01:08:56.218Z","avatar_url":"https://github.com/aporia-ai.png","language":"Vue","funding_links":[],"categories":["Simplification Tools"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\u003cimg alt=\"ML Notify\" src=\"docs/assets/logo-with-text.svg\" width=\"300\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"SDK Build\" src=\"https://img.shields.io/pypi/v/mlnotify.svg\"\u003e\n  \u003cimg alt=\"SDK Build\" src=\"https://img.shields.io/github/workflow/status/aporia-ai/mlnotify/Bump%20Version/main?label=sdk%20build\"\u003e\n  \u003ca href=\"https://app.fossa.com/projects/git%2Bgithub.com%2Faporia-ai%2Fmlnotify?ref=badge_shield\" alt=\"FOSSA Status\"\u003e\u003cimg src=\"https://app.fossa.com/api/projects/git%2Bgithub.com%2Faporia-ai%2Fmlnotify.svg?type=shield\"/\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/aporia-ai/mlnotify\" alt=\"License\"\u003e\n  \u003ca href=\"https://github.com/aporia-ai/mlnotify/issues\"\u003e\u003cimg src=\"https://img.shields.io/github/issues/aporia-ai/mlnotify\" alt=\"Issues\"\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/last-commit/aporia-ai/mlnotify\" alt=\"Last Commit\"\u003e\n  \u003ca href=\"https://pypi.org/project/mlnotify/\"\u003e\u003cimg src=\"https://pepy.tech/badge/mlnotify\" alt=\"Downloads\"\u003e\u003c/a\u003e\n  \n  \u003c!-- The Netlify badge is disabled since it's bugged. For more details: --\u003e\n  \u003c!-- https://answers.netlify.com/t/status-badge-incorrectly-shows-failing-when-deploy-is-auto-cancelled/7316/26 --\u003e\n  \u003c!-- \u003ca href=\"https://app.netlify.com/sites/mlnotify/deploys\" alt=\"Website Deploy Status\"\u003e\u003cimg src=\"https://api.netlify.com/api/v1/badges/a832ff7a-83aa-4c70-99b1-f812ae4bc3d8/deploy-status\"/\u003e\u003c/a\u003e --\u003e\n\u003c/p\u003e\n\nNo need to keep checking your training. Add \u003cstrong\u003ejust 1 import line\u003c/strong\u003e and MLNotify will let you know the second it's done.\n\n**Features:**\n\n- Just `pip install mlnotify` and `import mlnotify` to get started\n- Out-of-the-box email \u0026 push notifications on desktop, mobile\n- Support for most major ML frameworks (as in Keras, LightGBM, SKLearn, XGBoost, Tensorflow)\n- A simple \u0026 intuitive UX\n- Fully secure - no sensitive data leaves your machine (only training start time / end time)\n\n\u003cp align=\"center\"\u003eMade with :heart: by \u003ca href=\"https://www.aporia.com?utm_source=github\u0026utm_medium=github\u0026utm_campaign=mlnotify\" target=\"_blank\"\u003eAporia\u003c/a\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e\n    \u003cimg alt=\"ML Notify\" src=\"docs/assets/usage.gif\"\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\n## Quickstart\n\n```bash\npip3 install mlnotify\n```\n\n```python\n# STEP 1: Import package\nimport mlnotify\n\n# STEP 2: Do your thing.\nmy_model.fit(...)\n\n# STEP 3: Browse to mlnotify.com and get notified when training is done!\n```\n\nThe import will automagically hook into your fit/train method.\n\n- Once you start training your model a tracking url \u0026 QR code will be printed to the console.\n  ![Printed tracking URL \u0026 QR code](docs/assets/printed-tracking-url-and-qr-code.png)\n- Enter the tracking url\n- Grab a coffee and relax, the tracking url will notify you when the training is complete via desktop, mobile, or email notifications\n\n## Usage\n\n### Simple\n\n`import mlnotify`\n\nThis will automagically hook into your fit/train method.\n\nSupported ML frameworks:\n\n- [Keras](https://keras.io/)\n- [LightGBM](https://github.com/microsoft/LightGBM)\n- [SKLearn](http://scikit-learn.org/stable/)\n- [XGBoost](https://xgboost.readthedocs.io/en/latest/) (partially)\n- [Tensorflow](https://www.tensorflow.org/)\n- [Catboost](https://catboost.ai/)\n\n### Jupyter Notebook\n\n`import mlnotify`\n\nAnd in any Jupyter cell:\n\n```\n%%notify\n...\n```\n\nWorks with line magic, too\n```\n%notify your_code()\n```\n\n### Manual\n\nThe library also exports a manual API to be used if you want to do it manually.\n\n```python\nimport mlnotify\n\nmlnotify.start() # Start tracking\n# ...\nmlnotify.end() # End tracking\n```\n\n### Advanced\n\nThe library uses a simple plugin architecture. You can register your own plugins to extend the library's functionality.\n\n```python\nfrom mlnotify import BasePlugin, plugin_manager\n\n# A plugin is simply a class with `before` and `after` methods\nclass MyPlugin(BasePlugin):\n    def before(self, *args, **kwargs):\n        # Called before the fit/train method\n        print(\"MyPlugin: training started\")\n\n    def after(self, *args, **kwargs):\n        # Called after the fit/train method\n        print(\"MyPlugin: training finished\")\n\nplugin_manager.register_plugin(MyPlugin())\n\n# Use mlnotify as you normally would\nmodel.fit(...)\n```\n\n## API\n\nThe library exports four items:\n\n```python\nfrom mlnotify import start, end, plugins_manager, BasePlugin\n```\n\n### `start() -\u003e None`\n\nStarts tracking.\n\n### `end() -\u003e None`\n\nEnds tracking.\n\n### `plugins_manager: PluginsManager`\n\nThe class handling all plugin registration and invocation.\nMethods:\n\n- `plugins_manager.register_plugin(plugin: BasePlugin) -\u003e None`\n\n  Registers a plugin.\n\n- `plugins_manager.clear_plugins() -\u003e None`\n\n  Removes all registered plugins.\n\n## Security\n\nNo sensitive data is sent to the MLNotify server - only training start \u0026 end time.\n\n## Contribution, self-deployment \u0026 local development\n\nContributions and self-deployments are more than welcome.\n\n### Website \u0026 API\n\nThis project relies heavily on SaaS products, and must receive proper config for Netlify, Firebase and SendGrid for it to work. You can run this project locally using the Netlify CLI:\n\n- Make sure you installed the Netlify CLI globally: `npm install -g netlify-cli`\n- You must have the following environment variables set:\n  - `FIREBASE_SERVER_CERT` - a stringified JSON containing the firebase server config (it contains the following keys: {type, project_id, private_key_id, private_key, client_email, client_id, auth_uri, token_uri, auth_provider_x509_cert_url, client_x509_cert_url})\n  - `GRIDSOME_FIREBASE_APP_CONFIG` - a stringified JSON containing the firebase client config (it contains the following keys: {apiKey, projectId, messagingSenderId, appId})\n  - `SENDGRID_API_KEY` - a string containing the SendGrid API Key\n- `cd website`\n- `netlify dev`\n\n### SDK\n\n- `pip install ./sdk`\n- Write a python file using the SDK and just `import mlnotify`\n\n## License\n\n[![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Faporia-ai%2Fmlnotify.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Faporia-ai%2Fmlnotify?ref=badge_large)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faporia-ai%2Fmlnotify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faporia-ai%2Fmlnotify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faporia-ai%2Fmlnotify/lists"}