From 05a45dd1edbaeb972d960e181b18cb4878b49674 Mon Sep 17 00:00:00 2001
From: Danny White <3104761+dnywh@users.noreply.github.com>
Date: Wed, 23 Sep 2026 08:52:07 +1000
Subject: [PATCH] feat(studio): rename Replication to Pipelines (#50637)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
## What kind of change does this PR introduce?
Feature and docs update.
## What is the current behavior?
The Dashboard lists Pipelines destinations under Database > Replication.
Read replicas have moved to Infrastructure, but the temporary notices
remain on the destinations page and new destination sheet.
Closes PIPE-1021.
## What is the new behavior?
The canonical Dashboard routes are Database > Pipelines, while legacy
Replication list and detail URLs permanently redirect to the equivalent
Pipelines routes. Navigation, command palette, shortcuts, pipeline
links, docs, and current marketing copy use Pipelines. Read-replica
notices and their obsolete dismissal state are removed.
| Before | After |
| --- | --- |
| | |
The Management API, pipeline behaviour, replication logs, and Postgres
replication terminology remain unchanged.
## To test
- Open `/project//database/pipelines` and confirm the Database
navigation, page header, and pipeline breadcrumb say Pipelines.
- Open
`/project//database/replication?source=bookmark#destinations` and a
legacy pipeline detail URL. Confirm each redirects to the matching
Pipelines URL while preserving parameters and fragments.
- From the Pipelines page, open Add destination. Confirm no read-replica
migration notice appears.
- Open the Pipelines guide and confirm its Dashboard steps lead to
Database > Pipelines.
## Before merge
- [ ] Get changelog entry reviewed
https://github.com/supabase/changelog/pull/262 and prepare to merge
simultaneously
## Summary by CodeRabbit
- **New Features**
- Added dedicated **Database > Pipelines** pages for pipeline lists and
details.
- Added permanent redirects from legacy Replication URLs to their
corresponding Pipelines pages.
- Read replica management links now open **Settings > Infrastructure**.
- **Documentation**
- Updated Pipelines setup, monitoring, troubleshooting, and usage
guidance to reference the current dashboard locations.
- Updated Realtime guidance to use **Database > Publications**.
- **Updates**
- Renamed dashboard navigation, breadcrumbs, commands, and keyboard
shortcuts from **Replication** to **Pipelines**.
- Removed the “Read replicas have moved” notification.
---------
Co-authored-by: Joshen Lim
---
.../database/replication/pipelines-faq.mdx | 2 +-
.../replication/pipelines-monitoring.mdx | 4 +-
.../guides/database/replication/pipelines.mdx | 4 +-
.../platform/manage-your-usage/pipelines.mdx | 2 +-
...ltime-postgres-changes-troubleshooting.mdx | 4 +-
apps/studio/TANSTACK_MIGRATION.md | 6 +-
.../Database/Backups/PITR/PITRSelection.tsx | 2 +-
.../DestinationTypeSelection.test.tsx | 43 -----
.../DestinationTypeSelection.tsx | 2 -
.../ReadReplicasMovedCallout.test.tsx | 66 -------
.../ReadReplicasMovedCallout.tsx | 50 ------
.../Replication/DestinationRow.test.tsx | 12 +-
.../Database/Replication/DestinationRow.tsx | 2 +-
.../ReplicationPipelineLayout.test.tsx | 4 +-
.../Replication/ReplicationPipelineLayout.tsx | 6 +-
.../Database/Replication/RowMenu.tsx | 2 +-
.../Infrastructure/UpgradeWarnings.tsx | 2 +-
.../NamespaceWithTables/TableRowComponent.tsx | 2 +-
.../DatabaseLayout/Database.Commands.tsx | 6 +-
.../DatabaseLayout/DatabaseMenu.utils.tsx | 6 +-
...licationLayout.tsx => PipelinesLayout.tsx} | 4 +-
.../[pipelineId].tsx | 12 +-
.../{replication => pipelines}/index.tsx | 18 +-
.../replication/replica/[replicaId].tsx | 34 ----
apps/studio/redirects.shared.test.ts | 27 +++
apps/studio/redirects.shared.ts | 10 ++
apps/studio/routeTree.gen.ts | 167 ++++++++----------
.../{replication.tsx => pipelines.tsx} | 8 +-
.../$ref/database/pipelines/$pipelineId.tsx | 11 ++
.../project/$ref/database/pipelines/index.tsx | 11 ++
.../$ref/database/replication/$pipelineId.tsx | 11 --
.../$ref/database/replication/index.tsx | 11 --
.../replication/replica/$replicaId.tsx | 11 --
.../state/shortcuts/registry/database-nav.ts | 2 +-
...5-12-02-introducing-supabase-pipelines.mdx | 2 +-
apps/www/data/features.tsx | 2 +-
packages/common/constants/local-storage.ts | 4 -
37 files changed, 187 insertions(+), 385 deletions(-)
delete mode 100644 apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicasMovedCallout.test.tsx
delete mode 100644 apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicasMovedCallout.tsx
rename apps/studio/components/layouts/DatabaseLayout/{ReplicationLayout.tsx => PipelinesLayout.tsx} (77%)
rename apps/studio/pages/project/[ref]/database/{replication => pipelines}/[pipelineId].tsx (76%)
rename apps/studio/pages/project/[ref]/database/{replication => pipelines}/index.tsx (85%)
delete mode 100644 apps/studio/pages/project/[ref]/database/replication/replica/[replicaId].tsx
rename apps/studio/routes/project/$ref/database/{replication.tsx => pipelines.tsx} (68%)
create mode 100644 apps/studio/routes/project/$ref/database/pipelines/$pipelineId.tsx
create mode 100644 apps/studio/routes/project/$ref/database/pipelines/index.tsx
delete mode 100644 apps/studio/routes/project/$ref/database/replication/$pipelineId.tsx
delete mode 100644 apps/studio/routes/project/$ref/database/replication/index.tsx
delete mode 100644 apps/studio/routes/project/$ref/database/replication/replica/$replicaId.tsx
diff --git a/apps/docs/content/guides/database/replication/pipelines-faq.mdx b/apps/docs/content/guides/database/replication/pipelines-faq.mdx
index 53cc52fb01e..c723e019561 100644
--- a/apps/docs/content/guides/database/replication/pipelines-faq.mdx
+++ b/apps/docs/content/guides/database/replication/pipelines-faq.mdx
@@ -10,7 +10,7 @@ sidebar_label: 'FAQ'
## Which plans support Pipelines?
-Pipelines requires a Pro, Team, or Enterprise plan. During public alpha, availability varies by organization; an eligible plan does not guarantee access. If unavailable, request access from **Database > Replication** or contact your account manager.
+Pipelines requires a Pro, Team, or Enterprise plan. During public alpha, availability varies by organization; an eligible plan does not guarantee access. If unavailable, request access from **Database > Pipelines** or contact your account manager.
## What destinations are supported?
diff --git a/apps/docs/content/guides/database/replication/pipelines-monitoring.mdx b/apps/docs/content/guides/database/replication/pipelines-monitoring.mdx
index e943b76b23c..c69c786fdf0 100644
--- a/apps/docs/content/guides/database/replication/pipelines-monitoring.mdx
+++ b/apps/docs/content/guides/database/replication/pipelines-monitoring.mdx
@@ -12,7 +12,7 @@ Use the Dashboard to check [replication progress](#viewing-detailed-pipeline-met
## Viewing pipeline status
-Open [**Database > Replication**](/dashboard/project/_/database/replication) to see each destination's pipeline status.
+Open [**Database > Pipelines**](/dashboard/project/_/database/pipelines) to see each destination's pipeline status.
### Pipeline states
@@ -163,7 +163,7 @@ When you restart table replication:
The pipeline stops temporarily to apply the table restart. The Dashboard restarts it automatically, or starts it if it was stopped. Replication for other tables is paused during this process, and their unfinished initial syncs can restart from scratch.
-Before restarting, use **Edit pipeline** to check the **Initial sync** selection. Include any affected tables whose existing source rows you need to copy again, then apply your changes. Open the pipeline from the list on **Database > Replication**.
+Before restarting, use **Edit pipeline** to check the **Initial sync** selection. Include any affected tables whose existing source rows you need to copy again, then apply your changes. Open the pipeline from the list on **Database > Pipelines**.
### Restart a single table
diff --git a/apps/docs/content/guides/database/replication/pipelines.mdx b/apps/docs/content/guides/database/replication/pipelines.mdx
index 5e031e5913d..71390159c34 100644
--- a/apps/docs/content/guides/database/replication/pipelines.mdx
+++ b/apps/docs/content/guides/database/replication/pipelines.mdx
@@ -47,7 +47,7 @@ Pipelines installs an `etl` schema and a database event trigger to track replica
-1. Navigate to the [**Database > Replication**](/dashboard/project/_/database/replication) section of the Dashboard
+1. Navigate to the [**Database > Pipelines**](/dashboard/project/_/database/pipelines) section of the Dashboard
2. Click **Add pipeline** to show the replication side panel
3. Select a destination available to your organization
4. If Pipelines is not yet enabled, click **Enable Pipelines**, review the dialog, and confirm **Enable Pipelines**.
@@ -175,7 +175,7 @@ If the main replication slot is lost and **Recreate slot** is enabled, startup r
### Disabling Pipelines
-Delete all pipelines first. Then open the three-dot actions menu on the Replication page and click **Disable Pipelines**.
+Delete all pipelines first. Then open the three-dot actions menu on the Pipelines page and click **Disable Pipelines**.
For cleanup details, see [What happens when you disable Pipelines?](/docs/guides/database/replication/pipelines-faq#what-happens-when-you-disable-pipelines).
diff --git a/apps/docs/content/guides/platform/manage-your-usage/pipelines.mdx b/apps/docs/content/guides/platform/manage-your-usage/pipelines.mdx
index 2325101bf3c..b5c2b5b0fc6 100644
--- a/apps/docs/content/guides/platform/manage-your-usage/pipelines.mdx
+++ b/apps/docs/content/guides/platform/manage-your-usage/pipelines.mdx
@@ -84,7 +84,7 @@ Pipeline hours are billed in arrears. Deleting the pipeline after 24 hours ends
- Include only the tables and columns that you need at the destination.
- Keep high-churn tables out of the publication when their changes are not needed for analytics.
-- If you no longer require replication, delete the pipeline through your [project's replication settings](/dashboard/project/_/database/replication) to stop pipeline-hour charges.
+- If you no longer require replication, delete the pipeline through your [project's Pipelines settings](/dashboard/project/_/database/pipelines) to stop pipeline-hour charges.
## How data processed is measured
diff --git a/apps/docs/content/troubleshooting/realtime-postgres-changes-troubleshooting.mdx b/apps/docs/content/troubleshooting/realtime-postgres-changes-troubleshooting.mdx
index 2d5bcfa2608..04881ce20e7 100644
--- a/apps/docs/content/troubleshooting/realtime-postgres-changes-troubleshooting.mdx
+++ b/apps/docs/content/troubleshooting/realtime-postgres-changes-troubleshooting.mdx
@@ -27,7 +27,7 @@ If the table's missing from the results:
alter publication supabase_realtime add table your_table;
```
-Or toggle it on from **Database → Replication** in the dashboard.
+Or toggle it on from **Database → Publications** in the dashboard.
This gets overlooked on a table created recently — creating the table and enabling Realtime on it are two separate steps:
@@ -203,7 +203,7 @@ channel.subscribe(async (status) => {
Sometimes the answer is straightforward. Check:
- **Project Settings → Realtime** — enabled at the project level?
-- **Database → Replication** — toggle on for this specific table?
+- **Database → Publications** — toggle on for this specific table?
Check this again after a project's been paused and restarted — the replication slot can need to reconnect. If the project's under heavier load than usual, also check the Realtime "Concurrent Peak Connections" quota — hitting that limit can look a lot like a broken subscription.
diff --git a/apps/studio/TANSTACK_MIGRATION.md b/apps/studio/TANSTACK_MIGRATION.md
index 07db3d5658b..1ef32b7e503 100644
--- a/apps/studio/TANSTACK_MIGRATION.md
+++ b/apps/studio/TANSTACK_MIGRATION.md
@@ -85,7 +85,7 @@ These are the layout-only TanStack files. Most hold a single product layout comp
- [x] `routes/project/$ref.tsx` — DefaultLayout only. **Delta vs plan:** ProjectLayoutWithAuth omitted from the shell because product layouts (DatabaseLayout, AuthLayout, StorageLayout, …) already render `withAuth(... ProjectLayout ...)` internally — adding it here would double-wrap. The home page (`/project/$ref/index.tsx`) wraps itself in `ProjectLayoutWithAuth` since it has no product layout.
- [x] `routes/project/$ref/database.tsx` — DatabaseLayout (reads `databaseLayoutTitle` from leaf `staticData`)
- [x] `routes/project/$ref/database/triggers.tsx` — sub-shell with `PageLayout` + permission gate + nav items, inlined from `DatabaseTriggersLayout`. **Delta vs plan:** the existing `DatabaseTriggersLayout` component wraps `` internally, so re-using it inside the database.tsx shell would double-wrap. Inlined the inner part instead; the Next-side component is left untouched (still used by the `pages/...` files we re-export).
-- [x] `routes/project/$ref/database/replication.tsx` — sub-shell providing `PipelineRequestStatusProvider`, mirrors `ReplicationLayout` on the Next side. Sets `databaseLayoutTitle: 'Replication'` for the whole subtree (leaf routes no longer redeclare it) so the provider stays a single instance across navigation between `replication/index`, `replication/$pipelineId`, and `replication/replica/$replicaId` — those three leaves all read pipeline start/stop state via `usePipelineRequestStatus`, which previously lived on `DatabaseLayout` itself and mounted for every non-Replication Database page too.
+- [x] `routes/project/$ref/database/pipelines.tsx` — sub-shell providing `PipelineRequestStatusProvider`, mirrors `PipelinesLayout` on the Next side. Sets `databaseLayoutTitle: 'Pipelines'` for the whole subtree so the provider stays a single instance across navigation between the Pipelines list and detail routes. Legacy Replication routes are retained only for redirects, while the replica detail route redirects to Infrastructure.
- [x] `routes/project/$ref/auth.tsx` — AuthLayout (reads `authLayoutTitle` from leaf `staticData`). **Delta vs plan:** shell honours a `skipAuthLayout: true` opt-out in `staticData` for leaves whose own body or sub-layout already wraps in `AuthLayout` (`AuthProvidersLayout`, `AuthEmailsLayout`, `pages/.../auth/third-party.tsx`) — without it those routes would double-wrap (which also doubles `withAuth` + `ProjectLayout`).
- ~~`routes/project/$ref/auth/templates.tsx` — AuthEmailsLayout~~ **Delta vs plan: not landed.** A unified `templates.tsx` sub-shell would force `templates/$templateId.tsx` (which uses plain `AuthLayout`, not `AuthEmailsLayout`) into the wrong wrapping. Instead `templates/index.tsx` and `auth/smtp.tsx` each set `skipAuthLayout: true` and wrap themselves in `AuthEmailsLayout`; `templates/$templateId.tsx` uses the standard auth shell with `authLayoutTitle: 'Emails'`.
- [x] `routes/project/$ref/storage.tsx` — StorageLayout + StorageBucketsLayout (reads `storageLayoutTitle`, optional `skipStorageBucketsLayout`, `storageBucketsLayoutTitle`, `storageBucketsLayoutHideSubtitle` from leaf `staticData`). **Delta vs plan:** the shell wraps in BOTH StorageLayout and StorageBucketsLayout by default — every storage page except bucket-detail pages uses both. Bucket-detail pages set `skipStorageBucketsLayout: true`. `/storage/s3` uses `storageBucketsLayout{Title,HideSubtitle}` to override the inner header.
@@ -182,8 +182,8 @@ These are the layout-only TanStack files. Most hold a single product layout comp
- [x] A `routes/project/$ref/database/tables/$id.tsx` ← `pages/project/[ref]/database/tables/[id].tsx`
- [x] A `routes/project/$ref/database/publications/index.tsx` ← `pages/project/[ref]/database/publications/index.tsx`
- [x] A `routes/project/$ref/database/publications/$id.tsx` ← `pages/project/[ref]/database/publications/[id].tsx`
-- [x] A `routes/project/$ref/database/replication/index.tsx` ← `pages/project/[ref]/database/replication/index.tsx`
-- [x] A `routes/project/$ref/database/replication/$pipelineId.tsx` ← `pages/project/[ref]/database/replication/[pipelineId].tsx`
+- [x] A `routes/project/$ref/database/pipelines/index.tsx` ← `pages/project/[ref]/database/pipelines/index.tsx`
+- [x] A `routes/project/$ref/database/pipelines/$pipelineId.tsx` ← `pages/project/[ref]/database/pipelines/[pipelineId].tsx`
- [x] A `routes/project/$ref/database/replication/replica/$replicaId.tsx` ← `pages/project/[ref]/database/replication/replica/[replicaId].tsx` (redirects to Infrastructure)
- [x] A `routes/project/$ref/database/triggers/index.tsx` ← `pages/project/[ref]/database/triggers/index.tsx`
- [x] A `routes/project/$ref/database/triggers/data.tsx` ← `pages/project/[ref]/database/triggers/data.tsx` (sub-shell at `database/triggers.tsx` provides PageLayout + nav, parent shell provides DatabaseLayout)
diff --git a/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx b/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx
index 2721d07f7f0..fbc58643165 100644
--- a/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx
+++ b/apps/studio/components/interfaces/Database/Backups/PITR/PITRSelection.tsx
@@ -101,7 +101,7 @@ export const PITRSelection = () => {