---
title: Realtime Monaco
description: Real-time Monaco editor for collaborative applications
preview: |-
---
## Installation
## Introduction
The Realtime Monaco component provides a collaborative code editor powered by [Monaco](https://microsoft.github.io/monaco-editor/) and [Yjs](https://yjs.dev/). It uses [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase) under the hood to sync document state across clients through Supabase Realtime.
**Features**
- Real-time document synchronization via Supabase Realtime broadcast
- Cursor and selection sharing between collaborators (awareness)
- Optional persistence to Postgres so documents survive page reloads
- Supports all Monaco languages and themes
- Room-based isolation for scoped collaboration
## How it works under the hood
The component creates a [Yjs](https://yjs.dev/) document and connects it to a Supabase Realtime channel using `SupabaseProvider` from `@supabase-labs/y-supabase`. A `MonacoBinding` from `y-monaco` bridges the Yjs document with the Monaco editor model, keeping them in sync.
When **awareness** is enabled, each user's cursor position and selection are broadcast to other clients in the same channel. Remote cursors are rendered with unique colors via dynamically injected CSS.
When **persistence** is enabled, the full Yjs document state is saved to a Postgres table so it can be restored when clients reconnect.
## Usage
### Basic usage
```tsx
import { RealtimeMonaco } from '@/components/realtime-monaco'
export default function MonacoPage() {
return
}
```
### With persistence
Enable persistence to save the editor content to your Supabase database. This requires a table to store the Yjs document state.
First, create the required table in your Supabase project:
```sql
create table yjs_documents (
room text primary key,
state text not null
);
```
Then pass `persistence` to the component:
```tsx
import { RealtimeMonaco } from '@/components/realtime-monaco'
export default function MonacoPage() {
return
}
```
You can also pass a `SupabasePersistenceOptions` object:
```tsx
```
### Without awareness
By default, cursor and selection positions are shared between collaborators. To disable this:
```tsx
```
## Props
| Prop | Type | Description |
| -------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `channel` | `string` | Unique channel name used to sync editor content between collaborators in the same session. |
| `language?` | `string` | Monaco [language identifier](https://code.visualstudio.com/docs/languages/identifiers) (e.g. `typescript`, `python`). Defaults to `javascript`. |
| `height?` | `string \| number` | Height of the editor container. Accepts a pixel number or CSS string (e.g. `"100%"`). Defaults to `550`. |
| `className?` | `string` | CSS class applied to the editor wrapper element. |
| `awareness?` | `boolean \| Awareness` | Enables cursor and selection sharing between users. Pass `false` to disable or a custom `Awareness` instance. Defaults to `true`. |
| `persistence?` | `boolean \| SupabasePersistenceOptions` | Persists editor content to Supabase so it survives page reloads. Pass `true` for defaults or an options object for fine-grained control. |
| `theme?` | `'light' \| 'dark'` | Color theme for the editor. Maps to Monaco's `light` and `vs-dark` themes. |
### SupabasePersistenceOptions
| Option | Type | Default | Description |
| -------------- | -------- | ----------------- | --------------------------------------------------- |
| `table` | `string` | `'yjs_documents'` | Name of the Postgres table used to store documents. |
| `schema` | `string` | `'public'` | Schema where the table is located. |
| `roomColumn` | `string` | `'room'` | Column used as the document identifier. |
| `stateColumn` | `string` | `'state'` | Column used to store the binary Yjs state. |
| `storeTimeout` | `number` | `1000` | Debounce delay (ms) before persisting changes. |
## Further reading
- [Realtime Broadcast](https://supabase.com/docs/guides/realtime/broadcast)
- [Realtime authorization](https://supabase.com/docs/guides/realtime/authorization)
- [`@supabase-labs/y-supabase`](https://github.com/supabase-community/y-supabase)
- [Yjs documentation](https://docs.yjs.dev/)