diff --git a/src/app/editor/[projectId]/FlowchartEditor.tsx b/src/app/editor/[projectId]/FlowchartEditor.tsx index 325dd07..2e20982 100644 --- a/src/app/editor/[projectId]/FlowchartEditor.tsx +++ b/src/app/editor/[projectId]/FlowchartEditor.tsx @@ -566,6 +566,11 @@ function FlowchartEditorInner({ projectId, projectName, userId, userDisplayName, }, onPersist: async (persistNodes: FlowchartNode[], persistEdges: FlowchartEdge[]) => { try { + // Auto-persist saves the current state for durability. We do NOT + // broadcast state-refresh here because CRDT already syncs nodes/edges + // via yjs-update broadcasts. Broadcasting here causes ping-pong: + // other clients fetch from DB, overwrite their local variables/characters, + // then their persist writes stale data back, causing a loop. await supabase .from('projects') .update({ @@ -577,8 +582,6 @@ function FlowchartEditorInner({ projectId, projectName, userId, userDisplayName, }, }) .eq('id', projectId) - // Notify other clients to refresh after successful auto-persist - realtimeRef.current?.broadcastStateRefresh() } catch { // Persistence failure is non-critical; will retry on next change }