<!-- 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]
[![Maintainability][Qlty-shield]][Qlty-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 ".[dev]"
```
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 pnpm as dependency manager, if you don't have
# it, you must install it.
# This command will install the deps:
pnpm
```
run the development server:
```sh
pnpm 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
[Qlty-shield]: https://qlty.sh/gh/lucafaggianelli/projects/plombery/maintainability.svg
[Qlty-url]: https://qlty.sh/gh/lucafaggianelli/projects/plombery
Raw data
{
"_id": null,
"home_page": null,
"name": "plombery",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.14,>=3.9",
"maintainer_email": null,
"keywords": "pipeline, task-scheduler, apscheduler, orchestrator, web-ui, fastapi, pydantic",
"author": null,
"author_email": "Luca Faggianelli <luca@velvetlab.tech>",
"download_url": "https://files.pythonhosted.org/packages/17/64/f3b4347bfb1332905707f872d6bf1429108e14897b7a3361e0668eabdd18/plombery-0.5.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[![Maintainability][Qlty-shield]][Qlty-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 \".[dev]\"\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 pnpm as dependency manager, if you don't have\n# it, you must install it.\n# This command will install the deps:\npnpm\n```\n\nrun the development server:\n\n```sh\npnpm 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[Qlty-shield]: https://qlty.sh/gh/lucafaggianelli/projects/plombery/maintainability.svg\n[Qlty-url]: https://qlty.sh/gh/lucafaggianelli/projects/plombery\n",
"bugtrack_url": null,
"license": null,
"summary": "Python task scheduler with a user-friendly web UI",
"version": "0.5.1",
"project_urls": null,
"split_keywords": [
"pipeline",
" task-scheduler",
" apscheduler",
" orchestrator",
" web-ui",
" fastapi",
" pydantic"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "88f264698b2b18f352fa49d8041395d158ca9fc7c3a22142e11c07cb5f666099",
"md5": "294fb47c84179643176804d9325201fe",
"sha256": "11dbe3de15616423523feb6843a3c71793d0529acc882c70edfc3ace44f6c52b"
},
"downloads": -1,
"filename": "plombery-0.5.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "294fb47c84179643176804d9325201fe",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<3.14,>=3.9",
"size": 838828,
"upload_time": "2025-10-28T14:31:29",
"upload_time_iso_8601": "2025-10-28T14:31:29.426923Z",
"url": "https://files.pythonhosted.org/packages/88/f2/64698b2b18f352fa49d8041395d158ca9fc7c3a22142e11c07cb5f666099/plombery-0.5.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1764f3b4347bfb1332905707f872d6bf1429108e14897b7a3361e0668eabdd18",
"md5": "3b277caa07fa682c820334e2f39942d0",
"sha256": "a3410c20d3950366fe948bbd3a183939259b6c06fcd3b74a80803b54bc0262ca"
},
"downloads": -1,
"filename": "plombery-0.5.1.tar.gz",
"has_sig": false,
"md5_digest": "3b277caa07fa682c820334e2f39942d0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.14,>=3.9",
"size": 828873,
"upload_time": "2025-10-28T14:31:30",
"upload_time_iso_8601": "2025-10-28T14:31:30.775376Z",
"url": "https://files.pythonhosted.org/packages/17/64/f3b4347bfb1332905707f872d6bf1429108e14897b7a3361e0668eabdd18/plombery-0.5.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-28 14:31:30",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "plombery"
}