Skip to content

chore(sync): merge upstream documenso/main (c81bc72c4..8a41a3bf6, incl. v2.19.0) - #23

Merged
JOY (JOY) merged 21 commits into
mainfrom
chore/sync-upstream-v2.19
Oct 1, 2026
Merged

JOY (JOY) merged 21 commits into
mainfrom
chore/sync-upstream-v2.19

Conversation

@JOY

@JOY JOY (JOY) commented Oct 1, 2026 •

Copy link
Copy Markdown

What

Upstream sync #2: merges documenso/documenso upstream/main (17 commits since our last sync point c81bc72), spanning the v2.19.0 release (586b1f5) plus 8 post-release commits.

Highlights: configurable legal/data-protection/imprint links (documenso#3131 - complements our /terms + /privacy pages), recipient grouping, team document analytics dashboard, owner-password-protected PDF acceptance, embed signing completion fixes, signed-recipient reject prevention, branding form validation errors.

Conflict resolution (1 file)

  • apps/remix/app/components/forms/signup.tsx: took upstream's configurable availableLegalLinks mechanism (env NEXT_PUBLIC_TERMS_OF_SERVICE_URL / NEXT_PUBLIC_PRIVACY_POLICY_URL / NEXT_PUBLIC_IMPRINT_URL, new public-legal-links component also renders on recipient signing pages) over our hardcoded /terms /privacy links from PR feat(branding): replace the last user-facing Documenso surfaces (batch 1) #18. Deploy note: prod env must set the two legal URLs to https://sign.crove.com/terms and https://sign.crove.com/privacy so the links render (self-host default renders NO legal links when unset).

Plus a format-only commit conforming upstream's app-command-menu.tsx to our biome config.

Verification

  • Conflict probe pre-measured in a worktree: exactly 1 file
  • CI-equivalent biome check (LF worktree at the merge commit): 0 errors after the format fix
  • tsc findings in the local worktree are the known phantom stale-generated-types class (both parents + merged source verified consistent by grep); CI Build App is the gate
  • Branding patch re-ran post-merge: no-op (files already Crove)
  • Reviewer gate per repo process

Deploy note

Set on prod before/with deploy: NEXT_PUBLIC_TERMS_OF_SERVICE_URL="https://sign.crove.com/terms" and NEXT_PUBLIC_PRIVACY_POLICY_URL="https://sign.crove.com/privacy" (self-host default renders NO legal links when unset).


📌 TL;DR

This PR introduces a comprehensive analytics dashboard for teams and organizations, featuring new UI components for data visualization and activity tracking. It also enhances the embedded signing experience with new CSS hooks and postMessage events for completion/rejection states, while improving form validation and legal link configuration.

🎯 Type of Change

  • 🚀 New feature
  • 🐛 Bugfix
  • 🧹 Refactor
  • 📚 Documentation
  • ⚡ Performance
  • ⚙️ CI / Configuration

🔍 Changes Walkthrough

File Summary of Changes
apps/docs/content/docs/developers/embedding/css-variables.mdx Updated documentation to include new CSS classes for completion/rejection states and a data-readonly attribute. Fixed CSS variable usage in examples.
apps/docs/content/docs/self-hosting/configuration/database.mdx Removed redundant npx prisma migrate deploy command from manual deployment instructions.
apps/docs/content/docs/self-hosting/maintenance/upgrades.mdx Updated Docker migration instructions to include NEXT_PRIVATE_DIRECT_DATABASE_URL and explicit schema path.
apps/remix/app/components/dialogs/envelope-item-edit-dialog.tsx Improved error message for invalid PDF uploads to mention password protection.
apps/remix/app/components/embed/embed-document-completed.tsx Redesigned the completion screen with new CSS classes, a check icon, and clearer status messaging.
apps/remix/app/components/embed/embed-document-signing-page-v1.tsx Added isRejected prop and implemented postMessage events to the parent window for document-rejected and document-completed actions.
apps/remix/app/components/embed/embed-document-signing-page-v2.tsx Refactored state management for completion/rejection to handle revalidation correctly. Improved signature data retrieval for the completion screen.
apps/remix/app/components/forms/branding-preferences-form.tsx Added FormMessage components for validation errors. Updated Zod schemas to use Lingui msg for internationalization of error messages.
apps/remix/app/components/forms/signup.tsx Refactored legal links (ToS, Privacy, Imprint) to use environment variables and render dynamically. Removed oidcProviderLabel prop.
apps/remix/app/components/general/analytics/analytics-activity-table-card.tsx New: Reusable table component for displaying member/team activity with search, pagination, and completion rate visualization.
apps/remix/app/components/general/analytics/analytics-documents-over-time-card.tsx New: Bar chart component using Recharts to visualize document creation trends over time.
apps/remix/app/components/general/analytics/analytics-hydrate-fallback.tsx New: Loading spinner component for analytics hydration.
apps/remix/app/components/general/analytics/analytics-no-activity-alert.tsx New: Alert component shown when no activity is found, with an option to widen the date range.
apps/remix/app/components/general/analytics/analytics-overview-cards.tsx New: Grid of stat cards showing documents sent, completion rate, and active entities with delta badges.
apps/remix/app/components/general/analytics/analytics-page-header.tsx New: Header component for analytics pages with avatar, title, and range picker.
apps/remix/app/components/general/analytics/analytics-query-error.tsx New: Error state component with a retry button for failed analytics queries.
apps/remix/app/components/general/analytics/analytics-range-picker.tsx New: Date range selection component with preset ranges and custom date picking.

📊 Architectural Flow

sequenceDiagram
    participant Parent as Parent App
    participant Embed as Embed Signing Page
    participant UI as Embed UI Components

    Note over Embed,UI: Document Completion/Rejection Flow

    alt Document Completed
        Embed->>UI: Render EmbedDocumentCompleted
        Embed->>Parent: postMessage({ action: 'document-completed', data: {...} })
    else Document Rejected
        Embed->>UI: Render EmbedDocumentRejected
        Embed->>Parent: postMessage({ action: 'document-rejected', data: {...} })
    end

    Note over Parent: Parent App can now react to signing status changes
Loading

Strip encryption from PDFs that open with an empty user password via
libpdf's ignorePermissions, still rejecting user-password PDFs.

Upgrade @libpdf/core to 0.5.1, which also keeps overlapping and layered
text intact during text extraction.

Resolves documenso#3303
Send completed/rejected events when reopening an actioned v1 embed,
show the completed page after signing in v2, and tidy the completed
page.
# Conflicts:
#	apps/remix/app/components/forms/signup.tsx
@coderabbitai

coderabbitai Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 170 files, which is 70 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 3d06b57b-cad1-4fdb-afce-513aef5b661f

📥 Commits

Reviewing files that changed from the base of the PR and between 85fb110 and f3ee711.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (170)
  • .env.example
  • apps/docs/content/docs/developers/embedding/css-variables.mdx
  • apps/docs/content/docs/self-hosting/configuration/database.mdx
  • apps/docs/content/docs/self-hosting/maintenance/upgrades.mdx
  • apps/remix/app/components/dialogs/envelope-item-edit-dialog.tsx
  • apps/remix/app/components/embed/embed-document-completed.tsx
  • apps/remix/app/components/embed/embed-document-signing-page-v1.tsx
  • apps/remix/app/components/embed/embed-document-signing-page-v2.tsx
  • apps/remix/app/components/forms/branding-preferences-form.tsx
  • apps/remix/app/components/forms/signup.tsx
  • apps/remix/app/components/general/analytics/analytics-activity-table-card.tsx
  • apps/remix/app/components/general/analytics/analytics-documents-over-time-card.tsx
  • apps/remix/app/components/general/analytics/analytics-hydrate-fallback.tsx
  • apps/remix/app/components/general/analytics/analytics-no-activity-alert.tsx
  • apps/remix/app/components/general/analytics/analytics-overview-cards.tsx
  • apps/remix/app/components/general/analytics/analytics-page-header.tsx
  • apps/remix/app/components/general/analytics/analytics-query-error.tsx
  • apps/remix/app/components/general/analytics/analytics-range-picker.tsx
  • apps/remix/app/components/general/analytics/analytics-stat-card.tsx
  • apps/remix/app/components/general/analytics/analytics-status-breakdown-card.tsx
  • apps/remix/app/components/general/analytics/analytics-template-usage-card.tsx
  • apps/remix/app/components/general/app-command-menu.tsx
  • apps/remix/app/components/general/app-nav-mobile.tsx
  • apps/remix/app/components/general/direct-template/direct-template-signing-form.tsx
  • apps/remix/app/components/general/document-signing/document-signing-complete-dialog.tsx
  • apps/remix/app/components/general/document-signing/document-signing-form.tsx
  • apps/remix/app/components/general/document-signing/document-signing-page-view-v1.tsx
  • apps/remix/app/components/general/document-signing/envelope-signing-provider.tsx
  • apps/remix/app/components/general/envelope-editor/envelope-editor-recipient-form.tsx
  • apps/remix/app/components/general/envelope-editor/recipient-row.tsx
  • apps/remix/app/components/general/envelope-editor/recipient-step-card.tsx
  • apps/remix/app/components/general/envelope-editor/recipient-step-list.tsx
  • apps/remix/app/components/general/envelope-signing/envelope-signer-header.tsx
  • apps/remix/app/components/general/filter-pill.tsx
  • apps/remix/app/components/general/metric-card.tsx
  • apps/remix/app/components/general/org-menu-switcher.tsx
  • apps/remix/app/components/general/pdf-viewer/pdf-viewer.tsx
  • apps/remix/app/components/general/public-legal-links.tsx
  • apps/remix/app/components/tables/admin-organisation-stats-table.tsx
  • apps/remix/app/root.tsx
  • apps/remix/app/routes/_authenticated+/admin+/organisations.$id.tsx
  • apps/remix/app/routes/_authenticated+/o.$orgUrl._index.tsx
  • apps/remix/app/routes/_authenticated+/o.$orgUrl.analytics._index.tsx
  • apps/remix/app/routes/_authenticated+/t.$teamUrl+/analytics._index.tsx
  • apps/remix/app/routes/_authenticated+/t.$teamUrl+/documents.$id.legacy_editor.tsx
  • apps/remix/app/routes/_authenticated+/t.$teamUrl+/templates.$id.legacy_editor.tsx
  • apps/remix/app/routes/_recipient+/_layout.tsx
  • apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
  • apps/remix/app/routes/_unauthenticated+/_layout.tsx
  • apps/remix/app/routes/_unauthenticated+/signup.tsx
  • apps/remix/app/routes/embed+/_v0+/sign.$token.tsx
  • apps/remix/app/utils/analytics.ts
  • apps/remix/app/utils/toast-error-messages.ts
  • apps/remix/package.json
  • docker/start.sh
  • package.json
  • packages/api/v1/schema.ts
  • packages/app-tests/e2e/api/trpc/envelope/expired-recipient-field-signing.spec.ts
  • packages/app-tests/e2e/api/trpc/test-unauthorized-analytics-access.spec.ts
  • packages/app-tests/e2e/api/v2/recipient-signing-order-validation.spec.ts
  • packages/app-tests/e2e/api/v2/tsp-recipient-grouping.spec.ts
  • packages/app-tests/e2e/document-auth/assistant-grouped-dictation-ui.spec.ts
  • packages/app-tests/e2e/document-auth/assistant-null-order.spec.ts
  • packages/app-tests/e2e/document-auth/assistant-signing-groups.spec.ts
  • packages/app-tests/e2e/document-auth/grouped-next-recipient-dictation.spec.ts
  • packages/app-tests/e2e/document-auth/viewer-next-recipient-dictation.spec.ts
  • packages/app-tests/e2e/document-flow/legacy-editor-version-guard.spec.ts
  • packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-cc-order.spec.ts
  • packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-csc-grouping.spec.ts
  • packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-groups.spec.ts
  • packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-id-stability.spec.ts
  • packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-legacy-unordered-tail.spec.ts
  • packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-locked-steps.spec.ts
  • packages/app-tests/e2e/envelope-editor-v2/envelope-recipient-null-order-hydration.spec.ts
  • packages/app-tests/e2e/envelope-editor-v2/envelope-recipients.spec.ts
  • packages/app-tests/e2e/fixtures/envelope-editor.ts
  • packages/app-tests/e2e/organisations/organisation-analytics.spec.ts
  • packages/app-tests/e2e/recipient/legacy-unordered-recipients.spec.ts
  • packages/app-tests/e2e/recipient/rejected-recipient-advancement.spec.ts
  • packages/app-tests/e2e/recipient/signing-group-advancement.spec.ts
  • packages/app-tests/e2e/recipient/signing-groups.spec.ts
  • packages/app-tests/e2e/teams/team-analytics.spec.ts
  • packages/app-tests/e2e/templates/direct-template-dictation-groups.spec.ts
  • packages/email/templates/organisation-limits-updated.tsx
  • packages/lib/client-only/hooks/use-editor-recipients.ts
  • packages/lib/client-only/providers/envelope-editor-provider.tsx
  • packages/lib/constants/app.ts
  • packages/lib/jobs/client.ts
  • packages/lib/jobs/definitions/emails/send-organisation-limit-alert-email.handler.ts
  • packages/lib/jobs/definitions/emails/send-organisation-limits-updated-email.handler.ts
  • packages/lib/jobs/definitions/emails/send-organisation-limits-updated-email.ts
  • packages/lib/server-only/document/complete-document-with-token.ts
  • packages/lib/server-only/document/reject-document-with-token.ts
  • packages/lib/server-only/document/send-document.ts
  • packages/lib/server-only/envelope/create-envelope.ts
  • packages/lib/server-only/envelope/get-envelope-for-recipient-signing.ts
  • packages/lib/server-only/field/get-fields-for-token.ts
  • packages/lib/server-only/field/remove-signed-field-with-token.ts
  • packages/lib/server-only/field/sign-field-with-token.ts
  • packages/lib/server-only/organisation/get-organisation-analytics-documents-over-time.ts
  • packages/lib/server-only/organisation/get-organisation-analytics-overview.ts
  • packages/lib/server-only/organisation/get-organisation-analytics-scope.ts
  • packages/lib/server-only/organisation/get-organisation-analytics-status-breakdown.ts
  • packages/lib/server-only/organisation/get-organisation-analytics-team-activity.ts
  • packages/lib/server-only/organisation/get-organisation-analytics-template-usage.ts
  • packages/lib/server-only/pdf/normalize-pdf.ts
  • packages/lib/server-only/recipient/assign-omitted-recipient-signing-orders.test.ts
  • packages/lib/server-only/recipient/assign-omitted-recipient-signing-orders.ts
  • packages/lib/server-only/recipient/create-envelope-recipients.ts
  • packages/lib/server-only/recipient/get-is-recipient-turn.ts
  • packages/lib/server-only/recipient/get-next-pending-recipient.ts
  • packages/lib/server-only/recipient/get-recipients-for-assistant.ts
  • packages/lib/server-only/recipient/set-document-recipients.ts
  • packages/lib/server-only/recipient/set-template-recipients.ts
  • packages/lib/server-only/recipient/update-envelope-recipients.ts
  • packages/lib/server-only/signature-level/assert-compatible-recipient-grouping.test.ts
  • packages/lib/server-only/signature-level/assert-compatible-recipient-grouping.ts
  • packages/lib/server-only/team/get-team-analytics-documents-over-time.ts
  • packages/lib/server-only/team/get-team-analytics-member-activity.ts
  • packages/lib/server-only/team/get-team-analytics-overview.ts
  • packages/lib/server-only/team/get-team-analytics-scope.ts
  • packages/lib/server-only/team/get-team-analytics-status-breakdown.ts
  • packages/lib/server-only/team/get-team-analytics-template-usage.ts
  • packages/lib/server-only/template/create-document-from-direct-template.ts
  • packages/lib/server-only/template/create-document-from-template.ts
  • packages/lib/translations/de/web.po
  • packages/lib/types/recipient.ts
  • packages/lib/universal/organisation-limit-changes.ts
  • packages/lib/utils/organisations.ts
  • packages/lib/utils/recipient-groups.test.ts
  • packages/lib/utils/recipient-groups.ts
  • packages/lib/utils/recipient-queries.test.ts
  • packages/lib/utils/recipient-queries.ts
  • packages/lib/utils/recipients.test.ts
  • packages/lib/utils/recipients.ts
  • packages/lib/utils/team-analytics-range.test.ts
  • packages/lib/utils/team-analytics-range.ts
  • packages/lib/utils/teams.ts
  • packages/prisma/seed/analytics-seed.ts
  • packages/trpc/server/admin-router/find-organisation-stats.ts
  • packages/trpc/server/admin-router/find-organisation-stats.types.ts
  • packages/trpc/server/admin-router/update-admin-organisation.ts
  • packages/trpc/server/admin-router/update-admin-organisation.types.ts
  • packages/trpc/server/embedding-router/create-embedding-document.types.ts
  • packages/trpc/server/embedding-router/create-embedding-template.types.ts
  • packages/trpc/server/embedding-router/update-embedding-document.types.ts
  • packages/trpc/server/embedding-router/update-embedding-template.types.ts
  • packages/trpc/server/envelope-router/envelope-recipients/create-envelope-recipients.types.ts
  • packages/trpc/server/envelope-router/envelope-recipients/update-envelope-recipients.types.ts
  • packages/trpc/server/envelope-router/set-envelope-recipients.types.ts
  • packages/trpc/server/envelope-router/sign-envelope-field.ts
  • packages/trpc/server/envelope-router/use-envelope.types.ts
  • packages/trpc/server/organisation-router/get-organisation-analytics-documents-over-time.ts
  • packages/trpc/server/organisation-router/get-organisation-analytics-overview.ts
  • packages/trpc/server/organisation-router/get-organisation-analytics-status-breakdown.ts
  • packages/trpc/server/organisation-router/get-organisation-analytics-team-activity.ts
  • packages/trpc/server/organisation-router/get-organisation-analytics-template-usage.ts
  • packages/trpc/server/organisation-router/get-organisation-analytics.types.ts
  • packages/trpc/server/organisation-router/router.ts
  • packages/trpc/server/recipient-router/schema.ts
  • packages/trpc/server/team-router/get-team-analytics-documents-over-time.ts
  • packages/trpc/server/team-router/get-team-analytics-member-activity.ts
  • packages/trpc/server/team-router/get-team-analytics-overview.ts
  • packages/trpc/server/team-router/get-team-analytics-status-breakdown.ts
  • packages/trpc/server/team-router/get-team-analytics-template-usage.ts
  • packages/trpc/server/team-router/get-team-analytics.types.ts
  • packages/trpc/server/team-router/router.ts
  • packages/tsconfig/process-env.d.ts
  • packages/ui/package.json
  • packages/ui/primitives/signature-pad/signature-pad-dialog.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@dos dos Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⏱️ Code Review completed (31 files · 720,706 chars · 3 PR unit(s))

ℹ️ Full-Context Analysis: Analyzed all changed files in a unified context pass to preserve cross-file type definitions, imports, and caller contracts. Deducted 3 PR units.
⚠️ PR diff exceeded maximum review ceiling (3 batches / ~90,000 chars) - lower-priority files were skipped.

⏱️ Adversarial Review completed (Model: gemini-3.8-flash)

⚠️ Primary model was unavailable; the verdict was served by backup model gemini-3.8-flash.
⚠️ Phase 1 reviewer output hit the token limit; the candidate list may be incomplete.

🔍 Verified Adversarial Review Findings

An issue identified in the Phase 1 review is verified:

📋 Findings Summary (1 inline finding)

  • 🔴 BLOCKER packages/lib/client-only/hooks/use-editor-recipients.ts:70-86: Unconditional rejection of recipient signing groups across all envelopes in the editor (Inline on diff)

Comment on lines +70 to +86
const seenSigningOrders = new Set<number>();

data.signers.forEach((signer, index) => {
if (signer.role === RecipientRole.CC || typeof signer.signingOrder !== 'number') {
return;
}

if (seenSigningOrders.has(signer.signingOrder)) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: 'CSC envelopes do not support recipient signing groups.',
path: ['signers', index, 'signingOrder'],
});
}

