Skip to content

Multiplayer cursor

Two humans, one model, no elbow fight.

11 min

The moment two people share a model session, the composer is no longer a private surface. Someone is typing; someone else is reading. Someone is about to interject; someone else has the floor. Presence becomes a first-class element, and the pattern that makes it legible has to do so without drowning the conversation in chrome.

The best version of this pattern is almost nothing. A color per cursor. A small letter above it. A floor token that passes with a keypress. No modals. No sidebar. No notification bar. Presence lives in the rhythm of the conversation, not on top of it.

"A shared composer is a negotiation."
The pattern

Color, initial, floor.

Each user gets a color and a one-letter initial. The cursor carries both. When a user starts typing, their line shimmers into the transcript softly — enough to announce presence, little enough that it doesn't interrupt. The floor token is the small affordance that says "I want to speak next," and it passes with one key.

The model, in a multiplayer session, addresses the user who holds the floor. If the floor passes mid-response, the model acknowledges it briefly. No popup. A small in-transcript line: "— switched to D."

Two cursors, one model
Floor token passes between presenters. Shimmer announces typing.
D● floorM○ idle

Press Replay session. Two cursors, one model.

Cursor color names the speaker. Floor token passes between presenters without a modal.

The why

Presence is honest about who's speaking.

The failure mode the pattern prevents is subtle: when two people are prompting the same model, and the model's responses start blending context from both users, neither user is sure whose question was answered. Presence and floor management keep the turn-taking legible.

This is the same thing a good facilitator does in a meeting. It's the interface equivalent of passing the talking stick.

Three moves

The presence I'd ship.

  • Restrained palette. Two colors, three colors at most. A rainbow of cursors reads as chaos. A calm palette reads as a working session.
  • Shimmer, don't slam. Typing presence should fade in. Nothing should jump the layout. Nothing should force the active reader's eye off the transcript.
  • Floor is explicit. Don't infer who's talking by who typed most recently. That's a guess and it gets embarrassing when two users type simultaneously. The floor token is a small, intentional handshake.

The trap

Overtalking that nobody sees.

If two users type simultaneously and the interface hides it, the conversation becomes a race to send and whoever wins overrides the other's context. The pattern must surface overtalking — a quiet "M is also typing" line — rather than suppress it.

Make overtalking visible. Trust the users to resolve it.

Failure modes

What this pattern gets wrong when it gets wrong.

Role drift
The model or the user shifts role mid-session without the interface updating tone, scope, or permissions to match.
Ambiguous state
Running, done, errored, paused all look the same. The user has to infer from context.
Leaky context
Content from another source, session, or user surfacing in a place it shouldn't.
Seen in the wild

Three shipping variants worth copying.

  • A per-user cursor color with a one-letter initial above
  • A soft 'typing' shimmer that fades after 1.5s of silence
  • A 'you have the floor' token that passes with a single key