{"id":28569698,"url":"https://github.com/abilian/nephele-smo-fork","last_synced_at":"2026-02-13T16:14:39.233Z","repository":{"id":264331576,"uuid":"893065812","full_name":"abilian/nephele-smo-fork","owner":"abilian","description":"Fork of https://gitlab.eclipse.org/eclipse-research-labs/nephele-project/smo","archived":false,"fork":false,"pushed_at":"2025-02-12T09:27:38.000Z","size":22198,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-10T17:15:47.935Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/abilian.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2024-11-23T12:51:57.000Z","updated_at":"2025-02-12T09:27:42.000Z","dependencies_parsed_at":"2024-12-17T16:38:16.746Z","dependency_job_id":null,"html_url":"https://github.com/abilian/nephele-smo-fork","commit_stats":null,"previous_names":["abilian/nephele-smo-fork"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/abilian/nephele-smo-fork","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abilian%2Fnephele-smo-fork","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abilian%2Fnephele-smo-fork/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abilian%2Fnephele-smo-fork/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abilian%2Fnephele-smo-fork/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abilian","download_url":"https://codeload.github.com/abilian/nephele-smo-fork/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abilian%2Fnephele-smo-fork/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29412082,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-13T06:24:03.484Z","status":"ssl_error","status_checked_at":"2026-02-13T06:23:12.830Z","response_time":78,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2025-06-10T17:15:28.727Z","updated_at":"2026-02-13T16:14:39.191Z","avatar_url":"https://github.com/abilian.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SMO\n\nThis repository hosts the Synergetic Meta-Orchestrator consisting of a Flask REST API that is responsible for translating intent formulations, constructing and enforcing deployment plans for Hyper Distributed Application Graphs.\n\nThis is a fork of the original SMO repository, which can be found [here](https://gitlab.eclipse.org/eclipse-research-labs/nephele-project/smo).\n\nBuild status: [![builds.sr.ht status](https://builds.sr.ht/~sfermigier/smo.svg)](https://builds.sr.ht/~sfermigier/smo?)\n\n## TOC\n\n\u003c!-- toc --\u003e\n\n  * [Changes from the Original Repository](#changes-from-the-original-repository)\n  * [Current Status and Issues](#current-status-and-issues)\n  * [License](#license)\n    + [License Compliance](#license-compliance)\n    + [Third-Party Licenses](#third-party-licenses)\n  * [Getting started](#getting-started)\n    + [Prerequisites](#prerequisites)\n    + [Using Python](#using-python)\n    + [Using Docker](#using-docker)\n    + [Using docker-compose](#using-docker-compose)\n    + [Using Vagrant](#using-vagrant)\n  * [Changelog from the Original Repository](#changelog-from-the-original-repository)\n    + [DONE](#done)\n    + [Roadmap / Started](#roadmap--started)\n    + [Roadmap / TODO](#roadmap--todo)\n    + [Roadmap / Long-term](#roadmap--long-term)\n  * [Contributing](#contributing)\n    + [Setting up the development environment](#setting-up-the-development-environment)\n      - [Prerequisite: `uv`](#prerequisite-uv)\n      - [Setting up the environment](#setting-up-the-environment)\n    + [Tooling](#tooling)\n    + [Contribution Guidelines](#contribution-guidelines)\n    + [Code Style](#code-style)\n    + [Testing](#testing)\n      - [`pytest`](#pytest)\n      - [`nox`](#nox)\n    + [Documentation](#documentation)\n    + [Pull Request Process](#pull-request-process)\n    + [Code of Conduct](#code-of-conduct)\n  * [Deployment](#deployment)\n    + [On Hop3](#on-hop3)\n    + [On Heroku](#on-heroku)\n    + [On Docker Swarm](#on-docker-swarm)\n- [Original README](#original-readme)\n  * [Getting started](#getting-started-1)\n  * [File structure](#file-structure)\n\n\u003c!-- tocstop --\u003e\n\n## Changes from the Original Repository\n\nThis repository has undergone a few changes to enhance its functionality, maintainability and compatibility.\n\n1. **Introduction of `pyproject.toml`**: This repository has been updated to reflect a [post-hypermodern Python development approach](https://rdrn.me/postmodern-python/). The adoption of a `pyproject.toml` file provides a standardized and centralized configuration for dependency management and tooling. This simplifies project setup, ensures compatibility with modern Python packaging standards, and consolidates configuration for tools such as linters, formatters, and test runners.\n\n2. **Project Refactoring**: The codebase has been reorganized to improve readability, remove unnecessary dependencies, and simplify the overall structure. This ensures a cleaner and more maintainable implementation.\n\n3. **Database Support**: Added support for SQLite, enabling more flexibility in deployment environments and simplifying testing and development setups.\n\n4. **Namespace Introduction**: A dedicated namespace for the SMO has been introduced to better organize the project and facilitate integration with other components in the open-source cloud ecosystem (including [Hop3](https://github.com/abilian/hop3)).\n\n5. **Continuous Integration Enhancements**: We've created a CI pipeline to ensure smoother automated testing, formatting enforcement, and build processes.\n\n6. **Code Quality Improvements**: Static analysis (ruff, flake8, mypy, pyright...) and formatting (ruff, black, isort...) tools have been implemented to ensure consistent coding standards, and some minor issues and warnings have been resolved.\n\n7. **Testing Additions**: We have added basic unit tests to validate functionality and as such start to improve the reliability of the codebase and the confidence in the future refactorings and enhancements.\n\n8. **Documentation Updates**: Additional documentation (this README) has been included to clarify the usage and contribution guidelines for the project.\n\n9. **Added a CLI**: We have added a CLI to interact with the SMO API. The CLI provides a simplified interface for deploying, managing, and monitoring Hyper Distributed Application Graphs. (WIP - not fully implemented yet).\n```text\nusage: smo [-h] {deploy,get-graph,list-graphs,placement,remove,start,stop,plugins} ...\n\nSMO CLI - Simplified Modular Operations\n\noptions:\n  -h, --help            show this help message and exit\n\ncommands:\n  {deploy,get-graph,list-graphs,placement,remove,start,stop,plugins}\n                        Available commands\n    deploy              Deploy a graph descriptor\n    get-graph           Fetch a specific graph\n    list-graphs         Fetch all graphs under a project\n    placement           Trigger the placement algorithm for a graph\n    remove              Remove a running graph\n    start               Start a stopped graph\n    stop                Stop a running graph\n    plugins             List currently installed plugins\n```\n\n## Current Status and Issues\n\nThe current version of this fork is a **work in progress**, with several planned enhancements and improvements. The following are some of the key areas that we are actively working on:\n\n- **Dependency Issue**: The current deployment mechanism relies on `hdarctl`, which is not universally compatible. We are exploring alternative solutions to address this dependency issue and ensure broader compatibility.\n- **Test Coverage**: While we have added a few basic unit tests, current coverage rate is only 48%, which is quite low. We are working to expand test coverage to include integration tests and end-to-end tests to validate the functionality of the application more comprehensively.\n- **Configuration Management**: Currently the configuraion is hardwired. We are enhancing the configuration management system to provide more flexibility and customization options for deployment environments.\n- **Error Handling and Logging**: We are enhancing error handling and logging mechanisms to improve the robustness and reliability of the application.\n- **Refactoring and Modernization**: We are refactoring the codebase to use modern Python features and best practices, including the adoption of a layered architecture, improved configuration management, and dependency injection mechanisms.\n- **Migrations**: We have introduced Alembic for database migrations. We need to ensure that the migrations are properly managed and versioned to avoid data loss or corruption during updates.\n- **Type Annotations**: We are adding type hints to all functions and methods to improve code readability and maintainability.\n- **Linting and Formatting**: We are addressing all linting and type-checking issues to ensure consistent code quality and adherence to coding standards.\n- **Documentation Improvements**: We are updating the documentation to include a changelog, improve readability, and provide more comprehensive information on the project.\n- **Changelog**: We need to introduce a changelog to track changes and updates to the project more effectively.\n- **CI/CD Pipeline**: We are enhancing the CI/CD pipeline to automate testing, linting, and formatting processes more efficiently.\n- **Deployment Options**: We are exploring deployment options on various platforms, including Hop3, Heroku, and Docker Swarm, to provide more flexibility and scalability.\n- **Contributions**: We welcome contributions from the community to help us address these issues and improve the SMO project further.\n- **License**: The original SMO repository is licensed under the MIT License. We are maintaining the same license for this fork to ensure compliance with the original project's licensing terms.\n- **Licensing Issues**: The project uses the Gurobi Optimizer which is a mathematical optimization software library for solving mixed-integer linear and quadratic optimization problems. This package comes with a trial license that allows to solve problems of limited size. We need to replace it with an open-source alternative to avoid licensing issues.\n\n## License\n\nThe original SMO repository is licensed under the MIT License. We are maintaining the same license for this fork to ensure compliance with the original project's licensing terms.\n\n### License Compliance\n\nHere is the license compliance report (`reuse lint`) for this repository:\n\n```\n* Bad licenses: 0\n* Deprecated licenses: 0\n* Licenses without file extension: 0\n* Missing licenses: 0\n* Unused licenses: 0\n* Used licenses: BSD-3-Clause, CC-BY-4.0, MIT\n* Read errors: 0\n* Files with copyright information: 48 / 48\n* Files with license information: 48 / 48\n\nCongratulations! Your project is compliant with version 3.3 of the REUSE Specification :-)\n```\n\n### Third-Party Licenses\n\nNote that third party libraries used in this project may have different licenses. Please refer to the respective libraries' documentation for details. We will provide a more detailed assessment of third-party licenses in the future.\n\nThis is especially relevant for the Gurobi Optimizer, which is a mathematical optimization software library for solving mixed-integer linear and quadratic optimization problems. This package comes with a trial license that allows to solve problems of limited size. As stated elsewhere, we need to replace it with an open-source alternative to avoid licensing issues.\n\n\n## Getting started\n\n### Prerequisites\n\n\u003e [!NOTE]\n\u003e We currently rely on `[hdarctl](https://gitlab.eclipse.org/eclipse-research-labs/nephele-project/nephele-hdar.git)` for the deployment of applications. A binary is currently provided in this repository, but it will only work on Linux/x86_64 (for other architecture, you will have to build another binary). We need to find a more robust solution.\n\n### Using Python\n\nAssuming you have a working Python environment, you can install the dependencies and run the application as follows:\n\n```bash\n# Install for development\npip install -e .\n# ... or for production\npip install .\n# Run the application\nflask run\n```\n\n### Using Docker\n\n```bash\ndocker build -t smo .\ndocker run -p 5000:5000 smo\n```\n\n\u003e [!WARNING]\n\u003e This will run the application in debug mode. DO NOT use this in production.\n\n### Using docker-compose\n\n```bash\ndocker-compose up\n```\n\n\u003e [!WARNING]\n\u003e This will run the application in debug mode. DO NOT use this in production.\n\n### Using Vagrant\n\n```bash\nvagrant up\nvagrant ssh\n# etc.\n```\n\n## Changelog from the Original Repository\n\n### DONE\n\n- [x] Refactor codebase for readability and maintainability.\n- [x] Remove unnecessary dependencies.\n- [x] Add SQLite support for database flexibility.\n- [x] Introduce SMO-specific namespace for better organization.\n- [x] Add basic unit tests for functionality validation.\n- [x] Implement static analysis and enforce consistent formatting.\n- [x] Create a CI pipeline on SourceHut.\n- [x] Update documentation for usage and contribution guidelines (README)\n- [x] Extend test capabilities to include runtime type-checking with tools like **Typeguard** and **Beartype**.\n- [x] Introduce a `Makefile` to streamline hypermodern Python development workflows (e.g., testing, linting, formatting).\n- [x] Add support for local development with **Vagrant**.\n- [x] Enable easy integration and deployment with **Heroku**.\n- [x] Implement a basic CLI for interacting with the SMO API.\n- [x] Generate a SBOM for the project.\n\n### Roadmap / Started\n\n- [ ] refact: Refactor using a layered architecture.\n- [ ] type: Add type hints to all functions and methods.\n\n### Roadmap / TODO\n\n- [ ] fix: Work around the `hdarctl` dependency issue.\n- [ ] test: Add more unit tests in order to reach close to 100% coverage.\n- [ ] test: Add integration tests.\n- [ ] test: Add e2e tests.\n- [ ] test: test Swagger API using [Schemathesis](https://github.com/schemathesis/schemathesis?tab=readme-ov-file) (and/or [Bravado](https://pypi.org/project/pytest-bravado/)). (But not Dredd - Dredd is dead, killed by Oracle)\n- [ ] feature: Improve error handling and logging.\n- [ ] refact: use the modern (2.0) SQLAlchemy ORM API.\n- [ ] feature: Implement a proper configuration management.\n- [ ] feature: Implement a dependency injection mechanism.\n- [ ] feature: Implement an extension mechanism (e.g. `pluggy` or similar).\n- [ ] refact: Replace the Gurobi Optimizer with an [open-source alternative](https://lab.abilian.com/Tech/Programming%20Techniques/Optimization/)\n- [ ] lint: Fix / suppress all linting issues (ruff, flake8).\n- [ ] lint: Resolve all type-checking issues (mypy, pyright, typeguard, beartype).\n- [ ] doc: Introduce a Changelog (and tools to manage it, like `towncryer` or similar).\n- [ ] doc: Create a proper documentation site using Portray or MkDocs (cf. \u003chttps://lab.abilian.com/Tech/Python/Tooling/Documentation/\u003e)\n- [ ] doc: Describe python API using a formalized format (cf. \u003chttps://lab.abilian.com/Tech/Python/Tooling/Documenting%20a%20Python%20API/\u003e)\n- [ ] chore: Add a license compliance report (and double-check REUSE config).\n\n### Roadmap / Long-term\n\n- [ ] refact: make the optimizer pluggable.\n- [ ] feat: make the orchestration backend-end (current, Kubernetes) pluggable.\n- [ ] refact: make the orchestrator pluggable.\n- [ ] feat: create plugins for other orchestrators: Nomad, Docker Swarm, OpenNebula, Hop3 (when it's ready), etc.\n- [ ] feat: Make a Web UI.\n- [ ] refact: Make the optimisation algorithm pluggable.\n- [ ] feat: Create and benchmark alternative optimisation algorithms.\n- ...\n\n## Contributing\n\nWe welcome contributions to the SMO project! Below is a guide to help you get started.\n\n### Setting up the development environment\n\n#### Prerequisite: `uv`\n\nWe recommend to use `uv`, which is a rapidly evolving Python project that aims to provide a modern, flexible, and efficient way to manage Python environments. It is designed to be a drop-in replacement for `virtualenv`, `pyenv`, `pipenv`, `poetry`, `rye`.\n\nIf `uv` is not supported by your OS (with Homebrew or Linuxbrew, you can install it with `brew install uv`, and you can similarly leverage Nix or Guix to get a recent version of `uv`), you can use `pipx` to install it (assuming you have `pipx` installed, of course):\n\n```bash\npipx install uv\n```\n\nOr simply:\n\n```bash\ncurl -LsSf https://astral.sh/uv/install.sh | sh\n# Or on Windows:\npowershell -c \"irm https://astral.sh/uv/install.ps1 | iex\"\n```\n\n#### Setting up the environment\n\n```bash\nuv venv\n. .venv/bin/activate\nuv sync\n```\n\n### Tooling\n\nBesides the `uv` tool, we use the following tools to maintain the codebase:\n\n- **ruff**: A modern, flexible, and efficient way to manage Python environments.\n- **black**: The uncompromising Python code formatter.\n- **isort**: A Python utility / library to sort imports.\n- **flake8**: A Python tool that glues together pep8, pyflakes, mccabe, and third-party plugins to check the style and quality of some Python code.\n- **mypy**: An optional static type checker for Python.\n- **pyright**: Another optional static type checker for Python.\n- **pytest**: A framework that makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries.\n- **beartype**: A runtime type-checker for Python functions.\n- **typeguard**: Another runtime type checking for Python functions.\n- **nox**: A flexible test automation tool that automates testing in multiple Python environments.\n\nWe orchestrate these tools using `make`, the standard build tool on Unix-like systems, which provides shortcuts for common tasks based on these tools:\n\nThe provided `Makefile` orchestrates various tasks to streamline development, testing, formatting, and maintenance workflows. Here’s a high-level overview of the key functionalities it provides:\n\n- **`develop`**: Installs development dependencies, activates pre-commit hooks, and configures Git for rebase workflows by default.\n- **`install-deps`**: Ensures the project's dependencies are synced and up-to-date using `uv sync`.\n- **`update-deps`**: Updates the project's dependencies to the latest compatible versions using `uv sync -U`.\n- **`activate-pre-commit`**: Installs pre-commit hooks to automatically enforce coding standards during commits.\n- **`configure-git`**: Sets Git to use rebase workflows automatically when pulling branches.\n- **`test`**: Runs Python unit tests using `pytest`.\n- **`test-randomly`**: Executes tests in a randomized order to uncover order-dependent issues.\n- **`test-e2e`**: Placeholder for running end-to-end tests (not yet implemented).\n- **`test-with-coverage`**: Runs tests and generates a coverage report for the specified package.\n- **`test-with-typeguard`**: Verifies runtime type checking for the package using `Typeguard`.\n- **`lint`**: Performs linting and type-checking using `adt check` to ensure code quality.\n- **`format`**: Formats code to meet the style guide using `docformatter` for documentation strings and `adt format` for general formatting.\n- **`clean`**: Cleans up temporary files, cache directories, and build artifacts, leaving the repository in a pristine state.\n- **`help`**: Displays available `make` commands and their descriptions, leveraging `adt help-make`.\n\nThe full list of available commands can be viewed by running `make help`.\n\n\n### Contribution Guidelines\n\n1. **Fork the Repository**: Create a fork of the repository in your own GitHub/GitLab account.\n2. **Create a Feature Branch**: Make a new branch in your fork for the feature or bugfix you plan to work on.\n3. **Follow the Code Style**: Adhere to the project's code style guidelines (see below).\n4. **Add Tests**: Ensure your changes are covered by appropriate unit and integration tests.\n5. **Document Changes**: Update relevant sections in the documentation, including this README if necessary.\n6. **Submit a Pull Request**: Open a pull request against the `main` branch of this repository with a clear description of your changes.\n\n### Code Style\n\nWe use **PEP 8** as the basis for our code style. In practice, most of the code formatting is handled by the following tools:\n\n- **Black**: Ensures consistent formatting.\n- **Ruff**: Handles both formatting and static analysis.\n- **isort**: Organizes imports.\n\nTo apply formatting and linting, simply run:\n\n```bash\nblack .\nisort .\nruff format\n# Use this last one carefully, as it introduces refctorings that should be reviewed:\nruff . --fix\n```\n\n(`ruff` last as it may conflict with some of the changes made by `black` and `isort`.)\n\nOr, better yet, use the provided `Makefile` shortcuts:\n\n- `make format`: Apply formatting.\n\n### Testing\n\nTests are critical to maintaining the quality and reliability of the codebase. We encourage contributors to:\n\n- Add **unit tests** for new or modified functionalities.\n- Write **integration tests** for changes that affect multiple components.\n\n#### `pytest`\n\nRun all tests using:\n\n```bash\npytest\n```\n\nFor test coverage, use:\n\n```bash\npytest --cov=smo\n```\n\nThe `Makefile` provides shortcuts for common testing tasks:\n\n- `make test`: Run all tests.\n- `make test-randomly`: Run tests in random order.\n- `make test-with-coverage`: Run tests with coverage report.\n- `make test-with-typeguard`: Run tests with typeguard enabled.\n- `make test-with-beartype`: Run tests with beartype enabled.\n- `make lint`: Run linters and static analysis.\n\n#### `nox`\n\nWe use `nox` to automate testing in multiple Python environments. To run tests with `nox`, use:\n\n```bash\nnox\n```\n\n(Run `nox -l` to list available session types.)\n\n### Documentation\n\nAll new features or changes should be documented. The documentation should include:\n\n- **Code Comments**: Explain non-trivial parts of the code.\n- **README Updates**: Update this file for any major changes in functionality or usage.\n- **Changelog**: Add a note in the upcoming changelog (to be implemented).\n- **API Documentation**: Update the API documentation if necessary (swagger files).\n\n### Pull Request Process\n\nTo ensure a smooth review process:\n\n1. Make sure your branch is **up to date** with the `main` branch.\n2. Ensure all tests pass and there are no linting or formatting issues.\n3. Provide a clear and concise description of the changes in your pull request, including any relevant issue numbers.\n4. Be responsive to reviewer feedback and address any requested changes promptly.\n\n\n### Code of Conduct\n\nThis project adheres to the [PSF Code of Conduct](https://policies.python.org/python.org/code-of-conduct/). By participating, you agree to abide by its terms. Please be respectful and collaborative in all interactions.\n\nFor further details, see the `[CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md)` file in the main repository.\n\n\n## Deployment\n\n### On Hop3\n\n```bash\nhop create smo\nhop deploy smo\n# TODO: env vars\n```\n\n### On Heroku\n\n```bash\nheroku create\nheroku addons:create heroku-postgresql:essential-0\nheroku config:set FLASK_APP=smo\nheroku config:set FLASK_ENV=production\n# TODO: set SQLALCHEMY_DATABASE_URI properly\ngit push heroku main\nheroku run flask db upgrade\n```\n\n### On Docker Swarm\n\nTODO.\n\n---\n\n# Original README\n\n## Getting started\nUse docker compose:\n```\ndocker-compose up\n```\nThe SMO API is available at port 8000.\n\n## File structure\nThe directory structure of the codebase is as follows:\n```\nsrc/\n├── errors\n├── models\n├── routes\n├── services\n├── utils\n├── app.py\n└── config.py\n```\n- `errors`: custom errors and handlers\n- `models`: db models\n- `routes`: app blueprints\n- `services`: business logic for the routes\n- `utils`: misc\n- `app.py`: the Flask application\n- `config.py`: the Flask application configuration files\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabilian%2Fnephele-smo-fork","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabilian%2Fnephele-smo-fork","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabilian%2Fnephele-smo-fork/lists"}