Skip to content

Multi-user Scenarios

When multiple people use the same system — whether collaborating in real-time, sharing access, or working asynchronously — new challenges emerge. Who can do what? Who’s working on what right now? What happens when two people edit the same thing?

Multi-user collaborative interfaces must account for a broader range of requirements than single-user interfaces: role differentiation, presence awareness, conflict resolution, and communication channels between users.


PatternDescriptionExamplesKey Challenge
Real-time co-editingMultiple users editing simultaneouslyGoogle Docs, FigmaConflict resolution
Asynchronous collaborationUsers contribute at different timesGitHub, NotionContext and handoffs
Review/approval workflowsSequential with gatesDocument approval, code reviewStatus visibility
Shared accessMultiple users, usually not simultaneousFamily accounts, team dashboardsPermission clarity
Multiplayer experiencesCoordinated real-time interactionCollaborative games, virtual meetingsSynchronization
RoleCreateEditCommentViewManage UsersDeleteTransfer
Owner
Admin
Editor
Commenter
Viewer
StateIndicatorExample
Active nowGreen dot, live cursorCurrently editing
IdleYellow dotWindow unfocused 5+ min
AwayGray dotNo activity 15+ min
OfflineNo indicator or hollow dotDisconnected
Do Not DisturbRed dotExplicitly set by user

multi_user_validation:
rules:
- id: roles-clearly-defined
severity: error
check: "Each role has documented capabilities"
includes:
- what_role_can_do
- what_role_cannot_do
- how_to_request_elevated_access
- id: permission-denial-explained
severity: error
check: "Disabled actions explain why they're unavailable"
bad: "Grayed-out delete button with no explanation"
good: "'Delete' — Only workspace owners can delete. Request access"
- id: presence-visible
severity: warning
check: "Real-time collaborators visible when in same space"
includes:
- avatar_or_cursor
- current_location_indicator
- activity_state
- id: collision-prevention
severity: error
check: "Simultaneous edit conflicts handled gracefully"
options:
- automatic_merge
- soft_lock_with_notification
- explicit_conflict_resolution_ui
- id: work-never-lost
severity: error
check: "No user's work is silently discarded"
rationale: "Losing work destroys trust"
- id: audit-trail-available
severity: warning
check: "Changes tracked with author attribution"
includes:
- version_history
- activity_feed
- change_notifications
- id: handoff-context
severity: warning
check: "Async handoffs include sufficient context"
includes:
- status_indicator
- assigned_next_actor
- notes_explaining_changes
- id: ownership-clear
severity: error
check: "Every item has clear ownership"
rationale: "Orphaned items create confusion"

Match roles to your users’ actual needs. Too few roles force workarounds; too many roles cause confusion.

Common role patterns:

RoleDescriptionUse Case
OwnerFull control, can delete and transfer ownershipOriginal creator, account holder
AdminManage settings and users, but not delete workspaceTeam leads, IT administrators
EditorCreate and modify contentTeam members, contributors
CommenterAdd comments but not edit contentStakeholders, reviewers
ViewerRead-only accessExternal partners, guests

Some products need granular permissions beyond standard roles:

┌─────────────────────────────────────────────┐
│ Custom Role: Content Manager │
├─────────────────────────────────────────────┤
│ ✓ Create blog posts │
│ ✓ Edit blog posts │
│ ✓ Publish to staging │
│ ✗ Publish to production │
│ ✓ Manage media library │
│ ✗ Manage user accounts │
│ ✗ Access billing settings │
└─────────────────────────────────────────────┘

Users should always understand:

  • What they can and can’t do
  • Why an action is unavailable
  • How to request elevated access

Don’t just disable buttons — explain why:

BadBetter
[Delete] (grayed out)[Delete] → “Only owners can delete this workspace”
[Publish] (invisible)[Publish] → “Editors can’t publish. Request access from @admin”
Error: “Permission denied""You need Editor access to make changes. Request access”
User clicks disabled action
┌─────────────────────────────┐
│ "You need Editor access to │
│ edit this document." │
│ │
│ [Request Access] [Cancel] │
└─────────────────────────────┘
▼ (if Request Access)
┌─────────────────────────────┐
│ Request sent to: │
│ @Sarah (Owner) │
│ │
│ Add a message: [___________]│
│ │
│ [Send Request] │
└─────────────────────────────┘
Owner receives notification
┌─────────────────────────────┐
│ @John requested Editor │
│ access to "Q4 Report" │
│ │
│ "Need to add budget data" │
│ │
│ [Approve] [Deny] [Discuss] │
└─────────────────────────────┘

When multiple users can be in the same space:

  • Display avatars or cursors for active users
  • Indicate what others are viewing or editing
  • Distinguish between states — online now vs. was here recently
PatternBest ForExample
Avatar stackDocuments, files3 avatars + “+2 more”
Live cursorsCanvas tools, whiteboardsLabeled cursor with name
Sidebar listTeam spacesList of online members
Inline indicatorsSpecific locations”Sarah is editing this section”

