chore(docs): update docs to use postgres over postgresql language (#44881)

## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES

## What kind of change does this PR introduce?

Updates verbiage throughout docs to use postgres over postgresql.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
* Updated terminology throughout documentation, guides, and resources
for consistent product naming across all user-facing materials,
including page titles, descriptions, and reference documentation.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Taryn King authored and GitHub committed 2026-04-15 09:49:45 +00:00
1 parent 667d1ce497
commit 65c6929414
36 files changed
+63 -63

No files matched your search

@@ -1403,7 +1403,7 @@ export const database: NavMenuConstant = {
url: '/guides/database/postgres/first-row-in-group' as `/${string}`,
},
{
name: 'Print PostgreSQL Version',
name: 'Print Postgres Version',
url: '/guides/database/postgres/which-version-of-postgres' as `/${string}`,
},
{
+1 -1
View File
@@ -73,7 +73,7 @@ Check out all of the AI [templates and examples](https://github.com/supabase/sup
href: 'https://supabase.com/customers/berriai',
},
{
name: 'Firecrawl switches from Pinecone to Supabase for PostgreSQL vector embeddings',
name: 'Firecrawl switches from Pinecone to Supabase for Postgres vector embeddings',
description:
'How Firecrawl boosts efficiency and accuracy of chat powered search for documentation using Supabase with pgvector',
href: 'https://supabase.com/customers/firecrawl',
@@ -1,7 +1,7 @@
---
id: 'ai-vecs-python-client'
title: 'Python client'
subtitle: 'Manage unstructured vector stores in PostgreSQL.'
subtitle: 'Manage unstructured vector stores in Postgres.'
breadcrumb: 'AI Quickstarts'
---
+1 -1
View File
@@ -21,7 +21,7 @@ The REST interface is automatically reflected from your database's schema and is
- **Instant and auto-generated.** <br />As you update your database the changes are immediately accessible through your API.
- **Self documenting.** <br />Supabase generates documentation in the Dashboard which updates as you make database changes.
- **Secure.** <br />The API is configured to work with PostgreSQL's Row Level Security, provisioned behind an API gateway with key-auth enabled.
- **Secure.** <br />The API is configured to work with Postgres's Row Level Security, provisioned behind an API gateway with key-auth enabled.
- **Fast.** <br />Our benchmarks for basic reads are more than 300% faster than Firebase. The API is a very thin layer on top of Postgres, which does most of the heavy lifting.
- **Scalable.** <br />The API can serve thousands of simultaneous requests, and works well for Serverless workloads.
@@ -344,7 +344,7 @@ revoke execute
</TabPanel>
<TabPanel id="sql-allow-deny-by-cidr" label="Allow/Deny by IP or CIDR">
This example shows how you might restrict sign up from a single IP address or a range of them using [PostgreSQL’s built-in](https://www.postgresql.org/docs/current/datatype-net-types.html) `inet` and `<<` operators for [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) -- a method of representing IP address ranges.
This example shows how you might restrict sign up from a single IP address or a range of them using [Postgres’s built-in](https://www.postgresql.org/docs/current/datatype-net-types.html) `inet` and `<<` operators for [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) -- a method of representing IP address ranges.
For instance: `123.123.123.123/32` represents only a single IP address, while `123.123.123.0/24` means all IP addresses starting with `123.123.123.`.
The `before-user-created` hook solves this by:
@@ -599,7 +599,7 @@ Deno.serve(async (req) => {
</TabPanel>
<TabPanel id="http-allow-deny-by-cidr" label="Allow/Deny by IP or CIDR">
This example shows how you might restrict sign up from a single IP address or a range of them using [PostgreSQL’s built-in](https://www.postgresql.org/docs/current/datatype-net-types.html) `inet` and `<<` operators for [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) -- a method of representing IP address ranges.
This example shows how you might restrict sign up from a single IP address or a range of them using [Postgres’s built-in](https://www.postgresql.org/docs/current/datatype-net-types.html) `inet` and `<<` operators for [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing) -- a method of representing IP address ranges.
For instance: `123.123.123.123/32` represents only a single IP address, while `123.123.123.0/24` means all IP addresses starting with `123.123.123.`.
The `before-user-created` hook solves this by:
+2 -2
View File
@@ -226,7 +226,7 @@ create policy "Policy name."
- The policy will accept both `aal1` and `aal2` for users with a `created_at`
timestamp prior to 12th December 2022 at 00:00 UTC, but will only accept
`aal2` for all other timestamps.
- The `<@` operator is PostgreSQL's ["contained in"
- The `<@` operator is Postgres's ["contained in"
operator.](https://www.postgresql.org/docs/current/functions-array.html)
- **Using `as restrictive` ensures this policy will restrict all commands on the
table regardless of other policies!**
@@ -256,7 +256,7 @@ create policy "Policy name."
- The policy will only accept only `aal2` when the user has at least one MFA
factor verified.
- Otherwise, it will accept both `aal1` and `aal2`.
- The `<@` operator is PostgreSQL's ["contained in"
- The `<@` operator is Postgres's ["contained in"
operator.](https://www.postgresql.org/docs/current/functions-array.html)
- **Using `as restrictive` ensures this policy will restrict all commands on the
table regardless of other policies!**
+1 -1
View File
@@ -1,7 +1,7 @@
---
id: 'arrays'
title: 'Working With Arrays'
description: 'How to use arrays in PostgreSQL and the Supabase API.'
description: 'How to use arrays in Postgres and the Supabase API.'
---
Postgres supports flexible [array types](https://www.postgresql.org/docs/12/arrays.html). These arrays are also supported in the Supabase Dashboard and in the JavaScript API.
@@ -1,7 +1,7 @@
---
id: 'http'
title: 'http: RESTful Client'
description: 'An HTTP Client for PostgreSQL Functions.'
description: 'An HTTP Client for Postgres Functions.'
video: 'https://www.youtube.com/v/rARgrELRCwY'
---
@@ -1,7 +1,7 @@
---
id: 'pg_graphql'
title: 'pg_graphql: GraphQL for PostgreSQL'
description: 'A GraphQL Interface for PostgreSQL'
title: 'pg_graphql: GraphQL for Postgres'
description: 'A GraphQL Interface for Postgres'
---
[pg_graphql](https://supabase.github.io/pg_graphql/) is Postgres extension for interacting with the database using [GraphQL](https://graphql.org) instead of SQL.
@@ -1,11 +1,11 @@
---
id: 'pg_jsonschema'
title: 'pg_jsonschema: JSON Schema Validation'
description: 'Validate json/jsonb with JSON Schema in PostgreSQL.'
description: 'Validate json/jsonb with JSON Schema in Postgres.'
tocVideo: 'amJo48ChLGs'
---
[JSON Schema](https://json-schema.org) is a language for annotating and validating JSON documents. [`pg_jsonschema`](https://github.com/supabase/pg_jsonschema) is a Postgres extension that adds the ability to validate PostgreSQL's built-in `json` and `jsonb` data types against JSON Schema documents.
[JSON Schema](https://json-schema.org) is a language for annotating and validating JSON documents. [`pg_jsonschema`](https://github.com/supabase/pg_jsonschema) is a Postgres extension that adds the ability to validate Postgres's built-in `json` and `jsonb` data types against JSON Schema documents.
## Enable the extension
@@ -1,7 +1,7 @@
---
id: 'pg_net'
title: 'pg_net: Async Networking'
description: 'pg_net: an async networking extension for PostgreSQL.'
description: 'pg_net: an async networking extension for Postgres.'
---
<Admonition type="caution">
@@ -1,7 +1,7 @@
---
id: 'pgaudit'
title: 'PGAudit: Postgres Auditing'
description: 'Session and object auditing via PostgreSQL standard logging'
description: 'Session and object auditing via Postgres standard logging'
---
[PGAudit](https://www.pgaudit.org) extends Postgres's built-in logging abilities. It can be used to selectively track activities within your database.
@@ -1,7 +1,7 @@
---
id: 'pgjwt'
title: 'pgjwt: JSON Web Tokens'
description: 'Encode and decode JWTs in PostgreSQL'
description: 'Encode and decode JWTs in Postgres'
---
<Admonition type="note">
@@ -1,7 +1,7 @@
---
id: 'pgroonga'
title: 'PGroonga: Multilingual Full Text Search'
description: 'Full Text Search for multiple languages in PostgreSQL'
description: 'Full Text Search for multiple languages in Postgres'
tocVideo: 'Mmmv9g_MiBA'
---
@@ -65,9 +65,9 @@ To test the full text index, we'll add some data.
```sql
insert into memos(content)
values
('PostgreSQL is a relational database management system.'),
('Postgres is a relational database management system.'),
('Groonga is a fast full text search engine that supports all languages.'),
('PGroonga is a PostgreSQL extension that uses Groonga as index.'),
('PGroonga is a Postgres extension that uses Groonga as index.'),
('There is groonga command.');
```
@@ -117,7 +117,7 @@ And the result:
id | content
----+------------------------------------------------------------------------
2 | Groonga is a fast full text search engine that supports all languages.
3 | PGroonga is a PostgreSQL extension that uses Groonga as index.
3 | PGroonga is a Postgres extension that uses Groonga as index.
4 | There is groonga command.
(3 rows)
```
@@ -136,7 +136,7 @@ And the result:
```markdown
id | content
----+----------------------------------------------------------------
3 | PGroonga is a PostgreSQL extension that uses Groonga as index.
3 | PGroonga is a Postgres extension that uses Groonga as index.
(1 row)
```
@@ -154,8 +154,8 @@ And the result:
```markdown
id | content
----+----------------------------------------------------------------
1 | PostgreSQL is a relational database management system.
3 | PGroonga is a PostgreSQL extension that uses Groonga as index.
1 | Postgres is a relational database management system.
3 | PGroonga is a Postgres extension that uses Groonga as index.
(2 rows)
```
@@ -173,7 +173,7 @@ And the result:
```markdown
id | content
----+--------------------------------------------------------
1 | PostgreSQL is a relational database management system.
1 | Postgres is a relational database management system.
(1 row)
```
@@ -1,7 +1,7 @@
---
id: 'pgsodium'
title: 'pgsodium (pending deprecation): Encryption Features'
description: 'Encryption library for PostgreSQL'
description: 'Encryption library for Postgres'
---
Supabase DOES NOT RECOMMEND any new usage of [`pgsodium`](https://github.com/michelp/pgsodium).
@@ -1,7 +1,7 @@
---
id: 'pgtap'
title: 'pgTAP: Unit Testing'
description: 'Unit testing in PostgreSQL.'
description: 'Unit testing in Postgres.'
---
`pgTAP` is a unit testing extension for Postgres.
@@ -1,7 +1,7 @@
---
id: 'pgvector'
title: 'pgvector: Embeddings and vector similarity'
description: 'pgvector: a PostgreSQL extension for storing embeddings and performing vector similarity search.'
description: 'pgvector: a Postgres extension for storing embeddings and performing vector similarity search.'
---
[pgvector](https://github.com/pgvector/pgvector/) is a Postgres extension for vector similarity search. It can also be used for storing [embeddings](/blog/openai-embeddings-postgres-vector).
@@ -1,7 +1,7 @@
---
id: 'plv8'
title: 'plv8: JavaScript Language'
description: 'JavaScript language for PostgreSQL.'
description: 'JavaScript language for Postgres.'
---
<Admonition type="deprecation">
@@ -1,7 +1,7 @@
---
id: 'uuid-ossp'
title: 'uuid-ossp: Unique Identifiers'
description: 'A UUID generator for PostgreSQL.'
description: 'A UUID generator for Postgres.'
---
The `uuid-ossp` extension can be used to generate a `UUID`.
@@ -1,8 +1,8 @@
---
id: 'full-text-search'
title: 'Full Text Search'
description: 'How to use full text search in PostgreSQL.'
subtitle: 'How to use full text search in PostgreSQL.'
description: 'How to use full text search in Postgres.'
subtitle: 'How to use full text search in Postgres.'
tocVideo: 'GRwIa-ce7RA'
---
@@ -1,12 +1,12 @@
---
id: 'orioledb'
title: 'OrioleDB Overview'
description: "A storage extension for PostgreSQL which uses PostgreSQL's pluggable storage system"
description: "A storage extension for Postgres which uses Postgres's pluggable storage system"
---
The [OrioleDB](https://www.orioledb.com/) Postgres extension provides a drop-in replacement storage engine for the default heap storage method. It is designed to improve Postgres' scalability and performance.
OrioleDB addresses PostgreSQL's scalability limitations by removing bottlenecks in the shared memory cache under high concurrency. It also optimizes write-ahead-log (WAL) insertion through row-level WAL logging. These changes lead to significant improvements in the industry standard TPC-C benchmark, which approximates a real-world transactional workload. The following benchmark was performed on a c7g.metal instance and shows OrioleDB's performance outperforming the default Postgres heap method with a 3.3x speedup.
OrioleDB addresses Postgres's scalability limitations by removing bottlenecks in the shared memory cache under high concurrency. It also optimizes write-ahead-log (WAL) insertion through row-level WAL logging. These changes lead to significant improvements in the industry standard TPC-C benchmark, which approximates a real-world transactional workload. The following benchmark was performed on a c7g.metal instance and shows OrioleDB's performance outperforming the default Postgres heap method with a 3.3x speedup.
<Image
alt="TPC-C (warehouses = 500)"
@@ -31,7 +31,7 @@ OrioleDB uses index-organized tables, where table data is stored in the index st
### No buffer mapping
In-memory pages are connected to the storage pages using direct links. This allows OrioleDB to bypass PostgreSQL's shared buffer pool and eliminate the associated complexity and contention in buffer mapping.
In-memory pages are connected to the storage pages using direct links. This allows OrioleDB to bypass Postgres's shared buffer pool and eliminate the associated complexity and contention in buffer mapping.
### Undo log
@@ -4,7 +4,7 @@ title: 'Column Level Security'
description: 'Secure your data using Postgres Column Level Security.'
---
PostgreSQL's [Row Level Security (RLS)](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) gives you granular control over who can access rows of data. However, it doesn't give you control over which columns they can access within rows. Sometimes you want to restrict access to specific columns in your database. Column Level Privileges allows you to do just that.
Postgres's [Row Level Security (RLS)](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) gives you granular control over who can access rows of data. However, it doesn't give you control over which columns they can access within rows. Sometimes you want to restrict access to specific columns in your database. Column Level Privileges allows you to do just that.
<Admonition type="caution">
@@ -1,5 +1,5 @@
---
title: 'Drop all tables in a PostgreSQL schema'
title: 'Drop all tables in a Postgres schema'
description: 'Useful snippet for deleting all tables in a given schema'
footerHelpType: 'postgres'
---
@@ -1,6 +1,6 @@
---
title: 'Select first row for each group in PostgreSQL'
description: 'PostgreSQL snippet for grabbing the first row in each distinct group by group'
title: 'Select first row for each group in Postgres'
description: 'Postgres snippet for grabbing the first row in each distinct group by group'
footerHelpType: 'postgres'
---
@@ -1,5 +1,5 @@
---
title: 'Managing Indexes in PostgreSQL'
title: 'Managing Indexes in Postgres'
description: 'Improve query performance using various index types in Postgres'
footerHelpType: 'postgres'
tocVideo: 'bBu_V8CfWgM'
@@ -1,5 +1,5 @@
---
title: 'Print PostgreSQL version'
title: 'Print Postgres version'
description: 'Useful snippet for finding out which version of postgres you are running'
footerHelpType: 'postgres'
---
+1 -1
View File
@@ -313,7 +313,7 @@ supabase
### Bulk data loading
When inserting large data sets it's best to use PostgreSQL's [COPY](https://www.postgresql.org/docs/current/sql-copy.html) command.
When inserting large data sets it's best to use Postgres's [COPY](https://www.postgresql.org/docs/current/sql-copy.html) command.
This loads data directly from a file into a table. There are several file formats available for copying data: text, CSV, binary, JSON, etc.
For example, if you wanted to load a CSV file into your movies table:
@@ -50,7 +50,7 @@ An open source Dashboard for managing your database and services.
### GoTrue (Auth)
A JWT-based API for managing users and issuing access tokens. This integrates with PostgreSQL's Row Level Security and the API servers.
A JWT-based API for managing users and issuing access tokens. This integrates with Postgres's Row Level Security and the API servers.
- Official Docs: [Supabase Auth reference docs](/docs/reference/auth)
- Source code: [github.com/supabase/gotrue](https://github.com/supabase/gotrue)
@@ -4,7 +4,7 @@ description: 'Migrate your MySQL database to Supabase Postgres database.'
subtitle: 'Migrate your MySQL database to Supabase Postgres database.'
---
This guide aims to exhibit the process of transferring your MySQL database to Supabase's Postgres database. Supabase is a robust and open-source platform offering a wide range of backend features, including a Postgres database, authentication, instant APIs, edge functions, real-time subscriptions, and storage. Migrating your MySQL database to Supabase's Postgres enables you to leverage PostgreSQL's capabilities and access all the features you need for your project.
This guide aims to exhibit the process of transferring your MySQL database to Supabase's Postgres database. Supabase is a robust and open-source platform offering a wide range of backend features, including a Postgres database, authentication, instant APIs, edge functions, real-time subscriptions, and storage. Migrating your MySQL database to Supabase's Postgres enables you to leverage Postgres's capabilities and access all the features you need for your project.
## Retrieve your MySQL database credentials
+2 -2
View File
@@ -73,7 +73,7 @@ hideToc: true
title: 'Firestore Data',
icon: '/docs/img/icons/firebase-icon',
href: '/guides/resources/migrating-to-supabase/firestore-data',
description: 'Migrate the contents of a Firestore collection to a single PostgreSQL table.',
description: 'Migrate the contents of a Firestore collection to a single Postgres table.',
},
{
title: 'Firebase Storage',
@@ -173,7 +173,7 @@ hideToc: true
description: 'Retrieve the first row in each distinct group.'
},
{
title: 'Print PostgreSQL version',
title: 'Print Postgres version',
hasLightIcon: true,
href: '/guides/database/postgres/which-version-of-postgres',
description: 'Find out which version of Postgres you are running.'
@@ -370,7 +370,7 @@ If the tools and communities already exist, with an MIT, Apache 2, or equivalent
- **[imgproxy](https://github.com/imgproxy/imgproxy)** - Fast and secure image processing server
- **[postgres-meta](https://github.com/supabase/postgres-meta)** - RESTful API for managing Postgres (fetch tables, add roles, run queries)
{/* supa-mdx-lint-disable-next-line Rule004ExcludeWords */}
- **[PostgreSQL](https://github.com/supabase/postgres)** - Object-relational database with over 30 years of active development
- **[Postgres](https://github.com/supabase/postgres)** - Object-relational database with over 30 years of active development
- **[Edge Runtime](https://github.com/supabase/edge-runtime)** - Web server based on Deno runtime for running JavaScript, TypeScript, and WASM services
- **[Logflare](https://github.com/Logflare/logflare)** - Log management and event analytics platform
- **[Vector](https://github.com/vectordotdev/vector)** - High-performance observability data pipeline for logs
@@ -1,6 +1,6 @@
---
title: 'Query with PostgreSQL'
subtitle: 'Query analytics bucket data directly from PostgreSQL using SQL.'
title: 'Query with Postgres'
subtitle: 'Query analytics bucket data directly from Postgres using SQL.'
---
Once your data flows into an analytics bucket through your own ingestion pipeline, you can query it directly from Postgres using standard SQL.
@@ -28,7 +28,7 @@ The dashboard provides the easiest setup experience:
2. Locate the namespace you want to query and click **Query with Postgres**.
<Image
alt="Query with PostgreSQL button on analytics bucket page"
alt="Query with Postgres button on analytics bucket page"
src="/docs/img/storage/query-analytics-with-postgres.png"
width={1860}
@@ -38,7 +38,7 @@ height={332}
3. Enter the **Postgres schema** where you want to create the foreign tables.
<Image
alt="Select destination PostgreSQL schema"
alt="Select destination Postgres schema"
src="/docs/img/storage/query-analytics-schema-name.png"
width={525}
@@ -1,6 +1,6 @@
---
title: 'Querying Vectors'
subtitle: 'Perform similarity search and retrieve vectors using JavaScript SDK or PostgreSQL.'
subtitle: 'Perform similarity search and retrieve vectors using JavaScript SDK or Postgres.'
---
<Admonition type="caution" title="This feature is in alpha">
+5 -5
View File
@@ -6,24 +6,24 @@ title: Supabase Realtime Server
sidebar_label: Supabase Realtime Server
---
Supabase Realtime is a server built with Elixir using the [Phoenix Framework](https://www.phoenixframework.org) that allows you to listen to changes in your PostgreSQL database via logical replication and then broadcast those changes via WebSockets.
Supabase Realtime is a server built with Elixir using the [Phoenix Framework](https://www.phoenixframework.org) that allows you to listen to changes in your Postgres database via logical replication and then broadcast those changes via WebSockets.
There are two versions of this server: `Realtime` and `Realtime RLS`.
`Realtime` server works by:
1. listening to PostgreSQL's replication functionality (using PostgreSQL's logical decoding)
1. listening to Postgres's replication functionality (using Postgres's logical decoding)
2. converting the byte stream into JSON
3. broadcasting to all connected clients over WebSockets
`Realtime RLS` server works by:
1. polling PostgreSQL's replication functionality (using PostgreSQL's logical decoding and [wal2json](https://github.com/eulerto/wal2json) output plugin)
2. passing database changes to a [Write Ahead Log Realtime Unified Security (WALRUS)](https://github.com/supabase/walrus) PostgreSQL function and receiving a list of authorized subscribers depending on Row Level Security (RLS) policies
1. polling Postgres's replication functionality (using Postgres's logical decoding and [wal2json](https://github.com/eulerto/wal2json) output plugin)
2. passing database changes to a [Write Ahead Log Realtime Unified Security (WALRUS)](https://github.com/supabase/walrus) Postgres function and receiving a list of authorized subscribers depending on Row Level Security (RLS) policies
3. converting the changes into JSON
4. broadcasting to authorized subscribers over WebSockets
## Why not just use PostgreSQL's `NOTIFY`?
## Why not just use Postgres's `NOTIFY`?
A few reasons:
@@ -30,7 +30,7 @@ The Analytics server supports either **Postgres** or **BigQuery** as the backend
When using the BigQuery backend, a BigQuery dataset is created in the provided Google Cloud project, and tables are created for each source. Log events are streamed into each table, and all queries generated by Studio or by the Logs Explorer are executed against the BigQuery API. This backend requires internet access to work, and cannot be run fully locally.
When using the Postgres backend, tables are created for each source within the provided schema (for supabase-cli, this would be `_analytics`). Log events received by Logflare are inserted directly into the respective tables. All BigQuery-dialect SQL queries from Studio will be handled by a translation layer within the Analytics server. This translation layer translates the query to PostgreSQL dialect, and then executes it against the Postgres database.
When using the Postgres backend, tables are created for each source within the provided schema (for supabase-cli, this would be `_analytics`). Log events received by Logflare are inserted directly into the respective tables. All BigQuery-dialect SQL queries from Studio will be handled by a translation layer within the Analytics server. This translation layer translates the query to Postgres dialect, and then executes it against the Postgres database.
The Postgres backend is not yet optimized for a high volume of inserts, or for heavy query usage. Today the translation layer only handles a limited subset of the BigQuery dialect. As such, the [Log Explorer](https://supabase.com/docs/guides/platform/logs#logs-explorer) may produce errors for more advanced queries when using the Postgres Backend.
@@ -13,24 +13,24 @@ hideTitle: true
<RefSubLayout.EducationRow>
<RefSubLayout.Details>
Supabase Realtime is a server built with Elixir using the [Phoenix Framework](https://www.phoenixframework.org) that allows you to listen to changes in your PostgreSQL database via logical replication and then broadcast those changes via WebSockets.
Supabase Realtime is a server built with Elixir using the [Phoenix Framework](https://www.phoenixframework.org) that allows you to listen to changes in your Postgres database via logical replication and then broadcast those changes via WebSockets.
There are two versions of this server: `Realtime` and `Realtime RLS`.
`Realtime` server works by:
1. Listening to PostgreSQL's replication functionality (using PostgreSQL's logical decoding)
1. Listening to Postgres's replication functionality (using Postgres's logical decoding)
2. Converting the byte stream into JSON
3. Broadcasting to all connected clients over WebSockets
`Realtime RLS` server works by:
1. Polling PostgreSQL's replication functionality (using PostgreSQL's logical decoding and [wal2json](https://github.com/eulerto/wal2json) output plugin)
2. Passing database changes to a [Write Ahead Log Realtime Unified Security (WALRUS)](https://github.com/supabase/walrus) PostgreSQL function and receiving a list of authorized subscribers depending on Row Level Security (RLS) policies
1. Polling Postgres's replication functionality (using Postgres's logical decoding and [wal2json](https://github.com/eulerto/wal2json) output plugin)
2. Passing database changes to a [Write Ahead Log Realtime Unified Security (WALRUS)](https://github.com/supabase/walrus) Postgres function and receiving a list of authorized subscribers depending on Row Level Security (RLS) policies
3. Converting the changes into JSON
4. Broadcasting to authorized subscribers over WebSockets
## Why not just use PostgreSQL's `NOTIFY`?
## Why not just use Postgres's `NOTIFY`?
A few reasons: