| 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 | Provide controls for showing or hiding the user's pointer, reducing other users' cursor noise, following a collaborator, pinning cursor chat, and distinguishing pointer, text cursor, selection range, viewport, and temporary cursor-attached message states. | Show presence controls and explanations where users act on the signal: status menu, status duration, last updated time, working-hours note, privacy restriction, stale value, co-viewer list, and action changes such as call disabled, message allowed, or notify later. | 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. | Show mention suggestions at the caret with names, handles, avatars, teams, channels, availability or scope hints, permission warnings, and keyboard-highlight state; distinguish exact matches, ambiguous display names, unavailable recipients, and broad-audience mentions. | 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. | Preserve comment drafts, anchors, authorship, notifications, edit history, deletion outcomes, and resolved or hidden states so conversation context remains trustworthy across reloads, permissions, moderation, and return visits. | 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. | Help the person reach a clear task outcome. |
| 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 stale active badge remains after the user has gone offline and the call button still looks primary. | A Notes textarea sits under a record and calls itself comments even though every user overwrites the same field. | Mention chips break when copied, pasted, edited, localized, or rendered in plain-text fallbacks. | Nested replies are indented until they become unreadable on mobile and the answer is hidden below collapsed context. | Users ignore the center because duplicate low-value messages inflate the badge. | An export button downloads a different date range and timezone than the on-screen filtered log. | 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. | The tooltip appears only on mouse hover. |
| 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 file owner sees who has viewed the document within the same domain, respects hidden view-history settings, and uses the signal for follow-up rather than audit proof. | 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 | Cursor overlays are offset after zoom, scroll, pan, or resize. | 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 mention notification opens the record homepage rather than the exact comment sentence, forcing the recipient to search for why they were pulled in. | A moderator marks an answer but the thread summary still shows unanswered because answer state is stored only on the visible reply card. | Users mark all notifications read and lose the only record of an export job they still need to download. | 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. | A submitted offline form disappears from the screen even though it was neither queued nor accepted by the server. | 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. | Feedback must preserve author, timestamp, reply, resolution, assignment, or moderation context. | 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 surface is a broad feed of independent posts or activity cards. | 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. | A confirmed failure blocks the whole view and needs a full error recovery surface. | 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. | Manual status, automatic status, status duration, status message, working-hours state, paused-notification state, and calendar-derived state. | Empty comment list and first-comment composer. | Highlighted suggestion, keyboard-selected suggestion, mouse or touch-selected suggestion, and inserted mention token. | 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. | Queued state for work waiting for a sync attempt. | Offline banner or local status that names affected scope. | Keyboard focus state where the tooltip appears and focus remains on the trigger. |
| Accessibility burden | Provide text labels for cursor owner, role, and state rather than color-only cursor identity. | Announce meaningful presence changes only when they affect the current task or selected person. | 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. | Announce new notification arrival with status semantics when appropriate, but avoid interrupting users repeatedly for low-priority center items. | Use table or structured list semantics so actor, action, object, timestamp, result, and scope are perceivable together. | Expose sync summaries through polite status updates when state changes matter to the current task. | 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. | Treating presence as employee monitoring or audit evidence. | Using one shared Notes field as a comment system and overwriting prior contributors. | Treating a mention suggestion list as a generic people picker and ignoring caret position, inline serialization, and notification side effects. | 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. | Using vague activity labels that omit actor, action, object, timestamp, or result. | 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. |