| UI or UX | UI + UX - Ephemeral collaborator pointer and selection awareness with identity, color, recency, privacy, visibility controls, and stale-state handling | UI + UX - Person or group availability signal with status label, recency, source, privacy boundary, and action-aware affordances | UI + UX - Object-attached comment composer and comment list with authorship, replies, state, permissions, and moderation | UI + UX - Inline recipient reference with autocomplete, stable recipient identity, notification routing, access checks, and broad-audience safeguards | UI + UX - Topic-centered conversation with parent post, reply branches, unread participation state, and thread-level controls | UI + UX - Durable user-opened notification history and action drawer | UI + UX - Searchable and exportable record of system, user, or administrative events | UI + UX - Local-and-remote reconciliation status | UI + UX - Connectivity-mode and local-work continuity state | UI + UX - Short noninteractive description tied to a trigger |
| UI guidance | Render live cursors as lightweight overlays tied to the shared coordinate system, with person label, color, shape, current object or selection, recency, and stale or hidden state that does not obscure primary content. | Render presence as a labelled availability signal near the person, team, object, or conversation it describes; pair color, shape, text, timestamp, and source so users can distinguish active, away, busy, do not disturb, offline, unknown, viewing, and recently active states. | Render comments as anchored contributions with author identity, timestamp, body, optional attachment or selection context, edited state, reply target, and state labels such as open, resolved, hidden, deleted, or assigned. | Render mentions as inline tokens or highlighted text that preserve a stable recipient identity, display name, avatar or team marker, recipient type, and selected state without breaking surrounding editable text. | Render a threaded discussion around a visible parent topic or parent message, with reply rows that preserve author, timestamp, reply target, branch depth, unread or new state, and thread-scoped actions. | Provide a persistent notification entry point, usually a bell or inbox control, with a count that represents new unseen notifications rather than every unread item forever. | Render activity logs as evidence-oriented records with event time, actor, action, object, source system, scope, result, and technical context such as IP address or location when available. | Show sync state close to the object or queue it describes, using labels such as Local saved, Queued, Syncing, Synced, Partially synced, Failed, Paused, and Conflict needs review. | Show offline status where it changes the current task, naming what remains available such as cached reports, local draft editing, queued saves, or read-only history. | Render a tooltip as a small text-only bubble visually tied to a focusable trigger, with concise copy, readable contrast, stable placement, and an optional arrow that points to the target. |
| UX guidance | Use live cursors when collaborators need immediate spatial awareness of where other people are pointing, selecting, hovering, typing, or presenting in the same shared surface. | Use presence when users need to decide whether to interrupt, wait, route work, join a session, assign follow-up, or understand who is currently viewing or recently active in a shared space. | Use comments when users need to discuss, question, annotate, review, or leave follow-up notes on a specific object, selection, file line, record, document, or task without changing the primary content directly. | Use mentions when a user needs to call attention to a person, team, channel, role, or group from inside a message, comment, task, document, issue, or thread while keeping the reference embedded in the authored content. | Use threaded discussion when users need to follow, contribute to, or resolve a conversation that branches from one topic, question, channel message, or post and must keep replies understandable over time. | Use a notification center when users receive enough asynchronous system or collaboration updates that they need a durable place to review, triage, and act later. | Use activity log when users need to investigate, audit, verify, or troubleshoot actions across accounts, objects, systems, settings, or security boundaries. | Use sync state to keep users confident while local changes, remote copies, attachments, messages, or records reconcile across devices, services, or background workers. | Use offline state to preserve trust and task continuity when connection loss changes what users can read, edit, submit, sync, refresh, or share. | Use tooltips to add a brief description on focus or hover without asking users to open a separate layer or change task mode. |
| Good UI | A whiteboard shows Priya's pointer with a labelled color chip, Dana's text selection range, a stale cursor fading after reconnect loss, and a toggle to hide your pointer. | A reviewer row shows Priya as Busy in a meeting until 14:30, disables Call, keeps Message available, and offers Notify when available. | A document margin comment shows the selected paragraph, author, timestamp, body text, Reply, Resolve, Assign, and Copy link actions with the composer focused on that selection. | A comment composer opens a suggestion list after @, shows people and teams with avatars, handles, access labels, and keyboard focus, then inserts a mention chip for Priya Rao. | A support topic shows the original question, three top-level replies, one expanded reply branch, an accepted answer badge, unread branch marker, and thread-level Follow and Mute controls. | A bell opens a drawer with Unread and All filters, showing comment mentions, approval requests, export results, and background-job failures in newest-first order. | An organization audit log table shows timestamp, actor, action, target object, app, IP address, result, and a Details drawer with before and after fields. | A field report queue shows 5 local changes: notes synced, two photos uploading, meter reading queued, signature failed with Retry, and supervisor comment needs review. | A field report says Offline: 3 edits saved on this device, cached customer history shown from 10:42, Submit disabled until connection returns, and Retry connection. | A labelled Archive icon button receives focus and shows a short tooltip that says Moves this report to archived reports. |
| Bad UI | Remote cursors are unlabeled colored arrows that overlap form controls and stay frozen after users leave. | A green dot appears next to every name with no label, timestamp, or meaning. | A Notes textarea sits under a record and calls itself comments even though every user overwrites the same field. | The editor highlights every @word as a mention even when it is plain text and has no recipient identity. | All replies are rendered as identical flat messages with no indication of which parent or branch they answer. | A red badge says 42 forever because opening the drawer, reading items, and viewing related work never update the count. | A page titled Activity shows vague entries such as Changed settings with no actor, target, timestamp, or source. | A single green Saved badge appears while several attachments are still queued. | A blank page says You are offline even though the app has cached drafts and help content. | A mystery icon has no label and the only explanation is a hover-only tooltip that never appears for touch users. |
| Good UX | A presenter enables live pointers during a design review, follows Dana's cursor to a problem area, then hides extra cursors while editing text. | A user sees that Dana is in Do not disturb, sends a message without a banner interruption, and schedules a reminder to follow up when Dana is available. | A reviewer comments on a selected line, adds an action item for Dana, receives a reply, resolves the comment, and can reopen it from the resolved filter. | A user mentions @Dana in a private incident note, sees that Dana lacks access, chooses Invite and mention, and the resulting notification opens the exact note. | A user opens a notification to a specific unread reply, sees the parent post and branch context, replies, marks the answer, and mutes future replies after resolution. | Opening the notification drawer clears the new-notification badge while unread items remain available for later triage. | An admin filters to failed SSO events, expands one entry, copies the event ID, exports the filtered range, and sees that records older than 180 days require a different archive. | A user reconnects after editing offline and sees the queue move from local saved to syncing, then to one failed photo with retry while the accepted notes remain synced. | A user loses connection while editing an inspection note, sees it saved on this device, attaches photos to a queue, and later watches the queue sync after reconnect. | Tabbing to Archive keeps focus on the button, shows a short description, Escape hides it, and focus remains on Archive. |
| Bad UX | A user is trying to edit a small control while five cursor labels cover the target and there is no reduce-cursors mode. | A manager treats Away as an attendance record even though it came from device inactivity and privacy-limited activity data. | A user writes a long comment, loses network connection, and the draft disappears when the page reloads. | A user mentions someone in a private channel, the person is not notified, and the sender receives no warning or recovery path. | A user clicks New reply and lands at the top of a long topic with no highlight, branch context, or last-read position. | A payment failure that blocks the current checkout is only stored in the notification center and never appears in the task. | A user marks a notification read and the corresponding activity evidence disappears from the only log. | The offline banner disappears after reconnect, but hidden queued changes keep failing in the background. | The app keeps a spinner on Save during airplane mode and never explains that no network request can start. | A user presses Escape to hide the tooltip and focus jumps to the top of the page. |
| Best fit | Collaborators need real-time spatial awareness in a shared visual or text surface. | Users need to understand current or recent availability before messaging, calling, assigning, routing, or joining. | Users need object-attached discussion without changing the primary object content directly. | Composed content needs to target people or groups inline. | A topic or parent message can generate multiple reply branches that users need to follow over time. | Users receive multiple asynchronous updates across objects, jobs, collaborators, approvals, or reminders. | Users need to inspect recorded user, admin, system, security, or integration events. | Local changes, files, messages, uploads, or records need to reconcile with a remote service or another device. | Connection loss or server reachability changes the user's current task. | A compact control needs a brief supplemental explanation. |
| Avoid when | The collaboration is asynchronous and durable comments or annotations would be more useful. | The product needs a durable audit trail or compliance record. | The user is simply entering a long answer into a form field. | The user is selecting a structured owner, assignee, approver, or recipient field outside written content. | The feedback is a simple object-attached comment with no navigable topic discussion. | The product has only occasional current-action feedback that a toast or inline status can handle. | The goal is only to show a readable milestone history for one case or process. | The product has no local copy or queued work and a simple loading, success, or error state is enough. | A single request failed while the rest of the app is reachable and an error state is clearer. | The text is the only label or action name. |
| Required state | Local pointer visible, local pointer hidden, remote pointer visible, remote pointer hidden, and reduced-cursor mode. | Available, active, away, busy, in a meeting, in a call, presenting, focusing, do not disturb, out of office, offline, unknown, and hidden states where supported. | Empty comment list and first-comment composer. | Empty composer, @ trigger, loading suggestions, no results, and filtered suggestions. | Parent topic or parent message with author, timestamp, title or body, category, and reply count. | Closed entry-point state with zero, new-unseen, and unread-but-seen counts. | Default log state with event records, result count, visible timezone, retention window, and permission scope. | Local saved state for data persisted on the device but not yet sent. | Online normal state with no offline warning. | Resting trigger state with a visible or accessible name that works without the tooltip. |
| Accessibility burden | Provide text labels for cursor owner, role, and state rather than color-only cursor identity. | Expose presence state as text, such as Dana Lee, Busy in a meeting until 14:30, not just a colored dot. | Label the comments region with the object or selection being discussed. | Expose the suggestion list as a labelled popup tied to the editor and announce the number of available mention targets. | Label the thread region with the parent topic or message title. | Give the entry-point control an accessible name that includes new or unread count without relying only on a red dot. | Use table or structured list semantics so actor, action, object, timestamp, result, and scope are perceivable together. | Use visible text and accessible names for statuses; do not rely on spinning arrows, checkmarks, color, or icon overlays alone. | Announce significant connectivity changes with status messaging when they affect the current task. | Use tooltip text as a description with aria-describedby when it supplements the trigger. |
| Common misuse | Using live cursors as durable comments, decision records, or audit history. | Using only color dots without text labels, source, or recency. | Using one shared Notes field as a comment system and overwriting prior contributors. | Parsing @words after submit without requiring the sender to choose a real recipient. | Flattening every reply into a chronological stream and losing who replied to whom. | Treating the badge count, unread count, and total notification count as one number. | Calling a social feed or notification drawer an activity log without event evidence. | Calling local persistence Synced before remote acceptance. | Showing only a browser-style offline page when useful cached or local content exists. | Using hover-only tooltip text as the only label for an icon button. |