Presence
Share state between users with Realtime Presence.
Let's explore how to implement Realtime Presence to track state between multiple users.
Usage
You can use the Supabase client libraries to track Presence state between users.
How Presence works
Presence lets each connected client publish a small piece of state—called a “presence payload”—to a shared channel. Supabase stores each client’s payload under a unique presence key and keeps a merged view of all connected clients.
When any client subscribes, disconnects, or updates their presence payload, Supabase triggers one of three events:
sync— the full presence state has been updatedjoin— a new client has started tracking presenceleave— a client has stopped tracking presence
The complete presence state returned by presenceState() looks like this:
1{2 "client_key_1": [{ "userId": 1, "typing": false }],3 "client_key_2": [{ "userId": 2, "typing": true }]4}Initialize the client
Get the Project URL and key from the project's Connect dialog.
Changes to API keys
Supabase is changing the way keys work to improve project security and developer experience. You can read the full announcement, but in the transition period, you can use both the current anon and service_role keys and the new publishable key with the form sb_publishable_xxx which will replace the older keys.
In most cases, you can get the correct key from the Project's Connect dialog, but if you want a specific key, you can find all keys in the API Keys section of a Project's Settings page:
- For legacy keys, copy the
anonkey for client-side operations and theservice_rolekey for server-side operations from the Legacy API Keys tab. - For new keys, open the API Keys tab, if you don't have a publishable key already, click Create new API Keys, and copy the value from the Publishable key section.
1import { } from '@supabase/supabase-js'23const = 'https://<project>.supabase.co'4const = '<sb_publishable_... or anon key>'56const = (, )Sync and track state
Listen to the sync, join, and leave events triggered whenever any client joins or leaves the channel or changes their slice of state:
1const = .('room_01')234 .('presence', { : 'sync' }, () => {5 const = .()6 .('sync', )7 })8 .('presence', { : 'join' }, ({ , }) => {9 .('join', , )10 })11 .('presence', { : 'leave' }, ({ , }) => {12 .('leave', , )13 })14 .()Sending state
You can send state to all subscribers using track():
1const = .('room_01')23const = {4 : 'user-1',5 : new ().(),6}78.(async () => {9 if ( !== 'SUBSCRIBED') { return }1011 const = await .()12 .()13})A client will receive state from any other client that is subscribed to the same topic (in this case room_01). It will also automatically trigger its own sync and join event handlers.
Stop tracking
You can stop tracking presence using the untrack() method. This will trigger the sync and leave event handlers.
1const = async () => {2 const = await .()3 .()4}56()Presence options
You can pass configuration options while initializing the Supabase Client.
Presence key
By default, Presence will generate a unique UUIDv1 key on the server to track a client channel's state. If you prefer, you can provide a custom key when creating the channel. This key should be unique among clients.
1import { } from '@supabase/supabase-js'2const = ('SUPABASE_URL', 'SUPABASE_PUBLISHABLE_KEY')34const = .('test', {5 : {6 : {7 : 'userId-123',8 },9 },10})