diff --git a/.env.example b/.env.example index f723e1c66a..cfd45e9ee2 100644 --- a/.env.example +++ b/.env.example @@ -43,9 +43,9 @@ NEXT_PRIVATE_WEBHOOK_SSRF_BYPASS_HOSTS= PORT=3000 # [[DATABASE]] -NEXT_PRIVATE_DATABASE_URL="postgres://documenso:password@127.0.0.1:54320/documenso" +NEXT_PRIVATE_DATABASE_URL="postgres://keepcontracts:password@127.0.0.1:54320/keepcontracts" # Defines the URL to use for the database when running migrations and other commands that won't work with a connection pool. -NEXT_PRIVATE_DIRECT_DATABASE_URL="postgres://documenso:password@127.0.0.1:54320/documenso" +NEXT_PRIVATE_DIRECT_DATABASE_URL="postgres://keepcontracts:password@127.0.0.1:54320/keepcontracts" # [[SIGNING]] # The transport to use for document signing. Available options: local (default) | gcloud-hsm @@ -114,9 +114,9 @@ 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="Documenso" +NEXT_PRIVATE_SMTP_FROM_NAME="Keep Contracts" # REQUIRED: Defines the email address to use as the from address. -NEXT_PRIVATE_SMTP_FROM_ADDRESS="noreply@documenso.com" +NEXT_PRIVATE_SMTP_FROM_ADDRESS="noreply@keepcontracts.com" # OPTIONAL: Defines the service for nodemailer NEXT_PRIVATE_SMTP_SERVICE= # OPTIONAL: The API key to use for Resend.com diff --git a/CLA.md b/CLA.md deleted file mode 100644 index 9bdc1bd2b3..0000000000 --- a/CLA.md +++ /dev/null @@ -1,45 +0,0 @@ -# Documenso Contributors License Agreement - -This Contributors License Agreement ("CLA") is entered into between the Contributor, and Documenso Inc. ("Documenso"), collectively referred to as the "Parties." - -## Background: - -Documenso is an open-source project aimed at providing an open-source document signing platform for all parties. This CLA governs the rights and contributions made by the Contributor to the Documenso project. - -## Agreement: - -**Contributor Grant of License:** - -By submitting code, documentation, or any other materials (collectively, "Contributions") to the Documenso project, the Contributor grants Documenso a perpetual, worldwide, non-exclusive, royalty-free, sublicensable license to use, modify, distribute, and otherwise exploit the Contributions, including any intellectual property rights therein, for the purposes of the Documenso project. - -**Representation of Ownership and Right to Contribute:** - -The Contributor represents that they have the legal right to grant the license stated in Section 1, and that the Contributions do not infringe upon the intellectual property rights of any third party. The Contributor also represents that they have the authority to submit the Contributions on their own behalf or, if applicable, on behalf of their employer or any other entity. - -**Patent Grant:** - -If the Contributions include any method, process, or apparatus that is covered by a patent, the Contributor agrees to grant Documenso a non-exclusive, worldwide, royalty-free license under any patent claims necessary to use, modify, distribute, and otherwise exploit the Contributions for the purposes of the Documenso project. - -**No Implied Warranties or Support:** - -The Contributor acknowledges that the Contributions are provided "as is," without any warranties or support of any kind. Documenso shall have no obligation to provide maintenance, updates, bug fixes, or support for the Contributions. - -**Retention of Contributor Rights:** - -The Contributor retains all right, title, and interest in and to their Contributions. This CLA does not restrict the Contributor from using their own Contributions for any other purpose. - -**Governing Law:** - -This CLA shall be governed by and construed in accordance with the laws of California (CA), without regard to its conflict of laws principles. - -**Entire Agreement:** - -This CLA constitutes the entire agreement between the Parties with respect to the subject matter hereof and supersedes all prior and contemporaneous understandings, agreements, representations, and warranties. - -**Acceptance:** - -By submitting Contributions to the Documenso project, the Contributor acknowledges and agrees to the terms and conditions of this CLA. If the Contributor is agreeing to this CLA on behalf of an entity, they represent that they have the necessary authority to bind that entity to these terms. - -**Effective Date:** - -This CLA is effective as of the date of the first Contribution made by the Contributor to the Documenso project. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 5cf6aad4ef..0000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,126 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, caste, color, religion, or sexual -identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -- Focusing on what is best not just for us as individuals, but for the overall - community - -Examples of unacceptable behavior include: - -- The use of sexualized language or imagery, and sexual attention or advances of - any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others' private information, such as a physical or email address, - without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -support@documenso.com. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series of -actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or permanent -ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within the -community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.1, available at -[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at -[https://www.contributor-covenant.org/translations][translations]. diff --git a/CODE_STYLE.md b/CODE_STYLE.md index c58c7255fe..435ad64a77 100644 --- a/CODE_STYLE.md +++ b/CODE_STYLE.md @@ -1,6 +1,6 @@ -# Documenso Code Style Guide +# Keep Contracts Code Style Guide -This document captures the code style, patterns, and conventions used in the Documenso 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 Keep Contracts codebase. It covers both enforceable rules and subjective "taste" elements that make our code consistent and maintainable. ## Table of Contents diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 5cd7a6887c..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,108 +0,0 @@ -# Contributing to Documenso - -If you plan to contribute to Documenso, please take a moment to feel awesome ✨ People like you are what open source is about ♥. Any contributions, no matter how big or small, are highly appreciated. - -## Before getting started - -- Before jumping into a PR be sure to search [existing PRs](https://github.com/documenso/documenso/pulls) or [issues](https://github.com/documenso/documenso/issues) for an open or closed item that relates to your submission. -- Select an issue from [here](https://github.com/documenso/documenso/issues) or create a new one -- Consider the results from the discussion on the issue -- Accept the [Contributor License Agreement](https://documen.so/cla) to ensure we can accept your contributions. - -## English only PRs and Issues - -Please write all issues, pull requests, and related comments in English so maintainers and the wider contributor community can follow the discussion. - -## Taking issues - -Before taking an issue, ensure that: - -- The issue has been assigned the public label -- The issue is clearly defined and understood -- No one has been assigned to the issue -- No one has expressed intention to work on it - -You can then: - -1. Comment on the issue with your intention to work on it -2. Begin work on the issue - -Always feel free to ask questions or seek clarification on the issue. - -## Developing - -The development branch is main. All pull requests should be made against this branch. If you need help getting started, [join us on Discord](https://documen.so/discord). - -1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your - own GitHub account and then - [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device. -2. Create a new branch: - -- Create a new branch (include the issue id and something readable): - - ```sh - git checkout -b feat/doc-999-somefeature-that-rocks - ``` - -3. See the [Developer Setup](https://github.com/documenso/documenso/blob/main/README.md#developer-setup) for more setup details. - -## Building - -> **Note** -> Please ensure you can make a full production build before pushing code or creating PRs. - -You can build the project with: - -```bash -npm run build -``` - -## AI-Assisted Development with OpenCode - -We use [OpenCode](https://opencode.ai) for AI-assisted development. OpenCode provides custom commands and skills to help maintain consistency and streamline common workflows. - -OpenCode works with most major AI providers (Anthropic, OpenAI, Google, etc.) or you can use [Zen](https://opencode.ai/zen) for optimized coding models. Configure your preferred provider in the OpenCode settings. - -> **Important**: All AI-generated code must be thoroughly reviewed by the contributor before submitting a PR. You are responsible for understanding and validating every line of code you submit. If we detect that contributors are simply throwing AI-generated code over the wall without proper review, they will be blocked from the repository. - -### Getting Started - -1. Install OpenCode (see [opencode.ai](https://opencode.ai) for other install methods): - ```bash - curl -fsSL https://opencode.ai/install | bash - ``` -2. Configure your AI provider (or use Zen for optimized models) -3. Run `opencode` in the project root - -### Available Commands - -Use these commands in OpenCode by typing the command name: - -| Command | Description | -| ------------------------------ | -------------------------------------------------------- | -| `/implement ` | Implement a spec from `.agents/plans/` autonomously | -| `/continue ` | Continue implementing a spec from a previous session | -| `/interview ` | Deep-dive interview to flesh out a spec or design | -| `/document ` | Generate MDX documentation for a module or feature | -| `/commit` | Create a conventional commit for staged changes | -| `/create-plan ` | Create a new plan file in `.agents/plans/` | -| `/create-scratch ` | Create a scratch file for notes in `.agents/scratches/` | -| `/create-justification ` | Create a justification file in `.agents/justifications/` | - -### Typical Workflow - -1. **Create a plan**: Use `/create-plan my-feature` to draft a spec for a new feature -2. **Flesh out the spec**: Use `/interview .agents/plans/.md` to refine requirements -3. **Implement**: Use `/implement .agents/plans/.md` to build the feature -4. **Continue if needed**: Use `/continue .agents/plans/.md` to pick up where you left off -5. **Commit**: Use `/commit` to create a conventional commit - -### Agent Files - -The `.agents/` directory stores AI-generated artifacts: - -- **`.agents/plans/`** - Feature specs and implementation plans -- **`.agents/scratches/`** - Temporary notes and explorations -- **`.agents/justifications/`** - Decision rationale and technical justifications - -These files use a unique ID format (`{word}-{word}-{word}-{slug}.md`) to prevent conflicts. diff --git a/MANIFEST.md b/MANIFEST.md deleted file mode 100644 index 2f62eb455f..0000000000 --- a/MANIFEST.md +++ /dev/null @@ -1,6 +0,0 @@ -# The Documenso Manifest -Signing documents is a fundamental building block of private, economic, and government interactions. Access to easy and secure signing to participate in society should therefore be a fundamental right for everyone. The technology to enable this should be accessible and widespread. - -We know that open source is the key to solving this need once and for all to benefit all humankind. Using open source kickstarts innovation by putting the open sharing of ideas and solutions first. With Documenso, we will create an open and globally accessible signing platform to empower users, customers, and developers to fulfill their needs. Documenso is built by and for the global community, listening and implementing what is needed. Being transparent with the code and the processes that use it brings trust and security to the platform. - -We build Documenso for longevity and scale by embracing the capital efficiency and inclusiveness of the Commercial Open Source (COSS) movement. We are building a global commodity for the world. diff --git a/README.md b/README.md index b522205547..f97bf26ea2 100644 --- a/README.md +++ b/README.md @@ -1,227 +1,94 @@ -Documenso Logo - -

