--- title: Langflow Extension quickstart slug: /extensions-quickstart --- Build, validate, and run a Langflow Extension bundle to create a single-component extension you can `pip-install` or load using `lfx extension dev`. ## Prerequisites * Python 3.11 or greater * `langflow` installed with `uv pip install langflow`. The `lfx` CLI provides every command in this guide. For more information, see [Install the Langflow OSS package](/get-started-installation#install-and-run-the-langflow-oss-python-package). ## Create an extension 1. Scaffold a new extension: ```bash lfx extension init my-extension cd my-extension ``` This creates the canonical layout the loader expects: ``` my-extension/ ├── extension.json # the v0 manifest ├── pyproject.toml # so the bundle is pip-installable └── src/ └── lfx_my_extension/ ├── __init__.py ├── extension.json # symlink/copy used by importlib at runtime └── components/ └── my_bundle/ ├── __init__.py └── my_component.py ``` For more information, see [Manifest reference](./extensions-manifest.mdx). 2. To edit the component, open `src/lfx_my_extension/components/my_bundle/my_component.py`. The scaffold ships a working `Component` subclass that prints `"Hello, {name}!"` ```python from lfx.custom.custom_component.component import Component from lfx.io import MessageTextInput, Output from lfx.schema.message import Message class HelloComponent(Component): display_name = "Hello" description = "Greets the caller." inputs = [MessageTextInput(name="who", display_name="Who?", value="world")] outputs = [Output(display_name="Greeting", name="greeting", method="build_message")] def build_message(self) -> Message: return Message(text=f"Hello, {self.who}!") ``` The full surface available to bundle code is enumerated in [`BUNDLE_API.md`](https://github.com/langflow-ai/langflow/blob/main/BUNDLE_API.md). Anything outside of [`BUNDLE_API.md`](https://github.com/langflow-ai/langflow/blob/main/BUNDLE_API.md) is not part of the API contract, and may move or break between releases. 3. Before launching Langflow, run the static extension checker. ```bash lfx extension validate . ``` The validator parses the manifest and reports typed errors. It does not execute imports by default, so it is safe to run against an extension you just downloaded. Use `--execute-imports` only when you trust the source — it runs the import probe in a subprocess. 4. Run Langflow with the extension loaded. ```bash lfx extension dev . ``` This launches a Langflow dev server with `my-extension` registered at the `@official` slot. The Hello component appears in the Langflow UI component list under the bundle name in `extension.json`. To see what the loader picked up: ```bash lfx extension list --format json ``` 5. Iterate with reload. Edit the component, save, then click the **Reload** action in the palette's bundle header (or run `lfx extension reload --bundle my_bundle`). The atomic-swap reload pipeline replaces the component in place; in-flight flows keep the pre-swap class so a running execution is never interrupted. Reload only works in Mode A (local dev). Production deployments rebuild the Docker image. 6. Ship the extension. Once the extension works locally, publish the package to PyPI: ```bash python -m build # builds the wheel + sdist twine upload dist/* # publish to PyPI ``` To install the extension into a Langflow environment with a regular `pip install`: ```bash pip install lfx-my-extension langflow run ``` Discovery happens at server startup. The bundle appears in the palette without further configuration. ## See also - [Bundle extensions overview](./extensions-overview) - [Manifest reference](./extensions-manifest)