- Notifications
You must be signed in to change notification settings - Fork474
Update to single changelog source of truth for entire monorepo#805
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:dev
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Conversation
vercelbot commentedJul 25, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
The latest updates on your projects. Learn more aboutVercel for GitHub.
|
✨ No files to analyze in this PR. Need help? Join our Discord for support! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Greptile Summary
This PR implements a comprehensive consolidation of changelog management across the Stack Auth monorepo by removing 24+ individual CHANGELOG.md files from packages, apps, and examples, and replacing them with a single centralized CHANGELOG.md file at the root level. The change introduces an interactive changelog management script (scripts/interactive-changelog.ts) that provides a CLI interface for adding changelog entries across multiple packages simultaneously.
The consolidation transforms the changelog structure from package-specific files to a unified format organized by version number, with subsections for each package/application. This approach maintains the same level of historical detail while providing better visibility into cross-package changes and release coordination. The new system includes proper semantic versioning, change categorization (Major/Minor/Patch Changes), and dependency tracking.
A new npm scriptchangelog:update has been added to package.json that runs the interactive changelog tool, making it easy for developers to add entries during the release process. The script includes features like smart package ordering (core packages first, examples last), input validation for version numbers, and confirmation prompts before making changes.
Confidence score: 2/5
• This PR has significant implementation issues that could cause immediate problems upon merge
• The main consolidated CHANGELOG.md file appears to be missing or empty in the template package location, which would break the entire changelog system
• The interactive changelog script has potential file handling issues, hardcoded package lists that need manual maintenance, and insufficient error handling
• Files that need more attention:scripts/interactive-changelog.ts (hardcoded package list maintenance),packages/template/CHANGELOG.md (appears empty when it should contain consolidated changelog), and the rootCHANGELOG.md file location verification
25 files reviewed, 1 comment
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
coderabbitaibot commentedJul 26, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. WalkthroughConsolidates many package- and app-level CHANGELOG.md files into a single root CHANGELOG.md, adds a Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Possibly related PRs
Suggested reviewers
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches🧪 Generate unit tests (beta)
Thanks for usingCodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
package.json (1)
69-69:Use the samenpx --package=tsxpattern for consistency across scripts.Other TSX-backed scripts (lines 8 & 64) explicitly pin the runtime package to avoid relying on a globally-installed binary. Keeping the pattern uniform reduces surprises in fresh clone / CI environments.
- "changelog:update": "npx tsx scripts/interactive-changelog.ts"+ "changelog:update": "npx --package=tsx tsx scripts/interactive-changelog.ts"
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (22)
apps/backend/CHANGELOG.md(0 hunks)apps/dashboard/CHANGELOG.md(0 hunks)apps/dev-launchpad/CHANGELOG.md(0 hunks)apps/e2e/CHANGELOG.md(0 hunks)apps/mcp-server/CHANGELOG.md(0 hunks)apps/mock-oauth-server/CHANGELOG.md(0 hunks)docs/CHANGELOG.md(0 hunks)examples/cjs-test/CHANGELOG.md(0 hunks)examples/demo/CHANGELOG.md(0 hunks)examples/docs-examples/CHANGELOG.md(0 hunks)examples/e-commerce/CHANGELOG.md(0 hunks)examples/js-example/CHANGELOG.md(0 hunks)examples/middleware/CHANGELOG.md(0 hunks)examples/partial-prerendering/CHANGELOG.md(0 hunks)examples/react-example/CHANGELOG.md(0 hunks)examples/supabase/CHANGELOG.md(0 hunks)package.json(1 hunks)packages/init-stack/CHANGELOG.md(0 hunks)packages/stack-emails/CHANGELOG.md(0 hunks)packages/stack-sc/CHANGELOG.md(0 hunks)packages/stack-shared/CHANGELOG.md(0 hunks)packages/stack-ui/CHANGELOG.md(0 hunks)
💤 Files with no reviewable changes (21)
- examples/docs-examples/CHANGELOG.md
- examples/react-example/CHANGELOG.md
- apps/backend/CHANGELOG.md
- examples/supabase/CHANGELOG.md
- apps/mcp-server/CHANGELOG.md
- examples/js-example/CHANGELOG.md
- packages/stack-shared/CHANGELOG.md
- docs/CHANGELOG.md
- examples/e-commerce/CHANGELOG.md
- apps/dev-launchpad/CHANGELOG.md
- apps/mock-oauth-server/CHANGELOG.md
- examples/partial-prerendering/CHANGELOG.md
- packages/stack-emails/CHANGELOG.md
- apps/e2e/CHANGELOG.md
- examples/demo/CHANGELOG.md
- packages/stack-sc/CHANGELOG.md
- apps/dashboard/CHANGELOG.md
- examples/cjs-test/CHANGELOG.md
- examples/middleware/CHANGELOG.md
- packages/init-stack/CHANGELOG.md
- packages/stack-ui/CHANGELOG.md
⏰ 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). (1)
- GitHub Check: Security Check
🔇 Additional comments (1)
package.json (1)
68-68:Comma addition keepsscriptsJSON-valid – nice catch.
The trailing comma after thegenerate-openapi-docs:watchentry prevents accidental JSON breakage when new keys are appended.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
What's the new workflow
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Looks good — can we somehow get the same changelog on the landing page?https://github.com/stack-auth/stackframe-website
<!--Make sure you've read the CONTRIBUTING.md guidelines:https://github.com/stack-auth/stack-auth/blob/dev/CONTRIBUTING.md--><!-- ELLIPSIS_HIDDEN -->----> [!IMPORTANT]> Add admin-only API endpoints and UI support for project configurationoverrides, with comprehensive tests and documentation updates.> > - **New Features**:> - Added admin-only API endpoints for reading and updating projectconfiguration overrides in `config/crud.tsx` and`config/override/crud.tsx`.> - Admin app supports fetching, caching, and updating configurationoverrides with new React hooks in `admin-app-impl.ts`.> - **Bug Fixes**:> - Validation and error handling for OAuth providers, duplicate IDs,and invalid config fields in `oauth-providers/crud.tsx`.> - **Tests**:> - Added end-to-end tests for configuration management and validationerrors in `config.test.ts` and `js/config.test.ts`.> - **Documentation**:> - Updated API documentation for new config override endpoints in`config.ts`.> > <sup>This description was created by </sup>[<img alt="Ellipsis"src="https://img.shields.io/badge/Ellipsis-blue?color=175173">](https://www.ellipsis.dev?ref=stack-auth%2Fstack-auth&utm_source=github&utm_medium=referral)<sup>for3d20abc. You can[customize](https://app.ellipsis.dev/stack-auth/settings/summaries) thissummary. It will automatically update as commits are pushed.</sup>----<!-- ELLIPSIS_HIDDEN --><!-- This is an auto-generated comment: release notes by coderabbit.ai-->## Summary by CodeRabbit* **New Features*** Added the ability for admins to view and update project configurationoverrides through new internal API endpoints.* Extended the admin app to support fetching, updating, and cachingconfiguration overrides, including React hook support for real-timeconfig usage.* Introduced new admin interface methods for retrieving and updatingconfiguration.* **Bug Fixes*** Improved validation and error handling for configuration updates,including checks for duplicate or invalid OAuth provider entries andnon-existent configuration fields.* **Tests*** Added comprehensive end-to-end tests covering configuration retrieval,updates, access control, OAuth provider management, and domainmanagement.* **Documentation*** Enhanced API documentation for configuration management endpoints andoperations.<!-- end of auto-generated comment: release notes by coderabbit.ai -->---------Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>Co-authored-by: Konsti Wohlwend <n2d4xc@gmail.com>
Note for deployment: This PR needs to add some env vars<!-- ELLIPSIS_HIDDEN -->----> [!IMPORTANT]> Adds S3-compatible storage for profile images with S3Mock for localdevelopment, updating environment variables, Docker configurations, andtests.> > - **Behavior**:> - Adds S3-compatible storage for user, team, and team member profileimages using `uploadAndGetUrl()` in `s3.tsx`.> - Integrates S3Mock for local development in `docker.compose.yaml` and`emulator/docker.compose.yaml`.> - Updates `crud.tsx` files for `users`, `teams`, and`team-member-profiles` to use S3 for profile images.> - **Environment**:> - Adds S3-related environment variables to `.env.development`.> - Updates `package.json` to include `@aws-sdk/client-s3`.> - **Testing**:> - Modifies test cases in `teams.test.ts` and `users.test.ts` tovalidate S3 URL behavior.> - Updates `auto-migration.tests.ts` for concurrent migration handling.> - **Documentation**:> - Updates `self-host.mdx` to include S3 storage requirements.> > <sup>This description was created by </sup>[<img alt="Ellipsis"src="https://img.shields.io/badge/Ellipsis-blue?color=175173">](https://www.ellipsis.dev?ref=stack-auth%2Fstack-auth&utm_source=github&utm_medium=referral)<sup>for901f0b5. You can[customize](https://app.ellipsis.dev/stack-auth/settings/summaries) thissummary. It will automatically update as commits are pushed.</sup>----<!-- ELLIPSIS_HIDDEN --><!-- This is an auto-generated comment: release notes by coderabbit.ai-->## Summary by CodeRabbit* **New Features*** Added support for uploading and storing user, team, and team memberprofile images using S3-compatible storage.* Integrated S3Mock for local development and testing of storagefeatures.* Added new services to Docker Compose configurations for S3Mock andrelated dependencies.* Introduced image validation and processing for base64-encoded imagesbefore upload.* **Bug Fixes*** Profile image upload now returns a storage URL instead of echoing backthe base64 data.* **Documentation*** Updated self-hosting documentation to include S3 storage requirementsand usage.* **Chores*** Added and updated environment variables for S3 storage configuration. * Updated backend dependencies to include the AWS S3 SDK. * Enhanced test cases to validate new image upload and URL behaviors.<!-- end of auto-generated comment: release notes by coderabbit.ai -->---------Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>Co-authored-by: Konsti Wohlwend <n2d4xc@gmail.com>
Generated with ❤️ byellipsis.dev |
… add dynamic package discovery.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Actionable comments posted: 20
🔭 Outside diff range comments (1)
apps/backend/src/lib/projects.tsx (1)
79-126:Transaction boundary change may impact atomicityMoving config override operations outside the transaction means project creation/update and config overrides are no longer atomic. If config overrides fail, the project will be in an inconsistent state.
Consider wrapping all operations in a single transaction or implementing compensating transactions:
+ // Consider implementing a saga pattern or compensating transaction+ let projectCreated = false;+ try { const [projectId, branchId] = await retryTransaction(globalPrismaClient, async (tx) => { // ... existing transaction logic ... });+ projectCreated = true; // Update project config override await overrideProjectConfigOverride({ // ... existing logic ... }); // Update environment config override // ... existing logic ...+ } catch (error) {+ if (projectCreated && options.type === "create") {+ // Rollback: delete the created project+ await globalPrismaClient.project.delete({ where: { id: projectId } });+ }+ throw error;+ }
♻️ Duplicate comments (2)
apps/backend/src/app/api/latest/integrations/custom/domains/crud.tsx (2)
49-51:Add null safety check for domain parameterSame issue as in the Neon integration - the helper function should validate the domain parameter.
function domainConfigToLegacyConfig(domain: Tenancy['config']['domains']['trustedDomains'][string]) {+ if (!domain) {+ throwErr('Domain configuration is required');+ } return { domain: domain.baseUrl || throwErr('Domain base URL is required'), handler_path: domain.handlerPath }; }
63-63:Inconsistent handler path assignmentSame issue as in the Neon integration - hardcoded handler_path value.
Consider using a consistent approach:
- domains: [...Object.values(oldDomains).map(domainConfigToLegacyConfig), { domain: data.domain, handler_path: "/handler" }],+ domains: [...Object.values(oldDomains).map(domainConfigToLegacyConfig), { domain: data.domain, handler_path: data.handler_path || "/handler" }],
🧹 Nitpick comments (22)
CLAUDE.md (2)
7-17:Add the newchangelog:updatescript to "Essential Commands".
The PR introduces an interactive changelog script exposed viapnpm changelog:update, but the command is not documented here. Adding it keeps this reference file in sync with the tooling shipped in the same PR.- **Type check**: `pnpm typecheck`+ - **Update changelog**: `pnpm changelog:update` (runs the interactive changelog updater)
14-21:Remove (or consolidate) the duplicated test-command section.
Lines 18-21 repeat the test commands already documented in lines 14-15, bloating the doc without adding new information. Either delete the second block or expand it with advanced options (e.g., coverage, watch mode) to justify a separate “Testing” section.-### Testing-- **Run all tests**: `pnpm test --no-watch`-- **Run some tests**: `pnpm test --no-watch <file-filters>`+<!-- (section removed – commands already covered above) -->apps/dashboard/src/components/vibe-coding/dts/util-dts.ts (1)
4-4:Consider using a more maintainable approach for large type definitionsInstead of embedding the entire module declaration as a string literal, consider:
- Loading it from a separate
.d.tsfile at runtime- Using a build process to inject the content
- Storing it as a separate asset file
This would make the code more maintainable and easier to update.
apps/dashboard/package.json (2)
3-3:Ensure workspace version consistencyBumping the dashboard only to
2.8.26may desynchronise semver across other workspace packages if they track the same minor stream.
Confirm that all packages that must stay in lock-step received a matching bump (or that the version field is intentionally independent).
40-42:Evaluatejoseimpact on client bundle size
jose(~100 KB min-gz) will be shipped to the browser unless every import is server-only.
If JWT signing/verification is required only during API calls (Node runtime), gate the import with dynamicimport()insidegetServerSideProps/API routes or move the code to the backend package to avoid inflating the Next.js client bundle.Example pattern:
- import { jwtVerify } from 'jose'+ const { jwtVerify } = await import('jose') // inside an async server functionapps/backend/.env.development (1)
51-56:Consider reordering environment variables for consistency.The S3 configuration variables are correctly configured for local development with s3mock. However, consider reordering them alphabetically to follow dotenv conventions.
Apply this diff to improve variable ordering:
# S3 Configuration for local development using s3mock-STACK_S3_ENDPOINT=http://localhost:8121-STACK_S3_REGION=us-east-1-STACK_S3_ACCESS_KEY_ID=s3mockroot-STACK_S3_SECRET_ACCESS_KEY=s3mockroot-STACK_S3_BUCKET=stack-storage+STACK_S3_ACCESS_KEY_ID=s3mockroot+STACK_S3_BUCKET=stack-storage+STACK_S3_ENDPOINT=http://localhost:8121+STACK_S3_REGION=us-east-1+STACK_S3_SECRET_ACCESS_KEY=s3mockrootapps/backend/scripts/verify-data-integrity.ts (1)
135-137:Consider more robust filtering criteriaThe current implementation uses a simple substring match which works but might be fragile. Consider if a more specific pattern or field-based approach would be more reliable for identifying Neon projects.
Current implementation:
if(shouldSkipNeon&&projects[i].description.includes("Neon")){return;}Alternative approach using a more specific pattern:
if(shouldSkipNeon&&projects[i].description?.toLowerCase().includes("neon")){console.log(`Skipping Neon project:${projects[i].displayName}`);return;}apps/backend/src/app/api/latest/internal/email-themes/[id]/route.tsx (1)
3-3:Remove unused import.The
globalPrismaClientimport is no longer used since the transaction parameter was removed from theoverrideEnvironmentConfigOverridecall.-import { globalPrismaClient } from "@/prisma-client";apps/backend/.env (1)
53-59:Fix environment variable formatting issues.The new S3 environment variables are essential for the image upload functionality. However, there are formatting inconsistencies that should be addressed:
# S3-STACK_S3_ENDPOINT=# S3 endpoint URL (e.g., 'https://s3.amazonaws.com' for AWS or custom endpoint for S3-compatible services)-STACK_S3_REGION=+STACK_S3_ACCESS_KEY_ID=+STACK_S3_BUCKET=+STACK_S3_ENDPOINT="# S3 endpoint URL (e.g., 'https://s3.amazonaws.com' for AWS or custom endpoint for S3-compatible services)"+STACK_S3_REGION= STACK_S3_ACCESS_KEY_ID= STACK_S3_SECRET_ACCESS_KEY=-STACK_S3_BUCKET=-+STACK_S3_BUCKET=This addresses:
- Adding quotes around the endpoint comment value
- Reordering keys alphabetically
- Removing the extra blank line
apps/backend/src/app/api/latest/teams/crud.tsx (1)
84-84:LGTM! S3 image upload properly integrated.The image upload functionality is correctly implemented with proper categorization ("team-profile-images") and validation. The await calls within transactions ensure data consistency.
Consider whether the S3 upload should happen outside the database transaction to reduce transaction duration, though the current approach ensures better consistency if uploads fail.
Also applies to: 168-168
apps/backend/src/app/api/latest/emails/render-email/route.tsx (1)
44-49:Consider simplifying template lookup.The Map creation is unnecessary overhead. You can directly access the templates object.
- if (body.theme_id && !(body.theme_id in tenancy.config.emails.themes)) {- throw new StatusError(400, "No theme found with given id");- }- const templateList = new Map(Object.entries(tenancy.config.emails.templates));- const themeSource = body.theme_id === undefined ? body.theme_tsx_source! : getEmailThemeForTemplate(tenancy, body.theme_id);- const templateSource = body.template_id ? templateList.get(body.template_id)?.tsxSource : body.template_tsx_source;+ if (body.theme_id && !(body.theme_id in tenancy.config.emails.themes)) {+ throw new StatusError(400, "No theme found with given id");+ }+ const themeSource = body.theme_id === undefined ? body.theme_tsx_source! : getEmailThemeForTemplate(tenancy, body.theme_id);+ const templateSource = body.template_id ? tenancy.config.emails.templates[body.template_id]?.tsxSource : body.template_tsx_source;apps/backend/src/lib/redirect-urls.tsx (1)
14-18:Domain validation logic looks correct.The check for
domain.baseUrlbefore proceeding prevents potential errors. Consider logging domains without baseUrl for debugging purposes.if (!domain.baseUrl) {+ // Log for debugging - domain entry exists but has no baseUrl return false; }apps/backend/src/app/api/latest/internal/config/override/crud.tsx (1)
12-21:Enhance JSON parsing error handling.While catching
SyntaxErroris good, consider handling other potential JSON parsing errors and providing more descriptive error messages.let parsedConfig; try { parsedConfig = JSON.parse(data.config_override_string); } catch (e) {- if (e instanceof SyntaxError) {- throw new StatusError(StatusError.BadRequest, 'Invalid config JSON');- }- throw e;+ if (e instanceof SyntaxError) {+ throw new StatusError(StatusError.BadRequest, `Invalid config JSON: ${e.message}`);+ } else if (e instanceof TypeError) {+ throw new StatusError(StatusError.BadRequest, 'Invalid config JSON: Circular reference detected');+ }+ throw new StatusError(StatusError.BadRequest, 'Failed to parse config JSON'); }apps/backend/prisma/seed.ts (1)
74-77:Consider improving error context in domain mapping.While the domain mapping logic is correct, the error thrown for missing baseUrl could provide more context.
- .map((d) => ({ domain: d.baseUrl || throwErr('Domain base URL is required'), handler_path: d.handlerPath })),+ .map((d) => ({+ domain: d.baseUrl || throwErr(`Domain base URL is required for trusted domain entry`),+ handler_path: d.handlerPath+ })),apps/dashboard/src/app/(main)/integrations/featurebase/sso/page.tsx (1)
44-48:Consider making the Featurebase URL configurable.The Featurebase URL is hardcoded, which might cause issues in different environments (development, staging, production).
Consider making it configurable:
+const featurebaseUrl = getEnvVariable("STACK_FEATUREBASE_URL", "https://feedback.stack-auth.com");+ // Redirect to Featurebase with JWT and return_to-const featurebaseUrl = new URL("https://feedback.stack-auth.com/api/v1/auth/access/jwt");+const featurebaseUrl = new URL(`${featurebaseUrl}/api/v1/auth/access/jwt`);apps/backend/src/lib/images.tsx (1)
44-45:Avoid using 'any' type for better type safety.Using proper types from the sharp library would improve type safety and IDE support.
Import and use proper types:
- let sharpImage: any;- let metadata: any;+ let sharpImage: ReturnType<typeof sharp>;+ let metadata: Awaited<ReturnType<ReturnType<typeof sharp>['metadata']>>;apps/backend/src/lib/email-rendering.tsx (1)
75-75:Improved subject extraction from template.Good improvement to extract actual Subject component from template. Consider enhancing the regex to also match non-self-closing Subject tags.
The current regex only matches self-closing tags. Consider supporting both formats:
- subject: `Mock subject, ${templateComponent.match(/<Subject\s+[^>]*\/>/g)?.[0]}`,+ subject: `Mock subject, ${templateComponent.match(/<Subject\s+[^>]*(?:\/?>|>.*?<\/Subject>)/g)?.[0]}`,apps/backend/src/app/api/latest/integrations/custom/domains/crud.tsx (1)
49-90:Consider extracting shared domain CRUD logicThis file shares identical logic with
apps/backend/src/app/api/latest/integrations/neon/domains/crud.tsx. Consider extracting the common domain CRUD handlers and helper functions into a shared module to reduce code duplication and maintain consistency.Create a shared module at
apps/backend/src/app/api/latest/integrations/shared/domains.tsxto house the common logic.apps/backend/src/app/api/latest/integrations/neon/oauth-providers/crud.tsx (1)
83-89:Inefficient provider lookup in findLegacyProviderThe current implementation uses
Object.entriesandfindwhich creates unnecessary intermediate arrays. Consider using a more efficient approach.-function findLegacyProvider(tenancy: Tenancy, providerType: string) {- const providerRaw = Object.entries(tenancy.config.auth.oauth.providers).find(([_, provider]) => provider.type === providerType);- if (!providerRaw) {- return null;- }- return oauthProviderConfigToLegacyConfig(providerRaw[1]);-}+function findLegacyProvider(tenancy: Tenancy, providerType: string) {+ for (const provider of Object.values(tenancy.config.auth.oauth.providers)) {+ if (provider.type === providerType) {+ return oauthProviderConfigToLegacyConfig(provider);+ }+ }+ return null;+}apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/email-templates/[templateId]/page-client.tsx (1)
42-42:updateEmailTemplate parameter handling could be clearerThe ternary operator for the third parameter makes the code less readable. Consider using a more explicit approach.
- await stackAdminApp.updateEmailTemplate(props.templateId, currentCode, selectedThemeId === undefined ? null : selectedThemeId);+ const themeId = selectedThemeId === undefined ? null : selectedThemeId;+ await stackAdminApp.updateEmailTemplate(props.templateId, currentCode, themeId);apps/backend/src/lib/emails.tsx (1)
81-93:Email verification retry logic could benefit from jitterThe exponential backoff for Emailable API retries uses a fixed base, which could cause thundering herd issues if multiple requests retry simultaneously.
- }, 4, { exponentialDelayBase: 4000 });+ }, 4, {+ exponentialDelayBase: 4000,+ // Add jitter to prevent thundering herd+ jitter: () => Math.random() * 1000+ });apps/backend/src/lib/config.tsx (1)
419-433:Test snapshot makes assertions fragileUsing inline snapshots for error messages makes tests brittle to formatting changes.
Consider using more flexible assertions:
- expect(await validateConfigOverrideSchema(unionSchema, { a: { "time": "now" } }, { "a.morning": true })).toMatchInlineSnapshot(`- {- "error": "[WARNING] a is not matched by any of the provided schemas:- Schema 0:- a must be a \`string\` type, but the final value was: \`{- "time": "\\"now\\"",- "morning": "true"- }\`.- Schema 1:- a contains unknown properties: morning- Schema 2:- a.time must be one of the following values: tomorrow",- "status": "error",- }- `);+ const result = await validateConfigOverrideSchema(unionSchema, { a: { "time": "now" } }, { "a.morning": true });+ expect(result.status).toBe("error");+ expect(result.error).toContain("[WARNING] a is not matched by any of the provided schemas");+ expect(result.error).toContain("morning");+ expect(result.error).toContain("tomorrow");
Uh oh!
There was an error while loading.Please reload this page.
.../backend/src/app/api/latest/connected-accounts/[user_id]/[provider_id]/access-token/crud.tsxShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
apps/backend/src/app/api/latest/integrations/neon/oauth-providers/crud.tsxShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
...src/app/(main)/(protected)/projects/[projectId]/email-templates/[templateId]/page-client.tsxShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
...src/app/(main)/(protected)/projects/[projectId]/email-templates/[templateId]/page-client.tsx OutdatedShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/email-templates/page-client.tsx OutdatedShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
apps/e2e/tests/backend/endpoints/api/v1/auth/password/send-reset-code.test.ts (1)
27-42:Update password reset e2e test to use dynamic mock subject format
Replace the static subject assertions in apps/e2e/tests/backend/endpoints/api/v1/auth/password/send-reset-code.test.ts (lines 27 & 35) with the dynamic mock pattern used elsewhere, for example:"Mock subject, <Subject value={\`Verify your email at \${project.displayName}\`} />"and
"Mock subject, <Subject value={\`Reset your password at \${project.displayName}\`} />"
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
apps/e2e/tests/backend/endpoints/api/v1/auth/password/send-reset-code.test.ts(1 hunks)apps/e2e/tests/backend/endpoints/api/v1/auth/password/sign-up.test.ts(1 hunks)apps/e2e/tests/backend/endpoints/api/v1/contact-channels/legacy-send-verification-code.test.ts(1 hunks)apps/e2e/tests/backend/endpoints/api/v1/contact-channels/send-verification-code.test.ts(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- apps/e2e/tests/backend/endpoints/api/v1/contact-channels/send-verification-code.test.ts
🧰 Additional context used
📓 Path-based instructions (2)
**/*.test.{ts,tsx,js}
📄 CodeRabbit inference engine (AGENTS.md)
In tests, prefer .toMatchInlineSnapshot where possible; refer to snapshot-serializer.ts for snapshot formatting and handling of non-deterministic values
Files:
apps/e2e/tests/backend/endpoints/api/v1/contact-channels/legacy-send-verification-code.test.tsapps/e2e/tests/backend/endpoints/api/v1/auth/password/sign-up.test.tsapps/e2e/tests/backend/endpoints/api/v1/auth/password/send-reset-code.test.ts
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
Prefer ES6 Map over Record when representing key–value collections
Files:
apps/e2e/tests/backend/endpoints/api/v1/contact-channels/legacy-send-verification-code.test.tsapps/e2e/tests/backend/endpoints/api/v1/auth/password/sign-up.test.tsapps/e2e/tests/backend/endpoints/api/v1/auth/password/send-reset-code.test.ts
⏰ 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). (11)
- GitHub Check: Vercel Agent Review
- GitHub Check: docker
- GitHub Check: restart-dev-and-test
- GitHub Check: build (22.x)
- GitHub Check: setup-tests
- GitHub Check: all-good
- GitHub Check: build (22.x)
- GitHub Check: lint_and_build (latest)
- GitHub Check: check_prisma_migrations (22.x)
- GitHub Check: docker
- GitHub Check: Security Check
🔇 Additional comments (3)
apps/e2e/tests/backend/endpoints/api/v1/auth/password/send-reset-code.test.ts (1)
1-1:LGTM! Import consolidation improves code organization.Moving the
waitimport to the top of the file follows best practices by keeping all imports in one location.apps/e2e/tests/backend/endpoints/api/v1/auth/password/sign-up.test.ts (1)
25-25:LGTM! Dynamic subject expectation aligns with test infrastructure update.The updated expectation correctly reflects the dynamic email subject format that includes
project.displayName, consistent with similar changes inlegacy-send-verification-code.test.ts.apps/e2e/tests/backend/endpoints/api/v1/contact-channels/legacy-send-verification-code.test.ts (1)
57-67:LGTM! Dynamic subject expectations properly updated.Both email message expectations now correctly use the dynamic mock subject format with
project.displayName, consistent with the test infrastructure changes observed across the codebase.
apps/e2e/tests/backend/endpoints/api/v1/auth/password/send-reset-code.test.tsShow resolvedHide resolved
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
CHANGELOG.md(1 hunks)apps/e2e/tests/backend/endpoints/api/v1/internal/email.test.ts(3 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
Use ES6 Maps instead of Records wherever possible in TypeScript code
Files:
apps/e2e/tests/backend/endpoints/api/v1/internal/email.test.ts
**/*.test.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
When writing tests, prefer .toMatchInlineSnapshot over other selectors where possible
Files:
apps/e2e/tests/backend/endpoints/api/v1/internal/email.test.ts
🪛 LanguageTool
CHANGELOG.md
[grammar] ~30-~30: Use a hyphen to join words.
Context: ... with new layout primitives and platform aware components - Corrected inaccurate ...
(QB_NEW_EN_HYPHEN)
[grammar] ~43-~43: Use a hyphen to join words.
Context: ...l close-less dialogs to support new full screen flows - Updated skeleton and typo...
(QB_NEW_EN_HYPHEN)
⏰ 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). (11)
- GitHub Check: restart-dev-and-test-with-custom-base-port
- GitHub Check: docker
- GitHub Check: build (22.x)
- GitHub Check: check_prisma_migrations (22.x)
- GitHub Check: build (22.x)
- GitHub Check: lint_and_build (latest)
- GitHub Check: all-good
- GitHub Check: build (22.x)
- GitHub Check: setup-tests
- GitHub Check: restart-dev-and-test
- GitHub Check: Security Check
🔇 Additional comments (1)
apps/e2e/tests/backend/endpoints/api/v1/internal/email.test.ts (1)
43-43:LGTM! Consistent snapshot updates for dynamic email subjects.The inline snapshot updates correctly reflect the new dynamic email subject format that includes
project.displayName. All three occurrences are consistent and align with the PR's objective to make email subjects dynamic.Also applies to: 58-58, 105-105
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
CHANGELOG.md (1)
30-30:Previous hyphenation issues resolved.“platform-aware” (Line 30) and “full-screen” (Line 43) are now correctly hyphenated. Nice.
Also applies to: 43-43
🧹 Nitpick comments (4)
CHANGELOG.md (4)
7-7:Add release date for 2.8.44.Include the release date to improve traceability (ISO-8601). Example:
-## 2.8.44+## 2.8.44 — 2025-07-25Please confirm the correct date before applying.
5-5:Enhance the NOTE with direct links to history.Add links to tags or a compare range so readers can quickly find earlier releases removed in this consolidation.
-> NOTE: Releases before ***2.8.44*** were never documented in this file. Check git history or individual commits if you need earlier details.+> NOTE: Releases before ***2.8.44*** were not documented here. See Git tags/releases or compare views for earlier history.Optionally add specific links to your repo’s Releases and Tags pages.
13-14:Unify tense and code-format identifiers/HTTP codes; capitalize “Apps” consistently.
- Use past tense consistently within a released version.
- Wrap identifiers and HTTP codes in backticks.
- Capitalize “Apps” when referring to the product feature.
Apply:
- Reworked apps config and URL helpers to support the new dashboard Apps experience- Tightened client retry logic around 429 responses for more resilient rate limiting+ Reworked Apps config and URL helpers to support the new dashboard Apps experience+ Tightened client retry logic around `429` responses for more resilient rate limiting- Checks Stripe connected accounts for charges_enabled before issuing purchase flows- Added dev-only 429 simulation plus smarter retry metadata to exercise rate-limit handling+ Checked Stripe connected accounts for `charges_enabled` before issuing purchase flows+ Added dev-only `429` simulation plus smarter retry metadata to exercise rate-limit handling- Removed runtime StackProvider fetching to make the dashboard static and simplify Suspense boundaries+ Removed runtime `StackProvider` fetching to make the dashboard static and simplify Suspense boundaries- Generates server Stack apps that inherit from the client instance when both are scaffolded+ Generated server Stack apps that inherit from the client instance when both are scaffolded- StackProvider now skips runtime user fetching so dashboard templates render statically- Stack app templates wire inheritFrom between client and server apps and update convex docs+ Made `StackProvider` skip runtime user fetching so dashboard templates render statically+ Stack app templates wired `inheritFrom` between client and server apps and updated Convex docsAlso applies to: 18-20, 24-24, 39-39, 48-49
26-26:Clarify list with commas and singularize “payments.”- Surfac ed project access summaries pending invitations and clearer payments warnings across settings+ Surfaced project access summaries, pending invitations, and clearer payment warnings across settings
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
CHANGELOG.md(1 hunks)
⏰ 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). (12)
- GitHub Check: Vercel Agent Review
- GitHub Check: setup-tests
- GitHub Check: build (22.x)
- GitHub Check: restart-dev-and-test-with-custom-base-port
- GitHub Check: build (22.x)
- GitHub Check: lint_and_build (latest)
- GitHub Check: restart-dev-and-test
- GitHub Check: docker
- GitHub Check: check_prisma_migrations (22.x)
- GitHub Check: build (22.x)
- GitHub Check: all-good
- GitHub Check: Security Check
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
what should the new workflow for making changes to the changelog be? should i add the "current version number" to the pushed-to-prod message and then you'll update the changelog, or how should we do it?
Uh oh!
There was an error while loading.Please reload this page.
Consolidates all changelog into single file.
Important
Consolidates changelogs into a single file and updates email subjects to include project display names.
CHANGELOG.md.changelog-manager.tsscript for interactive changelog updates.project.displayNameinstead of a static name insign-up.test.ts,legacy-send-verification-code.test.ts, andsend-verification-code.test.ts.This description was created by
for563fe8f. You cancustomize this summary. It will automatically update as commits are pushed.
Summary by CodeRabbit
Chores
Tests