<!-- Improved compatibility of back to top link: See: https://github.com/othneildrew/Best-README-Template/pull/73 -->
<a name="readme-top"></a>
<!-- PROJECT SHIELDS -->
<!--
*** I'm using markdown "reference style" links for readability.
*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).
*** See the bottom of this document for the declaration of the reference variables
*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.
*** https://www.markdownguide.org/basic-syntax/#reference-style-links
-->
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![MIT License][license-shield]][license-url]
[![PyPI Version][pypi-shield]][pypi-url]
[![Code Climate][CodeClimate-shield]][CodeClimate-url]
<!-- PROJECT LOGO -->
<br />
<div align="center">
<h3 align="center">Plombery</h3>
<p align="center">
Python task scheduler with a user-friendly web UI
<br />
<a href="https://lucafaggianelli.github.io/plombery/"><strong>Official website ยป</strong></a>
<br />
<br />
<a href="https://github.com/lucafaggianelli/plombery">GitHub</a>
ยท
<a href="https://github.com/lucafaggianelli/plombery/issues">Report Bug</a>
</p>
</div>
<!-- ABOUT THE PROJECT -->
## About The Project
Plombery is a simple task scheduler for Python with a web UI and a REST API,
if you need to run and monitor recurring python scripts then it's
the right tool for you!
<figure>
<img src="https://github.com/lucafaggianelli/plombery/raw/main/docs/assets/images/screenshot.png" alt="Plombery Screen Shot">
</figure>
> This project is at its beginning, so it can be shaped and improved with
> your feedback and help!
> If you like it, star it ๐! If you want a feature or find a bug, open an issue.
## Features
- โฐ Task scheduling based on [APScheduler](https://github.com/agronholm/apscheduler) (supports Interval, Cron and Date triggers)
- ๐ป Built-in Web interface, no HTML/JS/CSS coding required
- ๐ฉโ๐ป๐ Pipelines and tasks are defined in pure Python
- ๐๏ธ Pipelines can be parametrized via [Pydantic](https://docs.pydantic.dev/)
- ๐ Pipelines can be run manually from the web UI
- ๐ Secured via OAuth2
- ๐ Debug each run exploring logs and output data
- ๐ฉ Monitor the pipelines and get alerted if something goes wrong
- ๐ฃ Use the REST API for advanced integrations
When you shouldn't use it:
- you need a lot of scalability and you want to run on a distributed system
- you want a no-code tool or you don't want to use Python
<p align="right">(<a href="#readme-top">back to top</a>)</p>
### Built With
[![Python][Python]][Python-url]
[![TypeScript][TypeScript]][TypeScript-url]
[![React][React.js]][React-url]
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- GETTING STARTED -->
## ๐ Getting Started
Check the ๐ [official website](https://lucafaggianelli.github.io/plombery/)
to get started with Plombery.
## ๐ฎ Try on GitHub Codespaces
Try Plombery with some demo pipelines on GitHub Codespaces:
<figure align="center">
<img src="https://github.com/lucafaggianelli/plombery/raw/main/docs/assets/images/codespaces.png" alt="Get Started on Codespaces">
</figure>
Codespaces are development environments that run in the cloud so you
can run a project without cloning it, installing deps etc, here's an how
to:
- Go to the the [lucafaggianelli/plombery](https://github.com/lucafaggianelli/plombery) GitHub page
- Click on the green **Code** button on the top right
- Choose the **Codespaces** tab
- Click on *create new codespace from main* or reuse an existing one
- A new page will open at `github.dev`, wait for the environment build
- Once your codespace is ready you'll see an interface similar to VSCode
- Some commands will be run in the terminal to build the frontend etc., wait for their completion
- If everything went well, Plombery home page will be open in a new browser tab
- Changes in the Python code will be immediately reflected in the web page, like if you were developing
on your laptop
## ๐ง Show me the code
This is how it looks a minimalist pipeline:
<figure align="center">
<img src="https://github.com/lucafaggianelli/plombery/raw/main/docs/assets/images/minimal-code.png" alt="Minimal code" width="80%">
<figcaption>I know you want to see it!</figcaption>
</figure>
<!-- ROADMAP -->
## ๐ฃ Roadmap
See the [open issues](https://github.com/lucafaggianelli/plombery/issues) for a full list of proposed features (and known issues).
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- CONTRIBUTING -->
## ๐ฉโ๐ป Contributing
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement".
Don't forget to give the project a star! Thanks again!
1. Fork the Project
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the Branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
<p align="right">(<a href="#readme-top">back to top</a>)</p>
### Development
Clone a fork of this repo and start your dev environment.
Create a python virtual environment:
```sh
python -m venv .venv
# on Mac/Linux
source .venv/bin/activate
# on Win
.venv/Script/activate
```
and install the dependencies:
```sh
pip install -r requirements.txt
pip install -r requirements-dev.txt
```
for development purposes, it's useful to run the example application:
```sh
cd examples/
# Create a venv for the example app
python -m venv .venv
source .venv/bin/activate
pip install -r requirements
./run.sh
# or ./run.ps1 on windows
```
The React frontend is in the `frontend/` folder, enter the folder
and install the dependencies:
```sh
cd frontend/
# The project uses yarn as dependency manager, if you don't have
# it, you must install it.
# This command will install the deps:
yarn
```
run the development server:
```sh
yarn dev
```
### Documentation
The documentation website is based on MkDocs Material, the source code is in the
`docs/` folder and the config is in the `mkdocs.yml` file.
To run a local dev server, run:
```
mkdocs serve
```
### Testing
Tests are based on `pytest`, to run the entire suite just run:
```sh
pytest
```
To run tests coverage, run:
```sh
coverage run -m pytest
coverage report -m
```
<!-- LICENSE -->
## License
Distributed under the MIT License. See `LICENSE.txt` for more information.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- CONTACT -->
## Contact
Project Link: [https://github.com/lucafaggianelli/plombery](https://github.com/lucafaggianelli/plombery)
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- ACKNOWLEDGMENTS -->
## Acknowledgments
Plombery is built on top of amazing techs:
- [FastAPI](https://fastapi.tiangolo.com/)
- [Pydantic](https://docs.pydantic.dev/)
- [APScheduler](https://apscheduler.readthedocs.io/)
- [Apprise](https://github.com/caronc/apprise)
- [React](https://react.dev/)
- [Vite](https://vitejs.dev/)
- [Tremor](https://www.tremor.so/)
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Star History
<a href="https://star-history.com/#lucafaggianelli/plombery&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=lucafaggianelli/plombery&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=lucafaggianelli/plombery&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=lucafaggianelli/plombery&type=Date" />
</picture>
</a>
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
[contributors-shield]: https://img.shields.io/github/contributors/lucafaggianelli/plombery.svg?style=for-the-badge
[contributors-url]: https://github.com/lucafaggianelli/plombery/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/lucafaggianelli/plombery.svg?style=for-the-badge
[forks-url]: https://github.com/lucafaggianelli/plombery/network/members
[stars-shield]: https://img.shields.io/github/stars/lucafaggianelli/plombery.svg?style=for-the-badge
[stars-url]: https://github.com/lucafaggianelli/plombery/stargazers
[issues-shield]: https://img.shields.io/github/issues/lucafaggianelli/plombery.svg?style=for-the-badge
[issues-url]: https://github.com/lucafaggianelli/plombery/issues
[license-shield]: https://img.shields.io/github/license/lucafaggianelli/plombery.svg?style=for-the-badge
[license-url]: https://github.com/lucafaggianelli/plombery/blob/master/LICENSE
[product-screenshot]: images/screenshot.png
[React.js]: https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB
[React-url]: https://reactjs.org/
[Python]: https://img.shields.io/badge/Python-3776AB?style=for-the-badge&logo=python&logoColor=yellow
[Python-url]: https://www.python.org/
[TypeScript]: https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white
[TypeScript-url]: https://www.typescriptlang.org/
[pypi-shield]: https://img.shields.io/pypi/v/plombery.svg?style=for-the-badge
[pypi-url]: https://pypi.python.org/pypi/plombery
[CodeClimate-shield]: https://codeclimate.com/github/lucafaggianelli/plombery.png?style=for-the-badge
[CodeClimate-url]: https://codeclimate.com/github/lucafaggianelli/plombery
Raw data
{
"_id": null,
"home_page": "",
"name": "plombery",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "pipeline,task-scheduler,apscheduler,orchestrator,web-ui,fastapi,pydantic",
"author": "",
"author_email": "Luca Faggianelli <luca@velvetlab.tech>",
"download_url": "https://files.pythonhosted.org/packages/91/b3/963e13ed29827243320ec914322765435547aba103ba538e9702237478a2/plombery-0.4.1.tar.gz",
"platform": null,
"description": "<!-- Improved compatibility of back to top link: See: https://github.com/othneildrew/Best-README-Template/pull/73 -->\n\n<a name=\"readme-top\"></a>\n\n<!-- PROJECT SHIELDS -->\n<!--\n*** I'm using markdown \"reference style\" links for readability.\n*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).\n*** See the bottom of this document for the declaration of the reference variables\n*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.\n*** https://www.markdownguide.org/basic-syntax/#reference-style-links\n-->\n\n[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![MIT License][license-shield]][license-url]\n[![PyPI Version][pypi-shield]][pypi-url]\n[![Code Climate][CodeClimate-shield]][CodeClimate-url]\n\n<!-- PROJECT LOGO -->\n<br />\n<div align=\"center\">\n<h3 align=\"center\">Plombery</h3>\n\n <p align=\"center\">\n Python task scheduler with a user-friendly web UI\n <br />\n <a href=\"https://lucafaggianelli.github.io/plombery/\"><strong>Official website \u00bb</strong></a>\n <br />\n <br />\n <a href=\"https://github.com/lucafaggianelli/plombery\">GitHub</a>\n \u00b7\n <a href=\"https://github.com/lucafaggianelli/plombery/issues\">Report Bug</a>\n </p>\n</div>\n\n<!-- ABOUT THE PROJECT -->\n\n## About The Project\n\nPlombery is a simple task scheduler for Python with a web UI and a REST API,\nif you need to run and monitor recurring python scripts then it's\nthe right tool for you!\n\n<figure>\n <img src=\"https://github.com/lucafaggianelli/plombery/raw/main/docs/assets/images/screenshot.png\" alt=\"Plombery Screen Shot\">\n</figure>\n\n> This project is at its beginning, so it can be shaped and improved with\n> your feedback and help!\n> If you like it, star it \ud83c\udf1f! If you want a feature or find a bug, open an issue.\n\n## Features\n\n- \u23f0 Task scheduling based on [APScheduler](https://github.com/agronholm/apscheduler) (supports Interval, Cron and Date triggers)\n- \ud83d\udcbb Built-in Web interface, no HTML/JS/CSS coding required\n- \ud83d\udc69\u200d\ud83d\udcbb\ud83d\udc0d Pipelines and tasks are defined in pure Python\n- \ud83c\udf9b\ufe0f Pipelines can be parametrized via [Pydantic](https://docs.pydantic.dev/)\n- \ud83d\udc49 Pipelines can be run manually from the web UI\n- \ud83d\udd10 Secured via OAuth2\n- \ud83d\udd0d Debug each run exploring logs and output data\n- \ud83d\udce9 Monitor the pipelines and get alerted if something goes wrong\n- \ud83d\udca3 Use the REST API for advanced integrations\n\nWhen you shouldn't use it:\n\n- you need a lot of scalability and you want to run on a distributed system\n- you want a no-code tool or you don't want to use Python\n\n<p align=\"right\">(<a href=\"#readme-top\">back to top</a>)</p>\n\n### Built With\n\n[![Python][Python]][Python-url]\n[![TypeScript][TypeScript]][TypeScript-url]\n[![React][React.js]][React-url]\n\n<p align=\"right\">(<a href=\"#readme-top\">back to top</a>)</p>\n\n<!-- GETTING STARTED -->\n\n## \ud83d\ude80 Getting Started\n\nCheck the \ud83d\udc49 [official website](https://lucafaggianelli.github.io/plombery/)\nto get started with Plombery.\n\n## \ud83c\udfae Try on GitHub Codespaces\n\nTry Plombery with some demo pipelines on GitHub Codespaces:\n\n<figure align=\"center\">\n <img src=\"https://github.com/lucafaggianelli/plombery/raw/main/docs/assets/images/codespaces.png\" alt=\"Get Started on Codespaces\">\n</figure>\n\nCodespaces are development environments that run in the cloud so you\ncan run a project without cloning it, installing deps etc, here's an how\nto:\n\n- Go to the the [lucafaggianelli/plombery](https://github.com/lucafaggianelli/plombery) GitHub page\n- Click on the green **Code** button on the top right\n- Choose the **Codespaces** tab\n- Click on *create new codespace from main* or reuse an existing one\n- A new page will open at `github.dev`, wait for the environment build\n- Once your codespace is ready you'll see an interface similar to VSCode\n- Some commands will be run in the terminal to build the frontend etc., wait for their completion\n- If everything went well, Plombery home page will be open in a new browser tab\n- Changes in the Python code will be immediately reflected in the web page, like if you were developing\n on your laptop\n\n## \ud83e\uddd0 Show me the code\n\nThis is how it looks a minimalist pipeline:\n\n<figure align=\"center\">\n <img src=\"https://github.com/lucafaggianelli/plombery/raw/main/docs/assets/images/minimal-code.png\" alt=\"Minimal code\" width=\"80%\">\n <figcaption>I know you want to see it!</figcaption>\n</figure>\n\n<!-- ROADMAP -->\n\n## \ud83d\udee3 Roadmap\n\nSee the [open issues](https://github.com/lucafaggianelli/plombery/issues) for a full list of proposed features (and known issues).\n\n<p align=\"right\">(<a href=\"#readme-top\">back to top</a>)</p>\n\n<!-- CONTRIBUTING -->\n\n## \ud83d\udc69\u200d\ud83d\udcbb Contributing\n\nContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\nIf you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag \"enhancement\".\nDon't forget to give the project a star! Thanks again!\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the Branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\n<p align=\"right\">(<a href=\"#readme-top\">back to top</a>)</p>\n\n### Development\n\nClone a fork of this repo and start your dev environment.\n\nCreate a python virtual environment:\n\n```sh\npython -m venv .venv\n# on Mac/Linux\nsource .venv/bin/activate\n# on Win\n.venv/Script/activate\n```\n\nand install the dependencies:\n\n```sh\npip install -r requirements.txt\npip install -r requirements-dev.txt\n```\n\nfor development purposes, it's useful to run the example application:\n\n```sh\ncd examples/\n\n# Create a venv for the example app\npython -m venv .venv\nsource .venv/bin/activate\npip install -r requirements\n\n./run.sh\n# or ./run.ps1 on windows\n```\n\nThe React frontend is in the `frontend/` folder, enter the folder\nand install the dependencies:\n\n```sh\ncd frontend/\n# The project uses yarn as dependency manager, if you don't have\n# it, you must install it.\n# This command will install the deps:\nyarn\n```\n\nrun the development server:\n\n```sh\nyarn dev\n```\n\n### Documentation\n\nThe documentation website is based on MkDocs Material, the source code is in the\n`docs/` folder and the config is in the `mkdocs.yml` file.\n\nTo run a local dev server, run:\n\n```\nmkdocs serve\n```\n\n### Testing\n\nTests are based on `pytest`, to run the entire suite just run:\n\n```sh\npytest\n```\n\nTo run tests coverage, run:\n\n```sh\ncoverage run -m pytest\ncoverage report -m\n```\n\n<!-- LICENSE -->\n\n## License\n\nDistributed under the MIT License. See `LICENSE.txt` for more information.\n\n<p align=\"right\">(<a href=\"#readme-top\">back to top</a>)</p>\n\n<!-- CONTACT -->\n\n## Contact\n\nProject Link: [https://github.com/lucafaggianelli/plombery](https://github.com/lucafaggianelli/plombery)\n\n<p align=\"right\">(<a href=\"#readme-top\">back to top</a>)</p>\n\n<!-- ACKNOWLEDGMENTS -->\n\n## Acknowledgments\n\nPlombery is built on top of amazing techs:\n\n- [FastAPI](https://fastapi.tiangolo.com/)\n- [Pydantic](https://docs.pydantic.dev/)\n- [APScheduler](https://apscheduler.readthedocs.io/)\n- [Apprise](https://github.com/caronc/apprise)\n- [React](https://react.dev/)\n- [Vite](https://vitejs.dev/)\n- [Tremor](https://www.tremor.so/)\n\n<p align=\"right\">(<a href=\"#readme-top\">back to top</a>)</p>\n\n## Star History\n\n<a href=\"https://star-history.com/#lucafaggianelli/plombery&Date\">\n <picture>\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=lucafaggianelli/plombery&type=Date&theme=dark\" />\n <source media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=lucafaggianelli/plombery&type=Date\" />\n <img alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=lucafaggianelli/plombery&type=Date\" />\n </picture>\n</a>\n\n\n<!-- MARKDOWN LINKS & IMAGES -->\n<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->\n\n[contributors-shield]: https://img.shields.io/github/contributors/lucafaggianelli/plombery.svg?style=for-the-badge\n[contributors-url]: https://github.com/lucafaggianelli/plombery/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/lucafaggianelli/plombery.svg?style=for-the-badge\n[forks-url]: https://github.com/lucafaggianelli/plombery/network/members\n[stars-shield]: https://img.shields.io/github/stars/lucafaggianelli/plombery.svg?style=for-the-badge\n[stars-url]: https://github.com/lucafaggianelli/plombery/stargazers\n[issues-shield]: https://img.shields.io/github/issues/lucafaggianelli/plombery.svg?style=for-the-badge\n[issues-url]: https://github.com/lucafaggianelli/plombery/issues\n[license-shield]: https://img.shields.io/github/license/lucafaggianelli/plombery.svg?style=for-the-badge\n[license-url]: https://github.com/lucafaggianelli/plombery/blob/master/LICENSE\n[product-screenshot]: images/screenshot.png\n[React.js]: https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB\n[React-url]: https://reactjs.org/\n[Python]: https://img.shields.io/badge/Python-3776AB?style=for-the-badge&logo=python&logoColor=yellow\n[Python-url]: https://www.python.org/\n[TypeScript]: https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white\n[TypeScript-url]: https://www.typescriptlang.org/\n[pypi-shield]: https://img.shields.io/pypi/v/plombery.svg?style=for-the-badge\n[pypi-url]: https://pypi.python.org/pypi/plombery\n[CodeClimate-shield]: https://codeclimate.com/github/lucafaggianelli/plombery.png?style=for-the-badge\n[CodeClimate-url]: https://codeclimate.com/github/lucafaggianelli/plombery\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python task scheduler with a user-friendly web UI",
"version": "0.4.1",
"project_urls": null,
"split_keywords": [
"pipeline",
"task-scheduler",
"apscheduler",
"orchestrator",
"web-ui",
"fastapi",
"pydantic"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "ff60362b02d3f71b6d35f63f2ba77ecaf4a3c1fb34e568bc5a0a6b3e5a39906f",
"md5": "e9df14a078d9f3d0c47e873b689cef03",
"sha256": "6239662c9d9930a3ae3914057d07124b7ed5efbdfb34dc62f037f7df386b6ebe"
},
"downloads": -1,
"filename": "plombery-0.4.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e9df14a078d9f3d0c47e873b689cef03",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 625507,
"upload_time": "2023-10-11T15:39:00",
"upload_time_iso_8601": "2023-10-11T15:39:00.497275Z",
"url": "https://files.pythonhosted.org/packages/ff/60/362b02d3f71b6d35f63f2ba77ecaf4a3c1fb34e568bc5a0a6b3e5a39906f/plombery-0.4.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "91b3963e13ed29827243320ec914322765435547aba103ba538e9702237478a2",
"md5": "f36e68073d571c7e9c729e364fb3c5c9",
"sha256": "26bc9e74db6fa1f16af1270ab74662d846a28ac2dd600f789fcd6ff807e67a51"
},
"downloads": -1,
"filename": "plombery-0.4.1.tar.gz",
"has_sig": false,
"md5_digest": "f36e68073d571c7e9c729e364fb3c5c9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 619671,
"upload_time": "2023-10-11T15:39:02",
"upload_time_iso_8601": "2023-10-11T15:39:02.356614Z",
"url": "https://files.pythonhosted.org/packages/91/b3/963e13ed29827243320ec914322765435547aba103ba538e9702237478a2/plombery-0.4.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-10-11 15:39:02",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "plombery"
}