Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Caution Review failedThe pull request is closed. 📝 WalkthroughWalkthroughAdds a PostgreSQL read-replica development setup, a replication-wait mechanism in the Prisma client that waits on WAL LSNs, Docker compose/image/entrypoint for the replica, UI entries and readiness checks for new ports, and a dev-only frontend link. Changes
Sequence Diagram(s)sequenceDiagram
participant App as Backend App
participant Prisma as Prisma Client (with replication-wait)
participant Primary as Primary DB
participant Replica as Read Replica
App->>Prisma: Perform write (transaction)
Prisma->>Primary: Execute write
Primary-->>Prisma: Confirm + WAL LSN
Prisma->>Prisma: Record required LSN
App->>Prisma: Read request (may target replica)
Prisma->>Prisma: Check STACK_DATABASE_REPLICATION_WAIT_STRATEGY
Prisma->>Replica: Poll replica LSN/status
Replica-->>Prisma: Current LSN
alt Replica LSN < required LSN
Prisma->>Replica: Poll/wait until LSN >= required
end
Prisma->>Replica: Execute read query
Replica-->>Prisma: Return results
Prisma-->>App: Return consistent data
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
📜 Recent review detailsConfiguration used: defaults Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Older cmux preview screenshots (latest comment is below)Preview ScreenshotsOpen Workspace (1 hr expiry) · Open Dev Browser (1 hr expiry) · Open Diff Heatmap Captured 1 screenshot for commit Dev Launchpad page showing the new 'PostgreSQL Replica (100ms lag)' entry at port 8134 in the Background services section - this is the UI change from the async-replica PR that adds documentation for the new database replica service Generated by cmux preview system |
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
1 similar comment
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
|
Claude encountered an error —— View job I'll analyze this and get back to you. |
Greptile OverviewGreptile SummaryThis PR introduces first-class PostgreSQL read replica support with read-after-write consistency for Stack Auth's backend infrastructure. Key ChangesDatabase Replication Infrastructure:
Prisma Client Extensions:
Developer Experience:
Critical Issues FoundInfinite Loop Without Timeout (apps/backend/src/prisma-client.tsx:188-198): SQL Injection Risk (apps/backend/src/prisma-client.tsx:189): Unescaped Variables in Config (docker/dev-postgres-replica/entrypoint.sh:42): Architecture ConsiderationsThe implementation correctly:
Confidence Score: 2/5
Important Files ChangedFile Analysis
Sequence DiagramsequenceDiagram
participant App as Application
participant Primary as Primary Client
participant PrimaryDB as Primary Database
participant Replica as Replica Database
participant ReplicaClient as Replica Client
Note over App,ReplicaClient: Write Operation Flow
App->>Primary: Execute write operation (e.g., create, update)
Primary->>PrimaryDB: Perform write
PrimaryDB-->>Primary: Write complete
Primary->>PrimaryDB: SELECT pg_current_wal_lsn()
PrimaryDB-->>Primary: Return LSN (e.g., "0/1234ABC")
Note over Primary,PrimaryDB: Wait for replication (if strategy != "none")
Primary->>PrimaryDB: DO $$ LOOP checking pg_stat_replication
loop Until replica catches up or times out
PrimaryDB->>PrimaryDB: SELECT MIN(replay_lsn) FROM pg_stat_replication
PrimaryDB->>PrimaryDB: Compare with target LSN
alt Replica caught up
PrimaryDB->>PrimaryDB: EXIT loop
else Still lagging
PrimaryDB->>PrimaryDB: pg_sleep(0.01)
end
end
PrimaryDB-->>Primary: Replication confirmed
Primary-->>App: Write operation complete
Note over App,ReplicaClient: Read Operation Flow
App->>Primary: Execute read-only query
Primary->>Primary: Check if query is read-only
alt All queries are read-only
Primary->>ReplicaClient: Route to $replica()
ReplicaClient->>Replica: Execute SELECT query
Replica-->>ReplicaClient: Return results
ReplicaClient-->>Primary: Return results
else Contains write operations
Primary->>PrimaryDB: Execute on primary
PrimaryDB-->>Primary: Return results
end
Primary-->>App: Return query results
Note over PrimaryDB,Replica: Background Replication
PrimaryDB->>Replica: Stream WAL changes (continuous)
Replica->>Replica: Apply with recovery_min_apply_delay (15ms)
|
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Fix all issues with AI agents
In @apps/backend/.env.development:
- Around line 30-31: The replica connection string in
STACK_DATABASE_REPLICA_CONNECTION_STRING uses the superuser "postgres" and its
placeholder password; update that value to use the read-only database user by
replacing the username "postgres" with "readonly" and the password placeholder
"PASSWORD-PLACEHOLDER--uqfEC1hmmv" with
"PASSWORD-PLACEHOLDER--readonlyuqfEC1hmmv" so the replica connection uses the
SELECT-only user created in the Dockerfile (used by
@prisma/extension-read-replicas).
In @apps/backend/src/prisma-client.tsx:
- Around line 181-201: The DO block currently uses an infinite LOOP that can
block forever; modify the PL/pgSQL to enforce a max wait by introducing a
timeout check (e.g., capture a start timestamp with clock_timestamp() or use an
iteration counter) and compare elapsed time each loop iteration, exiting the
loop with a warning or raising an error if the configured max wait (passable via
a new parameter or constant) is exceeded; update the call site that uses
(primary as any).$queryRawUnsafe and the minLsnSubquery/lsn variables to supply
the timeout value or handle the returned timeout state so callers can respond
appropriately.
- Around line 241-261: The $allOperations hook currently calls
readLsnAndWaitForReplication(client) after every operation, adding latency for
read-only operations; update the hook in query.$allOperations to only call
readLsnAndWaitForReplication for write operations by checking the operation
string (e.g., allowlist: create, update, delete, upsert, createMany, updateMany,
deleteMany) and skipping the wait for read operations (findUnique, findMany,
findFirst, count, etc.); preserve the existing transaction short-circuit
(internalParams.transaction) and ensure the check occurs after obtaining result
but before awaiting replication.
🧹 Nitpick comments (1)
docker/dev-postgres-replica/entrypoint.sh (1)
21-23: Quote thePGDATAvariable to prevent word splitting.The
${PGDATA}variable should be quoted to handle paths with spaces and follow shell scripting best practices.Proposed fix
-if [ -z "$(ls -A ${PGDATA} 2>/dev/null)" ]; then +if [ -z "$(ls -A "${PGDATA}" 2>/dev/null)" ]; then
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
apps/backend/.env.developmentapps/backend/src/app/page.tsxapps/backend/src/prisma-client.tsxapps/dev-launchpad/public/index.htmldocker/dependencies/docker.compose.yamldocker/dev-postgres-replica/Dockerfiledocker/dev-postgres-replica/entrypoint.shdocker/dev-postgres-with-extensions/Dockerfilepackage.json
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{tsx,ts,jsx,js}
📄 CodeRabbit inference engine (AGENTS.md)
For blocking alerts and errors, never use
toast; instead, use alerts as toasts are easily missed by the user
Files:
apps/backend/src/app/page.tsxapps/backend/src/prisma-client.tsx
**/*.{tsx,css}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{tsx,css}: Keep hover/click animations snappy and fast; don't delay actions with pre-transitions (e.g., no fade-in on button hover) as it makes UI feel sluggish; instead apply transitions after the action like smooth fade-out when hover ends
When creating hover transitions, avoid hover-enter transitions and use only hover-exit transitions (e.g.,transition-colors hover:transition-none)
Files:
apps/backend/src/app/page.tsxapps/backend/src/prisma-client.tsx
**/*.{tsx,ts}
📄 CodeRabbit inference engine (AGENTS.md)
NEVER use Next.js dynamic functions if avoidable; prefer using client components instead to keep pages static (e.g., use
usePathnameinstead ofawait params)
Files:
apps/backend/src/app/page.tsxapps/backend/src/prisma-client.tsx
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx,js,jsx}: NEVER try-catch-all, NEVER void a promise, and NEVER use .catch(console.error) or similar; use loading indicators instead; if asynchronous handling is necessary, userunAsynchronouslyorrunAsynchronouslyWithAlertinstead
Use ES6 maps instead of records wherever possible
Files:
apps/backend/src/app/page.tsxapps/backend/src/prisma-client.tsx
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Code defensively; prefer?? throwErr(...)over non-null assertions with good error messages explicitly stating violated assumptions
Avoid theanytype; when necessary, leave a comment explaining why it's used, why the type system fails, and how errors would be caught at compile-, test-, or runtime
Files:
apps/backend/src/app/page.tsxapps/backend/src/prisma-client.tsx
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
Repo: stack-auth/stack-auth PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-07T00:55:19.871Z
Learning: The project uses PostgreSQL with Prisma ORM for database management; database models are located in `/apps/backend/src`
📚 Learning: 2026-01-07T00:55:19.871Z
Learnt from: CR
Repo: stack-auth/stack-auth PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-07T00:55:19.871Z
Learning: Applies to .env*,**/.env* : Any environment variables created should be prefixed with `STACK_` (or `NEXT_PUBLIC_STACK_` if public) to ensure Turborepo picks up changes and improves readability
Applied to files:
apps/backend/.env.developmentpackage.json
📚 Learning: 2026-01-07T00:55:19.871Z
Learnt from: CR
Repo: stack-auth/stack-auth PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-07T00:55:19.871Z
Learning: Applies to **/config/schema.ts,**/config/**/*.{ts,tsx} : Whenever making backwards-incompatible changes to the config schema, update the migration functions in `packages/stack-shared/src/config/schema.ts`
Applied to files:
apps/backend/src/prisma-client.tsx
🧬 Code graph analysis (1)
apps/backend/src/app/page.tsx (1)
packages/stack-shared/src/utils/env.tsx (1)
getNodeEnvironment(76-78)
🪛 dotenv-linter (4.0.0)
apps/backend/.env.development
[warning] 30-30: [SubstitutionKey] The STACK_DATABASE_REPLICA_CONNECTION_STRING key is not assigned properly
(SubstitutionKey)
[warning] 31-31: [UnorderedKey] The STACK_DATABASE_REPLICATION_WAIT_STRATEGY key should go before the STACK_DATABASE_REPLICA_CONNECTION_STRING key
(UnorderedKey)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
- GitHub Check: Agent
- GitHub Check: Vercel Agent Review
- GitHub Check: Cursor Bugbot
- GitHub Check: all-good
- GitHub Check: check_prisma_migrations (22.x)
- GitHub Check: lint_and_build (latest)
- GitHub Check: restart-dev-and-test
- GitHub Check: E2E Tests (Node 22.x, Freestyle mock)
- GitHub Check: E2E Tests (Node 22.x, Freestyle prod)
- GitHub Check: setup-tests-with-custom-base-port
- GitHub Check: build (22.x)
- GitHub Check: restart-dev-and-test-with-custom-base-port
- GitHub Check: build (22.x)
- GitHub Check: setup-tests
🔇 Additional comments (17)
apps/backend/src/app/page.tsx (1)
14-19: LGTM! Dev-only link is correctly conditionally rendered.The conditional rendering based on
getNodeEnvironment()appropriately restricts the "Dev Stats" link to development environments only. SinceNODE_ENVis typically resolved at build time, this should not cause dynamic rendering issues in production builds.apps/dev-launchpad/public/index.html (2)
125-125: LGTM!The PostgreSQL Replica background service entry is correctly added with suffix 34, which aligns with the replica connection port configured in
.env.development.
271-279: LGTM!The PgHero (Replica) app entry follows the established pattern and is correctly configured with port suffix 35 and appropriate importance level.
docker/dev-postgres-with-extensions/Dockerfile (2)
31-38: LGTM! Replication user and permissions setup looks correct.The replication user creation and pg_hba.conf configuration follow PostgreSQL streaming replication best practices. Using
scram-sha-256authentication is secure, and the "all" host specification is acceptable for development environments.
47-55: LGTM! Replication-enabled PostgreSQL configuration.The WAL configuration settings are appropriate for streaming replication:
wal_level=replicaenables replication-grade WALmax_wal_senders=3allows sufficient replication connectionswal_keep_size=64MBensures WAL retention for replica catch-uphot_standby=onenables read queries on replicasdocker/dev-postgres-replica/Dockerfile (1)
1-7: LGTM!The Dockerfile correctly uses PostgreSQL 15 and properly delegates replica initialization to the entrypoint script. The
entrypoint.shimplements solid replica bootstrap logic: it waits for the primary to be ready, performs a base backup usingpg_basebackup, configures recovery settings with apply delay, and sets standby mode—all following PostgreSQL replication best practices.package.json (1)
27-27: LGTM!The readiness check now correctly waits for both the primary database (port 28) and the new replica (port 34) to be available before proceeding, aligning with the async replica infrastructure.
docker/dependencies/docker.compose.yaml (3)
22-38: LGTM!The replica service is well-configured with proper dependency ordering, replication credentials, and a configurable apply delay for testing replication lag scenarios.
49-58: LGTM!The PgHero replica service mirrors the primary setup and enables monitoring of the replica instance.
256-256: LGTM!Volume correctly added for replica data persistence.
docker/dev-postgres-replica/entrypoint.sh (3)
1-19: LGTM!The script initialization is well-structured with proper error handling (
set -e), sensible defaults, and a reliable wait loop for primary readiness.
24-57: LGTM!The base backup configuration is well-implemented with proper streaming replication settings, recovery configuration, and correct file permissions for the PostgreSQL data directory.
59-60: LGTM!Using
exec gosuis the correct pattern for dropping privileges and ensuring proper signal handling in Docker containers.apps/backend/src/prisma-client.tsx (4)
7-15: LGTM!The new imports support defensive coding practices with proper error handling and schema validation for the replication functionality.
214-230: LGTM!The error handling is well-designed - it captures the error for visibility, logs a meaningful message, and falls back to a reasonable delay rather than failing the request or silently continuing.
264-274: LGTM!The extension ordering is correct - applying replication wait before read replicas ensures consistency guarantees are in place before reads are routed to replicas.
176-179: LGTM!Good defensive validation of the LSN format before using it in raw SQL, preventing potential injection even though the value originates from PostgreSQL.
There was a problem hiding this comment.
Pull request overview
This pull request adds support for asynchronous PostgreSQL replicas with configurable replication lag for development environments. It implements read-after-write consistency by waiting for replicas to catch up after write operations.
Changes:
- Added Docker configuration for a PostgreSQL replica with streaming replication and configurable lag
- Implemented replication wait logic in Prisma client to ensure read-after-write consistency
- Updated development environment configuration to use the replica database
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 13 comments.
Show a summary per file
| File | Description |
|---|---|
| package.json | Updated wait script to check both primary and replica database readiness |
| docker/dev-postgres-with-extensions/Dockerfile | Enabled WAL replication settings and added replicator user for streaming replication |
| docker/dev-postgres-replica/Dockerfile | Created new Dockerfile for replica container |
| docker/dev-postgres-replica/entrypoint.sh | Implemented replica initialization script with pg_basebackup and delay configuration |
| docker/dependencies/docker.compose.yaml | Added db-replica service and PgHero monitoring for replica |
| apps/dev-launchpad/public/index.html | Added UI entries for replica database and monitoring tools |
| apps/backend/src/prisma-client.tsx | Implemented replication wait logic and integrated with Prisma client extensions |
| apps/backend/src/app/page.tsx | Added development-only link to dev stats page |
| apps/backend/.env.development | Configured replica connection string and replication wait strategy |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
1 similar comment
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
apps/backend/src/prisma-client.tsx (2)
183-183: Document theanycast per coding guidelines.Per project guidelines,
anytypes should include a comment explaining why the type system fails here.- await (primary as any).$queryRawUnsafe(` + // Cast needed: Prisma extended client types don't expose $queryRawUnsafe in their type definitions + await (primary as any).$queryRawUnsafe(`
222-222: Add comment foranycast.Similar to the previous cast, document why the type system requires this workaround.
- const [{ lsn }] = await (client as any).$queryRaw<[{ lsn: string }]>`SELECT pg_current_wal_lsn()::text AS lsn`; + // Cast needed: extended Prisma client types don't properly expose $queryRaw on generic PrismaClient + const [{ lsn }] = await (client as any).$queryRaw<[{ lsn: string }]>`SELECT pg_current_wal_lsn()::text AS lsn`;
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
apps/backend/src/prisma-client.tsx
🧰 Additional context used
📓 Path-based instructions (5)
**/*.{tsx,ts,jsx,js}
📄 CodeRabbit inference engine (AGENTS.md)
For blocking alerts and errors, never use
toast; instead, use alerts as toasts are easily missed by the user
Files:
apps/backend/src/prisma-client.tsx
**/*.{tsx,css}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{tsx,css}: Keep hover/click animations snappy and fast; don't delay actions with pre-transitions (e.g., no fade-in on button hover) as it makes UI feel sluggish; instead apply transitions after the action like smooth fade-out when hover ends
When creating hover transitions, avoid hover-enter transitions and use only hover-exit transitions (e.g.,transition-colors hover:transition-none)
Files:
apps/backend/src/prisma-client.tsx
**/*.{tsx,ts}
📄 CodeRabbit inference engine (AGENTS.md)
NEVER use Next.js dynamic functions if avoidable; prefer using client components instead to keep pages static (e.g., use
usePathnameinstead ofawait params)
Files:
apps/backend/src/prisma-client.tsx
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx,js,jsx}: NEVER try-catch-all, NEVER void a promise, and NEVER use .catch(console.error) or similar; use loading indicators instead; if asynchronous handling is necessary, userunAsynchronouslyorrunAsynchronouslyWithAlertinstead
Use ES6 maps instead of records wherever possible
Files:
apps/backend/src/prisma-client.tsx
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Code defensively; prefer?? throwErr(...)over non-null assertions with good error messages explicitly stating violated assumptions
Avoid theanytype; when necessary, leave a comment explaining why it's used, why the type system fails, and how errors would be caught at compile-, test-, or runtime
Files:
apps/backend/src/prisma-client.tsx
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
Repo: stack-auth/stack-auth PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-07T00:55:19.871Z
Learning: The project uses PostgreSQL with Prisma ORM for database management; database models are located in `/apps/backend/src`
📚 Learning: 2026-01-07T00:55:19.871Z
Learnt from: CR
Repo: stack-auth/stack-auth PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-07T00:55:19.871Z
Learning: Applies to **/config/schema.ts,**/config/**/*.{ts,tsx} : Whenever making backwards-incompatible changes to the config schema, update the migration functions in `packages/stack-shared/src/config/schema.ts`
Applied to files:
apps/backend/src/prisma-client.tsx
📚 Learning: 2026-01-07T00:55:19.871Z
Learnt from: CR
Repo: stack-auth/stack-auth PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-07T00:55:19.871Z
Learning: Applies to **/*.{ts,tsx} : Code defensively; prefer `?? throwErr(...)` over non-null assertions with good error messages explicitly stating violated assumptions
Applied to files:
apps/backend/src/prisma-client.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
- GitHub Check: build (22.x)
- GitHub Check: E2E Tests (Node 22.x, Freestyle mock)
- GitHub Check: E2E Tests (Node 22.x, Freestyle prod)
- GitHub Check: build (22.x)
- GitHub Check: setup-tests-with-custom-base-port
- GitHub Check: restart-dev-and-test-with-custom-base-port
- GitHub Check: restart-dev-and-test
- GitHub Check: setup-tests
- GitHub Check: lint_and_build (latest)
- GitHub Check: all-good
- GitHub Check: Vercel Agent Review
- GitHub Check: docker
- GitHub Check: check_prisma_migrations (22.x)
- GitHub Check: Cursor Bugbot
🔇 Additional comments (2)
apps/backend/src/prisma-client.tsx (2)
246-254: Good defensive validation of undocumented internal params.Validating
__internalParamswith yup before use is excellent defensive coding, especially since this is an undocumented Prisma property that could change. The transaction check to avoid redundant replication waits is also correct.
264-274: Extension chaining order is correct.Applying
extendWithReplicationWaitbeforereadReplicasensures that writes complete replication before subsequent reads are routed to replicas, which is the correct ordering for read-after-write consistency.
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Note
Introduces read-replica support and ensures read-after-write consistency.
STACK_DATABASE_REPLICATION_WAIT_STRATEGYwithpg-stat-replication/aurora), validates LSN, and waits post-operations; integrates with@prisma/extension-read-replicasand routes read-only queries to$replica.db-replica) and ports; updates env (STACK_DATABASE_REPLICA_CONNECTION_STRING), Dockerfiles/compose, volumes, and readiness script to wait for both primary and replica; adds PgHero instance for replica; Launchpad lists replica services.nicify).Written by Cursor Bugbot for commit 9a7601e. This will update automatically on new commits. Configure here.
Summary by CodeRabbit
New Features
Chores
Tests
✏️ Tip: You can customize this high-level summary in your review settings.