diff --git a/.devcontainer/on-create.sh b/.devcontainer/on-create.sh index a66491ef7..fbd5351f2 100755 --- a/.devcontainer/on-create.sh +++ b/.devcontainer/on-create.sh @@ -9,10 +9,5 @@ npm install # Copy the env file cp .env.example .env -# Source the env file, export the variables -set -a -source .env -set +a - # Run the migrations -npm run -w @documenso/prisma prisma:migrate-dev +npm run prisma:migrate-dev diff --git a/.env.example b/.env.example index afe9557da..b4c5b616f 100644 --- a/.env.example +++ b/.env.example @@ -6,7 +6,7 @@ NEXTAUTH_SECRET="secret" NEXT_PRIVATE_GOOGLE_CLIENT_ID="" NEXT_PRIVATE_GOOGLE_CLIENT_SECRET="" -# [[APP]] +# [[URLS]] NEXT_PUBLIC_WEBAPP_URL="http://localhost:3000" NEXT_PUBLIC_MARKETING_URL="http://localhost:3001" @@ -50,7 +50,9 @@ NEXT_PRIVATE_SMTP_SECURE= NEXT_PRIVATE_SMTP_FROM_NAME="No Reply @ Documenso" # REQUIRED: Defines the email address to use as the from address. NEXT_PRIVATE_SMTP_FROM_ADDRESS="noreply@documenso.com" -# OPTIONAL: The API key to use for the MailChannels proxy endpoint. +# OPTIONAL: The API key to use for Resend.com +NEXT_PRIVATE_RESEND_API_KEY= +# OPTIONAL: The API key to use for MailChannels. NEXT_PRIVATE_MAILCHANNELS_API_KEY= # OPTIONAL: The endpoint to use for the MailChannels API if using a proxy. NEXT_PRIVATE_MAILCHANNELS_ENDPOINT= diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 000000000..d12bdad59 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,50 @@ +--- +name: Bug Report +about: Create a bug report to help us improve +--- + + + +## Issue Description + + + +## Steps to Reproduce + + + + +1. Step 1 +2. Step 2 +3. ... + +## Expected Behavior + + + +## Current Behavior + + + +## Screenshots (optional) + + + +## Environment + + + +- OS: [e.g., Windows 10] +- Browser: [e.g., Chrome, Firefox] +- Version: [e.g., 2.0.1] + +## Checklist + + + + +- [ ] I have searched the existing issues to make sure this is not a duplicate. +- [ ] I have provided steps to reproduce the issue. +- [ ] I have included relevant environment information. +- [ ] I have included any relevant screenshots. +- [ ] I understand that this is a voluntary contribution and that there is no guarantee of resolution. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 000000000..a850a7a9a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,41 @@ +--- +name: Feature Request +about: Suggest a new idea or enhancement for this project +--- + + + +## Feature Description + + + + +## Use Case + + + + +## Proposed Solution + + + + +## Alternatives (optional) + + + + +## Additional Context + + + +## Checklist + + + + +- [ ] I have searched the existing feature requests to make sure this is not a duplicate. +- [ ] I have provided a detailed description of the requested feature. +- [ ] I have explained the use case or scenario for this feature. +- [ ] I have included any relevant technical details or design suggestions. +- [ ] I understand that this is a suggestion and that there is no guarantee of implementation. diff --git a/.github/ISSUE_TEMPLATE/improvement.md b/.github/ISSUE_TEMPLATE/improvement.md new file mode 100644 index 000000000..709d3441f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/improvement.md @@ -0,0 +1,41 @@ +--- +name: General Improvement +about: Suggest a minor enhancement or improvement for this project +--- + + + +## Improvement Description + + + + +## Rationale + + + + +## Proposed Solution + + + + +## Alternatives (optional) + + + + +## Additional Context + + + +## Checklist + + + + +- [ ] I have searched the existing issues and improvement suggestions to avoid duplication. +- [ ] I have provided a clear description of the improvement being suggested. +- [ ] I have explained the rationale behind this improvement. +- [ ] I have included any relevant technical details or design suggestions. +- [ ] I understand that this is a suggestion and that there is no guarantee of implementation. diff --git a/.github/PULL_REQUEST_TEMPLATE/generic.md b/.github/PULL_REQUEST_TEMPLATE/generic.md new file mode 100644 index 000000000..70b668b5c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/generic.md @@ -0,0 +1,49 @@ +--- +name: Pull Request +about: Submit changes to the project for review and inclusion +--- + +## Description + + + + +## Related Issue + + + + +## Changes Made + + + + +- Change 1 +- Change 2 +- ... + +## Testing Performed + + + + +- Tested feature X in scenario Y. +- Ran unit tests for component Z. +- Tested on browsers A, B, and C. +- ... + +## Checklist + + + + +- [ ] I have tested these changes locally and they work as expected. +- [ ] I have added/updated tests that prove the effectiveness of these changes. +- [ ] I have updated the documentation to reflect these changes, if applicable. +- [ ] I have followed the project's coding style guidelines. +- [ ] I have addressed the code review feedback from the previous submission, if applicable. + +## Additional Notes + + + diff --git a/.github/PULL_REQUEST_TEMPLATE/test-addition.md b/.github/PULL_REQUEST_TEMPLATE/test-addition.md new file mode 100644 index 000000000..f93c81493 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/test-addition.md @@ -0,0 +1,40 @@ +--- +name: Test Addition +about: Submit a new test, either unit or end-to-end (E2E), for review and inclusion +--- + +## Description + + + + +## Related Issue + + + + +## Test Details + + + + +- Test Name: Name of the test +- Type: [Unit / E2E] +- Description: Brief description of what the test checks +- Inputs: What inputs the test uses (if applicable) +- Expected Output: What output or behavior the test expects + +## Checklist + + + + +- [ ] I have written the new test and ensured it works as intended. +- [ ] I have added necessary documentation to explain the purpose of the test. +- [ ] I have followed the project's testing guidelines and coding style. +- [ ] I have addressed any review feedback from previous submissions, if applicable. + +## Additional Notes + + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9a564b058..1269fd6c5 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,7 +9,7 @@ updates: labels: - "ci dependencies" - "ci" - open-pull-requests-limit: 10 + open-pull-requests-limit: 0 - package-ecosystem: "npm" directory: "/apps/marketing" @@ -19,7 +19,7 @@ updates: labels: - "npm dependencies" - "frontend" - open-pull-requests-limit: 10 + open-pull-requests-limit: 0 - package-ecosystem: "npm" directory: "/apps/web" @@ -29,4 +29,4 @@ updates: labels: - "npm dependencies" - "frontend" - open-pull-requests-limit: 10 + open-pull-requests-limit: 0 diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000..b03003160 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,55 @@ +tasks: + - init: | + npm i && + npm run dx:up && + cp .env.example .env && + set -a; source .env && + export NEXTAUTH_URL="$(gp url 3000)" && + export NEXT_PUBLIC_WEBAPP_URL="$(gp url 3000)" && + export NEXT_PUBLIC_MARKETING_URL="$(gp url 3001)" + command: npm run d + +ports: + - port: 3000 + visibility: public + onOpen: open-preview + - port: 3001 + visibility: public + onOpen: open-preview + - port: 9000 + visibility: public + onOpen: ignore + - port: 1100 + visibility: private + onOpen: ignore + - port: 2500 + visibility: private + onOpen: ignore + - port: 54320 + visibility: private + onOpen: ignore + + +github: + prebuilds: + master: true + pullRequests: true + pullRequestsFromForks: true + addCheck: true + addComment: true + addBadge: true + +vscode: + extensions: + - aaron-bond.better-comments + - bradlc.vscode-tailwindcss + - dbaeumer.vscode-eslint + - esbenp.prettier-vscode + - mikestead.dotenv + - unifiedjs.vscode-mdx + - GitHub.copilot-chat + - GitHub.copilot-labs + - GitHub.copilot + - GitHub.vscode-pull-request-github + - Prisma.prisma + - VisualStudioExptTeam.vscodeintellicode diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..5cf6aad4e --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,126 @@ +# 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/CONTRIBUTING.md b/CONTRIBUTING.md index eca35cd8b..e2db661b8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,20 +5,36 @@ If you plan to contribute to Documenso, please take a moment to feel awesome ✨ ## 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 and issue from [here](https://github.com/documenso/documenso/issues) or create a new one -- Consider the results from the discussion in the issue +- 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. +## 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 request should be made against this branch. If you need help getting started, [join us on Discord](https://documen.so/discord). +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 somthing readable): +- Create a new branch (include the issue id and something readable): ```sh git checkout -b doc-999-my-feature-or-fix @@ -29,7 +45,7 @@ The development branch is main. All pull request should be made aga ## Building > **Note** -> Please be sure that you can make a full production build before pushing code or creating PRs. +> Please ensure you can make a full production build before pushing code or creating PRs. You can build the project with: diff --git a/README.md b/README.md index 29ffb0d65..f488b4a63 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ -

