diff --git a/src-tauri/src/profile/types.rs b/src-tauri/src/profile/types.rs
index 32ac5c4..13b7282 100644
--- a/src-tauri/src/profile/types.rs
+++ b/src-tauri/src/profile/types.rs
@@ -21,7 +21,7 @@ pub enum SyncMode {
Encrypted,
}
-#[derive(Debug, Serialize, Deserialize, Clone)]
+#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct BrowserProfile {
pub id: uuid::Uuid,
pub name: String,
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..2fccbc8 100644
--- a/src-tauri/src/sync/manifest.rs
+++ b/src-tauri/src/sync/manifest.rs
@@ -8,6 +8,7 @@ use std::path::Path;
use std::time::SystemTime;
use super::types::{SyncError, SyncResult};
+use crate::profile::types::BrowserProfile;
/// Default exclude patterns for volatile browser profile files.
/// Patterns use `**/` prefix to match at any directory depth, since the sync
@@ -209,6 +210,39 @@ fn hash_file(path: &Path) -> Result