# Plugins Nodes come from **plugins**. noodlelab ships with its own (units, uncertainty, maths, science, engineering, geo, machine learning...), and anyone can write more and publish them from a git repository, without asking anyone. A plugin is an ordinary Python package with: - a `noodlelab.nodes` entry point, whose name prefixes its node ids (`thermo.rankine_cycle`); - a manifest, `noodlelab-plugin.toml`, that names it, states the plugin API it was written for, the other plugins it needs and what it does besides computing; - code that uses noodlelab only through {mod}`noodlelab.plugin`, the public API. Plugins are versioned as a whole, with git tags (`v1.4.2`, semantic versioning). A plugin can require others (`requires = { maths = ">=1.2,<2" }`): adding it adds them. Every run's provenance records each plugin's version and the git commit it was built from, and every saved graph records the plugins it needs, so it can be opened elsewhere with the same code. - [Installing plugins](installing.md): in the admin portal, on the command line, in Python and from agents - [Writing a plugin](writing.md): the standard, the manifest and the public API - [Publishing a plugin](publishing.md): versions, signed releases and indexes - [Security](security.md): what protects you from a harmful plugin, and what does not ```{toctree} :hidden: installing writing publishing security ```