diff --git a/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx b/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx
index 2ae4b59ac5af9229da20190ab299acbcacd5229d..b4635812a18286ba743a3b782ea59fc9a9ef7c1b 100644
--- a/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx
+++ b/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx
@@ -10,7 +10,7 @@ import {
   useReactFlow,
 } from '@xyflow/react';
 import { PlusCircleIcon } from 'lucide-react';
-import { useEffect } from 'react';
+import { useCallback, useEffect } from 'react';
 import CustomNode from './CustomNode';
 import * as chatAPI from '../../../lib/transformerlab-api-sdk';
 import { mutate } from 'swr';
@@ -121,12 +121,31 @@ const Flow = ({
     return () => clearTimeout(timer);
   }, [reactFlowInstance, selectedWorkflow]);
 
+  const onNodeDragStop = useCallback(async (event, node) => {
+    // Save all current node positions
+    const allCurrentPositions = nodes.map((n) => ({
+      id: n.id,
+      position: n.position,
+    }));
+
+    // Save to your backend or storage
+    // for (const node of allCurrentPositions) {
+    //   console.log('update node: ' + node?.id);
+    //   await fetch(
+    //     chatAPI.Endpoints.Workflows.UpdateNode(workflowId, node?.id, {
+    //       position: node.position,
+    //     })
+    //   );
+    // }
+  }, []);
+
   return (
     <ReactFlow
       nodes={nodes}
       edges={edges}
       onNodesChange={onNodesChange}
       onEdgesChange={onEdgesChange}
+      onNodeDragStop={onNodeDragStop}
       nodeTypes={nodeTypes}
       fitView
       zoomOnScroll={false}
diff --git a/src/renderer/lib/transformerlab-api-sdk.ts b/src/renderer/lib/transformerlab-api-sdk.ts
index 2ca6ce5251ee50d97e1d29aa590d025570df03aa..ac7f32444c340e3f52bd644067096d132886d442 100644
--- a/src/renderer/lib/transformerlab-api-sdk.ts
+++ b/src/renderer/lib/transformerlab-api-sdk.ts
@@ -1033,6 +1033,15 @@ Endpoints.Workflows = {
     workflowId +
     '&node_id=' +
     nodeId,
+  UpdateNode: (workflowId: string, nodeId: string, node: string) =>
+    API_URL() +
+    'workflows/update_node' +
+    '?workflow_id=' +
+    workflowId +
+    '&node_id=' +
+    nodeId +
+    '&node=' +
+    node,
   RunWorkflow: (workflowId: string) =>
     API_URL() + 'workflows/start/' + workflowId,
 };