diff --git a/src-tauri/src/sync/engine.rs b/src-tauri/src/sync/engine.rs
index d33a951..07df318 100644
--- a/src-tauri/src/sync/engine.rs
+++ b/src-tauri/src/sync/engine.rs
@@ -793,6 +793,7 @@ impl SyncEngine {
let mut sanitized = profile.clone();
sanitized.process_id = None;
sanitized.last_launch = None;
+ sanitized.last_sync = None; // Avoid triggering sync loop on timestamp change
let json = serde_json::to_string_pretty(&sanitized)
.map_err(|e| SyncError::SerializationError(format!("Failed to serialize profile: {e}")))?;
diff --git a/src-tauri/src/sync/manifest.rs b/src-tauri/src/sync/manifest.rs
index 21833db..c2de31a 100644
--- a/src-tauri/src/sync/manifest.rs
+++ b/src-tauri/src/sync/manifest.rs
@@ -7,6 +7,7 @@ use std::io::{BufReader, Read};
use std::path::Path;
use std::time::SystemTime;
+use crate::profile::types::BrowserProfile;
use super::types::{SyncError, SyncResult};
/// Default exclude patterns for volatile browser profile files.
@@ -209,6 +210,39 @@ fn hash_file(path: &Path) -> Result