diff --git a/bin/run.py b/bin/run.py
deleted file mode 100644
index 230b934bebbc201bc8acccd05c740f42853fef92..0000000000000000000000000000000000000000
--- a/bin/run.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env jupyter
-
-import argparse
-
-from aliby.pipeline import Pipeline, PipelineParameters
-
-parser = argparse.ArgumentParser(
-    prog="aliby-run", description="Run a default microscopy analysis pipeline"
-)
-
-param_values = {
-    "expt_id": None,
-    "distributed": 2,
-    "tps": 2,
-    "directory": "./data",
-    "filter": 0,
-    "host": None,
-    "username": None,
-    "password": None,
-}
-
-
-def _cast_str(x: str or None):
-    """
-    Cast string as int if possible. If Nonetype return None.
-    """
-    if x:
-        try:
-            return int(x)
-        except:
-            return x
-
-
-for k in param_values:
-    parser.add_argument(f"--{k}", action="store")
-
-args = parser.parse_args()
-
-for k in param_values:
-    if passed_value := _cast_str(getattr(args, k)):
-
-        param_values[k] = passed_value
-
-params = PipelineParameters.default(general=param_values)
-p = Pipeline(params)
-
-p.run()
diff --git a/src/aliby/bin/__init__.py b/src/aliby/bin/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..a051bb08ab05961eccb8250a04ca9bf4f0e382d9
--- /dev/null
+++ b/src/aliby/bin/__init__.py
@@ -0,0 +1 @@
+#!/usr/bin/env jupyter
diff --git a/src/aliby/bin/run.py b/src/aliby/bin/run.py
new file mode 100644
index 0000000000000000000000000000000000000000..e8495580d456783a35135a89641b15321c4fb02e
--- /dev/null
+++ b/src/aliby/bin/run.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env jupyter
+
+
+def run():
+    import argparse
+
+    from aliby.pipeline import Pipeline, PipelineParameters
+
+    parser = argparse.ArgumentParser(
+        prog="aliby-run",
+        description="Run a default microscopy analysis pipeline",
+    )
+
+    param_values = {
+        "expt_id": None,
+        "distributed": 2,
+        "tps": 2,
+        "directory": "./data",
+        "filter": 0,
+        "host": None,
+        "username": None,
+        "password": None,
+    }
+
+    def _cast_str(x: str or None):
+        """
+        Cast string as int if possible. If Nonetype return None.
+        """
+        if x:
+            try:
+                return int(x)
+            except:
+                return x
+
+    for k in param_values:
+        parser.add_argument(f"--{k}", action="store")
+
+    args = parser.parse_args()
+
+    for k in param_values:
+        if passed_value := _cast_str(getattr(args, k)):
+
+            param_values[k] = passed_value
+
+    params = PipelineParameters.default(general=param_values)
+    p = Pipeline(params)
+
+    p.run()