Skip to content

Conflict Resolution

A conflict occurs when the same wcp_id has been modified in both the source and the target since the last sync. WCP detects this by comparing content hashes stored in SyncLinks.

The source app always overwrites the target. No manual intervention needed.

Terminal window
curl -X PUT http://localhost:8000/api/conflicts/strategy \
-H "Content-Type: application/json" \
-d '{"strategy": "source_wins"}'

Whichever side has the most recent modification timestamp wins.

Terminal window
curl -X PUT http://localhost:8000/api/conflicts/strategy \
-d '{"strategy": "last_write_wins"}'

Conflicts are queued for human review. Sync continues for non-conflicted items. The dashboard shows a conflict card for each pending item.

Terminal window
curl -X PUT http://localhost:8000/api/conflicts/strategy \
-d '{"strategy": "manual"}'

In manual mode, each conflict exposes both sides:

{
"id": "conflict_abc123",
"wcp_id": "notion:page_xyz",
"source": {
"app": "notion",
"content": "Updated content from Notion",
"modified_at": "2026-04-03T10:00:00Z"
},
"target": {
"app": "sheets",
"content": "Different content in Sheets",
"modified_at": "2026-04-03T09:55:00Z"
}
}

Resolve via API:

Terminal window
# Use source side
curl -X POST http://localhost:8000/api/conflicts/conflict_abc123/resolve \
-d '{"winner": "source"}'
# Use target side
curl -X POST http://localhost:8000/api/conflicts/conflict_abc123/resolve \
-d '{"winner": "target"}'
# Dismiss (skip this conflict)
curl -X POST http://localhost:8000/api/conflicts/conflict_abc123/dismiss

Or use the Dashboard’s Conflicts page — it shows both sides side-by-side with a “Use this” button on each.