- - Documenso Logo - +Documenso Logo +

The Open Source DocuSign Alternative.
@@ -16,62 +14,69 @@ Issues · Roadmap + · + Upcoming Launches

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

-> **🚧 We're currently working on a large scale refactor which can be found on the [feat/refresh](https://github.com/documenso/documenso/tree/feat/refresh) branch.** +> 🦺 Documenso 1.0 is deployed to our Staging Environment. > -> **[Read more on why 👀](https://documenso.com/blog/why-were-doing-a-rewrite)** +> The code can be found on the [feat/refresh](https://github.com/documenso/documenso/tree/feat/refresh) branch. +> +> The new version will be released after the current testing phase. -# Documenso 0.9 - Developer Preview +# Join us in testing Documenso 1.0 during [MALFUNCTION MANIA](https://documenso.com/blog/malfunction-mania)
+ src="https://github.com/documenso/documenso/assets/1309312/67e08c98-c153-4115-aa2d-77979bb12c94)"> + src="https://github.com/documenso/documenso/assets/1309312/040cfbae-3438-4ca3-87f2-ce52c793dcaf"> + src="https://github.com/documenso/documenso/assets/1309312/72d445be-41e5-4936-bdba-87ef8e70fa09"> + src="https://github.com/documenso/documenso/assets/1309312/d7b86c0f-a755-4476-a022-a608db2c4633"> - - - + src=https://github.com/documenso/documenso/assets/1309312/c0f55116-ab82-433f-a266-f3fc8571d69f">
-> **Note** -> This project is currently under community review and will publish it's first production release soon™. - ## About this project -Signing documents digitally is fast, easy and should be 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. +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 +

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

