Presence

Add agent or human presence to your product.

Live avatars show who is viewing and editing, human or agent, the signal users expect from every multiplayer app.

Stop building presence from scratch for a feature users assume exists.

Free tier. No credit card. First comment in 5 minutes.

BDbudget-q3.xlsx / Sheet 1
live

Who’s in this document right now:

Mayalive
Devlive
Youaway

2 active · 1 away · avatars update in real time

Build this

Presence running inside products at

Migrating from Liveblocks or an in-house build?Compare·Migration guide

See your agents work

Both actor types, one primitive.

Velt Presence adds live avatars showing who is viewing and editing, humans and agents alike. When agents act in your product, your users should never wonder what the AI is doing. Presence shows an agent is in the document. Cursors and live selection show exactly what it is touching, as it touches it. Follow mode lets a user ride along while an agent works, the same way they would follow a teammate. Supervision is not a dashboard somewhere else; it is the same multiplayer primitives your users already understand, with agents as first-class users.

MASRDVCCAI+3

Clause 7: selection by Clause Checker

Maya

both actor types in one primitive; supervision visible, no dashboard

How it works

Three steps to a live avatar row.

Wrap your app, drop in VeltPresence, and avatars render for everyone on the document. Cursors, selection, and follow mode are sibling one-liners.

01Install
terminal
npm install @veltdev/react
02Wrap
_app.tsx
<VeltProvider
  apiKey={VELT_API_KEY}>
  <YourApp />
</VeltProvider>
03Mount
your-file.tsx
<VeltPresence />
// siblings: <VeltCursor />,
// live selection, and flockMode
With Velt

The mechanics

Presence shows everyone online on the document, with heartbeat monitoring behind it. A user goes away after a configurable inactivity window (default 5 minutes) and immediately when their tab loses focus; offline after longer inactivity (default 10 minutes) or on connection loss. maxUsers collapses crowded avatar rows into an overflow count, and locationId scopes presence to a page, tab, or region. Agents and bots enter the same list via addUser() on the client or the Presence REST APIs from your backend. userStateChange events and the presence data API stream everything back to your code.

// heartbeat monitoring · away after 5m or tab unfocus · offline after 10m

Build it yourself

What an in-house version requires

  • websocket or realtime infrastructure
  • heartbeats with idle and tab-focus detection
  • connection-drop cleanup
  • an avatar stack with overflow handling
  • per-location scoping
  • cursor throttling and position mapping across screen sizes
  • selection tracking on editable elements
  • viewport-following session management
  • a path to register non-human participants

Teams get a demo working in weeks; the idle states, reconnects, and fan-out scaling are the parts that never end. The 3 steps above replace the demo; the wall below replaces the long tail.

MCP: the faster path.

Skip the steps. Have your agent set it up.

npx -y @velt-js/mcp-installer

Launch presence this week.

No credit card. Works with React, Next.js, Vue, Angular, and HTML.

Get Free API Key

Capabilities

Who’s here, humans and agents.

Each card is the live SDK. Toggle to Code for the exact snippet that renders it.

01avatars
On this document6 here
5 people · 1 agentmaxUsers collapses the rest
Mayaediting slide 4
Devviewing
Sarahviewing
Review Agentreviewing clause 7
Chrisidle 5m
Youediting
// avatars
<VeltPresence maxUsers={5} />

Avatar stack with overflow

Live avatars render for everyone on the document, and maxUsers collapses extras into a single +N avatar. The whole deal team opens the deck without burying your header.

02states
Presence statesauto
Mayaactive nowonline
Sarahidle 5m · tab switchaway
Devdisconnected 10moffline
// states
<VeltPresence
  inactivityTime={5 * 60_000}
/>

Online, away, and offline states

Heartbeats mark a user away after configurable inactivity, instantly on tab switch, and offline on connection loss. The “is anyone looking at this forecast” question answers itself.

03agents
In the roomhuman + agent
Mayaeditinghuman
Review Agentreviewing clause 7agent
addUser()Or the Presence REST API
// agents
velt.addUser({
  userId: "agent-1", type: "agent",
});

Agent presence

addUser or the Presence REST API puts an agent in the avatar row while it works on the record. Your users see the reviewer is in before its findings land.

04cursors
Live cursorshumans + agents

7.2 The Provider shall indemnify and hold harmless the Client against all claims arising from the Services provided under this agreement.

Maya
Dev
Review Agent
// cursors
<VeltCursor />

Live cursors

No more real-time plumbing for table stakes: named cursors, or avatars in avatarMode, on every surface, humans and agents alike.

05selection
Live selectionattributed

7.2 The Provider shall indemnify and hold harmlessMaya the Client against all claims arisingDev from the Services.

B12$85,400Sarah
// selection
<input data-velt-live-selection />

Live selection

Inputs, text areas, and contenteditable elements broadcast selection automatically; opt any element in. The “what are you looking at?” question answers itself.

06follow
Follow modelive
Following Mayayour viewport mirrors hers
Click the agent to ride along as it works, live
// follow
<VeltPresence flockMode />

Follow mode

No more black-box agent work your users can’t watch: one click rides along with a teammate’s or an agent’s viewport, live.

07location
By locationslide-4
slide-3Pricingno one here
slide-4Forecast
slide-5Roadmapno one here
// location
velt.setLocation({ id: "slide-4" });

Presence by location

locationId scopes the avatar row to a page, tab, or region of your app. See who is on this slide, not just somewhere in the deck.

08data
Presence dataqueryable
usePresenceDatastatuses: ["away"]
Sarahidle 5m
Devidle 8m
onUserStateChange
Reviewer went idle → escalate(user)
drive your own indicators
// data
const users = usePresenceData({
  statuses: ["away"],
});

