Supabase (OT) Collaboration

Add real-time collaboration to Spreadsheet using Supabase with PostgreSQL persistence

The @rowsncolumns/supabase package provides real-time collaboration with PostgreSQL persistence and Operational Transformation (OT) for conflict resolution.

Features

  • PostgreSQL Persistence: All spreadsheet data stored in Supabase

  • Real-time Collaboration: Live updates via Supabase Realtime

  • Operational Transformation: Conflict resolution for concurrent edits

  • Presence Tracking: See active collaborators and their cursors

  • Leader Election: Coordinated recalculation

Installation

yarn add @rowsncolumns/supabase @supabase/supabase-js

Setup

1. Run Database Migration

Run the SQL migration in your Supabase project's SQL Editor:

-- See libs/supabase/migrations/001_create_spreadsheet_tables.sql
-- Or run via CLI:
supabase db push

2. Deploy Edge Function

Usage

Initializing Supabase Client

Using the Hook

API Reference

Props

Prop
Type
Required
Description

supabase

SupabaseClient

Yes

Supabase client instance

documentId

string

Yes

Unique document identifier

userId

string | number

Yes

Current user ID

title

string

Yes

User display name

sheetId

number

Yes

Active sheet ID

activeCell

CellInterface

No

Current active cell

initialSheets

Sheet[]

Yes

Initial sheets if document is new

edgeFunctionUrl

string

No

Edge function URL (default: /functions/v1/spreadsheet-ot)

onChangeSheetData

Dispatch

Yes

Sheet data setter

onChangeSheets

Dispatch

Yes

Sheets setter

onChangeTables

Dispatch

Yes

Tables setter

enqueueGraphOperation

Function

Yes

Calculation enqueue function

calculateNow

Function

Yes

Calculate now function

Return Value

Property
Type
Description

onBroadcastPatch

Function

Broadcast patches to other clients

users

Collaborator[]

Active collaborators

synced

boolean

Initial sync complete

isLeader

boolean

Is leader for recalc coordination

connectionState

ConnectionState

"connected", "connecting", or "disconnected"

Ephemeral-Only Mode

If you only need ephemeral collaboration without persistence, use @rowsncolumns/supabase-spreadsheet instead:

Note: This does not persist data - it only synchronizes state between connected clients.

Last updated