Product Craft Bible
Real-time & Collaboration
Inicio SaaS y Admin Real-time & Collaboration
SaaS y Admin

Real-time & Collaboration

11 reglas Liveblocks Engineering Blog · 2022Mark Skelton · mskelton.dev · 2023GitHub Primer Design System · Atlassian Design SystemGoogle Open Health Stack · Liveblocks useSyncStatus · 2024
164

Real-time & Collaboration

11 reglas
1415

Throttle cursor broadcasts a intervalos de 100ms con interpolación spring

Las posiciones de cursores en multijugador deben emitirse como máximo una vez cada 100ms (10 actualizaciones/seg) para evitar saturación de red y CPU. En el receptor, animar el movimiento con física spring o transition: transform, nunca saltar a la coordenada cruda, de modo que el movimiento sea fluido pese a la tasa discreta de envio.

Liveblocks Engineering Blog · 2022
Preferir
Ana
Bruno
10 msg/seg · glide suave
Evitar
Ana
1416

Ocultar cursores remotos con visibility:hidden hasta recibir la primera coordenada

El cursor de un colaborador debe permanecer invisible (visibility: hidden) hasta que el cliente reciba al menos una coordenada real de ese usuario. Sin esta guarda, los cursores fantasma aparecen en el origen (0,0) inmediatamente al conectarse, antes de que llegue cualquier dato de movimiento.

Mark Skelton · mskelton.dev · 2023
Preferir
Carlos · activo
Diana y Ernesto: visibility:hidden hasta primer movimiento
Evitar
Carlos
Diana
Ernesto
3 cursores agrupados en esquina superior izquierda
1417

Limitar el avatar stack a 4 avatares con contador +N de desbordamiento

Los stacks de presencia deben mostrar máximo 4 avatares individuales antes de colapsar participantes adicionales en un indicador "+N". Ordenar con usuarios activos (online ahora) primero. El contador de desbordamiento debe ser interactivo: click o hover revela la lista completa de participantes.

GitHub Primer Design System · Atlassian Design System
Preferir
Editando ahora
A
B
C
D
+6
Todos los participantes (10)
Ana · Bruno · Carlos · Diana, activos ahora
Ernesto, Felipe, Gina, Helena, Ivan, Juana, inactivos
Evitar
Colaboradores:
A
B
C
D
E
F
G
H
I
J
Overflow en mobile · identidad imposible a 20px
1418

Mostrar badge de sync-status persistente con tres estados: Guardando, Guardado, Sin conexion

Todo editor colaborativo debe mostrar un indicador de estado de sincronización con exactamente tres estados visibles: "Guardando" (escritura en vuelo), "Guardado" (última escritura confirmada) y "Sin conexion" (sin conectividad). Nunca usar rojo para el estado "Sin conexion", implica error irrecuperable en lugar de condición temporal.

Google Open Health Stack · Liveblocks useSyncStatus · 2024
Preferir
Propuesta Q3 · Informe final
Guardando...
Propuesta Q3 · Informe final
Guardado
Propuesta Q3 · Informe final
Sin conexion
"Sin conexion" usa ambar neutro, no rojo. Tooltip: "Tus cambios están guardados localmente y se sincronizaran al reconectar." Debounce 2s antes de mostrar.
1419

Asignar colores por usuario de forma determinista desde paleta de 12 tonos

Cada colaborador recibe un color de cursor y resaltado derivado deterministicamente de su user ID mediante hash, no asignado aleatoriamente por sesión. Pre-definir una paleta de al menos 12 tonos perceptualmente distintos (360° a ~30° de incremento) para que hasta 12 usuarios simultaneos tengan cero colisiones. Al superar 12 participantes, ciclar la paleta.

Figma multiplayer design system · color-hash npm · Liveblocks 2025
Preferir
hash(user.id) → color fijo
Ana hsl(0,65%,55%), siempre coral rojo
Bruno hsl(30,65%,55%), siempre ambar
Carlos hsl(210,65%,52%), siempre azul
1420

Aplicar actualizaciones optimistas inmediatamente y revertir con copy de error inline en menos de 500ms

Todas las operaciones de escritura colaborativas (enviar comentario, resolver hilo, cambiar permiso) deben aplicarse de forma optimista al UI local sin demora, y luego reconciliar con la respuesta del servidor. Si el servidor devuelve error o conflicto (HTTP 409), revertir el cambio y mostrar un mensaje de error inline en menos de 500ms. Nunca descartar silenciosamente una acción del usuario.

React 19 useOptimistic · FreeCodeCamp 2024 · 7tech.co.in 2025
Preferir
Hilo resuelto
Cambio aplicado instantaneamente al hacer click
"Deberiamos cambiar el encabezado a 24px."
Este elemento fue eliminado por Sara, tu resolución no se guardo.
Rollback en <400ms de recibir 403
Evitar
Hilo de comentario
"Deberiamos cambiar el encabezado a 24px."
Resolviendo...
600ms de espera... sin retroalimentación de fallo
1421