## Community and Next Steps 🎯 -We're currently working on a redesign of the application including a revamp of the codebase so Documenso can be more intuitive to use and robust to develop upon. +We're currently working on a redesign of the application, including a revamp of the codebase so Documenso can be more intuitive to use and robust to develop upon. - Check out the first source code release in this repository and test it -- Tell us what you think in the current [Discussions](https://github.com/documenso/documenso/discussions) +- 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 +- 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 @@ -84,62 +89,68 @@ Contact us if you are interested in our Enterprise plan for large organizations Book us with Cal.com -## Activity +## Tech Stack -![Repository Activity](https://repobeats.axiom.co/api/embed/622a2e9aa709696f7226304b5b7178a5741b3868.svg) +- [Typescript](https://www.typescriptlang.org/) - Language +- [Next.js](https://nextjs.org/) - Framework +- [Prisma](https://www.prisma.io/) - ORM +- [Tailwind](https://tailwindcss.com/) - CSS +- [shadcn/ui](https://ui.shadcn.com/) - Component Library +- [NextAuth.js](https://next-auth.js.org/) - Authentication +- [react-email](https://react.email/) - Email Templates +- [tRPC](https://trpc.io/) - API +- [Node SignPDF](https://github.com/vbuch/node-signpdf) - Digital Signature +- [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 +- [Vercel](https://vercel.com) - Hosting -# Tech + -Documenso is built using awesome open source tech including: +## Local Development -- [Typescript](https://www.typescriptlang.org/) -- [Javascript (when necessary)](https://developer.mozilla.org/en-US/docs/Web/JavaScript) -- [NextJS (JS Fullstack Framework)](https://nextjs.org/) -- [Postgres SQL (Database)](https://www.postgresql.org/) -- [Prisma (ORM - Object-relational mapping)](https://www.prisma.io/) -- [Tailwind CSS (Styling)](https://tailwindcss.com/) -- [Node SignPDF (Digital Signature)](https://github.com/vbuch/node-signpdf) -- [React-PDF for viewing PDFs](https://github.com/wojtekmaj/react-pdf) -- [PDF-Lib for PDF manipulation](https://github.com/Hopding/pdf-lib) -- Check out `/package.json` and `/apps/web/package.json` for more -- Support for [opensignpdf (requires Java on server)](https://github.com/open-pdf-sign) is currently planned. +### Requirements -# Getting Started +To run Documenso locally you will need -## Requirements +- Node.js +- Postgres SQL Database +- Docker (optional) -To run Documenso locally you need - -- [Node.js (Version: >=18.x)](https://nodejs.org/en/download/) -- Node Package Manager NPM - included in Node.js -- [PostgreSQL (local or remote)](https://www.postgresql.org/download/) - -## Developer Quickstart +### Developer Quickstart > **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. Want to get up and running quickly? Follow these steps: -- [Clone the repository](https://help.github.com/articles/cloning-a-repository/) it to your local device. +1. [Clone the repository](https://help.github.com/articles/cloning-a-repository/) it to your local device. - ```sh - git clone https://github.com/documenso/documenso - ``` +```sh +git clone https://github.com/documenso/documenso +``` -- Set up your `.env` file using the recommendations in the `.env.example` file. -- Run `npm run dx` in the root directory - - This will spin up a postgres database and inbucket mail server in docker containers. -- Run `npm run dev` in the root directory -- Want it even faster? Just use - ```sh - npm run d - ``` +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. -That's it! You should now be able to access the app at http://localhost:3000 +3. Run `npm run dx` in the root directory -Incoming mail will be available at http://localhost:9000 + - This will spin up a postgres database and inbucket mailserver in a docker container. -Your database will also be available on port `54320`. You can connect to it using your favorite database client. +4. Run `npm run dev` in the root directory + +5. Want it even faster? Just use + +```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. ## Developer Setup @@ -147,33 +158,38 @@ Your database will also be available on port `54320`. You can connect to it usin Follow these steps to setup documenso on you local machine: -- [Clone the repository](https://help.github.com/articles/cloning-a-repository/) it to your local device. - ```sh - git clone https://github.com/documenso/documenso - ``` -- Run `npm i` in root directory -- Rename `.env.example` to `.env` -- Set DATABASE_URL value in .env file - - You can use the provided test database url (may be wiped at any point) - - Or setup a local postgres sql instance (recommended) -- Create the database scheme by running `db-migrate:dev` -- Setup your mail provider - - Set `SENDGRID_API_KEY` value in .env file - - You need a SendGrid account, which you can create [here](https://signup.sendgrid.com/). - - Documenso uses [Nodemailer](https://nodemailer.com/about/) so you can easily use your own SMTP server by setting the `SMTP - \_ - * variables` in your .env -- Run `npm run dev` root directory to start -- Register a new user at http://localhost:3000/signup +1. [Clone the repository](https://help.github.com/articles/cloning-a-repository/) it to your local device. + +```sh +git clone https://github.com/documenso/documenso +``` + +2. Run `npm i` in root directory + +3. Create your `.env` from the `.env.example`. You can use `cp .env.example .env` to get started with our handpicked defaults. + +4. Set the following environement variables. + + - NEXTAUTH_URL + - NEXTAUTH_SECRET + - NEXT_PUBLIC_WEBAPP_URL + - NEXT_PUBLIC_MARKETING_URL + - NEXT_PRIVATE_DATABASE_URL + - NEXT_PRIVATE_DIRECT_DATABASE_URL + - NEXT_PRIVATE_SMTP_FROM_NAME + - NEXT_PRIVATE_SMTP_FROM_ADDRESS + +5. Create the database schema by running `npm run prisma:migrate-dev` + +6. Run `npm run dev` root directory to start + +7. Register a new user at http://localhost:3000/signup --- -- Optional: Seed the database using `npm run db-seed` to create a test user and document -- Optional: Upload and sign `apps/web/resources/example.pdf` manually to test your setup - +- Optional: Seed the database using `npm run prisma:seed -w @documenso/prisma` to create a test user and document - Optional: Create your own signing certificate - - A demo certificate is provided in `/app/web/resources/certificate.p12` - - To generate your own using these steps and a Linux Terminal or Windows Subsystem for Linux (WSL) see **[Create your own signing certificate](#creating-your-own-signing-certificate)**. + - To generate your own using these steps and a Linux Terminal or Windows Subsystem for Linux (WSL) see **[Create your own signing certificate](./SIGNING.md)**. ### Run in Gitpod @@ -181,81 +197,39 @@ Follow these steps to setup documenso on you local machine: [![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/documenso/documenso) -## Updating +### Run in DevContainer -- If you pull the newest version from main, using `git pull`, it may be necessary to regenerate your database client -- You can do this by running the generate command in `/packages/prisma`: - ```sh - npx prisma generate - ``` -- This is not necessary on first clone. +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) -# Creating your own signing certificate +## Docker -For the digital signature of your documents you need a signing certificate in .p12 format (public and private key). You can buy one (not recommended for dev) or use the steps to create a self-signed one: +🚧 Docker containers and images are current in progress. We are actively working on bringing a simple docker build and publish pipeline for Documenso. -1. Generate a private key using the OpenSSL command. You can run the following command to generate a 2048-bit RSA key: - - `openssl genrsa -out private.key 2048` - -2. Generate a self-signed certificate using the private key. You can run the following command to generate a self-signed certificate: - - `openssl req -new -x509 -key private.key -out certificate.crt -days 365` - - This will prompt you to enter some information, such as the Common Name (CN) for the certificate. Make sure you enter the correct information. The -days parameter sets the number of days for which the certificate is valid. - -3. Combine the private key and the self-signed certificate to create the p12 certificate. You can run the following command to do this: - - `openssl pkcs12 -export -out certificate.p12 -inkey private.key -in certificate.crt` - -4. You will be prompted to enter a password for the p12 file. Choose a strong password and remember it, as you will need it to use the certificate (**can be empty for dev certificates**) -5. Place the certificate `/apps/web/resources/certificate.p12` - -# Docker - -> We are still working on the publishing of docker images, in the meantime you can follow the steps below to create a production ready docker image. - -Want to create a production ready docker image? Follow these steps: - -- cd into `docker` directory -- Make `build.sh` executable by running `chmod +x build.sh` -- Run `./build.sh` to start building the docker image. -- Publish the image to your docker registry of choice (or) If you prefer running the image from local, run the below command - -``` -docker run -d --restart=unless-stopped -p 3000:3000 -v documenso:/app/data --name documenso documenso:latest -``` - -Command Breakdown: -- `-d` - Let's you run the container in background -- `-p` - Passes down which ports to use. First half is the host port, Second half is the app port. You can change the first half anything you want and reverse proxy to that port. -- `-v` - Volume let's you persist the data -- `--name` - Name of the container -- `documenso:latest` - Image you have built - -# Deployment +## Self Hosting We support a variety of deployment methods, and are actively working on adding more. Stay tuned for updates! -## Railway +> Please note the below deployment methods are for v0.9, we will update these to v1.0 once it has been released. + +### Railway [![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/DjrRRX) -## Render +### Render [![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/documenso/documenso) -# Troubleshooting +## Troubleshooting -## I'm not receiving any emails when using the developer quickstart +### I'm not receiving any emails when using the developer quickstart When using the developer quickstart an [Inbucket](https://inbucket.org/) server will be spun up in a docker container that will store all outgoing email locally for you to view. The Web UI can be found at http://localhost:9000 while the SMTP port will be on localhost:2500. -## Support IPv6 +### Support IPv6 -In case you are deploying to a cluster that uses only IPv6. You can use a custom command to pass a parameter to the NextJS start command +In case you are deploying to a cluster that uses only IPv6. You can use a custom command to pass a parameter to the Next.js start command For local docker run @@ -277,5 +251,25 @@ containers: - start - -- - -H - - "::" + - '::' ``` + +### I can't see environment variables in my package scripts + +Wrap your package script with the `with:env` script like such: + +``` +npm run with:env -- npm run myscript +``` + +The same can be done when using `npx` for one of bin scripts: + +``` +npm run with:env -- npx myscript +``` + +This will load environment variables from your `.env` and `.env.local` files. + +## Repo Activity + +![Repository Activity](https://repobeats.axiom.co/api/embed/622a2e9aa709696f7226304b5b7178a5741b3868.svg) diff --git a/SIGNING.md b/SIGNING.md new file mode 100644 index 000000000..d1942ed8a --- /dev/null +++ b/SIGNING.md @@ -0,0 +1,55 @@ +# Creating your own signing certificate + +For the digital signature of your documents you need a signing certificate in .p12 format (public and private key). You can buy one (not recommended for dev) or use the steps to create a self-signed one: + +1. Generate a private key using the OpenSSL command. You can run the following command to generate a 2048-bit RSA key: + + `openssl genrsa -out private.key 2048` + +2. Generate a self-signed certificate using the private key. You can run the following command to generate a self-signed certificate: + + `openssl req -new -x509 -key private.key -out certificate.crt -days 365` + + This will prompt you to enter some information, such as the Common Name (CN) for the certificate. Make sure you enter the correct information. The -days parameter sets the number of days for which the certificate is valid. + +3. Combine the private key and the self-signed certificate to create the p12 certificate. You can run the following command to do this: + + `openssl pkcs12 -export -out certificate.p12 -inkey private.key -in certificate.crt` + +4. You will be prompted to enter a password for the p12 file. Choose a strong password and remember it, as you will need it to use the certificate (**can be empty for dev certificates**) +5. Place the certificate `/apps/web/resources/certificate.p12` + +## Docker + +> We are still working on the publishing of docker images, in the meantime you can follow the steps below to create a production ready docker image. + +Want to create a production ready docker image? Follow these steps: + +- cd into `docker` directory +- Make `build.sh` executable by running `chmod +x build.sh` +- Run `./build.sh` to start building the docker image. +- Publish the image to your docker registry of choice (or) If you prefer running the image from local, run the below command + +``` +docker run -d --restart=unless-stopped -p 3000:3000 -v documenso:/app/data --name documenso documenso:latest +``` + +Command Breakdown: + +- `-d` - Let's you run the container in background +- `-p` - Passes down which ports to use. First half is the host port, Second half is the app port. You can change the first half anything you want and reverse proxy to that port. +- `-v` - Volume let's you persist the data +- `--name` - Name of the container +- `documenso:latest` - Image you have built + +## Deployment + +We support a variety of deployment methods, and are actively working on adding more. Stay tuned for updates! + +## Railway + +[![Deploy on Railway](https://railway.app/button.svg)](https://railway.app/template/DjrRRX) + +## Render + +[![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/documenso/documenso) diff --git a/apps/marketing/content/blog/deploy-with-vercel-supabase-resend.mdx b/apps/marketing/content/blog/deploy-with-vercel-supabase-resend.mdx new file mode 100644 index 000000000..fb00f40bf --- /dev/null +++ b/apps/marketing/content/blog/deploy-with-vercel-supabase-resend.mdx @@ -0,0 +1,198 @@ +--- +title: 'Deploying Documenso with Vercel, Supabase and Resend' +description: This is the first part of the new Building Documenso series, where I describe the challenges and design choices that we make while building the world’s most open signing platform. +authorName: 'Ephraim Atta-Duncan' +authorImage: '/blog/blog-author-duncan.jpeg' +authorRole: 'Software Engineer Intern' +date: 2023-09-08 +tags: + - Open Source + - Self Hosting + - Tutorial +--- + +In this article, we'll walk you through how to deploy and self-host Documenso using Vercel, Supabase, and Resend. + +You'll learn: + +- How to set up a Postgres database using Supabase, +- How to install SMTP with Resend, +- How to deploy your project with Vercel. + +If you don't know what [Documenso](https://documenso.com/) is, it's an open-source alternative to DocuSign, with the mission to create an open signing infrastructure while embracing openness, cooperation, and transparency. + +## Prerequisites + +Before we start, make sure you have a [GitHub](https://github.com/signup) account. You also need [Node.js](https://nodejs.org/en) and [npm](https://www.npmjs.com/) installed on your local machine (note: you also have the option to host it on a cloud environment using Gitpod for example; that would be another post). If you need accounts on Vercel, Supabase, and Resend, create them by visiting the [Vercel](https://vercel.com/), [Supabase](https://supabase.com/), and [Resend](https://resend.com/) websites. + +Checklist: + +- [ ] Have a GitHub account +- [ ] Install Node.js +- [ ] Install npm +- [ ] Have a Vercel account +- [ ] Have a Supabase account +- [ ] Have a Resend account + +## Step-by-Step guide to deploying Documenso with Vercel, Supabase, and Resend + +To deploy Documenso, we'll take the following steps: + +1. Fork the Documenso repository +2. Clone the forked repository and install dependencies +3. Create a new project on Supabase +4. Copy the Supabase Postgres database connection URL +5. Create a `.env` file +6. Run the migration on the Supabase Postgres Database +7. Get your SMTP Keys on Resend +8. Create a new project on Vercel +9. Add Environment Variables to your Vercel project + +So, you're ready? Let’s dive in! + +### Step 1: Fork the Documenso repository + +Start by creating a fork of Documenso on GitHub. You can do this by visiting the [Documenso repository](https://github.com/documenso/documenso) and clicking on the 'Fork' button. (Also, star the repo!) + +![Documenso](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wkcujctpf86p56bju3mq.png) + +Choose your GitHub profile as the owner and click on 'Create fork' to create a fork of the repo. + +![Fork the Documenso repository on GitHub](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xf49r2byu9nnd1465niy.png) + +### Step 2: Clone the forked repository and install dependencies + +Clone the forked repository to your local machine in any directory of your choice. Open your terminal and enter the following commands: + +```bash +# Clone the repo using Github CLI +gh repo clone [your_github_username]/documenso + +# Clone the repo using Git +git clone +``` + +You can now navigate into the directory and install the project’s dependencies: + +```bash +cd documenso +npm install +``` + +### Step 3: Create a new project on Supabase + +Now, let's set up the database. + +If you haven't already, create a new project on Supabase. This will automatically create a new Postgres database for you. + +On your Supabase dashboard, click the '**New project**' button and choose your organization. + +On the '**Create a new project**' page, set a database name of **documenso** and a secure password for your database. Choose a region closer to you, a pricing plan, and click on '**Create new project**' to create your project. + +![Create a new project on Supabase](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w5lqz771iupjyi1ekfdz.png) + +### Step 4: Copy the Supabase Postgres database connection URL + +In your project, click the '**Settings**' icon at the bottom left. + +Under the '**Project Settings**' section, click '**Database**' and scroll down to the '**Connection string**' section. Copy the '**URI**' and update it with the password you chose in the previous step. + +![Copy the Supabase Postgres database connection URL](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y1ldu3qrg9moednbzjij.png) + +### Step 5: Create a `.env` file + +Create a `.env` file in the root of your project by copying the contents of the `.env.example` file. + +Add the connection string you copied from your Supabase dashboard to the `DATABASE_URL` variable in the `.env` file. + +The `.env` should look like this: + +```bash +DATABASE_URL="postgres://postgres:[YOUR-PASSWORD]@db.[YOUR-PROJECT-REF].supabase.co:5432/postgres" +``` + +### Step 6: Run the migration on the Supabase Postgres Database + +Run the migration on the Supabase Postgres Database using the following command: + +```bash +npx prisma migrate deploy +``` + +### Step 7: Get your SMTP Keys on Resend + +So, you've just cloned Documenso, installed dependencies on your local machine, and set your database using Supabase. Now, SMTP is missing. Emails won't go out! Let's fix it with Resend. + +In the **[Resend](https://resend.com/)** dashboard, click 'Add API Key' to create a key for Resend SMTP. + +![Create a key for Resend SMTP](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uh2rztgn09mlvecl34i5.png) + +Next, add and verify your domain in the '**Domains**' section on the sidebar. This will allow you to send emails from any address associated with your domain. + +![Verify your domain on Resend](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nxgie0esz530vq5a494o.png) + +You can update your `.env` file with the following: + +```jsx +SMTP_MAIL_HOST = 'smtp.resend.com'; +SMTP_MAIL_PORT = '25'; +SMTP_MAIL_USER = 'resend'; +SMTP_MAIL_PASSWORD = 'YOUR_RESEND_API_KEY'; +MAIL_FROM = 'noreply@[YOUR_DOMAIN]'; +``` + +### Step 8: Create a new project on Vercel + +You set the database with Supabase and are SMTP-ready with Resend. Almost there! The next step is to deploy the project — we'll use Vercel for that. + +On your Vercel dashboard, create a new project using the forked project from your GitHub repositories. Select the project among the options and click '**Import**' to start running Documenso. + +![Create a new project on Vercel](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gdy97tltpnu7vf4fc11f.png) + +### Step 9: Add Environment Variables to your Vercel project + +In the '**Configure Project**' page, adding the required Environmental Variables is essential to ensure the application deploys without any errors. + +Specifically, for the `NEXT_PUBLIC_WEBAPP_URL` and `NEXTAUTH_URL` variables, you must add `.vercel.app` to your Project Name. This will form the deployment URL, which will be in the format: `https://[project_name].vercel.app`. + +For example, in my case, the deployment URL is `https://documenso-supabase-web.vercel.app`. + +![Add Environment Variables to your Vercel project](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aru33fk1i19h0valffow.png) + +This is a sample `.env` to deploy. Copy and paste it to auto-populate the fields and click ‘**Deploy.’** Now, you only need to wait for your project to deploy. You’re going live — enjoy! + +```bash +DATABASE_URL='postgresql://postgres:typeinastrongpassword@db.njuigobjlbteahssqbtw.supabase.co:5432/postgres' + +NEXT_PUBLIC_WEBAPP_URL='https://documenso-supabase-web.vercel.app' +NEXTAUTH_SECRET='something gibrish to encrypt your jwt tokens' +NEXTAUTH_URL='https://documenso-supabase-web.vercel.app' + +# Get a Sendgrid Api key here: +SENDGRID_API_KEY='' + +# Set SMTP credentials to use SMTP instead of the Sendgrid API. +SMTP_MAIL_HOST='smtp.resend.com' +SMTP_MAIL_PORT='25' +SMTP_MAIL_USER='resend' +SMTP_MAIL_PASSWORD='YOUR_RESEND_API_KEY' +MAIL_FROM='noreply@[YOUR_DOMAIN]' + +NEXT_PUBLIC_ALLOW_SIGNUP=true +``` + +## Wrapping up + +![Deploying Documenso](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/secg29j9j40o4u2oa8o8.png) + +Congratulations! 🎉 You've successfully deployed Documenso using Vercel, Supabase, and Resend. You're now ready to create and sign your own documents with your self-hosted Documenso! + +In this step-by-step guide, you learned how to: + +- set up a Postgres database using Supabase, +- install SMTP with Resend, +- deploy your project with Vercel. + +Over to you! How was the tutorial? If you enjoyed it, [please do share](https://twitter.com/documenso/status/1700141802693480482)! And if you have any questions or comments, please reach out to me on [Twitter / X](https://twitter.com/EphraimDuncan_) (DM open) or [Discord](https://documen.so/discord). + +We're building an open-source alternative to DocuSign and welcome every contribution. Head over to the GitHub repository and [leave us a Star](https://github.com/documenso/documenso)! diff --git a/apps/marketing/content/blog/early-adopters.mdx b/apps/marketing/content/blog/early-adopters.mdx new file mode 100644 index 000000000..d4b5cb0ac --- /dev/null +++ b/apps/marketing/content/blog/early-adopters.mdx @@ -0,0 +1,67 @@ +--- +title: The Early Adopters Plan +description: Launch Week Day 4 and we are still early! Early enough for you to get a sweet deal for supporting Documenso's Mission. Join the movement and get a shiny early adopter account in the process. +authorName: 'Timur Ercan' +authorImage: '/blog/blog-author-timur.jpeg' +authorRole: 'Co-Founder' +date: 2023-09-28 +tags: + - Paid Plan + - Metrics + - Open Startup +--- + +
+ + +
+ "Being early is, uh, good." -Unknown +
+
+ +> TLDR; we have 100 early adopter accounts available at a great price. [Secure yours now](https://documenso.com/pricing). + +## Community-Driven Development + +As we ramp up hiring and development speed for Documenso, I want to discuss how we plan to build its core version. +As we want to be a highly community-driven product, we want to capture the thoughts and ideas of said community in two ways: + +1. Everything we plan (i.e. documen.so/roadmap) and build (i.e. documen.so/repo) is public and open to comments and suggestions from everyone by design. We plan to have discussions, streams, and articles showcasing what we're up to, encouraging feedback and iterations on our plans. +2. We're looking for 100 die-hard early adopters to get more deep hands-on feedback. If you want to be among the first to use and help shape Documenso, we have a special offer for you: + +## The Early Adopter Plan + +- All first 100 signups are entitled to the early adopter plan. +- The plan includes everything we build in the next 12 months and unlimited1 signatures +- This plan is priced at $30/mo. +- No matter what we add, the price is guaranteed for life as a thank you for supporting Documenso's mission2. And we plan to add a lot. +- This also includes unlimited users3 as part of the upcoming support for teams. +- If you already claimed an early adopter account in the past and canceled, we are happy to reactivate your account with the early adopter pricing. Reach out to support@documenso.com + +## Being an Early Adopter + +Being eligible for the early adopter plan has no formal requirements like giving feedback or being active in the community. In good faith, we assume you sign the Documenso Supporter Pledge to be part of this. And if you want to use the newest version quietly, that's fine, too. Everything the die-hard community brings up will be carefully considered and prioritized 4. Also, there will obviously be limited edition merch available for the first 100. +Documenso currently runs the community reviewed 0.9.1 version. Getting from here to the globally loved and adopted signing tool we all deserve will take a lot of work, and we want you on board to help us create it. Join us in shaping the future of open signing and having fun doing it. [Malfunction Mania](https://documenso.com/blog/malfunction-mania) and releasing 1.0 will go a long way. + +## Extending our open metrics + +As part of our ongoing effort to be open and transparent in our doing, we are adding "Early Adopters" to our [/open page](https://documenso.com/open) page. After we exceed the early adopter slots, this metric will transition to "Customers". When no more early adopter seats can be claimed, the early adopter plan will transition to a standard paid plan. It will still be priced at $30/mo., but will no longer include upcoming features or unlimited seats. You can [claim your early adopter account here](https://documenso.com/pricing). + +If you have any questions or comments, please reach out on [Twitter / X](https://twitter.com/eltimuro) (DM open) or [Discord](https://documen.so/discord). + +Best from Hamburg\ +Timur + +\ +[1] Excluding signatures, we have to pay for i.e. third-party QES + +[2] The Documenso Manifest + +[3] Within reason. If you are unsure what that means, feel free to contact hi@documenso.com. But it should be fine if you don't plan to onboard a huge enterprise. + +[4] We won't be able to build everything everyone asks for. But we firmly plan to listen and build in a way everyone's requirements are met as well as possible. diff --git a/apps/marketing/content/blog/malfunction-mania.mdx b/apps/marketing/content/blog/malfunction-mania.mdx new file mode 100644 index 000000000..c1f5732f0 --- /dev/null +++ b/apps/marketing/content/blog/malfunction-mania.mdx @@ -0,0 +1,57 @@ +--- +title: Announcing Malfunction Mania +description: Launch Week Day 2 Y'all! We're getting ready to release Documenso 1.0! Join in on the fun of making sure the open-source alternative to DocuSign is on point. We're calling a 'MALFUNCTION MANIA.' +authorName: 'Timur Ercan' +authorImage: '/blog/blog-author-timur.jpeg' +authorRole: 'Co-Founder' +date: 2023-09-26 +tags: + - Testing + - Rewrite + - Bounties +--- + +
+ + +
+ We're calling a MALFUNCTION MANIA! 🚨 +
+
+ +> TLDR; Documenso 1.0 is in the [staging environment](https://documen.so/staging). Go check it out. + +It's been a minute since Lucas proclaimed, ["We're doing a rewrite"](https://documenso.com/blog/why-were-doing-a-rewrite), and many of you have been asking when the new version will be available. I'm happy to say that the wait has come to an end. The work on Documenso 1.0 has reached a level we feel comfortable going into the next phase with. We had a lot of community feedback, contributions, and moral support to get us this far, which is why we're excited to announce the most extensive community project yet: + +As Documenso 1.0 just hit the staging environment, we're calling a MALFUNCTION MANIA. An enormous, public testing phase, where we invite everyone to try out the new version, hunt down, report, and fix any malfunctions (aka bugs), and give feedback before release. Malfunction Mania will happen alongside our internal testing, and by combining the two, we want to ensure the best possible release we can have for Version 1.0. We know many of you have been eager to contribute; this is your chance (the first of many to come). + +## As part of Malfunction Mania, we're offering special bug bounties + +- We award $25 - $100 per report/ issue/ fix, depending on the severity and if the problem is already known +- Bounties will be awarded for fixing reported or other critical issues via accepted Pull Requests (PR) +- Just reporting issues in a reproducible way can also be awarded +- Smaller but notable contributions like minor issues and documentation will be awarded with exclusive merch as we see fit. + +## What you can do + +- Head over to the [staging environment](https://documen.so/staging), check out the new version and give it a spin; +- Check out the [source code](https://github.com/documenso/documenso) on GitHub and look it over; +- Spin up the new version locally and try it out. + +## How to get the bounties + +- Report bugs by creating an issue here: [documen.so/issues](https://documen.so/issues); +- Fix bugs by creating a Pull Request (PR); +- Look over and add missing documentation/ Quickstarts and other useful resources. + +We don't have a specific end date for Malfunction Mania. We plan to move the staging version into the production environment by the end of the month once we're happy with the results. Bug reports and fixes are, of course, always welcome going forward. + +Best from Hamburg +Timur + +**[Follow Documenso on Twitter / X](https://documen.so/tw) and [join the Discord server](https://documen.so/discord) to get the latest about Malfunction Mania.** diff --git a/apps/marketing/content/blog/next.mdx b/apps/marketing/content/blog/next.mdx index c241cf3eb..2f83fe3ef 100644 --- a/apps/marketing/content/blog/next.mdx +++ b/apps/marketing/content/blog/next.mdx @@ -20,11 +20,11 @@ Today, I'm pleased to share with you a preview of the next Documenso. We redesigned the whole signing flow to make it more appealing and more convenient. -We improved the overall look and feel by making it more elegant and appropriately playful. Focused on the task at hand, but explicitly enjoying doing it. +We improved the overall look and feel by making it more elegant and appropriately playful. Focused on the task at hand, but explicitly enjoying doing it. **We call it happy minimalism.** -We paid particular attention to the moment of signing, which should be celebrated. +We paid particular attention to the moment of signing, which should be celebrated. The image below is the final bloom of the completion celebration we added: diff --git a/apps/marketing/content/blog/shop.mdx b/apps/marketing/content/blog/shop.mdx new file mode 100644 index 000000000..fafd98a40 --- /dev/null +++ b/apps/marketing/content/blog/shop.mdx @@ -0,0 +1,64 @@ +--- +title: Merch Mania +description: Happy Launch Week Day 3. The limited edition "Malfunction Mania" shirt is here. Grab it, while you can. +authorName: 'Timur Ercan' +authorImage: '/blog/blog-author-timur.jpeg' +authorRole: 'Co-Founder' +date: 2023-09-27 +tags: + - Merch + - Rewrite + - Bounties +--- + +
+ + +
+ The Limited Edition "Malfunction Mania" Shirt - Only during Malfunction Mania +
+
+ +> TLDR; We have a fancy limited edition shirt. Contribute to [Malfunction Mania](https://documenso.com/blog/malfunction-mania) to get one. + +We kicked off [Malfunction Mania](https://documenso.com/blog/malfunction-mania) yesterday, and the first [issues](https://github.com/documenso/documenso/issues) are coming in. As mentioned, there will be dollar bounties, but we also wanted to celebrate entering the final stage of version 1.0 with something special. This is why we created this limited edition shirt. It will only be available during the runtime of Malfunction Mania. We have yet to set an exact end date, the next event in October, however, is looming, ready to end MM. + +## Documenso Merch Shop + +The shirt will be available in our [merch shop](https://documen.so/shop) via a unique discount code. While the shirt will be gone after Malfunction Mania, the shop is here to stay and provide a well-deserved reward for great community members and contributors. All items can be earned by contrinuting to Documenso. + +
+ + +
+ Merch at Documenso is always given to those who deserve it. +
+
+ +## How earn the shirt + +If you have been following us, you know we are not big on formalities but highly value rewarding merit. That being said, any worthwhile contribution has a chance to get one. To inspire, here are a few ideas on how to contribute to securing one: + +- Report a bug with detailed reproduction details +- Fix a bug (you or somebody else reported) +- Analyze and describe a usability or user experience shortcoming +- Test the product in a systematic and least somewhat documented way +- Engage in discussion about the current version and its choices +- Raise awareness for Malfunction Mania and try out the [version currently in staging](https://documen.so/staging) +- Review the version with a video, stream, or screenshots and post about it +- Review existing or create missing documentation + +Best from Hamburg +Timur + +**[Follow Documenso on Twitter / X](https://documen.so/tw) and [join the Discord server](https://documen.so/discord) to get the latest updates about Malfunction Mania.** diff --git a/apps/marketing/example/cert.p12 b/apps/marketing/example/cert.p12 new file mode 100644 index 000000000..532ee19ab Binary files /dev/null and b/apps/marketing/example/cert.p12 differ diff --git a/apps/marketing/next.config.js b/apps/marketing/next.config.js index 2783e4063..aeb06bdfd 100644 --- a/apps/marketing/next.config.js +++ b/apps/marketing/next.config.js @@ -2,7 +2,7 @@ const path = require('path'); const { withContentlayer } = require('next-contentlayer'); -const { parsed: env } = require('dotenv').config({ +require('dotenv').config({ path: path.join(__dirname, '../../.env.local'), }); @@ -10,9 +10,13 @@ const { parsed: env } = require('dotenv').config({ const config = { experimental: { serverActions: true, + serverActionsBodySizeLimit: '10mb', }, reactStrictMode: true, transpilePackages: ['@documenso/lib', '@documenso/prisma', '@documenso/trpc', '@documenso/ui'], + env: { + NEXT_PUBLIC_PROJECT: 'marketing', + }, modularizeImports: { 'lucide-react': { transform: 'lucide-react/dist/esm/icons/{{ kebabCase member }}', @@ -52,6 +56,14 @@ const config = { }, ]; }, + async rewrites() { + return [ + { + source: '/ingest/:path*', + destination: 'https://eu.posthog.com/:path*', + }, + ]; + }, }; module.exports = withContentlayer(config); diff --git a/apps/marketing/package.json b/apps/marketing/package.json index c76c5e631..11d72ee9f 100644 --- a/apps/marketing/package.json +++ b/apps/marketing/package.json @@ -8,6 +8,7 @@ "build": "next build", "start": "next start", "lint": "next lint", + "clean": "rimraf .next && rimraf node_modules", "copy:pdfjs": "node ../../scripts/copy-pdfjs.cjs" }, "dependencies": { @@ -18,17 +19,19 @@ "@hookform/resolvers": "^3.1.0", "contentlayer": "^0.3.4", "framer-motion": "^10.12.8", - "lucide-react": "^0.214.0", + "lucide-react": "^0.279.0", "micro": "^10.0.1", - "next": "13.4.12", + "next": "13.4.19", "next-auth": "4.22.3", "next-contentlayer": "^0.3.4", "next-plausible": "^3.10.1", "perfect-freehand": "^1.2.0", + "posthog-js": "^1.77.3", "react": "18.2.0", + "react-confetti": "^6.1.0", "react-dom": "18.2.0", "react-hook-form": "^7.43.9", - "react-icons": "^4.8.0", + "react-icons": "^4.11.0", "recharts": "^2.7.2", "sharp": "0.32.5", "typescript": "5.1.6", diff --git a/apps/marketing/public/blog/blog-author-duncan.jpeg b/apps/marketing/public/blog/blog-author-duncan.jpeg new file mode 100644 index 000000000..a4a52711c Binary files /dev/null and b/apps/marketing/public/blog/blog-author-duncan.jpeg differ diff --git a/apps/marketing/public/blog/blog-author-lucas.png b/apps/marketing/public/blog/blog-author-lucas.png new file mode 100644 index 000000000..7fa901359 Binary files /dev/null and b/apps/marketing/public/blog/blog-author-lucas.png differ diff --git a/apps/marketing/public/blog/blog-banner-rewrite.png b/apps/marketing/public/blog/blog-banner-rewrite.png new file mode 100644 index 000000000..922b800cf Binary files /dev/null and b/apps/marketing/public/blog/blog-banner-rewrite.png differ diff --git a/apps/marketing/public/blog/designsystem.png b/apps/marketing/public/blog/designsystem.png new file mode 100644 index 000000000..dbbaa9e0f Binary files /dev/null and b/apps/marketing/public/blog/designsystem.png differ diff --git a/apps/marketing/public/blog/early.png b/apps/marketing/public/blog/early.png new file mode 100644 index 000000000..edfac2c42 Binary files /dev/null and b/apps/marketing/public/blog/early.png differ diff --git a/apps/marketing/public/blog/mania-shirt.png b/apps/marketing/public/blog/mania-shirt.png new file mode 100644 index 000000000..eab20119e Binary files /dev/null and b/apps/marketing/public/blog/mania-shirt.png differ diff --git a/apps/marketing/public/blog/mm.png b/apps/marketing/public/blog/mm.png new file mode 100644 index 000000000..19477f0f7 Binary files /dev/null and b/apps/marketing/public/blog/mm.png differ diff --git a/apps/marketing/public/blog/shop.png b/apps/marketing/public/blog/shop.png new file mode 100644 index 000000000..d13e88748 Binary files /dev/null and b/apps/marketing/public/blog/shop.png differ diff --git a/apps/marketing/src/app/(marketing)/[content]/page.tsx b/apps/marketing/src/app/(marketing)/[content]/page.tsx index 37d6d1b63..5c846e9f2 100644 --- a/apps/marketing/src/app/(marketing)/[content]/page.tsx +++ b/apps/marketing/src/app/(marketing)/[content]/page.tsx @@ -39,7 +39,7 @@ export default function ContentPage({ params }: { params: { content: string } }) const MDXContent = useMDXComponent(post.body.code); return ( -
+
); diff --git a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx index 757eb8882..f1952cc72 100644 --- a/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx +++ b/apps/marketing/src/app/(marketing)/blog/[post]/page.tsx @@ -39,21 +39,21 @@ export default function BlogPostPage({ params }: { params: { post: string } }) { const MDXContent = useMDXComponent(post.body.code); return ( -
+
-