For real-time co-editing with cursors:

┌──────────────────────────────────────────────────┐
│ │
│ The quick brown fox jumps over the lazy dog. │
│ ▲ │
│ ┌──────┴──────┐ │
│ │ Sarah Chen │ (blue cursor) │
│ └─────────────┘ │
│ │
│ Lorem ipsum dolor sit amet, consectetur... │
│ █████████████████ │
│ ▲ │
│ ┌──────┴──────┐ │
│ │ John Smith │ (purple selection) │
│ └─────────────┘ │
└──────────────────────────────────────────────────┘

Cursor color assignment:

  • Consistent color per user session
  • High contrast against background
  • Distinct from selection highlight
  • Accessible to colorblind users (use patterns/labels)

OT has been the core technique for real-time co-editing since the late 1980s. It transforms operations to maintain consistency when concurrent edits occur.

How it works:

  1. User A types “Hello” at position 0
  2. User B types “World” at position 0 (simultaneously)
  3. OT transforms B’s operation: insert at position 5 (after “Hello”)
  4. Both users see “HelloWorld”

CRDTs (Conflict-free Replicated Data Types)

Section titled “CRDTs (Conflict-free Replicated Data Types)”

Alternative to OT, where operations are designed to be naturally commutative — they can be applied in any order and produce the same result.

ApproachProsCons
OTWell-established, widely usedComplex implementation, puzzles
CRDTMathematically sound, works offlineMemory overhead, less common
StrategyWhen to UseUser Experience
Auto-mergeNon-overlapping changesSeamless, no intervention
Last-write-winsLow-stakes contentSimple, but may lose work
Soft locksSequential editing preferred”Sarah is editing this section”
Hard locksData integrity critical”Locked by Sarah — request access”
Fork and mergeComplex conflictsGit-style branching
Manual resolutionOverlapping changesShow both versions, user chooses

When auto-merge isn’t possible:

