From b822d8a222cb96476ad3068f3ca5b30c69535f40 Mon Sep 17 00:00:00 2001
From: Austin Mangelson
Date: Thu, 30 Jul 2026 12:47:15 -0600
Subject: [PATCH 1/7] chore: rename "Keep Contracts" to "KeepContracts" (no
space)
---
ARCHITECTURE.md | 10 +++++-----
CODE_STYLE.md | 4 ++--
README.md | 8 ++++----
apps/docs/src/app/og/docs/[...slug]/route.tsx | 2 +-
apps/docs/src/lib/layout.shared.tsx | 2 +-
.../app/components/dialogs/account-delete-dialog.tsx | 2 +-
.../components/dialogs/envelope-distribute-dialog.tsx | 2 +-
.../app/components/dialogs/token-create-dialog.tsx | 2 +-
.../app/components/dialogs/webhook-create-dialog.tsx | 2 +-
.../app/components/dialogs/webhook-edit-dialog.tsx | 2 +-
.../app/components/embed/embed-document-completed.tsx | 2 +-
.../app/components/general/admin-license-card.tsx | 2 +-
.../components/general/admin-license-status-banner.tsx | 4 ++--
apps/remix/app/components/general/app-nav-mobile.tsx | 2 +-
.../app/components/general/branding-logo-icon.tsx | 4 ++--
apps/remix/app/components/general/branding-logo.tsx | 4 ++--
.../general/document/document-certificate-qr-view.tsx | 2 +-
.../envelope-editor-settings-dialog.tsx | 2 +-
.../organisations/organisation-billing-banner.tsx | 2 +-
apps/remix/app/components/marketing/Features.tsx | 2 +-
apps/remix/app/components/marketing/HowItWorks.tsx | 2 +-
.../remix/app/components/marketing/MarketingFooter.tsx | 2 +-
.../remix/app/components/marketing/MarketingHeader.tsx | 2 +-
.../app/routes/_authenticated+/o.$orgUrl.support.tsx | 2 +-
apps/remix/app/routes/_profile+/p.$url.tsx | 2 +-
apps/remix/app/routes/_recipient+/_layout.tsx | 2 +-
.../app/routes/_recipient+/sign.$token+/_index.tsx | 4 ++--
apps/remix/app/routes/_share+/share.$slug.tsx | 10 +++++-----
.../articles.signature-disclosure.tsx | 4 ++--
.../app/routes/_unauthenticated+/o.$orgUrl.signin.tsx | 2 +-
.../routes/_unauthenticated+/verify-email.$token.tsx | 4 ++--
apps/remix/app/routes/privacy.tsx | 8 ++++----
apps/remix/app/routes/terms.tsx | 10 +++++-----
apps/remix/app/utils/meta.ts | 8 ++++----
docker/testing/compose.yml | 2 +-
packages/api/v1/openapi.ts | 4 ++--
packages/assets/branding/README.md | 2 +-
.../template-admin-user-created.tsx | 4 ++--
.../template-components/template-branding-logo.tsx | 4 ++--
.../template-confirmation-email.tsx | 2 +-
.../template-components/template-document-image.tsx | 2 +-
packages/email/template-components/template-footer.tsx | 2 +-
packages/email/templates/admin-user-created.tsx | 4 ++--
packages/email/templates/confirm-team-email.tsx | 6 +++---
.../organisation-account-link-confirmation.tsx | 6 +++---
packages/email/templates/organisation-invite.tsx | 4 ++--
packages/email/templates/organisation-join.tsx | 2 +-
packages/email/templates/organisation-leave.tsx | 2 +-
packages/email/templates/team-email-removed.tsx | 2 +-
packages/lib/constants/email.ts | 2 +-
.../emails/send-admin-user-created-email.handler.ts | 2 +-
.../2fa/email/generate-2fa-credentials-from-email.ts | 2 +-
packages/lib/server-only/2fa/setup-2fa.ts | 2 +-
.../organisation/create-organisation-member-invites.ts | 2 +-
.../server-only/team/create-team-email-verification.ts | 2 +-
packages/lib/server-only/team/delete-team.ts | 2 +-
packages/lib/utils/authenticator.ts | 2 +-
packages/signing/index.ts | 2 +-
packages/trpc/server/open-api.ts | 4 ++--
.../ui/components/document/document-share-button.tsx | 4 ++--
60 files changed, 99 insertions(+), 99 deletions(-)
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index c4ee4abf07..04e96f31de 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -1,12 +1,12 @@
-# Keep Contracts Architecture
+# KeepContracts Architecture
-This document provides a high-level overview of the Keep Contracts (KC) codebase to help humans and agents understand how the application is structured.
+This document provides a high-level overview of the KeepContracts (KC) codebase to help humans and agents understand how the application is structured.
---
-## Keep Contracts Product Overview
+## KeepContracts Product Overview
-**What Keep Contracts is:** A document signing engine (white-labeled Documenso), running at keepcontracts.com. It is invisible infrastructure. End users never interact with it directly. Signup is disabled and only DataThink admins have accounts.
+**What KeepContracts is:** A document signing engine (white-labeled Documenso), running at keepcontracts.com. It is invisible infrastructure. End users never interact with it directly. Signup is disabled and only DataThink admins have accounts.
### What is an Envelope
@@ -47,7 +47,7 @@ KC doesn't do this, the DataThink app does. When KC creates an envelope it retur
## Codebase Overview
-This section covers the technical architecture of the Keep Contracts codebase (forked from Documenso).
+This section covers the technical architecture of the KeepContracts codebase (forked from Documenso).
## Overview
diff --git a/CODE_STYLE.md b/CODE_STYLE.md
index 435ad64a77..c665349ee0 100644
--- a/CODE_STYLE.md
+++ b/CODE_STYLE.md
@@ -1,6 +1,6 @@
-# Keep Contracts Code Style Guide
+# KeepContracts Code Style Guide
-This document captures the code style, patterns, and conventions used in the Keep Contracts codebase. It covers both enforceable rules and subjective "taste" elements that make our code consistent and maintainable.
+This document captures the code style, patterns, and conventions used in the KeepContracts codebase. It covers both enforceable rules and subjective "taste" elements that make our code consistent and maintainable.
## Table of Contents
diff --git a/README.md b/README.md
index f97bf26ea2..ff23805ef7 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,14 @@
-# Keep Contracts
+# KeepContracts
Simple, secure document signing for DataThink's internal teams and products.
-Keep Contracts is a white-labeled, self-hosted document signing service built on top of [Documenso](https://documenso.com) (v2.11.0) and maintained by [DataThink](https://datathink.dev).
+KeepContracts is a white-labeled, self-hosted document signing service built on top of [Documenso](https://documenso.com) (v2.11.0) and maintained by [DataThink](https://datathink.dev).
## About
-Keep Contracts powers document signing workflows across DataThink's products. It is not a public SaaS product; accounts are provisioned by DataThink admins.
+KeepContracts powers document signing workflows across DataThink's products. It is not a public SaaS product; accounts are provisioned by DataThink admins.
-Documents are sent and managed via API. End recipients (contractors, parents, etc.) sign through a standard signing link without needing a Keep Contracts account.
+Documents are sent and managed via API. End recipients (contractors, parents, etc.) sign through a standard signing link without needing a KeepContracts account.
## Tech Stack
diff --git a/apps/docs/src/app/og/docs/[...slug]/route.tsx b/apps/docs/src/app/og/docs/[...slug]/route.tsx
index d746f1acdf..6db5d175c4 100644
--- a/apps/docs/src/app/og/docs/[...slug]/route.tsx
+++ b/apps/docs/src/app/og/docs/[...slug]/route.tsx
@@ -68,7 +68,7 @@ export async function GET(_req: Request, { params }: RouteContext<'/og/docs/[...
}}
>
{/* eslint-disable-next-line @next/next/no-img-element */}
-
+
- Keep Contracts
+ KeepContracts
),
},
diff --git a/apps/remix/app/components/dialogs/account-delete-dialog.tsx b/apps/remix/app/components/dialogs/account-delete-dialog.tsx
index 25b16f34dc..cdfcc0169b 100644
--- a/apps/remix/app/components/dialogs/account-delete-dialog.tsx
+++ b/apps/remix/app/components/dialogs/account-delete-dialog.tsx
@@ -103,7 +103,7 @@ export const AccountDeleteDialog = ({ className }: AccountDeleteDialogProps) =>
- Keep Contracts will delete all of your documents, along with
+ KeepContracts will delete all of your documents, along with
all of your completed documents, signatures, and all other resources belonging to your Account.
diff --git a/apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx b/apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
index d85249adf8..dfacdec80b 100644
--- a/apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
+++ b/apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx
@@ -351,7 +351,7 @@ export const EnvelopeDistributeDialog = ({
))}
- Keep Contracts
+ KeepContracts
diff --git a/apps/remix/app/components/dialogs/token-create-dialog.tsx b/apps/remix/app/components/dialogs/token-create-dialog.tsx
index f8bfc5c3c8..5a1c421c3d 100644
--- a/apps/remix/app/components/dialogs/token-create-dialog.tsx
+++ b/apps/remix/app/components/dialogs/token-create-dialog.tsx
@@ -171,7 +171,7 @@ export const TokenCreateDialog = ({ trigger, ...props }: TokenCreateDialogProps)
- Use API tokens to authenticate with the Keep Contracts API.
+ Use API tokens to authenticate with the KeepContracts API.
diff --git a/apps/remix/app/components/dialogs/webhook-create-dialog.tsx b/apps/remix/app/components/dialogs/webhook-create-dialog.tsx
index 8738c89c51..ea5e53a915 100644
--- a/apps/remix/app/components/dialogs/webhook-create-dialog.tsx
+++ b/apps/remix/app/components/dialogs/webhook-create-dialog.tsx
@@ -127,7 +127,7 @@ export const WebhookCreateDialog = ({ trigger, ...props }: WebhookCreateDialogPr
- The URL for Keep Contracts to send webhook events to.
+ The URL for KeepContracts to send webhook events to.
diff --git a/apps/remix/app/components/dialogs/webhook-edit-dialog.tsx b/apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
index f2f5d2e357..b2be65cb58 100644
--- a/apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
+++ b/apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
@@ -111,7 +111,7 @@ export const WebhookEditDialog = ({ trigger, webhook, ...props }: WebhookEditDia
- The URL for Keep Contracts to send webhook events to.
+ The URL for KeepContracts to send webhook events to.
diff --git a/apps/remix/app/components/embed/embed-document-completed.tsx b/apps/remix/app/components/embed/embed-document-completed.tsx
index 37e5648dbd..3299037285 100644
--- a/apps/remix/app/components/embed/embed-document-completed.tsx
+++ b/apps/remix/app/components/embed/embed-document-completed.tsx
@@ -18,7 +18,7 @@ export const EmbedDocumentCompleted = ({ name, signature }: EmbedDocumentComplet
{match(license.status)
diff --git a/apps/remix/app/components/general/admin-license-status-banner.tsx b/apps/remix/app/components/general/admin-license-status-banner.tsx
index 1a86ec53cf..3133a63fb8 100644
--- a/apps/remix/app/components/general/admin-license-status-banner.tsx
+++ b/apps/remix/app/components/general/admin-license-status-banner.tsx
@@ -37,11 +37,11 @@ export const AdminLicenseStatusBanner = ({ license }: AdminLicenseStatusBannerPr
.with('UNAUTHORIZED', () =>
license ? (
- Invalid License Type - Your Keep Contracts instance is using features that are not part of your
+ Invalid License Type - Your KeepContracts instance is using features that are not part of your
license.
) : (
- Missing License - Your Keep Contracts instance is using features that require a license.
+ Missing License - Your KeepContracts instance is using features that require a license.
),
)
.otherwise(() => null)}
diff --git a/apps/remix/app/components/general/app-nav-mobile.tsx b/apps/remix/app/components/general/app-nav-mobile.tsx
index f51791b408..538d369a39 100644
--- a/apps/remix/app/components/general/app-nav-mobile.tsx
+++ b/apps/remix/app/components/general/app-nav-mobile.tsx
@@ -116,7 +116,7 @@ export const AppNavMobile = ({ isMenuOpen, onMenuOpenChange }: AppNavMobileProps
diff --git a/apps/remix/app/components/general/branding-logo-icon.tsx b/apps/remix/app/components/general/branding-logo-icon.tsx
index 0357d6bfd8..3f631e46d8 100644
--- a/apps/remix/app/components/general/branding-logo-icon.tsx
+++ b/apps/remix/app/components/general/branding-logo-icon.tsx
@@ -8,8 +8,8 @@ export type LogoProps = HTMLAttributes;
export const BrandingLogoIcon = ({ className, ...props }: LogoProps) => {
return (
<>
-
-
+
+
>
);
};
diff --git a/apps/remix/app/components/general/branding-logo.tsx b/apps/remix/app/components/general/branding-logo.tsx
index 88a9cdaa0e..d006745803 100644
--- a/apps/remix/app/components/general/branding-logo.tsx
+++ b/apps/remix/app/components/general/branding-logo.tsx
@@ -8,8 +8,8 @@ export type LogoProps = HTMLAttributes;
export const BrandingLogo = ({ className, ...props }: LogoProps) => {
return (
<>
-
-
+
+
>
);
};
diff --git a/apps/remix/app/components/general/document/document-certificate-qr-view.tsx b/apps/remix/app/components/general/document/document-certificate-qr-view.tsx
index 51301fe2db..35112c146c 100644
--- a/apps/remix/app/components/general/document/document-certificate-qr-view.tsx
+++ b/apps/remix/app/components/general/document/document-certificate-qr-view.tsx
@@ -76,7 +76,7 @@ export const DocumentCertificateQRView = ({
- This document is available in your Keep Contracts account. You can view more details, recipients, and
+ This document is available in your KeepContracts account. You can view more details, recipients, and
audit logs there.
diff --git a/apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx b/apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
index fa616b2c7d..2d74900416 100644
--- a/apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
+++ b/apps/remix/app/components/general/envelope-editor/envelope-editor-settings-dialog.tsx
@@ -775,7 +775,7 @@ export const EnvelopeEditorSettingsDialog = ({ trigger, ...props }: EnvelopeEdit
))}
- Keep Contracts
+ KeepContracts
diff --git a/apps/remix/app/components/general/organisations/organisation-billing-banner.tsx b/apps/remix/app/components/general/organisations/organisation-billing-banner.tsx
index 8f8af7f47b..7fea12eaeb 100644
--- a/apps/remix/app/components/general/organisations/organisation-billing-banner.tsx
+++ b/apps/remix/app/components/general/organisations/organisation-billing-banner.tsx
@@ -128,7 +128,7 @@ export const OrganisationBillingBanner = () => {
- Your plan is no longer valid. Please subscribe to a new plan to continue using Keep Contracts.
+ Your plan is no longer valid. Please subscribe to a new plan to continue using KeepContracts.
diff --git a/apps/remix/app/components/marketing/Features.tsx b/apps/remix/app/components/marketing/Features.tsx
index 0277da8b0b..e556e54c92 100644
--- a/apps/remix/app/components/marketing/Features.tsx
+++ b/apps/remix/app/components/marketing/Features.tsx
@@ -78,7 +78,7 @@ export function Features() {
centered
eyebrow="Features"
title="Everything you need to get documents signed"
- description="From the first upload to the final signature — Keep Contracts covers the whole workflow without getting in your way."
+ description="From the first upload to the final signature — KeepContracts covers the whole workflow without getting in your way."
/>
diff --git a/apps/remix/app/components/marketing/MarketingFooter.tsx b/apps/remix/app/components/marketing/MarketingFooter.tsx
index 16e8745016..dd762ba040 100644
--- a/apps/remix/app/components/marketing/MarketingFooter.tsx
+++ b/apps/remix/app/components/marketing/MarketingFooter.tsx
@@ -34,7 +34,7 @@ export function MarketingFooter() {
diff --git a/apps/remix/app/components/marketing/MarketingHeader.tsx b/apps/remix/app/components/marketing/MarketingHeader.tsx
index abc8f4a16b..6d184208f4 100644
--- a/apps/remix/app/components/marketing/MarketingHeader.tsx
+++ b/apps/remix/app/components/marketing/MarketingHeader.tsx
@@ -39,7 +39,7 @@ export function MarketingHeader() {
>
{/* biome-ignore lint/a11y/useValidAnchor: real href for pre-hydration/no-JS fallback; onClick upgrades to a JS scroll to avoid a ScrollRestoration/native-hash-nav race (see scroll-to-section.ts) */}
- scrollToSection(event, 'top')} aria-label="Keep Contracts home">
+ scrollToSection(event, 'top')} aria-label="KeepContracts home">
diff --git a/apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx b/apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
index 1cdcb57cd1..3f31700e92 100644
--- a/apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
+++ b/apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx
@@ -60,7 +60,7 @@ export default function SupportPage() {
- Read our documentation to get started with Keep Contracts.
+ Read our documentation to get started with KeepContracts.
{organisation && IS_BILLING_ENABLED() && subscriptionStatus && (
diff --git a/apps/remix/app/routes/_profile+/p.$url.tsx b/apps/remix/app/routes/_profile+/p.$url.tsx
index bee5aab1b3..fd4de3fd02 100644
--- a/apps/remix/app/routes/_profile+/p.$url.tsx
+++ b/apps/remix/app/routes/_profile+/p.$url.tsx
@@ -113,7 +113,7 @@ export default function PublicProfilePage({ loaderData }: Route.ComponentProps)
{!user?.id && (
- While waiting for them to do so you can create your own Keep Contracts account and get started with
+ While waiting for them to do so you can create your own KeepContracts account and get started with
document signing right away.
diff --git a/apps/remix/app/routes/_recipient+/_layout.tsx b/apps/remix/app/routes/_recipient+/_layout.tsx
index 8686c2e458..710b43f5da 100644
--- a/apps/remix/app/routes/_recipient+/_layout.tsx
+++ b/apps/remix/app/routes/_recipient+/_layout.tsx
@@ -12,7 +12,7 @@ import type { Route } from './+types/_layout';
export function meta() {
return [
- { title: i18n._(msg`Sign Document - Keep Contracts`) },
+ { title: i18n._(msg`Sign Document - KeepContracts`) },
{ name: 'robots', content: 'noindex, nofollow, noarchive, nosnippet, noimageindex' },
];
}
diff --git a/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx b/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
index 793efb5004..ae0e9f9bb7 100644
--- a/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
+++ b/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx
@@ -455,7 +455,7 @@ const SigningPageV1 = ({ data }: { data: Awaited
Want to send slick signing links like this one?{' '}
- Check out Keep Contracts
+ Check out KeepContracts
.
@@ -554,7 +554,7 @@ const SigningPageV2 = ({ data }: { data: Awaited
Want to send slick signing links like this one?{' '}
- Check out Keep Contracts
+ Check out KeepContracts
.
diff --git a/apps/remix/app/routes/_share+/share.$slug.tsx b/apps/remix/app/routes/_share+/share.$slug.tsx
index a742ac1742..374ca422b5 100644
--- a/apps/remix/app/routes/_share+/share.$slug.tsx
+++ b/apps/remix/app/routes/_share+/share.$slug.tsx
@@ -12,15 +12,15 @@ export function meta({ params: { slug } }: Route.MetaArgs) {
}
return [
- { title: 'Keep Contracts - Share' },
- { description: 'I just signed a document in style with Keep Contracts!' },
+ { title: 'KeepContracts - Share' },
+ { description: 'I just signed a document in style with KeepContracts!' },
{
property: 'og:title',
- content: 'Keep Contracts - Join the open source signing revolution',
+ content: 'KeepContracts - Join the open source signing revolution',
},
{
property: 'og:description',
- content: 'I just signed with Keep Contracts!',
+ content: 'I just signed with KeepContracts!',
},
{
property: 'og:type',
@@ -53,7 +53,7 @@ export const loader = async ({ request, params: { slug } }: Route.LoaderArgs) =>
return {};
}
- // Is hardcoded because this whole meta is hardcoded anyway for Keep Contracts.
+ // Is hardcoded because this whole meta is hardcoded anyway for KeepContracts.
throw redirect('https://keepcontracts.com');
};
diff --git a/apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx b/apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
index f4152d088c..6ad7dca715 100644
--- a/apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
+++ b/apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx
@@ -16,7 +16,7 @@ export default function SignatureDisclosure() {
- Thank you for using Keep Contracts to perform your electronic document signing. The purpose of this
+ Thank you for using KeepContracts to perform your electronic document signing. The purpose of this
disclosure is to inform you about the process, legality, and your rights regarding the use of electronic
signatures on our platform. By opting to use an electronic signature, you are agreeing to the terms and
conditions outlined below.
@@ -127,7 +127,7 @@ export default function SignatureDisclosure() {
- By proceeding to use the electronic signature service provided by Keep Contracts, you affirm that you have
+ By proceeding to use the electronic signature service provided by KeepContracts, you affirm that you have
read and understood this disclosure. You agree to all terms and conditions related to the use of electronic
signatures and electronic transactions as outlined herein.
diff --git a/apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx b/apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
index 1cf4acc247..481d7dec65 100644
--- a/apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
+++ b/apps/remix/app/routes/_unauthenticated+/o.$orgUrl.signin.tsx
@@ -204,7 +204,7 @@ export default function OrganisationSignIn({ loaderData }: Route.ComponentProps)
- Return to Keep Contracts sign in page here
+ Return to KeepContracts sign in page here
- Your email has been successfully confirmed! You can now use all features of Keep Contracts.
+ Your email has been successfully confirmed! You can now use all features of KeepContracts.
- Keep Contracts does not currently use a third-party payment processor. If billing is introduced in the future,
+ KeepContracts does not currently use a third-party payment processor. If billing is introduced in the future,
this Policy will be updated to name the relevant provider before it is used.
@@ -119,7 +119,7 @@ export default function PrivacyPage() {
9. Children's Privacy
- Keep Contracts is not intended for use by anyone under 18. We do not knowingly collect personal information
+ KeepContracts is not intended for use by anyone under 18. We do not knowingly collect personal information
from children.
diff --git a/apps/remix/app/routes/terms.tsx b/apps/remix/app/routes/terms.tsx
index 33170f43d7..8551627365 100644
--- a/apps/remix/app/routes/terms.tsx
+++ b/apps/remix/app/routes/terms.tsx
@@ -32,14 +32,14 @@ export default function TermsPage() {
- These Terms of Service ("Terms") govern your access to and use of Keep Contracts (the "Service"), operated by
+ These Terms of Service ("Terms") govern your access to and use of KeepContracts (the "Service"), operated by
DataThink ("DataThink," "we," "us," or "our"). By creating an account or otherwise using the Service, you
agree to these Terms. If you do not agree, do not use the Service.
1. The Service
- Keep Contracts is a document preparation, electronic signature, and contract management platform. We may add,
+ KeepContracts is a document preparation, electronic signature, and contract management platform. We may add,
change, or remove features over time.
@@ -78,14 +78,14 @@ export default function TermsPage() {
6. Fees
- Keep Contracts is not currently a paid product. If paid plans are introduced in the future, this section will
+ KeepContracts is not currently a paid product. If paid plans are introduced in the future, this section will
be updated and you will be notified in advance of any charges.
7. Intellectual Property
- Keep Contracts, DataThink, and associated names and logos are the property of DataThink. Nothing in these
- Terms grants you any right to use our trademarks or branding without prior written permission.
+ KeepContracts, DataThink, and associated names and logos are the property of DataThink. Nothing in these Terms
+ grants you any right to use our trademarks or branding without prior written permission.
8. Termination
diff --git a/apps/remix/app/utils/meta.ts b/apps/remix/app/utils/meta.ts
index 6ceddb5692..ab6e46225f 100644
--- a/apps/remix/app/utils/meta.ts
+++ b/apps/remix/app/utils/meta.ts
@@ -1,11 +1,11 @@
import { i18n, type MessageDescriptor } from '@lingui/core';
export const appMetaTags = (title?: MessageDescriptor) => {
- const description = 'Keep Contracts — simple, secure document signing for your team.';
+ const description = 'KeepContracts — simple, secure document signing for your team.';
return [
{
- title: title ? `${i18n._(title)} | Keep Contracts` : 'Keep Contracts',
+ title: title ? `${i18n._(title)} | KeepContracts` : 'KeepContracts',
},
{
name: 'description',
@@ -13,7 +13,7 @@ export const appMetaTags = (title?: MessageDescriptor) => {
},
{
name: 'keywords',
- content: 'Keep Contracts, document signing, secure contracts, DataThink',
+ content: 'KeepContracts, document signing, secure contracts, DataThink',
},
{
name: 'author',
@@ -25,7 +25,7 @@ export const appMetaTags = (title?: MessageDescriptor) => {
},
{
property: 'og:title',
- content: 'Keep Contracts',
+ content: 'KeepContracts',
},
{
property: 'og:description',
diff --git a/docker/testing/compose.yml b/docker/testing/compose.yml
index 0276cfd886..8b2626a768 100644
--- a/docker/testing/compose.yml
+++ b/docker/testing/compose.yml
@@ -45,7 +45,7 @@ services:
- NEXT_PRIVATE_SMTP_PORT=2500
- NEXT_PRIVATE_SMTP_USERNAME=keepcontracts
- NEXT_PRIVATE_SMTP_PASSWORD=password
- - NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Keep Contracts"
+ - NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ KeepContracts"
- NEXT_PRIVATE_SMTP_FROM_ADDRESS=noreply@keepcontracts.com
- NEXT_PRIVATE_SIGNING_LOCAL_FILE_PATH=/opt/keepcontracts/cert.p12
ports:
diff --git a/packages/api/v1/openapi.ts b/packages/api/v1/openapi.ts
index 33560676fc..836385d657 100644
--- a/packages/api/v1/openapi.ts
+++ b/packages/api/v1/openapi.ts
@@ -8,10 +8,10 @@ export const OpenAPIV1 = Object.assign(
ApiContractV1,
{
info: {
- title: 'Keep Contracts API',
+ title: 'KeepContracts API',
version: '1.0.0',
description:
- 'API V1 is deprecated, but will continue to be supported. For more details, see https://docs.documenso.com/developers/public-api. \n\nThe Keep Contracts API for retrieving, creating, updating and deleting documents.',
+ 'API V1 is deprecated, but will continue to be supported. For more details, see https://docs.documenso.com/developers/public-api. \n\nThe KeepContracts API for retrieving, creating, updating and deleting documents.',
},
servers: [
{
diff --git a/packages/assets/branding/README.md b/packages/assets/branding/README.md
index 0c8e24ef28..135bf099cb 100644
--- a/packages/assets/branding/README.md
+++ b/packages/assets/branding/README.md
@@ -1,6 +1,6 @@
# Brand source files
-This folder is the single source of truth for Keep Contracts logo/icon artwork.
+This folder is the single source of truth for KeepContracts logo/icon artwork.
- `logo-light.svg` / `logo-dark.svg` — full combo mark (icon + wordmark), for light-background and dark-background contexts respectively.
- `icon-light.svg` / `icon-dark.svg` — icon-only mark, for light-background and dark-background contexts respectively. Also used as the source for the browser favicon and app-icon tiles.
diff --git a/packages/email/template-components/template-admin-user-created.tsx b/packages/email/template-components/template-admin-user-created.tsx
index 9084e75373..d90f406a17 100644
--- a/packages/email/template-components/template-admin-user-created.tsx
+++ b/packages/email/template-components/template-admin-user-created.tsx
@@ -15,11 +15,11 @@ export const TemplateAdminUserCreated = ({ resetPasswordLink, assetBaseUrl }: Te
- Welcome to Keep Contracts!
+ Welcome to KeepContracts!
- An administrator has created a Keep Contracts account for you.
+ An administrator has created a KeepContracts account for you.
diff --git a/packages/email/template-components/template-branding-logo.tsx b/packages/email/template-components/template-branding-logo.tsx
index 827430007a..70ab01d018 100644
--- a/packages/email/template-components/template-branding-logo.tsx
+++ b/packages/email/template-components/template-branding-logo.tsx
@@ -12,7 +12,7 @@ export type TemplateBrandingLogoProps = {
*
* - When custom branding is enabled with a logo, the branding logo is shown.
* If a safe (http/https) Brand Website is configured, the logo links to it.
- * - Otherwise the Keep Contracts logo is shown.
+ * - Otherwise the KeepContracts logo is shown.
*/
export const TemplateBrandingLogo = ({ assetBaseUrl, className = 'mb-4 h-6' }: TemplateBrandingLogoProps) => {
const branding = useBranding();
@@ -22,7 +22,7 @@ export const TemplateBrandingLogo = ({ assetBaseUrl, className = 'mb-4 h-6' }: T
if (!hasCustomBrandingLogo) {
const documensoLogoUrl = new URL('/static/logo.png?v=2', assetBaseUrl).toString();
- return ;
+ return ;
}
const brandingLogo = ;
diff --git a/packages/email/template-components/template-confirmation-email.tsx b/packages/email/template-components/template-confirmation-email.tsx
index 00140ceeae..c84e716483 100644
--- a/packages/email/template-components/template-confirmation-email.tsx
+++ b/packages/email/template-components/template-confirmation-email.tsx
@@ -15,7 +15,7 @@ export const TemplateConfirmationEmail = ({ confirmationLink, assetBaseUrl }: Te
- Welcome to Keep Contracts!
+ Welcome to KeepContracts!
diff --git a/packages/email/template-components/template-document-image.tsx b/packages/email/template-components/template-document-image.tsx
index 71ab0c9a9f..9364594c04 100644
--- a/packages/email/template-components/template-document-image.tsx
+++ b/packages/email/template-components/template-document-image.tsx
@@ -16,7 +16,7 @@ export const TemplateDocumentImage = ({ assetBaseUrl, className }: TemplateDocum
-
+
diff --git a/packages/email/template-components/template-footer.tsx b/packages/email/template-components/template-footer.tsx
index ac9447fe18..951cf49230 100644
--- a/packages/email/template-components/template-footer.tsx
+++ b/packages/email/template-components/template-footer.tsx
@@ -31,7 +31,7 @@ export const TemplateFooter = ({ isDocument = true, reportUrl }: TemplateFooterP
{isDocument && !branding.brandingHidePoweredBy && (
- This document was sent using Keep Contracts.
+ This document was sent using KeepContracts.
)}
diff --git a/packages/email/templates/admin-user-created.tsx b/packages/email/templates/admin-user-created.tsx
index e9272ec526..120fafddcf 100644
--- a/packages/email/templates/admin-user-created.tsx
+++ b/packages/email/templates/admin-user-created.tsx
@@ -12,7 +12,7 @@ export const AdminUserCreatedTemplate = ({
}: TemplateAdminUserCreatedProps) => {
const { _ } = useLingui();
- const previewText = msg`Set your password for Keep Contracts`;
+ const previewText = msg`Set your password for KeepContracts`;
const getAssetUrl = (path: string) => {
return new URL(path, assetBaseUrl).toString();
@@ -27,7 +27,7 @@ export const AdminUserCreatedTemplate = ({
-
+
diff --git a/packages/email/templates/confirm-team-email.tsx b/packages/email/templates/confirm-team-email.tsx
index 8f265b7edf..64fcfee67e 100644
--- a/packages/email/templates/confirm-team-email.tsx
+++ b/packages/email/templates/confirm-team-email.tsx
@@ -25,7 +25,7 @@ export const ConfirmTeamEmailTemplate = ({
}: ConfirmTeamEmailProps) => {
const { _ } = useLingui();
- const previewText = msg`Accept team email request for ${teamName} on Keep Contracts`;
+ const previewText = msg`Accept team email request for ${teamName} on KeepContracts`;
return (
@@ -49,7 +49,7 @@ export const ConfirmTeamEmailTemplate = ({
{teamName} has requested to use your email address for their team
- on Keep Contracts.
+ on KeepContracts.
@@ -78,7 +78,7 @@ export const ConfirmTeamEmailTemplate = ({
- You can revoke access at any time in your team settings on Keep Contracts{' '}
+ You can revoke access at any time in your team settings on KeepContracts{' '}
here.
diff --git a/packages/email/templates/organisation-account-link-confirmation.tsx b/packages/email/templates/organisation-account-link-confirmation.tsx
index 844b3147aa..704e48c0b4 100644
--- a/packages/email/templates/organisation-account-link-confirmation.tsx
+++ b/packages/email/templates/organisation-account-link-confirmation.tsx
@@ -25,7 +25,7 @@ export const OrganisationAccountLinkConfirmationTemplate = ({
const previewText =
type === 'create'
? msg`A request has been made to create an account for you`
- : msg`A request has been made to link your Keep Contracts account`;
+ : msg`A request has been made to link your KeepContracts account`;
return (
@@ -46,7 +46,7 @@ export const OrganisationAccountLinkConfirmationTemplate = ({
{type === 'create' ? (
Account creation request
) : (
- Link your Keep Contracts account
+ Link your KeepContracts account
)}
@@ -87,7 +87,7 @@ export const OrganisationAccountLinkConfirmationTemplate = ({
- You can unlink your account at any time in your security settings on Keep Contracts{' '}
+ You can unlink your account at any time in your security settings on KeepContracts{' '}
here.
diff --git a/packages/email/templates/organisation-invite.tsx b/packages/email/templates/organisation-invite.tsx
index a3f034882c..a8cfc429d7 100644
--- a/packages/email/templates/organisation-invite.tsx
+++ b/packages/email/templates/organisation-invite.tsx
@@ -24,7 +24,7 @@ export const OrganisationInviteEmailTemplate = ({
}: OrganisationInviteEmailProps) => {
const { _ } = useLingui();
- const previewText = msg`Accept invitation to join an organisation on Keep Contracts`;
+ const previewText = msg`Accept invitation to join an organisation on KeepContracts`;
return (
@@ -42,7 +42,7 @@ export const OrganisationInviteEmailTemplate = ({
- Join {organisationName} on Keep Contracts
+ Join {organisationName} on KeepContracts
diff --git a/packages/email/templates/organisation-join.tsx b/packages/email/templates/organisation-join.tsx
index 6876de2f02..022f45cde9 100644
--- a/packages/email/templates/organisation-join.tsx
+++ b/packages/email/templates/organisation-join.tsx
@@ -26,7 +26,7 @@ export const OrganisationJoinEmailTemplate = ({
}: OrganisationJoinEmailProps) => {
const { _ } = useLingui();
- const previewText = msg`A member has joined your organisation on Keep Contracts`;
+ const previewText = msg`A member has joined your organisation on KeepContracts`;
return (
diff --git a/packages/email/templates/organisation-leave.tsx b/packages/email/templates/organisation-leave.tsx
index b3cefc0017..bcb77b7023 100644
--- a/packages/email/templates/organisation-leave.tsx
+++ b/packages/email/templates/organisation-leave.tsx
@@ -26,7 +26,7 @@ export const OrganisationLeaveEmailTemplate = ({
}: OrganisationLeaveEmailProps) => {
const { _ } = useLingui();
- const previewText = msg`A member has left your organisation on Keep Contracts`;
+ const previewText = msg`A member has left your organisation on KeepContracts`;
return (
diff --git a/packages/email/templates/team-email-removed.tsx b/packages/email/templates/team-email-removed.tsx
index dd1afbf5a6..2d2318cfea 100644
--- a/packages/email/templates/team-email-removed.tsx
+++ b/packages/email/templates/team-email-removed.tsx
@@ -25,7 +25,7 @@ export const TeamEmailRemovedTemplate = ({
}: TeamEmailRemovedTemplateProps) => {
const { _ } = useLingui();
- const previewText = msg`Team email removed for ${teamName} on Keep Contracts`;
+ const previewText = msg`Team email removed for ${teamName} on KeepContracts`;
return (
diff --git a/packages/lib/constants/email.ts b/packages/lib/constants/email.ts
index c14b15fb2f..2cda799c9a 100644
--- a/packages/lib/constants/email.ts
+++ b/packages/lib/constants/email.ts
@@ -1,7 +1,7 @@
import { env } from '../utils/env';
export const FROM_ADDRESS = env('NEXT_PRIVATE_SMTP_FROM_ADDRESS') || 'noreply@keepcontracts.com';
-export const FROM_NAME = env('NEXT_PRIVATE_SMTP_FROM_NAME') || 'Keep Contracts';
+export const FROM_NAME = env('NEXT_PRIVATE_SMTP_FROM_NAME') || 'KeepContracts';
export const KEEPCONTRACTS_INTERNAL_EMAIL = {
name: FROM_NAME,
diff --git a/packages/lib/jobs/definitions/emails/send-admin-user-created-email.handler.ts b/packages/lib/jobs/definitions/emails/send-admin-user-created-email.handler.ts
index 63020a7436..e64aa31359 100644
--- a/packages/lib/jobs/definitions/emails/send-admin-user-created-email.handler.ts
+++ b/packages/lib/jobs/definitions/emails/send-admin-user-created-email.handler.ts
@@ -60,7 +60,7 @@ export const run = async ({ payload, io }: { payload: TSendAdminUserCreatedEmail
name: user.name || '',
},
from: KEEPCONTRACTS_INTERNAL_EMAIL,
- subject: i18n._(msg`Welcome to Keep Contracts`),
+ subject: i18n._(msg`Welcome to KeepContracts`),
html,
text,
});
diff --git a/packages/lib/server-only/2fa/email/generate-2fa-credentials-from-email.ts b/packages/lib/server-only/2fa/email/generate-2fa-credentials-from-email.ts
index d7fdc7caa0..015bb7253d 100644
--- a/packages/lib/server-only/2fa/email/generate-2fa-credentials-from-email.ts
+++ b/packages/lib/server-only/2fa/email/generate-2fa-credentials-from-email.ts
@@ -4,7 +4,7 @@ import { createTOTPKeyURI } from 'oslo/otp';
import { DOCUMENSO_ENCRYPTION_KEY } from '../../../constants/crypto';
-const ISSUER = 'Keep Contracts Email 2FA';
+const ISSUER = 'KeepContracts Email 2FA';
export type GenerateTwoFactorCredentialsFromEmailOptions = {
envelopeId: string;
diff --git a/packages/lib/server-only/2fa/setup-2fa.ts b/packages/lib/server-only/2fa/setup-2fa.ts
index a90fc284c2..589efdb1a1 100644
--- a/packages/lib/server-only/2fa/setup-2fa.ts
+++ b/packages/lib/server-only/2fa/setup-2fa.ts
@@ -11,7 +11,7 @@ type SetupTwoFactorAuthenticationOptions = {
user: Pick;
};
-const ISSUER = 'Keep Contracts';
+const ISSUER = 'KeepContracts';
export const setupTwoFactorAuthentication = async ({ user }: SetupTwoFactorAuthenticationOptions) => {
const key = DOCUMENSO_ENCRYPTION_KEY;
diff --git a/packages/lib/server-only/organisation/create-organisation-member-invites.ts b/packages/lib/server-only/organisation/create-organisation-member-invites.ts
index d4f868394a..88a6096115 100644
--- a/packages/lib/server-only/organisation/create-organisation-member-invites.ts
+++ b/packages/lib/server-only/organisation/create-organisation-member-invites.ts
@@ -217,7 +217,7 @@ export const sendOrganisationMemberInviteEmail = async ({
await emailTransport.sendMail({
to: email,
from: senderEmail,
- subject: i18n._(msg`You have been invited to join ${organisation.name} on Keep Contracts`),
+ subject: i18n._(msg`You have been invited to join ${organisation.name} on KeepContracts`),
html,
text,
});
diff --git a/packages/lib/server-only/team/create-team-email-verification.ts b/packages/lib/server-only/team/create-team-email-verification.ts
index 3030b939df..50fc4d500e 100644
--- a/packages/lib/server-only/team/create-team-email-verification.ts
+++ b/packages/lib/server-only/team/create-team-email-verification.ts
@@ -138,7 +138,7 @@ export const sendTeamEmailVerificationEmail = async (email: string, token: strin
await emailTransport.sendMail({
to: email,
from: senderEmail,
- subject: i18n._(msg`A request to use your email has been initiated by ${team.name} on Keep Contracts`),
+ subject: i18n._(msg`A request to use your email has been initiated by ${team.name} on KeepContracts`),
html,
text,
});
diff --git a/packages/lib/server-only/team/delete-team.ts b/packages/lib/server-only/team/delete-team.ts
index bd734b227d..dc421ec53f 100644
--- a/packages/lib/server-only/team/delete-team.ts
+++ b/packages/lib/server-only/team/delete-team.ts
@@ -138,7 +138,7 @@ export const sendTeamDeleteEmail = async ({ email, team, organisationId }: SendT
await emailTransport.sendMail({
to: email,
from: senderEmail,
- subject: i18n._(msg`Team "${team.name}" has been deleted on Keep Contracts`),
+ subject: i18n._(msg`Team "${team.name}" has been deleted on KeepContracts`),
html,
text,
});
diff --git a/packages/lib/utils/authenticator.ts b/packages/lib/utils/authenticator.ts
index a928491d8e..06eff1622e 100644
--- a/packages/lib/utils/authenticator.ts
+++ b/packages/lib/utils/authenticator.ts
@@ -9,7 +9,7 @@ export const getAuthenticatorOptions = () => {
const rpId = webAppBaseUrl.hostname;
return {
- rpName: 'Keep Contracts',
+ rpName: 'KeepContracts',
rpId,
origin: NEXT_PUBLIC_WEBAPP_URL(),
timeout: PASSKEY_TIMEOUT,
diff --git a/packages/signing/index.ts b/packages/signing/index.ts
index 0e7322d5bf..84840afc1c 100644
--- a/packages/signing/index.ts
+++ b/packages/signing/index.ts
@@ -42,7 +42,7 @@ export const signPdf = async ({ pdf }: SignOptions) => {
const { bytes } = await pdf.sign({
signer,
- reason: 'Signed by Keep Contracts',
+ reason: 'Signed by KeepContracts',
location: NEXT_PUBLIC_WEBAPP_URL(),
contactInfo: NEXT_PUBLIC_SIGNING_CONTACT_INFO(),
subFilter: NEXT_PRIVATE_USE_LEGACY_SIGNING_SUBFILTER() ? 'adbe.pkcs7.detached' : 'ETSI.CAdES.detached',
diff --git a/packages/trpc/server/open-api.ts b/packages/trpc/server/open-api.ts
index d8d5386d33..6375b08e89 100644
--- a/packages/trpc/server/open-api.ts
+++ b/packages/trpc/server/open-api.ts
@@ -5,9 +5,9 @@ import { appRouter } from './router';
export const openApiDocument = {
...generateOpenApiDocument(appRouter, {
- title: 'Keep Contracts v2 API',
+ title: 'KeepContracts v2 API',
description:
- 'Welcome to the Keep Contracts v2 API.\n\nThis API provides access to our system, which you can use to integrate applications, automate workflows, or build custom tools.',
+ 'Welcome to the KeepContracts v2 API.\n\nThis API provides access to our system, which you can use to integrate applications, automate workflows, or build custom tools.',
version: '1.0.0',
baseUrl: `${NEXT_PUBLIC_WEBAPP_URL()}/api/v2`,
securitySchemes: {
diff --git a/packages/ui/components/document/document-share-button.tsx b/packages/ui/components/document/document-share-button.tsx
index b0e089c060..657f9b5144 100644
--- a/packages/ui/components/document/document-share-button.tsx
+++ b/packages/ui/components/document/document-share-button.tsx
@@ -105,7 +105,7 @@ export const DocumentShareButton = ({ token, documentId, className, trigger }: D
window.open(
generateTwitterIntent(
- `I just ${token ? 'signed' : 'sent'} a document with Keep Contracts. Check it out!`,
+ `I just ${token ? 'signed' : 'sent'} a document with KeepContracts. Check it out!`,
`${NEXT_PUBLIC_WEBAPP_URL()}/share/${slug}`,
),
'_blank',
@@ -149,7 +149,7 @@ export const DocumentShareButton = ({ token, documentId, className, trigger }: D
- I just {token ? 'signed' : 'sent'} a document with Keep Contracts. Check it out!
+ I just {token ? 'signed' : 'sent'} a document with KeepContracts. Check it out!
Date: Thu, 30 Jul 2026 13:10:26 -0600
Subject: [PATCH 2/7] chore: added terms
---
.../components/marketing/MarketingFooter.tsx | 8 +
apps/remix/app/routes/terms.tsx | 217 +++++++++++++-----
2 files changed, 168 insertions(+), 57 deletions(-)
diff --git a/apps/remix/app/components/marketing/MarketingFooter.tsx b/apps/remix/app/components/marketing/MarketingFooter.tsx
index dd762ba040..114f2ac1a4 100644
--- a/apps/remix/app/components/marketing/MarketingFooter.tsx
+++ b/apps/remix/app/components/marketing/MarketingFooter.tsx
@@ -34,6 +34,14 @@ export function MarketingFooter() {
diff --git a/apps/remix/app/routes/terms.tsx b/apps/remix/app/routes/terms.tsx
index 8551627365..3d33066df8 100644
--- a/apps/remix/app/routes/terms.tsx
+++ b/apps/remix/app/routes/terms.tsx
@@ -1,4 +1,3 @@
-import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert';
import { msg } from '@lingui/core/macro';
import { Link } from 'react-router';
@@ -16,111 +15,215 @@ export default function TermsPage() {
-
- Draft — not yet reviewed
-
- This is a placeholder draft generated to unblock development. It has not been reviewed by a lawyer and
- contains bracketed placeholders that must be filled in before this page is used with real users. Remove this
- notice once finalized.
-
-
-
Terms of Service
- Effective date: [INSERT EFFECTIVE DATE]
+ Last updated: July 30, 2026
+
+
+
+ These Terms of Service ("Terms") form a binding agreement between you and DataThink LLC ("DataThink," "we,"
+ "us," or "our") and govern your access to and use of KeepContracts, our document preparation, electronic
+ signature, and contract management platform available at keepcontracts.com (the "Service").
+
+
+ By creating an account or using the Service, you agree to these Terms and to our Privacy Policy. If you do not
+ agree, do not use the Service.
+
1. Eligibility and Acceptance
- These Terms of Service ("Terms") govern your access to and use of KeepContracts (the "Service"), operated by
- DataThink ("DataThink," "we," "us," or "our"). By creating an account or otherwise using the Service, you
- agree to these Terms. If you do not agree, do not use the Service.
+ You must be at least 18 years old and able to form a binding contract to use the Service. If you use the
+ Service on behalf of an organization, you represent that you are authorized to bind that organization to these
+ Terms, and "you" refers to both you and that organization.
-
1. The Service
+
2. The Service
- KeepContracts is a document preparation, electronic signature, and contract management platform. We may add,
- change, or remove features over time.
+ KeepContracts lets you and your organization prepare documents, collect electronic signatures, and manage
+ contracts, recipients, and templates. We may add, change, or remove features at any time, and we may set
+ limits on usage to keep the Service reliable and secure.
-
2. Accounts
+
3. Accounts and Security
-
You must provide accurate information when creating an account and keep it up to date.
+
You must provide accurate and complete information when creating an account and keep it up to date.
- You are responsible for safeguarding your account credentials and for all activity under your account.
+ You are responsible for safeguarding your credentials and for all activity that occurs under your account.
- You must be at least 18 years old, or the age of legal majority in your jurisdiction, to use the Service.
+ Notify us promptly at mangelsona@datathink.dev if you suspect
+ unauthorized use of your account.
+
You may verify your email address and use multi-step verification features where offered.
-
3. Acceptable Use
-
You agree not to use the Service to:
+
4. Organizations, Roles, and Members
+
+ The Service is organized into organizations, which may have administrators and members. Administrators can
+ invite and remove members, assign roles, manage teams, and configure document and signing settings.
+
+
+ If you are an administrator, you are responsible for your organization's use of the Service, including
+ managing member access and the accuracy and lawfulness of the documents your organization sends and signs. If
+ you are a member, your access is determined by your administrators.
+
+
+
5. Your Content and Data
+
+ You retain ownership of the content and data you submit to the Service, including documents, fields,
+ recipients, and signatures ("Your Content"). You grant us a limited, non-exclusive license to host, process,
+ and display Your Content solely to provide and improve the Service.
+
+
+ You are responsible for the accuracy and legality of Your Content. When you enter personal information about
+ other people, such as recipients or signers, you represent that you have the right to provide that information
+ and to allow us to process it as described in our Privacy Policy.
+
+
+
6. Acceptable Use
+
You agree not to:
-
Violate any applicable law or the rights of others;
-
Upload content you do not have the right to share or that infringes another party's rights;
-
Interfere with, disrupt, or attempt to gain unauthorized access to the Service or its systems.
+
Use the Service in violation of any applicable law or regulation;
+
Access or use another user's account or data without authorization;
+
Upload malicious code or attempt to disrupt, overload, or impair the Service;
+
Probe, scan, or test the vulnerability of the Service, or circumvent its security or access controls;
+
Scrape, harvest, or collect data from the Service by automated means without our permission;
+
Resell or commercially exploit the Service except as expressly permitted.
-
4. Your Content and Documents
+
7. AI-Assisted Features
- You retain all ownership rights in the documents, signatures, and other content you upload or create using the
- Service ("Your Content"). You grant DataThink a limited license to host, process, store, and transmit Your
- Content solely to provide the Service to you. You are solely responsible for the accuracy, legality, and
- appropriateness of Your Content.
+ The Service can use generative AI to suggest form fields and recipients within uploaded documents. These
+ suggestions are produced automatically, may contain errors, and are provided for your convenience only. You
+ are responsible for reviewing and confirming them before sending a document, and they do not constitute legal
+ advice about the placement or sufficiency of any field or signature.
-
5. Electronic Signatures
+
8. Documents, Signatures, and Records
- The Service allows you to collect and apply electronic signatures. You are responsible for determining whether
- an electronic signature is legally sufficient for your particular use case and jurisdiction.
+ The Service helps you prepare, send, and execute documents electronically, but you are solely responsible for
+ determining whether an electronic signature is legally sufficient for your particular use case and
+ jurisdiction, and for the accuracy of the documents you create. DataThink is not a party to any agreement
+ between you and your recipients or counterparties and is not responsible for enforcing or resolving disputes
+ arising from such agreements.
-
6. Fees
+
9. Fees
KeepContracts is not currently a paid product. If paid plans are introduced in the future, this section will
- be updated and you will be notified in advance of any charges.
+ be updated and you will be notified in advance of any charges. Unless required by law, fees are
+ non-refundable.
+
+
+
10. Third-Party Services
+
+ The Service relies on third-party providers, such as hosting, email delivery, document conversion,
+ authentication, and generative AI providers, and may let you sign in using third-party accounts such as
+ Google. Your use of those services may be subject to their own terms and privacy policies, and we are not
+ responsible for third-party services.
+
+
+
11. Intellectual Property
+
+ The Service, including its design, branding, and the KeepContracts and DataThink names and logos, is owned by
+ DataThink and protected by intellectual property laws. Except for the rights expressly granted to you in these
+ Terms — including the open source rights described in Section 12 — we reserve all rights in the Service. You
+ may not use our trademarks without our prior written permission.
+
+
+
12. Open Source Software
+
+ KeepContracts is built on{' '}
+
+ Documenso
+
+ , which we use and modify under the GNU Affero General Public License v3.0 ("AGPL-3.0"). The AGPL-3.0 governs
+ your rights in that underlying software independently of these Terms, which govern your use of the hosted
+ Service. Nothing in these Terms limits any right you have under the AGPL-3.0, including the right to obtain,
+ inspect, modify, and redistribute the corresponding source code.
+
- KeepContracts, DataThink, and associated names and logos are the property of DataThink. Nothing in these Terms
- grants you any right to use our trademarks or branding without prior written permission.
+ You may stop using the Service at any time and may delete your account from the settings page. We may suspend
+ or terminate your access if you violate these Terms, if required by law, or if necessary to protect the
+ Service or other users.
+
+
+ Upon termination, your right to use the Service ends. Sections of these Terms that by their nature should
+ survive termination, including ownership, disclaimers, limitation of liability, and indemnification, will
+ continue to apply. Our handling of your data after termination is described in our Privacy Policy.
-
8. Termination
+
14. Disclaimers
- You may stop using the Service and request deletion of your account at any time. We may suspend or terminate
- accounts that violate these Terms.
+ The Service is provided "as is" and "as available" without warranties of any kind, whether express, implied,
+ or statutory, including any implied warranties of merchantability, fitness for a particular purpose, and
+ non-infringement. We do not warrant that the Service will be uninterrupted, error-free, or secure, or that any
+ content or output will be accurate.
-
9. Disclaimer of Warranties
+
15. Limitation of Liability
+
+ To the maximum extent permitted by law, DataThink and its affiliates will not be liable for any indirect,
+ incidental, special, consequential, or punitive damages, or for any loss of profits, revenue, data, or
+ goodwill, arising out of or relating to your use of the Service.
+
- The Service is provided "as is" and "as available," without warranties of any kind, to the fullest extent
- permitted by law.
+ To the maximum extent permitted by law, our total liability for any claim arising out of or relating to the
+ Service will not exceed the greater of the amount you paid us for the Service in the twelve months before the
+ claim or one hundred US dollars (US$100).
-
10. Limitation of Liability
+
16. Indemnification
- To the maximum extent permitted by law, DataThink will not be liable for any indirect, incidental, special, or
- consequential damages arising from your use of the Service.
+ You agree to indemnify and hold harmless DataThink and its affiliates from any claims, damages, liabilities,
+ and expenses (including reasonable legal fees) arising out of your use of the Service, Your Content, or your
+ violation of these Terms or applicable law.
-
11. Governing Law
+
17. Governing Law and Disputes
- These Terms are governed by the laws of [INSERT STATE/COUNTRY], without regard to its conflict of law
- principles. Any disputes arising from these Terms will be resolved in the courts located in [INSERT
- JURISDICTION/VENUE].
+ These Terms are governed by the laws of the State of Idaho, United States, without regard to its conflict of
+ law rules. You agree that any dispute arising out of or relating to these Terms or the Service will be subject
+ to the exclusive jurisdiction of the state and federal courts located in Idaho, and you consent to personal
+ jurisdiction there.
-
12. Changes to These Terms
+
18. Changes to These Terms
- We may update these Terms from time to time. Continued use of the Service after changes take effect
- constitutes acceptance of the revised Terms.
+ We may update these Terms from time to time. When we do, we will revise the "Last updated" date above and, for
+ material changes, provide additional notice where required. Your continued use of the Service after an update
+ means you accept the revised Terms.
-
13. Contact
-
Questions about these Terms can be sent to [INSERT CONTACT EMAIL].
+
19. General
+
+
+ These Terms, together with the Privacy Policy, are the entire agreement between you and DataThink regarding
+ the Service.
+
+
If any provision is found unenforceable, the remaining provisions will remain in effect.
+
Our failure to enforce any right or provision is not a waiver of it.
+
+ You may not assign these Terms without our consent; we may assign them in connection with a merger,
+ acquisition, or sale of assets.
+
);
From bd7c1c70f324e316b7c11a9956c958ee6e9abf35 Mon Sep 17 00:00:00 2001
From: Austin Mangelson
Date: Thu, 30 Jul 2026 13:19:37 -0600
Subject: [PATCH 3/7] chore: small edits to terms
---
apps/remix/app/routes/terms.tsx | 47 ++++++++++++++++++++++-----------
1 file changed, 31 insertions(+), 16 deletions(-)
diff --git a/apps/remix/app/routes/terms.tsx b/apps/remix/app/routes/terms.tsx
index 3d33066df8..530f094f2a 100644
--- a/apps/remix/app/routes/terms.tsx
+++ b/apps/remix/app/routes/terms.tsx
@@ -81,7 +81,16 @@ export default function TermsPage() {
and to allow us to process it as described in our Privacy Policy.
-
6. Acceptable Use
+
6. Confidentiality
+
+ Documents and other non-public information exchanged through the Service may be confidential. Each party will
+ protect the other's confidential information with at least the same degree of care it uses to protect its own
+ confidential information, and in no event with less than a reasonable degree of care, and will use it only as
+ necessary to provide or use the Service. This does not apply to information that is or becomes publicly
+ available through no fault of the receiving party, or that must be disclosed by law.
+
+
+
7. Acceptable Use
You agree not to:
Use the Service in violation of any applicable law or regulation;
@@ -92,7 +101,7 @@ export default function TermsPage() {
Resell or commercially exploit the Service except as expressly permitted.
-
7. AI-Assisted Features
+
8. AI-Assisted Features
The Service can use generative AI to suggest form fields and recipients within uploaded documents. These
suggestions are produced automatically, may contain errors, and are provided for your convenience only. You
@@ -100,7 +109,7 @@ export default function TermsPage() {
advice about the placement or sufficiency of any field or signature.
-
8. Documents, Signatures, and Records
+
9. Documents, Signatures, and Records
The Service helps you prepare, send, and execute documents electronically, but you are solely responsible for
determining whether an electronic signature is legally sufficient for your particular use case and
@@ -109,14 +118,14 @@ export default function TermsPage() {
arising from such agreements.
-
9. Fees
+
10. Fees
KeepContracts is not currently a paid product. If paid plans are introduced in the future, this section will
be updated and you will be notified in advance of any charges. Unless required by law, fees are
non-refundable.
-
10. Third-Party Services
+
11. Third-Party Services
The Service relies on third-party providers, such as hosting, email delivery, document conversion,
authentication, and generative AI providers, and may let you sign in using third-party accounts such as
@@ -124,15 +133,15 @@ export default function TermsPage() {
responsible for third-party services.
-
11. Intellectual Property
+
12. Intellectual Property
The Service, including its design, branding, and the KeepContracts and DataThink names and logos, is owned by
DataThink and protected by intellectual property laws. Except for the rights expressly granted to you in these
- Terms — including the open source rights described in Section 12 — we reserve all rights in the Service. You
+ Terms — including the open source rights described in Section 13 — we reserve all rights in the Service. You
may not use our trademarks without our prior written permission.
+ If you send us suggestions, ideas, or other feedback about the Service, you agree that we may use it for any
+ purpose, including to improve the Service, without any obligation to compensate you.
+
+
+
15. Termination
You may stop using the Service at any time and may delete your account from the settings page. We may suspend
or terminate your access if you violate these Terms, if required by law, or if necessary to protect the
@@ -163,7 +178,7 @@ export default function TermsPage() {
continue to apply. Our handling of your data after termination is described in our Privacy Policy.
-
14. Disclaimers
+
16. Disclaimers
The Service is provided "as is" and "as available" without warranties of any kind, whether express, implied,
or statutory, including any implied warranties of merchantability, fitness for a particular purpose, and
@@ -171,7 +186,7 @@ export default function TermsPage() {
content or output will be accurate.
-
15. Limitation of Liability
+
17. Limitation of Liability
To the maximum extent permitted by law, DataThink and its affiliates will not be liable for any indirect,
incidental, special, consequential, or punitive damages, or for any loss of profits, revenue, data, or
@@ -183,14 +198,14 @@ export default function TermsPage() {
claim or one hundred US dollars (US$100).
-
16. Indemnification
+
18. Indemnification
You agree to indemnify and hold harmless DataThink and its affiliates from any claims, damages, liabilities,
and expenses (including reasonable legal fees) arising out of your use of the Service, Your Content, or your
violation of these Terms or applicable law.
-
17. Governing Law and Disputes
+
19. Governing Law and Disputes
These Terms are governed by the laws of the State of Idaho, United States, without regard to its conflict of
law rules. You agree that any dispute arising out of or relating to these Terms or the Service will be subject
@@ -198,14 +213,14 @@ export default function TermsPage() {
jurisdiction there.
-
18. Changes to These Terms
+
20. Changes to These Terms
We may update these Terms from time to time. When we do, we will revise the "Last updated" date above and, for
material changes, provide additional notice where required. Your continued use of the Service after an update
means you accept the revised Terms.
-
19. General
+
21. General
These Terms, together with the Privacy Policy, are the entire agreement between you and DataThink regarding
@@ -219,7 +234,7 @@ export default function TermsPage() {
-
20. Contact Us
+
22. Contact Us
If you have questions about these Terms, contact us at{' '}
mangelsona@datathink.dev.
From 75afe95dab8d072c77990b31f65844eab665ad33 Mon Sep 17 00:00:00 2001
From: Austin Mangelson
Date: Thu, 30 Jul 2026 13:44:23 -0600
Subject: [PATCH 4/7] chore: terms and privacy set and linked
---
apps/remix/app/components/forms/signup.tsx | 14 ++
.../app/components/general/app-nav-mobile.tsx | 9 ++
.../components/marketing/MarketingFooter.tsx | 19 +++
apps/remix/app/routes/privacy.tsx | 125 ++++++++++--------
4 files changed, 114 insertions(+), 53 deletions(-)
diff --git a/apps/remix/app/components/forms/signup.tsx b/apps/remix/app/components/forms/signup.tsx
index bc81260b0b..d930ba9691 100644
--- a/apps/remix/app/components/forms/signup.tsx
+++ b/apps/remix/app/components/forms/signup.tsx
@@ -371,6 +371,20 @@ export const SignUpForm = ({
Create account
)}
+
+
+
+ By creating an account, you agree to our{' '}
+
+ Terms of Service
+ {' '}
+ and{' '}
+
+ Privacy Policy
+
+ .
+
+
diff --git a/apps/remix/app/components/general/app-nav-mobile.tsx b/apps/remix/app/components/general/app-nav-mobile.tsx
index 538d369a39..c25be2e88c 100644
--- a/apps/remix/app/components/general/app-nav-mobile.tsx
+++ b/apps/remix/app/components/general/app-nav-mobile.tsx
@@ -120,6 +120,15 @@ export const AppNavMobile = ({ isMenuOpen, onMenuOpenChange }: AppNavMobileProps
All rights reserved.
+
+
+
+ Terms
+
+
+ Privacy
+
+
diff --git a/apps/remix/app/components/marketing/MarketingFooter.tsx b/apps/remix/app/components/marketing/MarketingFooter.tsx
index 114f2ac1a4..5c5b839fcb 100644
--- a/apps/remix/app/components/marketing/MarketingFooter.tsx
+++ b/apps/remix/app/components/marketing/MarketingFooter.tsx
@@ -1,3 +1,5 @@
+import { Link } from 'react-router';
+
import { BrandingLogo } from '~/components/general/branding-logo';
import { scrollToSection } from './scroll-to-section';
@@ -7,6 +9,11 @@ const PRODUCT_LINKS = [
{ label: 'How it works', href: '#how-it-works' },
];
+const LEGAL_LINKS = [
+ { label: 'Terms of Service', href: '/terms' },
+ { label: 'Privacy Policy', href: '/privacy' },
+];
+
export function MarketingFooter() {
return (