diff --git a/src/xfel_calibrate/calibrate.py b/src/xfel_calibrate/calibrate.py
index 1dd810b120ea4a42e04719a4b5f49c845d69ab8b..735730fe5eda5c4bf887a690590a06504f3040ba 100755
--- a/src/xfel_calibrate/calibrate.py
+++ b/src/xfel_calibrate/calibrate.py
@@ -74,6 +74,9 @@ def make_initial_parser(**kwargs):
                         default=False,
                         help="Do not run as a cluster job")
 
+    parser.add_argument('--prepare-only', action="store_true",
+                        help="Prepare notebooks but don't run them")
+
     parser.add_argument('--report-to', type=str,
                         help='Filename (and optionally path) for output'
                              ' report')
@@ -1166,6 +1169,15 @@ def run():
     # Save information about jobs for reproducibility
     job_group.save()
 
+    if args['prepare_only']:
+        print("Files prepared, not executing now (--prepare-only option).")
+        print("To execute the notebooks, run:")
+        rpt_opts = ''
+        if user_venv is not None:
+            rpt_opts = f'--python {python_exe}'
+        print(f"  python -m xfel_calibrate.repeat {run_tmp_path} {rpt_opts}")
+        return
+
     submission_time = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')
 
     # Launch the calibration work