┌────────────────────────────────────────────────┐
│ Conflict detected in "Budget Summary" │
├────────────────────────────────────────────────┤
│ │
│ Your version: Sarah's version: │
│ ┌──────────────────┐ ┌──────────────────┐│
│ │ Total: $45,000 │ │ Total: $52,000 ││
│ │ Updated 2:15 PM │ │ Updated 2:14 PM ││
│ └──────────────────┘ └──────────────────┘│
│ │
│ [Keep yours] [Keep Sarah's] [Keep both] [Edit]│
│ │
└────────────────────────────────────────────────┘

For edit-in-place scenarios where hard locks are too restrictive:

User opens section for editing
┌─────────────────────────────────────┐
│ Section: Executive Summary │
│ 🔒 Being edited by @Sarah │
│ │
│ [View only] [Request edit] [Notify │
│ when │
│ done] │
└─────────────────────────────────────┘

Never silently discard anyone’s work.

If there’s any possibility of data loss, warn the user and offer recovery options.


FUNCTION handleConcurrentEdit(editA, editB):
// Check if edits overlap
IF NOT overlaps(editA.range, editB.range):
// Non-overlapping edits: auto-merge
RETURN autoMerge(editA, editB)
// Check if one is clearly newer
IF editA.timestamp - editB.timestamp > STALE_THRESHOLD:
// Significant time difference: warn about overwrite
RETURN promptOverwrite(editA, editB)
// Simultaneous overlapping edits
IF content.criticality == "high":
// Critical content: require manual resolution
RETURN showConflictResolutionUI(editA, editB)
ELSE IF editA.user.role > editB.user.role:
// Role-based precedence (optional)
RETURN applyWithNotification(editA, notify=editB.user)
ELSE:
// Default: show both, let users resolve
RETURN showConflictResolutionUI(editA, editB)

For shared workspaces, transparency builds trust and enables accountability.

ComponentPurposeRetention
Version historyFull document snapshotsIndefinite or configurable
Activity feedRecent changes streamRolling window (30-90 days)
Change notificationsAlert relevant usersReal-time + digest options
Diff viewCompare versionsOn-demand
┌─────────────────────────────────────────────────┐
│ Activity in "Q4 Planning" │
├─────────────────────────────────────────────────┤
│ Today │
│ ┌──────────────────────────────────────────┐ │
│ │ 🖊 Sarah edited "Budget Summary" │ │
│ │ 2:45 PM · View changes │ │
│ └──────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────┐ │
│ │ 💬 John commented on "Timeline" │ │
│ │ 1:30 PM · "Should we push Q4 launch?" │ │
│ └──────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────┐ │
│ │ 👤 Alex was added as Editor │ │
│ │ 11:00 AM · Added by Sarah │ │
│ └──────────────────────────────────────────┘ │
│ │
│ Yesterday │
│ ┌──────────────────────────────────────────┐ │
│ │ 📄 Document created │ │
│ │ 3:15 PM · By Sarah │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘

FeatureDescriptionBest Practice
CommentsAnchored to specific contentThread replies, resolve action
@mentionsNotify specific usersAutocomplete, role mentions
ReactionsQuick acknowledgmentLimited set, not distracting
ThreadsGroup related discussionCollapse when resolved

Comments should attach to specific content, not float freely:

┌─────────────────────────────────────────────────┐
│ "Our Q4 revenue target is $2.5M" │
│ │ │
│ ┌─────────▼──────────┐ │
│ │ 💬 2 comments │ │
│ │ │ │
│ │ @John: Is this │ │
│ │ conservative enough?│ │
│ │ │ │
│ │ @Sarah: Based on Q3 │ │
│ │ actuals, yes. │ │
│ │ │ │
│ │ [Reply] [Resolve] │ │
│ └─────────────────────┘ │
└─────────────────────────────────────────────────┘

Balance awareness against interruption:

EventNotificationTiming
Direct mentionPush + emailImmediate
Assigned taskPush + emailImmediate
Comment on your contentPushImmediate
Others’ editsBadge countBatched hourly
Workspace activityDigestDaily/weekly

User controls:

  • Per-workspace notification levels
  • Quiet hours
  • Channel preferences (push, email, in-app)

Clear workflow states prevent confusion about what needs action:

StatusMeaningWho Acts Next
DraftWork in progressAuthor
Ready for ReviewAuthor is doneReviewer
Changes RequestedReviewer needs updatesAuthor
ApprovedReady to proceedPublisher/Next stage
Published/CompleteFinal stateNo one
┌─────────────────────────────────────────────────┐
│ Document: Q4 Marketing Plan │
│ Status: Ready for Review │
├─────────────────────────────────────────────────┤
│ Current step: Legal review │
│ Assigned to: @Legal Team │
│ Due: January 15, 2025 │
│ │
│ Previous: @Marketing (completed Jan 10) │
│ Next: @Executive (after Legal approves) │
│ │
│ [View history] [Reassign] [Add note] │
└─────────────────────────────────────────────────┘

Allow users to explain context when passing work:

┌─────────────────────────────────────────────────┐
│ Hand off to @Legal Team │
├─────────────────────────────────────────────────┤
│ Add a note for the next reviewer: │
│ ┌───────────────────────────────────────────┐ │
│ │ Please pay special attention to the │ │
│ │ influencer agreement terms in Section 3. │ │
│ │ We updated the payment structure. │ │
│ └───────────────────────────────────────────┘ │
│ │
│ [Send handoff] │
└─────────────────────────────────────────────────┘

SolutionImplementation
Show username/handle”@john_smith” vs “@john_doe”
Add discriminator”John Smith (Marketing)“
Use avatars prominentlyVisual differentiation
Show email domainjohn@corp.com” vs “john@agency.com
FUNCTION handleUserDeparture(user, workspace):
// Transfer ownership of user's content
FOR each item IN user.owned_items:
IF item.shared:
item.owner = workspace.default_owner OR admin
notifyNewOwner(item)
ELSE:
item.status = "orphaned"
promptAdminForDisposition(item)
// Handle in-progress items
FOR each item IN user.assigned_items:
item.assigned_to = null
notifyStakeholders("Unassigned: " + item)
// Preserve history
user.status = "departed"
user.display_name = user.name + " (Former)"
// Don't delete: preserve audit trail
User editing with Editor permissions
▼ (Admin removes Editor permission)
┌─────────────────────────────────────────────┐
│ Your permissions have changed │
│ │
│ You now have Viewer access to this │
│ document. Your unsaved changes: │
│ │
│ [Save to personal copy] [Discard] [View │
│ diff] │
└─────────────────────────────────────────────┘

Before sharing:

┌─────────────────────────────────────────────────┐
│ Share "Confidential: Salary Data" │
├─────────────────────────────────────────────────┤
│ ⚠️ This document contains sensitive content │
│ │
│ Current access: 2 people (you, @HR Director) │
│ │
│ You're about to add: │
│ • @all-company (347 people) │
│ │
│ Are you sure? This will share salary data │
│ with the entire company. │
│ │
│ [Cancel] [Share anyway] │
└─────────────────────────────────────────────────┘

The 27th ACM SIGCHI Conference on Computer-Supported Cooperative Work & Social Computing (CSCW 2024) was held in San José, Costa Rica — the first time CSCW was held in Latin America. The conference continues to explore technical, social, material, and theoretical challenges of designing technology to support collaborative work.

Research shows that despite broad claims of CRDT superiority, OT remains the choice for building the vast majority of today’s co-editors. CRDT is rarely found in working production systems, though it offers theoretical advantages for offline-first applications.

Tools like Figma have introduced AI into collaborative features (FigJam AI) for organizing ideas and generating design elements. The trend toward AI-assisted collaboration is accelerating, with AI helping to summarize discussions, suggest next steps, and identify conflicts before they occur.

2024 research emphasizes creating products for diverse user groups in collaborative contexts. Involving users with different cultural backgrounds, ages, and accessibility needs in multi-user design is becoming a priority.


CSCW Research:

Collaboration Tools:

Conflict Resolution:

Design Guidance: