Visual pipeline editor and runner for task automation
Project description
A lightweight visual pipeline runner for research.
Connect your Python scripts into a graph, tweak parameters, run experiments, see results — without setting up Airflow or learning a workflow framework.
Try the live demo — no installation required. Browse and run the example pipelines in your browser. (First load may take ~30s to wake up.)
Loom gives you a CLI runner and visual editor for pipelines defined in YAML. Your scripts stay as regular Python with argparse — no framework to learn, no rewrites needed.
It's designed for research workflows. For production orchestration, tools like Airflow or Kubeflow are better suited.
Installation
# Core runner only
pip install loom-pipeline
# With visual editor
pip install loom-pipeline[ui]
That's it. No configuration files to create, no external services to manage.
Quick Start
Clone the repo and try an example:
git clone https://github.com/ljubobratovicrelja/loom.git
cd loom
pip install -e .[ui,examples]
# Run a pipeline from the command line
loom examples/image-processing/pipeline.yml
Pipeline: 3 step(s) to run [parallel]
----------------------------------------
[RUNNING] grayscale
[grayscale] Converted to grayscale: .loom-url-cache/35bb4a6_Lenna.png -> data/grayscale.png
[SUCCESS] grayscale
[RUNNING] blur
[blur] Gaussian blur (radius=15): data/grayscale.png -> data/blurred.png
[SUCCESS] blur
[RUNNING] edge_detect
[edge_detect] Edge detection: data/grayscale.png -> data/edges.png
[SUCCESS] edge_detect
----------------------------------------
Completed: 3/3 steps succeeded
Or open it in the visual editor:
# Edit a single pipeline
loom-ui examples/image-processing/pipeline.yml
# Browse all example pipelines
loom-ui examples/
The editor opens in your browser where you can see the pipeline graph, run steps, and view outputs.
Building Your Own Pipeline
Add Loom to your project's environment:
pip install loom-pipeline[ui] # or just loom-pipeline for CLI only
Now you can run pipelines from within your project. Here's how to set one up.
1. Point it at your scripts
Say you have some Python scripts that process data:
tasks/
extract_features.py # Takes video, outputs CSV
train_model.py # Takes CSV, outputs model
evaluate.py # Takes model + test data, outputs metrics
2. Describe the pipeline in YAML
# experiment.yml
variables:
video: data/raw/recording.mp4
features: data/processed/features.csv
model: models/classifier.pt
metrics: results/metrics.json
parameters:
learning_rate: 0.001
epochs: 100
pipeline:
- name: extract
task: tasks/extract_features.py
inputs:
video: $video
outputs:
-o: $features
- name: train
task: tasks/train_model.py
inputs:
data: $features
outputs:
-o: $model
args:
--lr: $learning_rate
--epochs: $epochs
- name: evaluate
task: tasks/evaluate.py
inputs:
model: $model
outputs:
-o: $metrics
3. Run it
# Run the full pipeline
loom experiment.yml
# Run just one step
loom experiment.yml --step train
# Run from a step onward
loom experiment.yml --from train
# Try different parameters
loom experiment.yml --set learning_rate=0.01 --set epochs=200
# Override file paths
loom experiment.yml --var video=other_recording.mp4
# Run steps in parallel
loom experiment.yml --parallel --max-workers 4
# Preview without executing
loom experiment.yml --dry-run
# Clean all data (move to trash) and re-run from scratch
loom experiment.yml --clean
loom experiment.yml
# Preview what would be cleaned
loom experiment.yml --clean-list
4. Or use the visual editor
loom-ui experiment.yml
This opens a browser-based editor where you can:
- See your pipeline as a visual graph
- Drag and drop to reorganize
- Run individual steps and see output in real-time
- Quickly see which outputs exist (green) vs missing (grey)
You can also point it at a directory to browse multiple pipelines:
loom-ui experiments/ # Browse all pipelines in a folder
Each pipeline should be in its own subdirectory with a pipeline.yml file inside. See examples/ for the expected structure.
How Scripts Work
Your scripts stay normal Python with argparse. Just add a YAML block in the docstring so Loom knows the interface:
"""Extract features from video.
---
inputs:
video:
type: video
description: Input video file
outputs:
-o:
type: csv
description: Output features
args:
--sample-rate:
type: int
default: 30
description: Frames to sample per second
---
"""
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("video")
parser.add_argument("-o", "--output", required=True)
parser.add_argument("--sample-rate", type=int, default=30)
args = parser.parse_args()
# ... your code ...
if __name__ == "__main__":
main()
The YAML frontmatter is optional but enables the editor to show input/output types and provide better validation.
Use Cases
Parameter exploration: Create parallel branches in your pipeline to test different configurations side by side.
Reproducible experiments: The YAML file captures your entire experiment setup. Commit it to git alongside your code.
Iterative development: Run just the steps you're working on. Loom tracks dependencies so upstream steps run only when needed.
Result organization: Variables point to file paths, so your outputs are organized by experiment configuration.
Philosophy
Loom is intentionally minimal:
- No database — Everything is files: your scripts, YAML configs, and outputs
- No external services — The visual editor runs a local server that stops when you close it
- No lock-in — Your scripts work with or without Loom
- No magic — Loom just builds shell commands and runs them
This makes it easy to adopt incrementally. Start with one experiment, see if it helps, expand from there.
License
MIT License — see LICENSE for details.
Built for researchers who want to see their experiments, not manage infrastructure.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file loom_pipeline-0.3.0.tar.gz.
File metadata
- Download URL: loom_pipeline-0.3.0.tar.gz
- Upload date:
- Size: 337.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4036aa47dfd73abb7d369df46e78c192e9099d3b5c9c81b6f7de56f4156a4247
|
|
| MD5 |
c8c5f4be6ff00ffe9fe751da1884a3dc
|
|
| BLAKE2b-256 |
df2c229b9c2302c72b2b4584d043273559242c84110ae6b1ffb2733748187d12
|
Provenance
The following attestation bundles were made for loom_pipeline-0.3.0.tar.gz:
Publisher:
publish.yml on ljubobratovicrelja/loom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
loom_pipeline-0.3.0.tar.gz -
Subject digest:
4036aa47dfd73abb7d369df46e78c192e9099d3b5c9c81b6f7de56f4156a4247 - Sigstore transparency entry: 973221703
- Sigstore integration time:
-
Permalink:
ljubobratovicrelja/loom@7ee532b6970e37416b3d1be01aea2c67e037906d -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/ljubobratovicrelja
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7ee532b6970e37416b3d1be01aea2c67e037906d -
Trigger Event:
release
-
Statement type:
File details
Details for the file loom_pipeline-0.3.0-py3-none-any.whl.
File metadata
- Download URL: loom_pipeline-0.3.0-py3-none-any.whl
- Upload date:
- Size: 300.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d3287c02c7ca55109000f7458cb4abb1034125dfc1dd814a7a81bbae46c0ed1
|
|
| MD5 |
a36320c774c54a01244e5456098d075a
|
|
| BLAKE2b-256 |
1a42f20198f6551bb6534f76c1131af4f8e1ef7ec1e6bb9f9dba66e4df32e646
|
Provenance
The following attestation bundles were made for loom_pipeline-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on ljubobratovicrelja/loom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
loom_pipeline-0.3.0-py3-none-any.whl -
Subject digest:
3d3287c02c7ca55109000f7458cb4abb1034125dfc1dd814a7a81bbae46c0ed1 - Sigstore transparency entry: 973221709
- Sigstore integration time:
-
Permalink:
ljubobratovicrelja/loom@7ee532b6970e37416b3d1be01aea2c67e037906d -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/ljubobratovicrelja
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7ee532b6970e37416b3d1be01aea2c67e037906d -
Trigger Event:
release
-
Statement type: