Back to Articles
CollaborationArchitectureReal-time

Multiplayer Editing Without Merge Conflicts

January 28, 20269 min read

Git merge conflicts are the tax developers pay for collaboration. Two people edit the same file, and now someone has to manually reconcile the differences. In AppsAI, merge conflicts don't exist. Not because we're doing something clever with git—because we don't use text files at all.

Why Code Conflicts

Traditional source code is plain text. When two people edit the same line, there's no semantic understanding of what changed—just two different strings where one string used to be. The system can't automatically merge them because it doesn't know what the strings mean.

This happens constantly:

  • Two developers add imports to the same file
  • One person renames a function while another adds a call to it
  • Formatters make whitespace changes that conflict with logic changes
  • Someone adds a property to an object while someone else reorders it

The result is hours spent on conflict resolution instead of building features.

Structured State Changes Everything

In AppsAI, components aren't text files. They're structured data—trees of nodes with typed properties. When you add a button, you're not inserting characters into a string. You're adding a node to a tree.

This means we can understand edits semantically:

// User A's edit
{
  "operation": "add_child",
  "parentId": "form_123",
  "node": { "type": "Button", "props": { "label": "Submit" } }
}

// User B's edit (simultaneous)
{
  "operation": "update_prop",
  "nodeId": "form_123",
  "prop": "className",
  "value": "mt-4"
}

These operations don't conflict. User A is adding a child. User B is changing a style. Both can apply cleanly, in any order, with the same result.

Operational Transformation

For the rare cases where operations do touch the same property, we use operational transformation (OT). Instead of asking “which string wins?”, we ask “how do we combine these intentions?”

Example: Two users change the same button's label simultaneously.

  • User A changes “Submit” to “Save”
  • User B changes “Submit” to “Send”

In a text-based system, this is a conflict. In AppsAI, we apply last-write-wins at the property level, and the other user sees the change immediately with a small indicator showing what happened. No manual merge required—just awareness.

Real-Time Presence

The best way to avoid conflicts is to see what others are doing. In AppsAI, you see:

  • Cursors – Where each team member is looking
  • Selections – Which components they have selected
  • Active edits – What property panel they have open
  • AI activity – When the AI is making changes

When you see someone working on the header, you naturally work on the footer. Coordination happens visually, not through branch management.

The best conflict resolution is conflict prevention. When everyone sees the workspace in real-time, people naturally coordinate.

History Without Branches

Git branches exist because merging is hard. If merging were trivial, you'd probably just work on main. In AppsAI, that's exactly what happens.

Every operation is versioned. You can:

  • See the complete history of any component
  • Revert specific changes without affecting others
  • View the project at any point in time
  • Attribute every change to a user or AI action

No branches to manage. No PRs to review for merge conflicts. No rebasing. The complexity that makes git hard simply doesn't exist.

AI as a Collaborator

The AI in AppsAI is just another cursor. When you and the AI are both working, you see its changes appear in real-time, just like a human collaborator.

This matters because AI edits can be big. In a text-based system, an AI might touch dozens of files, creating a nightmare to review and merge. In AppsAI, you watch the changes happen, intervene if needed, and everything integrates smoothly.

Technical Implementation

Under the hood, we use:

  • WebSockets – For real-time operation broadcast
  • Vector clocks – For ordering operations consistently
  • Operation log – Append-only storage of all changes
  • Snapshot intervals – Periodic full-state captures for fast loading

Each client maintains a local copy of the state and applies operations as they arrive. Because operations are semantic (not textual), they commute in most cases, and the small number of true conflicts resolve automatically with clear rules.

Scaling Collaboration

We've tested with dozens of simultaneous editors on a single project. The architecture scales because:

  • Operations are small (usually <1KB)
  • Most operations are independent
  • The server only relays and stores—it doesn't compute merges
  • Clients do their own transformation locally

The bottleneck isn't technical—it's organizational. After about 10 people on one screen, you probably need to split into components anyway.

The End of Merge Conflicts

Merge conflicts aren't a law of physics. They're an artifact of representing programs as text files. When you move to structured state—where the system understands what you're actually changing—collaboration becomes seamless.

Build together, in real-time, without the merge tax.

Collaborate in real-time

Invite your team to an AppsAI project. Everyone works on the same canvas, simultaneously, without conflicts.

Start a Project