seenSigningOrders.add(signer.signingOrder);
});

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 BLOCKER: Unconditional rejection of recipient signing groups across all envelopes in the editor

Failure Trace:

  1. A user creates or edits a

⚠️ Verdict output hit the token limit and may be truncated.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a comprehensive analytics dashboard for teams and organisations, refactors recipient signing order and grouping logic to support signing groups while enforcing sequential signing for TSP envelopes, adds public legal links, and improves PDF password-protection handling. Feedback from the review highlights a high-severity security issue where sensitive signing tokens are exposed via postMessage with a wildcard target origin ('*'), alongside a React hook anti-pattern in useEffect that creates stale closures.

Comment on lines +270 to +306
useEffect(() => {
if (!window.parent) {
return;
}

if (hasRejectedDocument) {
window.parent.postMessage(
{
action: 'document-rejected',
data: {
token,
documentId,
recipientId: recipient.id,
},
},
'*',
);

return;
}

if (hasCompletedDocument) {
window.parent.postMessage(
{
action: 'document-completed',
data: {
token,
documentId,
recipientId: recipient.id,
},
},
'*',
);
}

// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

security-high high

Security & Code Quality Issues\n\n1. Sensitive Data Exposure (High Severity): Sending the sensitive signing token via postMessage with a wildcard target origin ('*') allows any parent window (including malicious or hijacked frames) to intercept the token. Consider restricting the target origin to a trusted origin (e.g., a configured parent origin) instead of using * when transmitting sensitive credentials.\n\n2. React Hook Anti-Pattern (Medium Severity): This useEffect uses an empty dependency array [] but references state variables hasRejectedDocument and hasCompletedDocument. This creates a stale closure and requires disabling the react-hooks/exhaustive-deps lint rule. Since this effect is intended to notify the parent window on mount if the document is already completed or rejected, you should use the initial props isRejected and isCompleted directly and include them in the dependency array.

  useEffect(() => {\n    if (!window.parent) {\n      return;\n    }\n\n    if (isRejected) {\n      window.parent.postMessage(\n        {\n          action: 'document-rejected',\n          data: {\n            token,\n            documentId,\n            recipientId: recipient.id,\n          },\n        },\n        '*',\n      );\n\n      return;\n    }\n\n    if (isCompleted) {\n      window.parent.postMessage(\n        {\n          action: 'document-completed',\n          data: {\n            token,\n            documentId,\n            recipientId: recipient.id,\n          },\n        },\n        '*',\n      );\n    }\n  }, [isRejected, isCompleted, token, documentId, recipient.id]);

Upstream documenso#3131 rewrote the region where our fork adds the
oidcProviderLabel prop (used for the OIDC signup button label in
redirect-only mode), and the auto-merge silently dropped it while the
route still passed it - a semantic conflict the textual merge could
not see.


Without NEXT_PUBLIC_TERMS_OF_SERVICE_URL / NEXT_PUBLIC_PRIVACY_POLICY_URL
set, the signup consent text and the new public legal footers render
nothing on self-host. Defaults point at the local /terms and /privacy
pages added in PR #18.
@JOY
JOY (JOY) merged commit 3e1a782 into main Oct 1, 2026
12 of 13 checks passed
@JOY
JOY (JOY) deleted the chore/sync-upstream-v2.19 branch October 1, 2026 08:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants