Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ NEXT_PRIVATE_SMTP_SECURE=
# OPTIONAL: if this is true and NEXT_PRIVATE_SMTP_SECURE is false then TLS is not used even if the server supports STARTTLS extension
NEXT_PRIVATE_SMTP_UNSAFE_IGNORE_TLS=
# REQUIRED: Defines the sender name to use for the from address.
NEXT_PRIVATE_SMTP_FROM_NAME="Keep Contracts"
NEXT_PRIVATE_SMTP_FROM_NAME="KeepContracts"
# REQUIRED: Defines the email address to use as the from address.
NEXT_PRIVATE_SMTP_FROM_ADDRESS="noreply@keepcontracts.com"
# OPTIONAL: Defines the service for nodemailer
Expand Down
3 changes: 3 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"recommendations": ["biomejs.biome", "Prisma.prisma", "spencerwmiles.vscode-task-buttons"]
}
19 changes: 18 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,22 @@
},
"[json]": {
"editor.defaultFormatter": "vscode.json-language-features"
}
},
"VsCodeTaskButtons.tasks": [
{ "label": "$(play) Dev", "task": "Dev", "tooltip": "Start the dev server" },
{
"label": "$(check) PR Checks",
"task": "PR Checks",
"tooltip": "Run lint, typecheck, unit tests, and build (mirrors CI)"
},
{ "label": "$(wrench) Lint Fix", "task": "Lint: Fix", "tooltip": "Auto-fix lint issues" },
{ "label": "$(beaker) Test", "task": "Test", "tooltip": "Run unit tests (vitest)" },
{
"label": "$(beaker) Test: E2E",
"task": "Test: E2E",
"tooltip": "Run the full Playwright E2E suite (matches CI)"
},
{ "label": "$(database) DB Up", "task": "DB: Up", "tooltip": "Start local Docker database" },
{ "label": "$(table) Prisma Studio", "task": "Prisma Studio", "tooltip": "Open Prisma Studio" }
]
}
72 changes: 72 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Dev",
"type": "npm",
"script": "dev",
"isBackground": true,
"presentation": {
"reveal": "always",
"panel": "dedicated"
},
"problemMatcher": []
},
{
"label": "Lint",
"type": "npm",
"script": "lint",
"problemMatcher": []
},
{
"label": "Lint: Fix",
"type": "npm",
"script": "lint:fix",
"problemMatcher": []
},
{
"label": "Typecheck",
"type": "shell",
"command": "npm run typecheck -w @documenso/remix",
"problemMatcher": ["$tsc"]
},
{
"label": "Build",
"type": "npm",
"script": "build",
"problemMatcher": []
},
{
"label": "Test",
"type": "shell",
"command": "npx turbo run test",
"problemMatcher": []
},
{
"label": "Test: E2E",
"type": "npm",
"script": "ci",
"detail": "Rebuilds the app and runs the full Playwright suite (matches CI) — requires the local DB to be up",
"problemMatcher": []
},
{
"label": "DB: Up",
"type": "npm",
"script": "dx:up",
"problemMatcher": []
},
{
"label": "Prisma Studio",
"type": "npm",
"script": "prisma:studio",
"isBackground": true,
"problemMatcher": []
},
{
"label": "PR Checks",
"dependsOn": ["Lint", "Typecheck", "Test", "Build"],
"dependsOrder": "sequence",
"problemMatcher": []
}
]
}
10 changes: 5 additions & 5 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions CODE_STYLE.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
2 changes: 1 addition & 1 deletion apps/docs/src/app/og/docs/[...slug]/route.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export async function GET(_req: Request, { params }: RouteContext<'/og/docs/[...
}}
>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src={logoSrc} alt="Keep Contracts" height={28} />
<img src={logoSrc} alt="KeepContracts" height={28} />
<span
style={{
color: '#D4D4D8',
Expand Down
2 changes: 1 addition & 1 deletion apps/docs/src/lib/layout.shared.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export function baseOptions(): BaseLayoutProps {
transform="matrix(-0.195024,-0.378544,-0.378544,0.195024,756.376578,447.744850)"
/>
</svg>
Keep Contracts
KeepContracts
</span>
),
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ export const AccountDeleteDialog = ({ className }: AccountDeleteDialogProps) =>

<DialogDescription>
<Trans>
Keep Contracts will delete <span className="font-semibold">all of your documents</span>, along with
KeepContracts will delete <span className="font-semibold">all of your documents</span>, along with
all of your completed documents, signatures, and all other resources belonging to your Account.
</Trans>
</DialogDescription>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ export const EnvelopeDistributeDialog = ({
</SelectItem>
))}

<SelectItem value={'-1'}>Keep Contracts</SelectItem>
<SelectItem value={'-1'}>KeepContracts</SelectItem>
</SelectContent>
</Select>
</FormControl>
Expand Down
2 changes: 1 addition & 1 deletion apps/remix/app/components/dialogs/token-create-dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ export const TokenCreateDialog = ({ trigger, ...props }: TokenCreateDialogProps)
</DialogTitle>

<DialogDescription>
<Trans>Use API tokens to authenticate with the Keep Contracts API.</Trans>
<Trans>Use API tokens to authenticate with the KeepContracts API.</Trans>
</DialogDescription>
</DialogHeader>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ export const WebhookCreateDialog = ({ trigger, ...props }: WebhookCreateDialogPr
</FormControl>

<FormDescription>
<Trans>The URL for Keep Contracts to send webhook events to.</Trans>
<Trans>The URL for KeepContracts to send webhook events to.</Trans>
</FormDescription>

<FormMessage />
Expand Down
2 changes: 1 addition & 1 deletion apps/remix/app/components/dialogs/webhook-edit-dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ export const WebhookEditDialog = ({ trigger, webhook, ...props }: WebhookEditDia
</FormControl>

<FormDescription>
<Trans>The URL for Keep Contracts to send webhook events to.</Trans>
<Trans>The URL for KeepContracts to send webhook events to.</Trans>
</FormDescription>

<FormMessage />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const EmbedDocumentCompleted = ({ name, signature }: EmbedDocumentComplet
<div className="mt-8 w-full max-w-md">
<SigningCard3D
className="mx-auto w-full"
name={name || 'Keep Contracts'}
name={name || 'KeepContracts'}
signature={signature}
signingCelebrationImage={signingCelebration}
/>
Expand Down
14 changes: 14 additions & 0 deletions apps/remix/app/components/forms/signup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,20 @@ export const SignUpForm = ({
<Trans>Create account</Trans>
</Button>
)}

<p className="text-center text-muted-foreground text-xs">
<Trans>
By creating an account, you agree to our{' '}
<Link to="/terms" className="underline hover:text-foreground">
Terms of Service
</Link>{' '}
and{' '}
<Link to="/privacy" className="underline hover:text-foreground">
Privacy Policy
</Link>
.
</Trans>
</p>
</form>
</Form>
</div>
Expand Down
2 changes: 1 addition & 1 deletion apps/remix/app/components/general/admin-license-card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ export const AdminLicenseCard = ({ licenseData }: AdminLicenseCardProps) => {
</div>

<h3 className="mb-2 flex items-end font-medium text-foreground text-sm leading-tight">
<Trans>Keep Contracts License</Trans>
<Trans>KeepContracts License</Trans>
</h3>

{match(license.status)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,11 @@ export const AdminLicenseStatusBanner = ({ license }: AdminLicenseStatusBannerPr
.with('UNAUTHORIZED', () =>
license ? (
<Trans>
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.
</Trans>
) : (
<Trans>Missing License - Your Keep Contracts instance is using features that require a license.</Trans>
<Trans>Missing License - Your KeepContracts instance is using features that require a license.</Trans>
),
)
.otherwise(() => null)}
Expand Down
11 changes: 10 additions & 1 deletion apps/remix/app/components/general/app-nav-mobile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,19 @@ export const AppNavMobile = ({ isMenuOpen, onMenuOpenChange }: AppNavMobileProps
</div>

<p className="text-muted-foreground text-sm">
© {new Date().getFullYear()} Keep Contracts, Inc.
© {new Date().getFullYear()} KeepContracts, Inc.
<br />
<Trans>All rights reserved.</Trans>
</p>

<p className="flex gap-x-3 text-muted-foreground text-sm">
<Link to="/terms" className="hover:text-foreground">
<Trans>Terms</Trans>
</Link>
<Link to="/privacy" className="hover:text-foreground">
<Trans>Privacy</Trans>
</Link>
</p>
</div>
</SheetContent>
</Sheet>
Expand Down
4 changes: 2 additions & 2 deletions apps/remix/app/components/general/branding-logo-icon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ export type LogoProps = HTMLAttributes<HTMLImageElement>;
export const BrandingLogoIcon = ({ className, ...props }: LogoProps) => {
return (
<>
<img src={IconLight} alt="Keep Contracts" className={cn(className, 'dark:hidden')} {...props} />
<img src={IconDark} alt="Keep Contracts" className={cn(className, 'hidden dark:block')} {...props} />
<img src={IconLight} alt="KeepContracts" className={cn(className, 'dark:hidden')} {...props} />
<img src={IconDark} alt="KeepContracts" className={cn(className, 'hidden dark:block')} {...props} />
</>
);
};
4 changes: 2 additions & 2 deletions apps/remix/app/components/general/branding-logo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ export type LogoProps = HTMLAttributes<HTMLImageElement>;
export const BrandingLogo = ({ className, ...props }: LogoProps) => {
return (
<>
<img src={LogoLight} alt="Keep Contracts" className={cn(className, 'dark:hidden')} {...props} />
<img src={LogoDark} alt="Keep Contracts" className={cn(className, 'hidden dark:block')} {...props} />
<img src={LogoLight} alt="KeepContracts" className={cn(className, 'dark:hidden')} {...props} />
<img src={LogoDark} alt="KeepContracts" className={cn(className, 'hidden dark:block')} {...props} />
</>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export const DocumentCertificateQRView = ({

<DialogDescription>
<Trans>
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.
</Trans>
</DialogDescription>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -775,7 +775,7 @@ export const EnvelopeEditorSettingsDialog = ({ trigger, ...props }: EnvelopeEdit
</SelectItem>
))}

<SelectItem value={'-1'}>Keep Contracts</SelectItem>
<SelectItem value={'-1'}>KeepContracts</SelectItem>
</SelectContent>
</Select>
</FormControl>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ export const OrganisationBillingBanner = () => {

<DialogDescription>
<Trans>
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.
</Trans>
</DialogDescription>
</DialogHeader>
Expand Down
2 changes: 1 addition & 1 deletion apps/remix/app/components/marketing/Features.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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."
/>
</motion.div>
<motion.div
Expand Down
2 changes: 1 addition & 1 deletion apps/remix/app/components/marketing/HowItWorks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export function HowItWorks() {
centered
eyebrow="How it works"
title="From upload to signed in three steps"
description="Keep Contracts keeps the workflow frictionless, so getting a document signed takes minutes, not days."
description="KeepContracts keeps the workflow frictionless, so getting a document signed takes minutes, not days."
/>
</motion.div>

Expand Down
Loading
Loading