Mostrar indicadores de escritura solo después de 300ms de actividad continua y limpiarlos tras 3s de inactividad

Los indicadores de "escribiendo..." en campos de texto colaborativos deben hacer debounce: mostrarse solo después de 300ms de actividad de teclas sostenida, evitando parpadeo en pulsaciones sueltas. Limpiar el indicador exactamente 3 segundos después de la última tecla. Nunca mostrar el indicador de escritura al propio usuario.

WhatsApp typing indicator · UX Matters 2018 · industria 300-500ms
Preferir
Comentario colaborativo
Revisando la propuesta...
M
Maria esta escribiendo
Aparece tras 300ms · desaparece 3s sin teclas
Emit broadcast: 1 evento cada 2s mientras escribe · 1 evento "stopped" al timeout
Evitar
Comentario colaborativo
G
M
Maria esta escribiendo
Parpadea con cada tecla individual
1422

Anclar comentarios a coordenadas de contenido y reposicionarlos en reflow, nunca a offsets de píxel fijo

Los comentarios inline y pines de anotación deben anclarse al elemento de contenido objetivo (nodo de párrafo, layer de diseño o línea de código) usando identificadores semánticos, no a coordenadas de píxel absolutas. Cuando el documento hace reflow, los comentarios anclados deben seguir a su elemento objetivo. Los comentarios que pierden su ancla (porque fue eliminada) deben aparecer en un sidebar de "comentarios huerfanos".

CKEditor 5 Comments · Figma layer-ID anchoring · Google Docs character-offset 2023
Preferir
Colaborador B agrego 2 párrafos aquí arriba...
1
Ancla: node#p-4f2a · pin sigue al párrafo tras cualquier reflow
Evitar
Colaborador B agrego 2 párrafos aquí arriba...
!
Pin quedo en párrafo equivocado tras inserción
1423

Liberar locks de elementos automáticamente tras 30s de inactividad o al desconectarse

Cuando la herramienta colaborativa implementa bloqueo pesimista de elementos (un editor a la vez), los locks deben auto-liberarse después de 30 segundos de inactividad del titular, o inmediatamente al desconectarse. Mostrar un badge "Bloqueado por [Nombre]" en el elemento, y un contador de cuenta regresiva en los últimos 10 segundos antes de la liberación automática.

Ably, Collaboration UX Best Practices 2024 · MagicDraw 2024x Locking Model
Preferir
Bloque de texto: Sección Introducción
Alice esta editando
Liberación automática en 8s
Solicitar acceso
Alice recibira una notificación
Elemento liberado
Disponible
1424

Defaultear el scope del share-dialog a "restringido" y requerir escalación explicita a "cualquiera con el link"

Cuando un usuario abre un dialogo de compartir y copia un link, el scope de permiso por defecto debe ser "Restringido" (solo personas invitadas explicitamente), nunca "Cualquiera con el link" como default. Si el usuario cambia el scope a publico, mostrar un paso de confirmación con el permiso exacto en lenguaje claro antes de copiar al portapapeles.

Microsoft 365 Next-Gen Sharing 2025 · Box invite-only default 2024 · Google Drive
Preferir
Compartir documento
Agregar personas o grupos
Invitar
Acceso general
Restringido
Solo personas invitadas pueden acceder
Al cambiar a "Cualquiera con el link", cualquier persona en internet podra ver este archivo.
1425

Usar aria-live="polite" para presencia y actividad; aria-live="assertive" solo para conflictos

Los eventos de colaboración en tiempo real, usuario nuevo, comentario agregado, documento guardado, deben anunciarse a los lectores de pantalla usando aria-live="polite", que encola anuncios sin interrumpir. Reservar aria-live="assertive" exclusivamente para alertas de conflicto y advertencias de perdida de datos. Agrupar actualizaciones de presencia en anuncios únicos dentro de una ventana de 2 segundos.

WCAG 2.2 SC 4.1.3 · W3C ARIA Live Regions · Sara Soueidan 2022-2024
Preferir
polite
Eventos de presencia y actividad
Ana se unio al documento
Ben se unio al documento
Carlos se unio al documento
Anuncio agrupado tras 2s: "Ana, Ben y Carlos se unieron al documento.", sin interrumpir lectura actual
assertive
Alertas de conflicto unicamente
Conflicto de edición detectado
Tus cambios en la Sección 3 entran en conflicto con los de Sara. Por favor revisa.
Assertive interrumpe inmediatamente, solo para perdida de datos o conflictos criticos
ARIA Notify API (Edge 136, Origin Trial 2025), alternativa más limpia a manipulación DOM de live regions