Presence data and events

usePresenceData and userStateChange expose full presence state, queryable by status. Drive your own indicators, or escalate when the assigned reviewer goes idle.

We had cursors, selection, and a working avatar row in an afternoon. The quarter we’d budgeted for reconnects and idle states never happened.

Founding engineer · collaborative editor

Little big details

The long tail, already built.

All items trace to docs pages; engineering sign-off still applies.

Heartbeat monitoring for active-session visibilityConfigurable inactivityTime (default 5 min) and offlineInactivityTime (default 10 min)Instant away on tab unfocus (isTabAway); offline on connection lossmaxUsers overflow avatar; include or exclude selflocationId scoping to a page, tab, or regionusePresenceData hook and getData API with status filtersuserStateChange and onPresenceUserClick eventsaddUser and removeUser for AI agents, bots, and system accountslocalOnly flag for client-only indicatorsPresence REST APIs (add, update, delete) for server-side presenceCursors: name labels or avatarMode; adaptation across screen sizesCursors: allowedElementIds whitelisting; onCursorUserChange eventLive selection on input, textarea, button, and contenteditableLive selection: per-element opt in/out via data attributeLive selection: indicator as avatar or label, position start or endgetLiveSelectionData API and hookFollow mode via flockMode prop or enableFlockMode()Leader clicks, scrolls, and navigation replay on followersstartFollowingUser / stopFollowingUser APIs; onNavigate callbackWireframes for Presence, Cursors, and Live Selection custom UIs

Make it yours

Your avatar row, your rules.

Prebuilt components for the fast path, wireframes for fully custom UIs, and configuration, hooks, events, and REST APIs underneath.

Look

Wireframe components for fully custom UIs across the family: Presence, Cursors, and Live Selection; template variables, dark mode, CSS customization. Your avatar row can look nothing like Velt’s defaults.

Maya
squirclelabelsdark

Behavior

Configuration props (inactivity windows, maxUsers, locations, allowed elements), data subscriptions and hooks, presence events, addUser/removeUser, and the Presence REST APIs for server-driven presence.

usePresenceData()statuses · location · selfqueryable
locationIdscope to a slide or roomslide-4
inactivityidle 5m → awayrule
onUserStateChangeaddUser · removeUser · RESTevent
Adding the agent to the avatar row changed how users feel about our AI. They can see it working and follow along instead of staring at a spinner.

Product lead · AI-native SaaS

In production

Presence, in products like yours.

Tabbed by vertical, with verified customer screenshots.

SummaryNext StepsDemoCustomer Stories

Hey Conductor!

This Digital Sales Room gives you everything you need to move forward — from proposal to plan.

Our Mutual Action Plan
Training2 / 5
Creating a new Room1
Build a working demo room
Contract sign-off
Maya2m

@Fin We need to make a working demo for Rene and his team

Brand, legal, and the client show up in the deck’s avatar row, cursors on the slide they are reading. Nobody re-sends a link to ask who has seen the latest version.For sales enablement

See it running in products like yours.

30 minutes, with an engineer, not a sales deck.

Book Demo
SOC 2 Type IIHIPAAEU data residencySelf-host identity

User identity behind every avatar can stay on your infrastructure via the users data provider, with Velt storing only user IDs. Presence, cursors, and selection run on the same isolation guarantees as the rest of the SDK. See self-hosting and governance.

Book Demo

Proof

The build-from-scratch quarter, skipped.

A feature users assume exists, without the ML infrastructure quarter.

1 afternoon

We’d scoped a quarter for presence, cursors, and selection. We shipped all three in an afternoon and spent the quarter on our actual product.
Founding engineer, collaborative editor

0 dashboards

Our users supervise the agent through the same avatar row and follow mode they already use for teammates. We never built a separate oversight dashboard.
Product lead, AI-native SaaS

1 handoff

Away and offline states ended the double-assigned work orders. Dispatch sees who actually has the doc open before they reassign.
Operations manager, logistics platform

FAQ

Questions about Presence.

Install @veltdev/react, wrap your app in VeltProvider with your API key, and add the VeltPresence component. Avatars render for everyone on the document; the quickstart walks through it in minutes.

Yes. Add the agent to the presence list with addUser or the Presence REST API and it appears in the avatar row like any user, including indicators visible only to one user via the localOnly flag. Cursors, live selection, and follow mode extend that to what the agent is touching and where it is going.

Away after a configurable inactivity window (default 5 minutes) and immediately when their tab loses focus. Offline after longer inactivity (default 10 minutes) or when their connection drops. Both thresholds are one prop to change.

Yes. locationId scopes the avatar row to a page, tab, or region; allowedElementIds restricts cursors to chosen elements; live selection opts elements in or out with a data attribute.

Cursors work across your document and adapt across screen sizes and content differences, with optional element whitelisting. Live selection tracks inputs, text areas, buttons, and contenteditable elements automatically, and any other element you opt in with one attribute.

One user clicks another’s avatar to start a session (docs call it Follow Me Mode). Whatever the leader does, clicking, scrolling, or navigating, happens on every follower’s screen, with a callback to drive your own router.

Yes. Use the prebuilt components as-is, restyle them with wireframes and template variables, or build fully custom UIs on the presence data hooks, events, and REST APIs. Your avatar row can look nothing like Velt’s defaults.

Yes. The SDK supports React, Next.js, Angular, Vue, and plain HTML via web components, and the Presence REST APIs cover server-side and non-web cases.

Velt is priced on usage, not seats: you pay for documents with review activity in a month, and there is a free tier for development and early production. The presence family is part of the SDK, not a separately priced add-on.

Add agent or human presence to your product.

Free tier. No credit card. First comment in 5 minutes.

30 minutes, with an engineer, not a sales deck.