-

- The Open Source DocuSign Alternative. -
- Learn more » -
-
- Discord - · - Website - · - Documentation - · - Issues - · - Upcoming Releases - · - Roadmap -

-

- -

- Join Documenso on Discord - Github Stars - License - Commits-per-month - - open in devcontainer - - Contributor Covenant -

- -
- -
- -## About Documenso - -Signing documents digitally should be fast and easy and should be the best practice for every document signed worldwide. This is technically quite easy today, but it also introduces a new party to every signature: The signing tool providers. While this is not a problem in itself, it should make us think about how we want these providers of trust to work. Documenso aims to be the world's most trusted document-signing tool. This trust is built by empowering you to self-host Documenso and review how it works under the hood. - -Join us in creating the next generation of open trust infrastructure. - -## Recognition - -

- Documenso - The open source DocuSign alternative | Product Hunt - Documenso - The Open Source DocuSign Alternative. | Product Hunt -

- -## Community and Next Steps 🎯 - -- Check out the first source code release in this repository and test it. -- Tell us what you think in the [Discussions](https://github.com/documenso/documenso/discussions). -- Join the [Discord server](https://documen.so/discord) for any questions and getting to know to other community members. -- ⭐ the repository to help us raise awareness. -- Spread the word on Twitter that Documenso is working towards a more open signing tool. -- Fix or create [issues](https://github.com/documenso/documenso/issues), that are needed for the first production release. - -## Contributing - -- To contribute, please see our [contribution guide](https://github.com/documenso/documenso/blob/main/CONTRIBUTING.md). - -## Contact us - -Contact us if you are interested in our Enterprise plan for large organizations that need extra flexibility and control. - -Book us with Cal.com +# Keep Contracts -## Tech Stack +Simple, secure document signing for DataThink's internal teams and products. -

- TypeScript - Made with Prisma - Tailwind CSS - - - - - -

- -- [Typescript](https://www.typescriptlang.org/) - Language -- [ReactRouter](https://reactrouter.com/) - Framework -- [Prisma](https://www.prisma.io/) - ORM -- [Tailwind](https://tailwindcss.com/) - CSS -- [shadcn/ui](https://ui.shadcn.com/) - Component Library -- [react-email](https://react.email/) - Email Templates -- [tRPC](https://trpc.io/) - API -- [@documenso/pdf-sign](https://www.npmjs.com/package/@documenso/pdf-sign) - PDF Signatures (launching soon) -- [React-PDF](https://github.com/wojtekmaj/react-pdf) - Viewing PDFs -- [PDF-Lib](https://github.com/Hopding/pdf-lib) - PDF manipulation -- [Stripe](https://stripe.com/) - Payments - - +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). -## Local Development +## About -### Requirements +Keep Contracts powers document signing workflows across DataThink's products. It is not a public SaaS product; accounts are provisioned by DataThink admins. -To run Documenso locally, you will need +Documents are sent and managed via API. End recipients (contractors, parents, etc.) sign through a standard signing link without needing a Keep Contracts account. -- Node.js (v22 or above) -- Postgres SQL Database -- Docker (optional) +## Tech Stack + +- [TypeScript](https://www.typescriptlang.org/) — Language +- [React Router v7](https://reactrouter.com/) — Framework +- [Prisma](https://www.prisma.io/) — ORM +- [PostgreSQL](https://www.postgresql.org/) — Database +- [Tailwind CSS](https://tailwindcss.com/) — Styling +- [shadcn/ui](https://ui.shadcn.com/) — Component library +- [react-email](https://react.email/) — Email templates +- [tRPC](https://trpc.io/) — API layer +- [Turborepo](https://turbo.build/) — Monorepo build system -### Developer Quickstart +## Local Development -> **Note**: This is a quickstart for developers. It assumes that you have both [docker](https://docs.docker.com/get-docker/) and [docker-compose](https://docs.docker.com/compose/) installed on your machine. +### Requirements -Want to get up and running quickly? Follow these steps: +- Node.js v22+ +- Docker and Docker Compose -1. [Fork this repository](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/about-forks) to your GitHub account. +### Quickstart -After forking the repository, clone it to your local device by using the following command: +1. Clone the repo and copy the env file: ```sh -git clone https://github.com//documenso +cp .env.example .env ``` -2. Set up your `.env` file using the recommendations in the `.env.example` file. Alternatively, just run `cp .env.example .env` to get started with our handpicked defaults. +2. Start the database, mail catcher, and S3-compatible storage: -3. Run `npm run dx` in the root directory +```sh +npm run dx +``` - - This will spin up a postgres database and inbucket mailserver in a docker container. +3. Start the dev server: -4. Run `npm run dev` in the root directory +```sh +npm run dev +``` -5. Want it even faster? Just use +Or run both at once: ```sh npm run d ``` -#### Access Points for Your Application - -1. **App** - http://localhost:3000 -2. **Incoming Mail Access** - http://localhost:9000 -3. **Database Connection Details** - - - **Port**: 54320 - - **Connection**: Use your favorite database client to connect using the provided port. - -4. **S3 Storage Dashboard** - http://localhost:9001 - -## Developer Setup - -### Manual Setup - -Follow the [manual setup guide](https://docs.documenso.com/docs/developers/local-development/manual) to configure Documenso on your local machine. - -### Run in Gitpod - -- Click below to launch a ready-to-use Gitpod workspace in your browser. - -[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/documenso/documenso) - -### Run in DevContainer - -We support DevContainers for VSCode. [Click here to get started.](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/documenso/documenso) - -### Video walkthrough +### Local Access Points -If you're a visual learner and prefer to watch a video walkthrough of setting up Documenso locally, check out this video: +| Service | URL | +|---|---| +| App | http://localhost:3000 | +| Email (Inbucket) | http://localhost:9000 | +| S3 dashboard (MinIO) | http://localhost:9001 | +| Database | `postgres://keepcontracts:password@127.0.0.1:54320/keepcontracts` | -[![Watch the video](https://img.youtube.com/vi/Y0ppIQrEnZs/hqdefault.jpg)](https://youtu.be/Y0ppIQrEnZs) +### Test Login -## Docker - -We provide official Docker images on [DockerHub](https://hub.docker.com/r/documenso/documenso) and [GitHub Container Registry](https://ghcr.io/documenso/documenso). - -For setup instructions, see the [Docker Deployment](https://docs.documenso.com/docs/self-hosting/deployment/docker) and [Docker Compose](https://docs.documenso.com/docs/self-hosting/deployment/docker-compose) guides. - -## Self Hosting - -We support a variety of deployment methods including Docker, Docker Compose, Railway, Kubernetes, and manual deployment. - -For full instructions, requirements, and configuration details, see the [Self Hosting documentation](https://docs.documenso.com/docs/self-hosting). - -### One-Click Deploys - -#### Railway - -[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/DjrRRX?referralCode=EZR3s0&utm_medium=integration&utm_source=template&utm_campaign=generic) - -#### Render - -[![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/documenso/documenso) - -#### Koyeb - -[![Deploy to Koyeb](https://www.koyeb.com/static/images/deploy/button.svg)](https://app.koyeb.com/deploy?type=git&repository=github.com/documenso/documenso&branch=main&name=documenso-app&builder=dockerfile&dockerfile=/docker/Dockerfile) - -#### Elestio - -[![Deploy on Elestio](https://elest.io/images/logos/deploy-to-elestio-btn.png)](https://elest.io/open-source/documenso) - -## Troubleshooting - -For troubleshooting self-hosted deployments, see the [Troubleshooting guide](https://docs.documenso.com/docs/self-hosting/maintenance/troubleshooting) and [Tips & Common Pitfalls](https://docs.documenso.com/docs/self-hosting/getting-started/tips). +``` +Email: example@keepcontracts.com +Password: password +``` -### I'm not receiving any emails when using the developer quickstart. +### Email -When using the developer quickstart, an [Inbucket](https://inbucket.org/) server will be spun up in a docker container that will store all outgoing emails locally for you to view. +Locally, all outgoing email is captured by [Inbucket](https://inbucket.org/) at http://localhost:9000. No real emails are sent. -The Web UI can be found at http://localhost:9000, while the SMTP port will be on localhost:2500. +SMTP credentials in `.env` point to `127.0.0.1:2500`, which is the Inbucket container. -### I can't see environment variables in my package scripts. +### Seeding -Wrap your package script with the `with:env` script like such: +To reset and reseed the local database with sample data: +```sh +npm run prisma:seed ``` -npm run with:env -- npm run myscript -``` - -The same can be done when using `npx` for one of the bin scripts: -``` -npm run with:env -- npx myscript -``` +## Upstream -This will load environment variables from your `.env` and `.env.local` files. +This project is a fork of [documenso/documenso](https://github.com/documenso/documenso) at v2.11.0, licensed under AGPLv3. Upstream documentation is available at [docs.documenso.com](https://docs.documenso.com). -## Repo Activity +## Support -![Repository Activity](https://repobeats.axiom.co/api/embed/622a2e9aa709696f7226304b5b7178a5741b3868.svg) +Internal support: [mangelsona@datathink.dev](mailto:mangelsona@datathink.dev) diff --git a/WRITING_STYLE.md b/WRITING_STYLE.md deleted file mode 100644 index cc9c21419b..0000000000 --- a/WRITING_STYLE.md +++ /dev/null @@ -1,343 +0,0 @@ -# Documentation Writing Style Guide - -This document defines the writing conventions for Documenso documentation. - -Documentation lives in `apps/docs/` as MDX files and uses [Fumadocs](https://fumadocs.dev). - -## Core Principles - -1. **Task-based navigation** - Organize by what users want to do, not by feature hierarchy -2. **Progressive examples** - Start simple, build to complex -3. **Explicit limitations** - List what's NOT supported clearly -4. **Real-world context** - Explain document signing concepts with familiar comparisons - -## Tone - -- Direct and action-oriented -- Second person ("you") with imperative voice -- Technical but accessible -- Acknowledge complexity without condescension -- No emojis or excessive personality - -## Anti-Patterns to Avoid - -- Assuming document signing domain knowledge -- Hiding default values -- Separate "TypeScript" sections (types integrated throughout) -- Monolithic single-page references -- Examples that don't work with current API - -## Documentation Audiences - -The docs serve three distinct audiences: - -1. **Users** - People using the Documenso web application to send and sign documents -2. **Developers** - Building integrations with the API or SDKs -3. **Self-hosters** - Running their own Documenso instance - -Tailor content to the audience: - -- User docs: Focus on UI workflows, no code required -- Developer docs: API/SDK examples, authentication, webhooks -- Self-hosting docs: Deployment, configuration, infrastructure - -## File Structure - -``` -apps/docs/ -├── index.mdx # Landing page with audience navigation -├── getting-started/ # Quick starts for each audience -├── users/ # Application usage guides -│ ├── documents/ # Creating and managing documents -│ ├── templates/ # Working with templates -│ ├── signing/ # Signing documents -│ └── settings/ # Account and team settings -├── developers/ # API and SDK documentation -│ ├── api/ # REST API reference -│ ├── sdk/ # SDK guides -│ ├── webhooks/ # Webhook integration -│ └── examples/ # Code examples and recipes -├── self-hosting/ # Self-hosting documentation -│ ├── deployment/ # Deployment guides -│ ├── configuration/ # Environment and settings -│ └── maintenance/ # Upgrades and backups -├── concepts/ # Shared concepts across audiences -└── migration/ # Migration guides -``` - -Each directory has a `meta.json` controlling navigation order: - -```json -{ - "title": "Section Title", - "pages": ["index", "page-one", "page-two"] -} -``` - -Use `---Label---` for section dividers in `meta.json`. - -## MDX Frontmatter - -Every page needs frontmatter for search and SEO: - -```yaml ---- -title: Working with Pages -description: Add, remove, reorder, copy, and merge PDF pages. ---- -``` - -## Page Structure - -### User Documentation - -```mdx ---- -title: Feature Name -description: Brief description for SEO and previews. ---- - -# Feature Name - -Brief description of what this does and when to use it. - -## Steps - -1. Navigate to **Settings > Feature** -2. Click **Add New** -3. Fill in the required fields - ---- - -## See Also - -- [Related Guide](/docs/users/related) -``` - -### Developer Documentation - -```mdx ---- -title: Feature Name -description: Brief description for SEO and previews. ---- - -# Feature Name - -Brief description of what this does and when to use it. - -## Quick Start - -\`\`\`typescript -// Minimal working example -\`\`\` - ---- - -## Section Name - -Content organized by task or concept. - ---- - -## See Also - -- [Related Guide](/docs/developers/related) -``` - -### Self-Hosting Documentation - -```mdx ---- -title: Configuration Topic -description: Brief description for SEO and previews. ---- - -# Configuration Topic - -Brief description of what this configures. - -## Environment Variables - -| Variable | Required | Default | Description | -| ---------- | -------- | ------- | ------------ | -| `VAR_NAME` | Yes | - | What it does | - ---- - -## See Also - -- [Related Guide](/docs/self-hosting/related) -``` - -## Parameter Tables - -Use Sharp-style nested parameter tables for developer documentation (API/SDK): - -```markdown -### methodName(param, options?) - -Description of what the method does. - -| Param | Type | Default | Description | -| ------------------- | --------- | -------- | --------------------- | -| `param` | `string` | required | What it does | -| `[options]` | `Options` | | | -| `[options.setting]` | `boolean` | `false` | Nested option | -| `[options.timeout]` | `number` | `5000` | Another nested option | - -**Returns**: `Promise` - -**Throws**: - -- `SpecificError` - When something goes wrong -``` - -Key conventions: - -- Square brackets `[param]` indicate optional parameters -- Nested options indented with `[options.name]` pattern -- Always show default values -- Group related options under their parent - -## Code Examples - -For developer documentation, use progressive complexity: - -```typescript -// Basic usage -const document = await documenso.documents.create({ - title: "Contract", - file: pdfBuffer, -}); - -// With recipients -const document = await documenso.documents.create({ - title: "Contract", - file: pdfBuffer, - recipients: [{ email: "signer@example.com", name: "John Doe" }], -}); - -// Full example with error handling -try { - const document = await documenso.documents.create({ - title: "Contract", - file: pdfBuffer, - recipients: [{ email: "signer@example.com", name: "John Doe" }], - }); -} catch (error) { - if (error instanceof DocumentError) { - // Handle document creation error - } -} -``` - -### Example Guidelines - -- All examples must be valid TypeScript -- Show imports when not obvious -- Include expected output in comments where helpful -- Use realistic values, not `foo`/`bar` - -## UI Instructions - -For user documentation, use clear step-by-step instructions: - -- Bold UI elements: **Settings**, **Save**, **Documents** -- Use `>` for navigation paths: **Settings > Team > Members** -- Number sequential steps -- Include screenshots sparingly for complex workflows -- Describe what the user should see after each action - -## Callouts - -Use Fumadocs callouts sparingly for important information: - -```mdx -Informational note about behavior. - -Warning about potential issues or breaking changes. - -Critical warning about data loss or security. -``` - -Reserve callouts for: - -- Beta/unstable features -- Security considerations -- Common mistakes -- Breaking changes - -## Tables - -Use tables for: - -- Feature matrices -- Parameter documentation -- Comparison charts -- Error catalogs - -```markdown -| Feature | Status | Notes | -| ---------------- | ------ | ------------------------ | -| Email signing | Full | All recipient types | -| Embedded signing | Full | Via SDK or direct links | -| Templates | Full | Create and use templates | -``` - -## Linking - -- Link to related docs: `[Documents](/docs/api/documents)` -- Use relative paths within docs -- Add "See Also" sections for discoverability - -## Error Documentation - -Categorize errors by when they occur: - -```markdown -## Document Errors - -Thrown when creating or updating documents. - -### InvalidDocumentError - -Document could not be processed. - -**Common causes:** - -- File is not a valid PDF -- File exceeds size limits - -**Solution:** Verify the file is a valid PDF within size limits. -``` - -## Concept Explanations - -Use analogies for document signing concepts: - -```markdown -Think of a **signing workflow** like passing a physical document around an office. - -Each recipient gets the document in turn, adds their signature or initials, -and passes it to the next person. The **document status** tracks where it -is in this journey. -``` - -## Self-Hosting Specific - -For self-hosting documentation: - -- Always specify required vs optional environment variables -- Include example `.env` snippets -- Document Docker and non-Docker approaches where applicable -- Link to troubleshooting for common deployment issues -- Specify minimum system requirements - -## Maintenance - -- Include types inline so docs don't get stale -- Reference source file locations for complex behavior -- Update examples when API changes -- Test all code examples work -- Keep environment variable documentation in sync with actual defaults diff --git a/apps/remix/app/components/dialogs/account-delete-dialog.tsx b/apps/remix/app/components/dialogs/account-delete-dialog.tsx index d23a0a74b6..25b16f34dc 100644 --- a/apps/remix/app/components/dialogs/account-delete-dialog.tsx +++ b/apps/remix/app/components/dialogs/account-delete-dialog.tsx @@ -103,8 +103,8 @@ export const AccountDeleteDialog = ({ className }: AccountDeleteDialogProps) => - Documenso will delete all of your documents, along with all - of your completed documents, signatures, and all other resources belonging to your Account. + Keep Contracts 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 750ab38f24..7a3b95c9a4 100644 --- a/apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx +++ b/apps/remix/app/components/dialogs/envelope-distribute-dialog.tsx @@ -306,7 +306,7 @@ export const EnvelopeDistributeDialog = ({ ))} - Documenso + Keep Contracts diff --git a/apps/remix/app/components/dialogs/organisation-create-dialog.tsx b/apps/remix/app/components/dialogs/organisation-create-dialog.tsx index 183dfbeecf..da9c2dfd44 100644 --- a/apps/remix/app/components/dialogs/organisation-create-dialog.tsx +++ b/apps/remix/app/components/dialogs/organisation-create-dialog.tsx @@ -30,10 +30,9 @@ import type { MessageDescriptor } from '@lingui/core'; import { msg } from '@lingui/core/macro'; import { Trans, useLingui } from '@lingui/react/macro'; import type * as DialogPrimitive from '@radix-ui/react-dialog'; -import { ExternalLinkIcon } from 'lucide-react'; import { useEffect, useMemo, useState } from 'react'; import { useForm } from 'react-hook-form'; -import { Link, useSearchParams } from 'react-router'; +import { useSearchParams } from 'react-router'; import { match } from 'ts-pattern'; import type { z } from 'zod'; @@ -378,33 +377,6 @@ const BillingPlanForm = ({ value, onChange, plans, canCreateFreeOrganisation }: ))} - - -
-

- Enterprise -

-

- Contact sales here - -

-
- - - -
- - Compare all plans and features in detail - -
); diff --git a/apps/remix/app/components/dialogs/organisation-member-invite-dialog.tsx b/apps/remix/app/components/dialogs/organisation-member-invite-dialog.tsx index a033e7bff2..1df73429c0 100644 --- a/apps/remix/app/components/dialogs/organisation-member-invite-dialog.tsx +++ b/apps/remix/app/components/dialogs/organisation-member-invite-dialog.tsx @@ -233,9 +233,9 @@ export const OrganisationMemberInviteDialog = ({ trigger, ...props }: Organisati const downloadTemplate = () => { const data = [ - { email: 'admin@documenso.com', role: 'Admin' }, - { email: 'manager@documenso.com', role: 'Manager' }, - { email: 'member@documenso.com', role: 'Member' }, + { email: 'admin@keepcontracts.com', role: 'Admin' }, + { email: 'manager@keepcontracts.com', role: 'Manager' }, + { email: 'member@keepcontracts.com', role: 'Member' }, ]; const csvContent = 'Email address,Role\n' + data.map((row) => `${row.email},${row.role}`).join('\n'); @@ -245,7 +245,7 @@ export const OrganisationMemberInviteDialog = ({ trigger, ...props }: Organisati }); downloadFile({ - filename: 'documenso-organisation-member-invites-template.csv', + filename: 'keepcontracts-organisation-member-invites-template.csv', data: blob, }); }; diff --git a/apps/remix/app/components/dialogs/webhook-create-dialog.tsx b/apps/remix/app/components/dialogs/webhook-create-dialog.tsx index 49ecd7968f..8738c89c51 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 Documenso to send webhook events to. + The URL for Keep Contracts to send webhook events to. @@ -196,8 +196,8 @@ export const WebhookCreateDialog = ({ trigger, ...props }: WebhookCreateDialogPr - A secret that will be sent to your URL so you can verify that the request has been sent by - Documenso. + A secret that will be sent to your URL so you can verify that the request has been sent by Keep + Contracts. diff --git a/apps/remix/app/components/dialogs/webhook-edit-dialog.tsx b/apps/remix/app/components/dialogs/webhook-edit-dialog.tsx index 4b89d10253..f2f5d2e357 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 Documenso to send webhook events to. + The URL for Keep Contracts to send webhook events to. @@ -178,8 +178,8 @@ export const WebhookEditDialog = ({ trigger, webhook, ...props }: WebhookEditDia - A secret that will be sent to your URL so you can verify that the request has been sent by - Documenso. + A secret that will be sent to your URL so you can verify that the request has been sent by Keep + Contracts. diff --git a/apps/remix/app/components/embed/embed-document-completed.tsx b/apps/remix/app/components/embed/embed-document-completed.tsx index da11e59efd..37e5648dbd 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
diff --git a/apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx b/apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx index b1934b3da9..b3abfab801 100644 --- a/apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx +++ b/apps/remix/app/components/forms/2fa/enable-authenticator-app-dialog.tsx @@ -111,7 +111,7 @@ export const EnableAuthenticatorAppDialog = ({ onSuccess }: EnableAuthenticatorA }); downloadFile({ - filename: 'documenso-2FA-recovery-codes.txt', + filename: 'keepcontracts-2FA-recovery-codes.txt', data: blob, }); } diff --git a/apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx b/apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx index 7720cc8877..f4f25ddd4a 100644 --- a/apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx +++ b/apps/remix/app/components/forms/2fa/view-recovery-codes-dialog.tsx @@ -66,7 +66,7 @@ export const ViewRecoveryCodesDialog = () => { }); downloadFile({ - filename: 'documenso-2FA-recovery-codes.txt', + filename: 'keepcontracts-2FA-recovery-codes.txt', data: blob, }); } diff --git a/apps/remix/app/components/general/admin-license-card.tsx b/apps/remix/app/components/general/admin-license-card.tsx index a5ed1fd908..0210f6eb4b 100644 --- a/apps/remix/app/components/general/admin-license-card.tsx +++ b/apps/remix/app/components/general/admin-license-card.tsx @@ -88,7 +88,7 @@ export const AdminLicenseCard = ({ licenseData }: AdminLicenseCardProps) => {

- Documenso License + Keep Contracts License

{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 6651d6dfdd..1a86ec53cf 100644 --- a/apps/remix/app/components/general/admin-license-status-banner.tsx +++ b/apps/remix/app/components/general/admin-license-status-banner.tsx @@ -37,10 +37,11 @@ export const AdminLicenseStatusBanner = ({ license }: AdminLicenseStatusBannerPr .with('UNAUTHORIZED', () => license ? ( - Invalid License Type - Your Documenso instance is using features that are not part of your license. + Invalid License Type - Your Keep Contracts instance is using features that are not part of your + license. ) : ( - Missing License - Your Documenso instance is using features that require a license. + Missing License - Your Keep Contracts 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 7530ec4008..68ce89c6ea 100644 --- a/apps/remix/app/components/general/app-nav-mobile.tsx +++ b/apps/remix/app/components/general/app-nav-mobile.tsx @@ -81,7 +81,7 @@ export const AppNavMobile = ({ isMenuOpen, onMenuOpenChange }: AppNavMobileProps - Documenso Logo + Keep Contracts Logo
@@ -115,7 +115,7 @@ export const AppNavMobile = ({ isMenuOpen, onMenuOpenChange }: AppNavMobileProps

- © {new Date().getFullYear()} Documenso, Inc. + © {new Date().getFullYear()} Keep Contracts, Inc.
All rights reserved.

diff --git a/apps/remix/app/components/general/branding-logo.tsx b/apps/remix/app/components/general/branding-logo.tsx index 57932129a6..f2814596c8 100644 --- a/apps/remix/app/components/general/branding-logo.tsx +++ b/apps/remix/app/components/general/branding-logo.tsx @@ -1,30 +1,8 @@ -import type { SVGAttributes } from 'react'; +import LogoImage from '@documenso/assets/logo.png'; +import type { HTMLAttributes } from 'react'; -export type LogoProps = SVGAttributes; +export type LogoProps = HTMLAttributes; -export const BrandingLogo = ({ ...props }: LogoProps) => { - return ( - - - - - - - - ); +export const BrandingLogo = ({ className, ...props }: LogoProps) => { + return Keep Contracts; }; diff --git a/apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx b/apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx index 2ba80e0884..ae28e5cacc 100644 --- a/apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx +++ b/apps/remix/app/components/general/direct-template/direct-template-configure-form.tsx @@ -101,7 +101,7 @@ export const DirectTemplateConfigureForm = ({ 0 || user?.email !== undefined} - placeholder="recipient@documenso.com" + placeholder="recipient@keepcontracts.com" /> diff --git a/apps/remix/app/components/general/document-signing/document-signing-page-view-v2.tsx b/apps/remix/app/components/general/document-signing/document-signing-page-view-v2.tsx index 46ff0d89f6..3fe72df820 100644 --- a/apps/remix/app/components/general/document-signing/document-signing-page-view-v2.tsx +++ b/apps/remix/app/components/general/document-signing/document-signing-page-view-v2.tsx @@ -283,7 +283,7 @@ export const DocumentSigningPageViewV2 = () => { {!hidePoweredBy && ( - This document is available in your Documenso account. You can view more details, recipients, and audit - logs there. + This document is available in your Keep Contracts 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 ea60d1819e..fa616b2c7d 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 ))} - Documenso + Keep Contracts 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 9bae2122ee..8f8af7f47b 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 Documenso. + Your plan is no longer valid. Please subscribe to a new plan to continue using Keep Contracts. diff --git a/apps/remix/app/components/tables/templates-table.tsx b/apps/remix/app/components/tables/templates-table.tsx index cc7754ffd1..06ababaf87 100644 --- a/apps/remix/app/components/tables/templates-table.tsx +++ b/apps/remix/app/components/tables/templates-table.tsx @@ -1,6 +1,5 @@ import { useLimits } from '@documenso/ee/server-only/limits/provider/client'; import { useUpdateSearchParams } from '@documenso/lib/client-only/hooks/use-update-search-params'; -import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation'; import { formatTemplatesPath } from '@documenso/lib/utils/teams'; import type { TFindTemplatesResponse } from '@documenso/trpc/server/template-router/schema'; import { Alert, AlertDescription, AlertTitle } from '@documenso/ui/primitives/alert'; @@ -52,8 +51,6 @@ export const TemplatesTable = ({ const { remaining } = useLimits(); const team = useCurrentTeam(); - const organisation = useCurrentOrganisation(); - const [isPending, startTransition] = useTransition(); const updateSearchParams = useUpdateSearchParams(); @@ -251,12 +248,7 @@ export const TemplatesTable = ({ Document Limit Exceeded! - - You have reached your document limit.{' '} - - Upgrade your account to continue! - - + You have reached your document limit. Please contact your administrator. )} diff --git a/apps/remix/app/root.tsx b/apps/remix/app/root.tsx index 096b1504e1..8aa8758d81 100644 --- a/apps/remix/app/root.tsx +++ b/apps/remix/app/root.tsx @@ -123,8 +123,7 @@ export function LayoutContent({ children }: { children: React.ReactNode }) { - - + @@ -146,18 +145,6 @@ export function LayoutContent({ children }: { children: React.ReactNode }) { - {/* Global license banner currently disabled. Need to wait until after a few releases. */} - {/* {licenseStatus === '?' && ( -
-
-
- - This is an expired license instance of Documenso -
-
-
- )} */} - diff --git a/apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx b/apps/remix/app/routes/_authenticated+/o.$orgUrl.support.tsx index cea48a1333..3bd312ed80 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 Documenso. + Read our documentation to get started with Keep Contracts.

diff --git a/apps/remix/app/routes/_profile+/_layout.tsx b/apps/remix/app/routes/_profile+/_layout.tsx index 877c9e367e..4777d0b98b 100644 --- a/apps/remix/app/routes/_profile+/_layout.tsx +++ b/apps/remix/app/routes/_profile+/_layout.tsx @@ -54,7 +54,7 @@ export default function PublicProfileLayout() { Documenso Logo - While waiting for them to do so you can create your own Documenso account and get started with + While waiting for them to do so you can create your own Keep Contracts 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 940218adba..8686c2e458 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 - Documenso`) }, + { title: i18n._(msg`Sign Document - Keep Contracts`) }, { 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 e289473619..b183ea1c90 100644 --- a/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx +++ b/apps/remix/app/routes/_recipient+/sign.$token+/_index.tsx @@ -381,8 +381,8 @@ const SigningPageV1 = ({ data }: { data: Awaited Want to send slick signing links like this one?{' '} - - Check out Documenso + + Check out Keep Contracts . @@ -467,8 +467,8 @@ const SigningPageV2 = ({ data }: { data: Awaited Want to send slick signing links like this one?{' '} - - Check out Documenso + + Check out Keep Contracts . diff --git a/apps/remix/app/routes/_share+/share.$slug.tsx b/apps/remix/app/routes/_share+/share.$slug.tsx index 4e8029f73e..ea1103b9b8 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: 'Documenso - Share' }, - { description: 'I just signed a document in style with Documenso!' }, + { title: 'Keep Contracts - Share' }, + { description: 'I just signed a document in style with Keep Contracts!' }, { property: 'og:title', - content: 'Documenso - Join the open source signing revolution', + content: 'Keep Contracts - Join the open source signing revolution', }, { property: 'og:description', - content: 'I just signed with Documenso!', + content: 'I just signed with Keep Contracts!', }, { property: 'og:type', @@ -44,7 +44,7 @@ export function meta({ params: { slug } }: Route.MetaArgs) { }, { name: 'twitter:description', - content: 'I just signed with Documenso!', + content: 'I just signed with Keep Contracts!', }, ]; } @@ -69,8 +69,8 @@ export const loader = async ({ request, params: { slug } }: Route.LoaderArgs) => return {}; } - // Is hardcoded because this whole meta is hardcoded anyway for Documenso. - throw redirect('https://documenso.com'); + // Is hardcoded because this whole meta is hardcoded anyway for Keep Contracts. + throw redirect('https://keepcontracts.com'); }; export default function SharePage() { diff --git a/apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx b/apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx index 20490d89dc..f4152d088c 100644 --- a/apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx +++ b/apps/remix/app/routes/_unauthenticated+/articles.signature-disclosure.tsx @@ -16,10 +16,10 @@ export default function SignatureDisclosure() {

- Thank you for using Documenso 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. + Thank you for using Keep Contracts 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,8 +127,8 @@ export default function SignatureDisclosure() {

- By proceeding to use the electronic signature service provided by Documenso, you affirm that you have read - and understood this disclosure. You agree to all terms and conditions related to the use of electronic + By proceeding to use the electronic signature service provided by Keep Contracts, 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 2078d4ecf4..88f05b24a0 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 Documenso sign in page here + Return to Keep Contracts sign in page here
diff --git a/apps/remix/app/routes/_unauthenticated+/verify-email.$token.tsx b/apps/remix/app/routes/_unauthenticated+/verify-email.$token.tsx index ae93fa460d..09fd4d9070 100644 --- a/apps/remix/app/routes/_unauthenticated+/verify-email.$token.tsx +++ b/apps/remix/app/routes/_unauthenticated+/verify-email.$token.tsx @@ -142,7 +142,7 @@ export default function VerifyEmailPage({ loaderData }: Route.ComponentProps) {

- Your email has been successfully confirmed! You can now use all features of Documenso. + Your email has been successfully confirmed! You can now use all features of Keep Contracts.

- - - ); diff --git a/packages/email/template-components/template-footer.tsx b/packages/email/template-components/template-footer.tsx index 95964f3516..3b5701c86c 100644 --- a/packages/email/template-components/template-footer.tsx +++ b/packages/email/template-components/template-footer.tsx @@ -20,7 +20,7 @@ export const TemplateFooter = ({ isDocument = true, reportUrl }: TemplateFooterP Did not expect this email?{' '} - + Click here to report the sender . Never sign a document you don't recognize or weren't expecting. @@ -30,13 +30,7 @@ export const TemplateFooter = ({ isDocument = true, reportUrl }: TemplateFooterP {isDocument && !branding.brandingHidePoweredBy && ( - - This document was sent using{' '} - - Documenso - - . - + This document was sent using Keep Contracts. )} @@ -60,14 +54,6 @@ export const TemplateFooter = ({ isDocument = true, reportUrl }: TemplateFooterP )} - - {!branding.brandingEnabled && ( - - Documenso, Inc. -
- 2261 Market Street, #5211, San Francisco, CA 94114, USA -
- )} ); }; diff --git a/packages/email/templates/admin-user-created.tsx b/packages/email/templates/admin-user-created.tsx index f9caaf7999..de669b8d64 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 Documenso`; + const previewText = msg`Set your password for Keep Contracts`; const getAssetUrl = (path: string) => { return new URL(path, assetBaseUrl).toString(); @@ -26,7 +26,7 @@ export const AdminUserCreatedTemplate = ({
- Documenso Logo + Keep Contracts Logo
diff --git a/packages/email/templates/confirm-team-email.tsx b/packages/email/templates/confirm-team-email.tsx index 355281e13f..5c6e518e31 100644 --- a/packages/email/templates/confirm-team-email.tsx +++ b/packages/email/templates/confirm-team-email.tsx @@ -18,14 +18,14 @@ export type ConfirmTeamEmailProps = { export const ConfirmTeamEmailTemplate = ({ assetBaseUrl = 'http://localhost:3002', - baseUrl = 'https://documenso.com', + baseUrl = 'https://keepcontracts.com', teamName = 'Team Name', teamUrl = 'demo', token = '', }: ConfirmTeamEmailProps) => { const { _ } = useLingui(); - const previewText = msg`Accept team email request for ${teamName} on Documenso`; + const previewText = msg`Accept team email request for ${teamName} on Keep Contracts`; return ( @@ -49,7 +49,7 @@ export const ConfirmTeamEmailTemplate = ({ {teamName} has requested to use your email address for their team - on Documenso. + on Keep Contracts. @@ -78,7 +78,7 @@ export const ConfirmTeamEmailTemplate = ({ - You can revoke access at any time in your team settings on Documenso{' '} + You can revoke access at any time in your team settings on Keep Contracts{' '} here. diff --git a/packages/email/templates/document-cancel.tsx b/packages/email/templates/document-cancel.tsx index 70a910eee2..8d62ce38d1 100644 --- a/packages/email/templates/document-cancel.tsx +++ b/packages/email/templates/document-cancel.tsx @@ -11,7 +11,7 @@ export type DocumentCancelEmailTemplateProps = Partial { const { _ } = useLingui(); diff --git a/packages/email/templates/document-reminder.tsx b/packages/email/templates/document-reminder.tsx index d8e0ddbec9..0848825add 100644 --- a/packages/email/templates/document-reminder.tsx +++ b/packages/email/templates/document-reminder.tsx @@ -22,7 +22,7 @@ export type DocumentReminderEmailTemplateProps = { export const DocumentReminderEmailTemplate = ({ recipientName = 'John Doe', documentName = 'Open Source Pledge.pdf', - signDocumentLink = 'https://documenso.com', + signDocumentLink = 'https://keepcontracts.com', assetBaseUrl = 'http://localhost:3002', customBody, role = RecipientRole.SIGNER, diff --git a/packages/email/templates/forgot-password.tsx b/packages/email/templates/forgot-password.tsx index 0e8443bace..8287878c3e 100644 --- a/packages/email/templates/forgot-password.tsx +++ b/packages/email/templates/forgot-password.tsx @@ -10,7 +10,7 @@ import { TemplateForgotPassword } from '../template-components/template-forgot-p export type ForgotPasswordTemplateProps = Partial; export const ForgotPasswordTemplate = ({ - resetPasswordLink = 'https://documenso.com', + resetPasswordLink = 'https://keepcontracts.com', assetBaseUrl = 'http://localhost:3002', }: ForgotPasswordTemplateProps) => { const { _ } = useLingui(); diff --git a/packages/email/templates/organisation-account-link-confirmation.tsx b/packages/email/templates/organisation-account-link-confirmation.tsx index 25c8206e6e..c33b15dcb9 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 Documenso account`; + : msg`A request has been made to link your Keep Contracts account`; return ( @@ -45,7 +45,7 @@ export const OrganisationAccountLinkConfirmationTemplate = ({ {type === 'create' ? ( Account creation request ) : ( - Link your Documenso account + Link your Keep Contracts account )} @@ -57,8 +57,8 @@ export const OrganisationAccountLinkConfirmationTemplate = ({ ) : ( - {organisationName} has requested to link your current Documenso - account to their organisation. + {organisationName} has requested to link your current Keep + Contracts account to their organisation. )} @@ -86,7 +86,7 @@ export const OrganisationAccountLinkConfirmationTemplate = ({ - You can unlink your account at any time in your security settings on Documenso{' '} + You can unlink your account at any time in your security settings on Keep Contracts{' '} here. diff --git a/packages/email/templates/organisation-invite.tsx b/packages/email/templates/organisation-invite.tsx index 09a1c777f5..af56799582 100644 --- a/packages/email/templates/organisation-invite.tsx +++ b/packages/email/templates/organisation-invite.tsx @@ -17,14 +17,14 @@ export type OrganisationInviteEmailProps = { export const OrganisationInviteEmailTemplate = ({ assetBaseUrl = 'http://localhost:3002', - baseUrl = 'https://documenso.com', + baseUrl = 'https://keepcontracts.com', senderName = 'John Doe', organisationName = 'Organisation Name', token = '', }: OrganisationInviteEmailProps) => { const { _ } = useLingui(); - const previewText = msg`Accept invitation to join an organisation on Documenso`; + const previewText = msg`Accept invitation to join an organisation on Keep Contracts`; return ( @@ -42,7 +42,7 @@ export const OrganisationInviteEmailTemplate = ({
- Join {organisationName} on Documenso + Join {organisationName} on Keep Contracts diff --git a/packages/email/templates/organisation-join.tsx b/packages/email/templates/organisation-join.tsx index 24e3efa661..8dac62e57b 100644 --- a/packages/email/templates/organisation-join.tsx +++ b/packages/email/templates/organisation-join.tsx @@ -18,15 +18,15 @@ export type OrganisationJoinEmailProps = { export const OrganisationJoinEmailTemplate = ({ assetBaseUrl = 'http://localhost:3002', - baseUrl = 'https://documenso.com', + baseUrl = 'https://keepcontracts.com', memberName = 'John Doe', - memberEmail = 'johndoe@documenso.com', + memberEmail = 'johndoe@keepcontracts.com', organisationName = 'Organisation Name', organisationUrl = 'demo', }: OrganisationJoinEmailProps) => { const { _ } = useLingui(); - const previewText = msg`A member has joined your organisation on Documenso`; + const previewText = msg`A member has joined your organisation on Keep Contracts`; return ( diff --git a/packages/email/templates/organisation-leave.tsx b/packages/email/templates/organisation-leave.tsx index 19870c354b..0612fcd5d7 100644 --- a/packages/email/templates/organisation-leave.tsx +++ b/packages/email/templates/organisation-leave.tsx @@ -18,15 +18,15 @@ export type OrganisationLeaveEmailProps = { export const OrganisationLeaveEmailTemplate = ({ assetBaseUrl = 'http://localhost:3002', - baseUrl = 'https://documenso.com', + baseUrl = 'https://keepcontracts.com', memberName = 'John Doe', - memberEmail = 'johndoe@documenso.com', + memberEmail = 'johndoe@keepcontracts.com', organisationName = 'Organisation Name', organisationUrl = 'demo', }: OrganisationLeaveEmailProps) => { const { _ } = useLingui(); - const previewText = msg`A member has left your organisation on Documenso`; + const previewText = msg`A member has left your organisation on Keep Contracts`; return ( diff --git a/packages/email/templates/recipient-expired.tsx b/packages/email/templates/recipient-expired.tsx index e07d01279c..70d90a5419 100644 --- a/packages/email/templates/recipient-expired.tsx +++ b/packages/email/templates/recipient-expired.tsx @@ -13,7 +13,7 @@ export const RecipientExpiredTemplate = ({ documentName = 'Open Source Pledge.pdf', recipientName = 'John Doe', recipientEmail = 'john@example.com', - documentLink = 'https://documenso.com', + documentLink = 'https://keepcontracts.com', assetBaseUrl = 'http://localhost:3002', }: RecipientExpiredEmailTemplateProps) => { const { _ } = useLingui(); diff --git a/packages/email/templates/reset-password.tsx b/packages/email/templates/reset-password.tsx index 314ac2e46e..f46318e4b4 100644 --- a/packages/email/templates/reset-password.tsx +++ b/packages/email/templates/reset-password.tsx @@ -12,7 +12,7 @@ export type ResetPasswordTemplateProps = Partial; export const ResetPasswordTemplate = ({ userName = 'Lucas Smith', - userEmail = 'lucas@documenso.com', + userEmail = 'lucas@keepcontracts.com', assetBaseUrl = 'http://localhost:3002', }: ResetPasswordTemplateProps) => { const { _ } = useLingui(); @@ -51,7 +51,7 @@ export const ResetPasswordTemplate = ({ Didn't request a password change? We are here to help you secure your account, just{' '} - + contact us . diff --git a/packages/email/templates/team-delete.tsx b/packages/email/templates/team-delete.tsx index 95f1f41f12..c21c88167a 100644 --- a/packages/email/templates/team-delete.tsx +++ b/packages/email/templates/team-delete.tsx @@ -15,7 +15,7 @@ export type TeamDeleteEmailProps = { export const TeamDeleteEmailTemplate = ({ assetBaseUrl = 'http://localhost:3002', - baseUrl = 'https://documenso.com', + baseUrl = 'https://keepcontracts.com', teamUrl = 'demo', }: TeamDeleteEmailProps) => { const { _ } = useLingui(); diff --git a/packages/email/templates/team-email-removed.tsx b/packages/email/templates/team-email-removed.tsx index dc76b20b97..81fac21d89 100644 --- a/packages/email/templates/team-email-removed.tsx +++ b/packages/email/templates/team-email-removed.tsx @@ -18,14 +18,14 @@ export type TeamEmailRemovedTemplateProps = { export const TeamEmailRemovedTemplate = ({ assetBaseUrl = 'http://localhost:3002', - baseUrl = 'https://documenso.com', - teamEmail = 'example@documenso.com', + baseUrl = 'https://keepcontracts.com', + teamEmail = 'example@keepcontracts.com', teamName = 'Team Name', teamUrl = 'demo', }: TeamEmailRemovedTemplateProps) => { const { _ } = useLingui(); - const previewText = msg`Team email removed for ${teamName} on Documenso`; + const previewText = msg`Team email removed for ${teamName} on Keep Contracts`; return ( diff --git a/packages/lib/constants/app.ts b/packages/lib/constants/app.ts index 1150a4ca74..740075a5a4 100644 --- a/packages/lib/constants/app.ts +++ b/packages/lib/constants/app.ts @@ -18,7 +18,7 @@ export const IS_BILLING_ENABLED = () => env('NEXT_PUBLIC_FEATURE_BILLING_ENABLED export const API_V2_BETA_URL = '/api/v2-beta'; export const API_V2_URL = '/api/v2'; -export const SUPPORT_EMAIL = env('NEXT_PUBLIC_SUPPORT_EMAIL') ?? 'support@documenso.com'; +export const SUPPORT_EMAIL = env('NEXT_PUBLIC_SUPPORT_EMAIL') ?? 'mangelsona@datathink.dev'; export const USE_INTERNAL_URL_BROWSERLESS = () => env('NEXT_PUBLIC_USE_INTERNAL_URL_BROWSERLESS') === 'true'; diff --git a/packages/lib/constants/direct-templates.ts b/packages/lib/constants/direct-templates.ts index 737062a0f6..e5d064fe73 100644 --- a/packages/lib/constants/direct-templates.ts +++ b/packages/lib/constants/direct-templates.ts @@ -1,3 +1,3 @@ // Put into a separate file due to Playwright not compiling due to the macro in the templates.ts file. -export const DIRECT_TEMPLATE_RECIPIENT_EMAIL = 'direct.link@documenso.com'; +export const DIRECT_TEMPLATE_RECIPIENT_EMAIL = 'direct.link@keepcontracts.com'; export const DIRECT_TEMPLATE_RECIPIENT_NAME = 'Direct link recipient'; diff --git a/packages/lib/constants/email.ts b/packages/lib/constants/email.ts index a6742c5a86..70a5a875a1 100644 --- a/packages/lib/constants/email.ts +++ b/packages/lib/constants/email.ts @@ -1,6 +1,6 @@ import { env } from '../utils/env'; -export const FROM_ADDRESS = env('NEXT_PRIVATE_SMTP_FROM_ADDRESS') || 'noreply@documenso.com'; +export const FROM_ADDRESS = env('NEXT_PRIVATE_SMTP_FROM_ADDRESS') || 'noreply@keepcontracts.com'; export const FROM_NAME = env('NEXT_PRIVATE_SMTP_FROM_NAME') || 'Documenso'; export const DOCUMENSO_INTERNAL_EMAIL = { diff --git a/packages/lib/server-only/auth/send-forgot-password.ts b/packages/lib/server-only/auth/send-forgot-password.ts index c29d92b543..e21fff4466 100644 --- a/packages/lib/server-only/auth/send-forgot-password.ts +++ b/packages/lib/server-only/auth/send-forgot-password.ts @@ -58,7 +58,7 @@ export const sendForgotPassword = async ({ userId }: SendForgotPasswordOptions) }, from: { name: env('NEXT_PRIVATE_SMTP_FROM_NAME') || 'Documenso', - address: env('NEXT_PRIVATE_SMTP_FROM_ADDRESS') || 'noreply@documenso.com', + address: env('NEXT_PRIVATE_SMTP_FROM_ADDRESS') || 'noreply@keepcontracts.com', }, subject: i18n._(msg`Forgot Password?`), html, diff --git a/packages/lib/server-only/auth/send-reset-password.ts b/packages/lib/server-only/auth/send-reset-password.ts index 3c4957d314..fb7ca48003 100644 --- a/packages/lib/server-only/auth/send-reset-password.ts +++ b/packages/lib/server-only/auth/send-reset-password.ts @@ -38,7 +38,7 @@ export const sendResetPassword = async ({ userId }: SendResetPasswordOptions) => }, from: { name: env('NEXT_PRIVATE_SMTP_FROM_NAME') || 'Documenso', - address: env('NEXT_PRIVATE_SMTP_FROM_ADDRESS') || 'noreply@documenso.com', + address: env('NEXT_PRIVATE_SMTP_FROM_ADDRESS') || 'noreply@keepcontracts.com', }, subject: 'Password Reset Success!', html, diff --git a/packages/lib/server-only/envelope/create-envelope.ts b/packages/lib/server-only/envelope/create-envelope.ts index f1ddbe13ec..450549c173 100644 --- a/packages/lib/server-only/envelope/create-envelope.ts +++ b/packages/lib/server-only/envelope/create-envelope.ts @@ -481,7 +481,7 @@ export const createEnvelope = async ({ const placeholderRecipients = Array.from(uniqueRecipientRefs.entries(), ([recipientIndex, name]) => ({ envelopeId: envelope.id, - email: `recipient.${recipientIndex}@documenso.com`, + email: `recipient.${recipientIndex}@keepcontracts.com`, name, role: RecipientRole.SIGNER, signingOrder: recipientIndex, diff --git a/packages/lib/server-only/pdf/helpers.ts b/packages/lib/server-only/pdf/helpers.ts index 2d6a1bc7ed..1637c0e032 100644 --- a/packages/lib/server-only/pdf/helpers.ts +++ b/packages/lib/server-only/pdf/helpers.ts @@ -137,7 +137,7 @@ const extractRecipientPlaceholder = (placeholder: string): RecipientPlaceholderI const recipientIndex = Number(indexMatch[1]); return { - email: `recipient.${recipientIndex}@documenso.com`, + email: `recipient.${recipientIndex}@keepcontracts.com`, name: `Recipient ${recipientIndex}`, recipientIndex, }; diff --git a/packages/lib/server-only/user/service-accounts/deleted-account.ts b/packages/lib/server-only/user/service-accounts/deleted-account.ts index 500718e5b8..528d500fca 100644 --- a/packages/lib/server-only/user/service-accounts/deleted-account.ts +++ b/packages/lib/server-only/user/service-accounts/deleted-account.ts @@ -1,6 +1,6 @@ import { prisma } from '@documenso/prisma'; -const LEGACY_DELETED_ACCOUNT_EMAIL = 'deleted-account@documenso.com'; +const LEGACY_DELETED_ACCOUNT_EMAIL = 'deleted-account@keepcontracts.com'; export const deletedServiceAccountEmail = () => { try { diff --git a/packages/lib/server-only/user/service-accounts/legacy-service-account.ts b/packages/lib/server-only/user/service-accounts/legacy-service-account.ts index 3299c2a470..3fabb795ab 100644 --- a/packages/lib/server-only/user/service-accounts/legacy-service-account.ts +++ b/packages/lib/server-only/user/service-accounts/legacy-service-account.ts @@ -1,6 +1,6 @@ import { prisma } from '@documenso/prisma'; -const LEGACY_SERVICE_ACCOUNT_EMAIL = 'serviceaccount@documenso.com'; +const LEGACY_SERVICE_ACCOUNT_EMAIL = 'serviceaccount@keepcontracts.com'; export const legacyServiceAccountEmail = () => { try { diff --git a/packages/lib/server-only/webhooks/trigger/generate-sample-data.ts b/packages/lib/server-only/webhooks/trigger/generate-sample-data.ts index 340e6790fe..16620d6320 100644 --- a/packages/lib/server-only/webhooks/trigger/generate-sample-data.ts +++ b/packages/lib/server-only/webhooks/trigger/generate-sample-data.ts @@ -54,7 +54,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo id: 52, documentId: 10, templateId: null, - email: 'signer@documenso.com', + email: 'signer@keepcontracts.com', name: 'John Doe', token: 'SIGNING_TOKEN', documentDeletedAt: null, @@ -75,7 +75,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo id: 52, documentId: 10, templateId: null, - email: 'signer@documenso.com', + email: 'signer@keepcontracts.com', name: 'John Doe', token: 'SIGNING_TOKEN', documentDeletedAt: null, @@ -114,7 +114,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo recipients: [ { ...basePayload.recipients[0], - email: 'signer2@documenso.com', + email: 'signer2@keepcontracts.com', name: 'Signer 2', role: RecipientRole.VIEWER, sendStatus: SendStatus.SENT, @@ -132,7 +132,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo Recipient: [ { ...basePayload.Recipient[0], - email: 'signer1@documenso.com', + email: 'signer1@keepcontracts.com', name: 'Signer 1', token: 'SIGNING_TOKEN', signingOrder: 2, @@ -163,7 +163,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo recipients: [ { ...basePayload.recipients[0], - email: 'signer2@documenso.com', + email: 'signer2@keepcontracts.com', name: 'Signer 2', role: RecipientRole.VIEWER, readStatus: ReadStatus.OPENED, @@ -181,7 +181,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo Recipient: [ { ...basePayload.Recipient[0], - email: 'signer2@documenso.com', + email: 'signer2@keepcontracts.com', name: 'Signer 2', role: RecipientRole.VIEWER, readStatus: ReadStatus.OPENED, @@ -213,7 +213,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo { ...basePayload.recipients[0], id: 51, - email: 'signer1@documenso.com', + email: 'signer1@keepcontracts.com', name: 'Signer 1', token: 'SIGNING_TOKEN', signedAt: now, @@ -235,7 +235,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo { ...basePayload.Recipient[0], id: 51, - email: 'signer1@documenso.com', + email: 'signer1@keepcontracts.com', name: 'Signer 1', token: 'SIGNING_TOKEN', signedAt: now, @@ -271,7 +271,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo id: 50, documentId: 10, templateId: null, - email: 'signer2@documenso.com', + email: 'signer2@keepcontracts.com', name: 'Signer 2', token: 'SIGNING_TOKEN', documentDeletedAt: null, @@ -293,7 +293,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo id: 51, documentId: 10, templateId: null, - email: 'signer1@documenso.com', + email: 'signer1@keepcontracts.com', name: 'Signer 1', token: 'SIGNING_TOKEN', documentDeletedAt: null, @@ -317,7 +317,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo id: 50, documentId: 10, templateId: null, - email: 'signer2@documenso.com', + email: 'signer2@keepcontracts.com', name: 'Signer 2', token: 'SIGNING_TOKEN', documentDeletedAt: null, @@ -339,7 +339,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo id: 51, documentId: 10, templateId: null, - email: 'signer1@documenso.com', + email: 'signer1@keepcontracts.com', name: 'Signer 1', token: 'SIGNING_TOKEN', documentDeletedAt: null, @@ -446,7 +446,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo id: 7, documentId: 7, templateId: null, - email: 'signer1@documenso.com', + email: 'signer1@keepcontracts.com', name: 'Signer 1', token: 'SIGNING_TOKEN', documentDeletedAt: null, @@ -470,7 +470,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo id: 7, documentId: 7, templateId: null, - email: 'signer@documenso.com', + email: 'signer@keepcontracts.com', name: 'Signer', token: 'SIGNING_TOKEN', documentDeletedAt: null, @@ -506,7 +506,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo recipients: [ { ...basePayload.recipients[0], - email: 'signer1@documenso.com', + email: 'signer1@keepcontracts.com', name: 'Signer 1', sendStatus: SendStatus.SENT, documentDeletedAt: null, @@ -523,7 +523,7 @@ export const generateSampleWebhookPayload = (event: WebhookTriggerEvents, webhoo Recipient: [ { ...basePayload.Recipient[0], - email: 'signer1@documenso.com', + email: 'signer1@keepcontracts.com', name: 'Signer 1', sendStatus: SendStatus.SENT, documentDeletedAt: null, diff --git a/packages/lib/utils/templates.ts b/packages/lib/utils/templates.ts index 4f4eda1e08..9a40af9ac2 100644 --- a/packages/lib/utils/templates.ts +++ b/packages/lib/utils/templates.ts @@ -21,7 +21,7 @@ export const formatDirectTemplatePath = (token: string) => { export const generateRecipientPlaceholder = (index: number) => { return { name: `Recipient ${index}`, - email: `recipient.${index}@documenso.com`, + email: `recipient.${index}@keepcontracts.com`, }; }; diff --git a/packages/prisma/seed/initial-seed.ts b/packages/prisma/seed/initial-seed.ts index d93820ef12..4f0143d70d 100644 --- a/packages/prisma/seed/initial-seed.ts +++ b/packages/prisma/seed/initial-seed.ts @@ -37,13 +37,13 @@ export const seedDatabase = async () => { const exampleUserExists = await prisma.user.findFirst({ where: { - email: 'example@documenso.com', + email: 'example@keepcontracts.com', }, }); const adminUserExists = await prisma.user.findFirst({ where: { - email: 'admin@documenso.com', + email: 'admin@keepcontracts.com', }, }); @@ -53,12 +53,12 @@ export const seedDatabase = async () => { const exampleUser = await seedUser({ name: 'Example User', - email: 'example@documenso.com', + email: 'example@keepcontracts.com', }); const adminUser = await seedUser({ name: 'Admin User', - email: 'admin@documenso.com', + email: 'admin@keepcontracts.com', isAdmin: true, }); diff --git a/packages/prisma/seed/medium-account-seed.ts b/packages/prisma/seed/medium-account-seed.ts index f10df2ee0d..c66944f1a9 100644 --- a/packages/prisma/seed/medium-account-seed.ts +++ b/packages/prisma/seed/medium-account-seed.ts @@ -5,7 +5,7 @@ import { DocumentStatus } from '../client'; import { seedBlankDocument } from './documents'; import { seedUser } from './users'; -const MEDIUM_ACCOUNT_EMAIL = 'medium-account@documenso.com'; +const MEDIUM_ACCOUNT_EMAIL = 'medium-account@keepcontracts.com'; const DOCUMENT_COUNT = 1000; const STATUSES = [DocumentStatus.DRAFT, DocumentStatus.PENDING, DocumentStatus.COMPLETED]; @@ -28,7 +28,7 @@ export const seedDatabase = async () => { email: MEDIUM_ACCOUNT_EMAIL, }); - const recipientEmails = Array.from({ length: 20 }, (_, i) => `recipient-${i}@test.documenso.com`); + const recipientEmails = Array.from({ length: 20 }, (_, i) => `recipient-${i}@test.keepcontracts.com`); for (let i = 0; i < DOCUMENT_COUNT; i++) { const status = STATUSES[i % STATUSES.length]; diff --git a/packages/prisma/seed/teams.ts b/packages/prisma/seed/teams.ts index c656bb3dcd..08aa5e2eba 100644 --- a/packages/prisma/seed/teams.ts +++ b/packages/prisma/seed/teams.ts @@ -7,7 +7,7 @@ import { OrganisationMemberRole, TeamMemberRole } from '../client'; import { seedOrganisationMembers } from './organisations'; import { seedUser } from './users'; -const EMAIL_DOMAIN = `test.documenso.com`; +const EMAIL_DOMAIN = `test.keepcontracts.com`; const nanoid = customAlphabet('1234567890abcdef', 10); type SeedTeamOptions = { diff --git a/packages/prisma/seed/templates.ts b/packages/prisma/seed/templates.ts index 160b613e04..c55fc48a5b 100644 --- a/packages/prisma/seed/templates.ts +++ b/packages/prisma/seed/templates.ts @@ -121,7 +121,7 @@ export const seedTemplate = async (options: SeedTemplateOptions) => { teamId, recipients: { create: { - email: 'recipient.1@documenso.com', + email: 'recipient.1@keepcontracts.com', name: 'Recipient 1', token: Math.random().toString().slice(2, 7), sendStatus: SendStatus.NOT_SENT, diff --git a/packages/prisma/seed/users.ts b/packages/prisma/seed/users.ts index 4fef074047..a31f97bb47 100644 --- a/packages/prisma/seed/users.ts +++ b/packages/prisma/seed/users.ts @@ -20,7 +20,7 @@ type SeedUserOptions = { const nanoid = customAlphabet('1234567890abcdef', 10); -export const seedTestEmail = () => `${nanoid()}@test.documenso.com`; +export const seedTestEmail = () => `${nanoid()}@test.keepcontracts.com`; export const seedUser = async ({ name = nanoid(), @@ -34,7 +34,7 @@ export const seedUser = async ({ isPersonalOrganisation = false, }: SeedUserOptions = {}) => { if (!email) { - email = `${nanoid()}@test.documenso.com`; + email = `${nanoid()}@test.keepcontracts.com`; } const user = await prisma.user.create({ diff --git a/packages/tailwind-config/index.cjs b/packages/tailwind-config/index.cjs index 2b7703f829..aa1cbebb85 100644 --- a/packages/tailwind-config/index.cjs +++ b/packages/tailwind-config/index.cjs @@ -68,18 +68,18 @@ module.exports = { foreground: 'hsl(var(--widget-foreground))', }, documenso: { - DEFAULT: '#A2E771', - 50: '#FFFFFF', - 100: '#FDFFFD', - 200: '#E7F9DA', - 300: '#D0F3B7', - 400: '#B9ED94', - 500: '#A2E771', - 600: '#83DF41', - 700: '#66C622', - 800: '#4D9619', - 900: '#356611', - 950: '#284E0D', + DEFAULT: '#2063B0', + 50: '#EEF4FC', + 100: '#D8E7F8', + 200: '#B1CFF1', + 300: '#79ACE6', + 400: '#468CDD', + 500: '#2063B0', + 600: '#1A508E', + 700: '#133C6C', + 800: '#0D2949', + 900: '#08182B', + 950: '#050E1A', }, dawn: { DEFAULT: '#aaa89f', diff --git a/packages/ui/primitives/button.tsx b/packages/ui/primitives/button.tsx index 3cf3635681..4fe5de8e4a 100644 --- a/packages/ui/primitives/button.tsx +++ b/packages/ui/primitives/button.tsx @@ -21,9 +21,9 @@ const buttonVariants = cva( none: '', }, size: { - default: 'h-10 py-2 px-4', - sm: 'h-9 px-3 rounded-md', - lg: 'h-11 px-8 rounded-md', + default: 'h-9 py-2 px-4', + sm: 'h-7 px-3 rounded-md', + lg: 'h-9 px-6 rounded-md', }, }, defaultVariants: { diff --git a/packages/ui/styles/theme.css b/packages/ui/styles/theme.css index caa7674330..c8b74bf06b 100644 --- a/packages/ui/styles/theme.css +++ b/packages/ui/styles/theme.css @@ -19,8 +19,8 @@ --card-border-tint: 112 205 159; --card-foreground: 222.2 47.4% 11.2%; - --field-card: 95 74% 90%; - --field-card-border: 95.08 71.08% 67.45%; + --field-card: 212 69% 95%; + --field-card-border: 212 69% 70%; --field-card-foreground: 222.2 47.4% 11.2%; --widget: 0 0% 97%; @@ -29,8 +29,8 @@ --border: 214.3 31.8% 91.4%; --input: 214.3 31.8% 91.4%; - --primary: 95.08 71.08% 67.45%; - --primary-foreground: 95.08 71.08% 10%; + --primary: 212 69% 41%; + --primary-foreground: 0 0% 100%; --secondary: 210 40% 96.1%; --secondary-foreground: 222.2 47.4% 11.2%; @@ -41,7 +41,7 @@ --destructive: 0 100% 50%; --destructive-foreground: 210 40% 98%; - --ring: 95.08 71.08% 67.45%; + --ring: 212 69% 41%; --radius: 0.5rem; @@ -82,18 +82,18 @@ --new-white-800: 0, 0%, 90%; --new-white-900: 0, 0%, 100%; - /* Primary - Green */ - --new-primary-50: 98, 73%, 97%; - --new-primary-100: 95, 73%, 94%; - --new-primary-200: 94, 70%, 87%; - --new-primary-300: 95, 71%, 81%; - --new-primary-400: 95, 71%, 74%; - --new-primary-500: 95, 71%, 67%; - --new-primary-600: 95, 71%, 54%; - --new-primary-700: 95, 71%, 41%; - --new-primary-800: 95, 71%, 27%; - --new-primary-900: 95, 72%, 14%; - --new-primary-950: 95, 72%, 7%; + /* Primary - DataThink Blue */ + --new-primary-50: 212, 69%, 96%; + --new-primary-100: 212, 69%, 91%; + --new-primary-200: 212, 69%, 82%; + --new-primary-300: 212, 69%, 69%; + --new-primary-400: 212, 69%, 57%; + --new-primary-500: 212, 69%, 41%; + --new-primary-600: 212, 69%, 33%; + --new-primary-700: 212, 69%, 25%; + --new-primary-800: 212, 69%, 17%; + --new-primary-900: 212, 69%, 10%; + --new-primary-950: 212, 69%, 6%; /* Secondary - Info */ --new-info-50: 210, 54%, 95%; @@ -164,19 +164,19 @@ --field-border: 214.3 31.8% 91.4%; - --primary: 95.08 71.08% 67.45%; - --primary-foreground: 95.08 71.08% 10%; + --primary: 212 69% 41%; + --primary-foreground: 0 0% 100%; --secondary: 0 0% 23.4%; - --secondary-foreground: 95.08 71.08% 67.45%; + --secondary-foreground: 212 69% 72%; --accent: 0 0% 27.9%; - --accent-foreground: 95.08 71.08% 67.45%; + --accent-foreground: 212 69% 72%; --destructive: 0 87% 62%; --destructive-foreground: 0 87% 19%; - --ring: 95.08 71.08% 67.45%; + --ring: 212 69% 41%; --radius: 0.5rem; diff --git a/render.yaml b/render.yaml index 1811be3084..12480880f2 100644 --- a/render.yaml +++ b/render.yaml @@ -1,7 +1,7 @@ services: - type: web runtime: node - name: documenso-app + name: keepcontracts-app plan: free buildCommand: npm i && npm run build startCommand: npx prisma migrate deploy --schema packages/prisma/schema.prisma && npx turbo run start --filter=@documenso/remix @@ -18,7 +18,7 @@ services: # Auth - key: NEXTAUTH_URL fromService: - name: documenso-app + name: keepcontracts-app type: web envVarKey: RENDER_EXTERNAL_URL - key: NEXTAUTH_SECRET @@ -27,18 +27,18 @@ services: # Database - key: NEXT_PRIVATE_DATABASE_URL fromDatabase: - name: documenso-db + name: keepcontracts-db property: connectionString - key: NEXT_PRIVATE_DIRECT_DATABASE_URL fromDatabase: - name: documenso-db + name: keepcontracts-db property: connectionString # URLs - key: NEXT_PUBLIC_WEBAPP_URL fromService: - name: documenso-app + name: keepcontracts-app type: web envVarKey: RENDER_EXTERNAL_URL - key: NEXT_PRIVATE_INTERNAL_WEBAPP_URL @@ -167,5 +167,5 @@ services: sync: false databases: - - name: documenso-db + - name: keepcontracts-db plan: free