mirror of
https://github.com/documenso/documenso.git
synced 2025-11-10 04:22:32 +10:00
feat: add content layer
Add blog pages Add privacy page
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@ -34,3 +34,6 @@ yarn-error.log*
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# contentlayer
|
||||
.contentlayer
|
||||
|
||||
51
apps/marketing/content/blog/announcing-documenso.mdx
Normal file
51
apps/marketing/content/blog/announcing-documenso.mdx
Normal file
@ -0,0 +1,51 @@
|
||||
---
|
||||
title: Announcing Documenso
|
||||
description: Launching an open-source document signing tool because trusted-based products should be built on openness. The first release will be in 2023. Sign up at documenso.com to be on board.
|
||||
authorName: 'Timur Ercan'
|
||||
authorImage: '/blog/blog-author-timur.jpeg'
|
||||
authorRole: 'Co-Founder'
|
||||
date: 2022-12-29
|
||||
tags:
|
||||
- Announcement
|
||||
---
|
||||
|
||||
<figure>
|
||||
<MdxNextImage
|
||||
src="/blog/blog-banner-announcing-documenso.webp"
|
||||
width="1400"
|
||||
height="884"
|
||||
alt="Documenso announcement blog banner"
|
||||
/>
|
||||
|
||||
<figcaption className="text-center">Documenso — The DocuSign Open Source Alternative.</figcaption>
|
||||
</figure>
|
||||
|
||||
## TL; DR;
|
||||
|
||||
I am launching an open-source document signing tool because trusted-based products should be built on openness. The first release will be in 2023. Sign up at <a href="https://documenso.com" target="_blank">documenso.com</a> to be on board.
|
||||
|
||||
## Let’s build the world’s most trusted document-signing tool.
|
||||
|
||||
Today I am excited to announce my new Project Documenso. Documenso is an open-source document signing tool you can host yourself and freely build upon because it is, you know, open-source. Before I get more into the details of what and when will be launched I want to take a moment and talk about why.
|
||||
|
||||
## Digital signing is great
|
||||
|
||||
Signing Documents digitally has countless benefits: Less struggle with printing, less wasting paper, faster request delivery, easier changes, easier coordination of people far away, verifiable document integrity, and verifiable signer identity (this is a vast topic, will write more on soon), easier storage and search of signed documents, the list goes on. Digital Signatures take something very old and very trusted like personally signing documents into the digital space, adding the benefits listed above. It also introduces a new party to every signing transaction, the signing tool providers. What was peer to peer transaction before, now goes through an intermediary. While this is not a problem in itself, it should make us think about how we want these providers of trust to work.
|
||||
|
||||
## How do we build trusted systems?
|
||||
|
||||
While doing research for Documenso I came upon a quote that expresses the current state of document signing pretty well:
|
||||
|
||||
> Document signing is NOT a technical problem. [Editor’s Note: Because it was solved technically a long time ago] It’s a legal acceptance problem — and everyone KNOWS DocuSign and friends and understands how they’re admissible. Anything else would have to compete with that and people would be suspicious of it for a long time.
|
||||
|
||||
While this may sound like a hurdle at first, it immediately gave me a sense of validation for a more open approach to signing. People will and should be suspicious of their tools and demand a high bar when it comes to trust. And the way to earn this trust is by being open. Trusted tools should be the result of thoughtful discussion and reviews. They should be the result of the needs and will of its community. They should be transparent, adaptable, and empowering while using. Open-Source embodies these values very well for software, which makes it a perfect fit for this space and creating a high-trust tool.
|
||||
|
||||
## Next Steps
|
||||
|
||||
So, what can you expect from here on out? I have started to build Documenso 0.1 which is scheduled to release in “early” 2023. If you are interested in helping make this happen, let me know via hi@documenso.com. Getting working code into the hands of the perspective Documenso community is currently the #1 goal. Other than that I will be releasing several articles about document signing and what something like Documenso should look like, in my humble opinion. So stay tuned!
|
||||
|
||||
If you think Documenso is worthy of support, please share <a href="https://documenso.com" target="_blank">documenso.com</a> with anyone interested, and sign up to be among the first to try out version 0.1 as soon as it launches.
|
||||
|
||||
Cheers from Hamburg
|
||||
|
||||
Timur
|
||||
98
apps/marketing/content/blog/building-documenso-pt1.mdx
Normal file
98
apps/marketing/content/blog/building-documenso-pt1.mdx
Normal file
@ -0,0 +1,98 @@
|
||||
---
|
||||
title: 'Building Documenso — Part 1: Certificates'
|
||||
description: In today's fast-paced world, productivity and efficiency are crucial for success, both in personal and professional endeavors. We all strive to make the most of our time and energy to achieve our goals effectively. However, it's not always easy to stay on track and maintain peak performance. In this blog post, we'll explore 10 valuable tips to help you boost productivity and efficiency in your daily life.
|
||||
authorName: 'Timur Ercan'
|
||||
authorImage: '/blog/blog-author-timur.jpeg'
|
||||
authorRole: 'Co-Founder'
|
||||
date: 2023-06-23
|
||||
tags:
|
||||
- Open Source
|
||||
- Document Signature
|
||||
- Certificates
|
||||
- Signing
|
||||
---
|
||||
|
||||
<figure>
|
||||
<MdxNextImage
|
||||
src="/blog/blog-banner-building-documenso.webp"
|
||||
width="1200"
|
||||
height="675"
|
||||
alt="Building Documenso blog banner"
|
||||
/>
|
||||
|
||||
<figcaption className="text-center">
|
||||
What actually is a signature?
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
> Disclaimer: I’m not a lawyer and this isn’t legal advice. We plan to publish a much more specific framework on the topic of signature validity.
|
||||
|
||||
This is the first installment 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.
|
||||
|
||||
As you may have heard, we launched the community-reviewed <a href="https://github.com/documenso/documenso" target="_blank">version 0.9 of Documenso on GitHub</a> recently and it’s now available through the early adopter’s plan. One of the most fundamental choices we had to make on this first release, was the choice of certificate. While it’s interesting to know what we opted for, this shall also serve as a guide for everyone facing the same choice for self-hosting Documenso.
|
||||
|
||||
> Question: Why do I need a document signing certificate to self-host?
|
||||
>
|
||||
> Short Answer: Inserting the images of a signature into the document is only part of the signing process.
|
||||
|
||||
To have an actual digitally signed document you need a document signing certificate that is used to create the digital signature that is inserted into the document, alongside the visible one¹.
|
||||
|
||||
When hosting a signature service yourself, as we do, there are four main choices for handling the certificate: Not using a certificate, creating your own, buying a trusted certificate, and becoming and trusted service provider to issue your own trusted certificate.
|
||||
|
||||
## 1\. No Certificate
|
||||
|
||||
A lot of signing services actually don’t employ actual digital signatures besides the inserted image. The only insert and image of the signatures into the document you sign. This can be done and is legally acceptable in many cases. This option isn’t directly supported by Documenso without changing the code.
|
||||
|
||||
## 2\. Create your own
|
||||
|
||||
Since the cryptography behind certificates is freely available as open source you could generate your own using OpenSSL for example. Since it’s hardly more work than option 1 (using Documenso at least), this would be my minimum effort recommendation. Having a self-created (“self-signed”) certificate doesn’t add much in terms of regulation but it guarantees the document’s integrity, meaning no changes have been made after signing². What this doesn’t give you, is the famous green checkmark in Adobe Acrobat. Why? Because you aren’t on the list of providers Adobe “trusts”.³
|
||||
|
||||
## 3\. Buy a “trusted” certificate.
|
||||
|
||||
There are Certificate Authorities (CAs) that can sell you a certificate⁴. The service they provide is, that they validate your name (personal certificates) or your organization’s name (corporate certificate) before creating your certificate for you, just like you did in option 2. The difference is, that they are listed on the previously mentioned trust lists (e.g. Adobe’s) and thus the resulting signatures get a nice, green checkmark in Adobe Reader⁵
|
||||
|
||||
## 4\. Becoming a Trusted Certificate Authority (CA) yourself and create your own certificate
|
||||
|
||||
This option is an incredibly complex endeavour, requiring a lot of effort and skill. It can be done, as there are multiple CAs around the world. Is it worth the effort? That depends a lot on what you’re trying to accomplish.
|
||||
|
||||
<center>. . .</center>
|
||||
|
||||
## What we did
|
||||
|
||||
Having briefly introduced the options, here is what we did: Since we aim to raise the bar on digital signature proliferation and trust, we opted to buy an “Advanced Personal Certificates for Companies/Organisations” from WiseKey. Thus, documents signed with Documenso’s hosted version look like this:
|
||||
|
||||
<figure>
|
||||
<MdxNextImage
|
||||
src="/blog/blog-fig-building-documenso.webp"
|
||||
width="1262"
|
||||
height="481"
|
||||
alt="Figure 1"
|
||||
/>
|
||||
|
||||
<figcaption className="text-center">The famous green checkmark: Signed by hosted Documenso</figcaption>
|
||||
</figure>
|
||||
|
||||
There weren’t any deeper reasons we choose WiseKey, other than they offered what we needed and there wasn’t any reason to look much further. While I didn’t map the entire certificate market offering (yet), I’m pretty sure something similar could be found elsewhere. While we opted for option 3, choosing option 2 might be perfectly reasonable considering your use case.⁶
|
||||
|
||||
> While this is our setup, for now, we have a bigger plan for this topic. While globally trusted SSL Certificates have been available for free, courtesy of Let’s Encrypt, for a while now, there is no such thing as document signing. And there should be. Not having free and trusted infrastructure for signing is blocking a completely new generation of signing products from being created. This is why we’ll start working on option 4 when the time is right.
|
||||
|
||||
Do you have questions or thoughts about this? As always, let me know in the comments, on <a href="http://twitter.com/eltimuro" target="_blank">twitter.com/eltimuro</a>
|
||||
or directly: <a href="https://documen.so/timur" target="_blank">documen.so/timur</a>
|
||||
|
||||
Join the self-hoster community here: <a href="https://documenso.slack.com/" target="_blank">https://documenso.slack.com/</a>
|
||||
|
||||
Best from Hamburg
|
||||
|
||||
Timur
|
||||
|
||||
\[1\] There are different approaches to signing a document. For the sake of simplicity, here we talk about a document with X inserted signature images, that is afterward signed once the by signing service, i.e. Documenso. If each visual signature should have its own digital one (e.g. QES — eIDAS Level 3), the case is a bit more complex.
|
||||
|
||||
\[2\] Of course, the signing service provider technically can change and resign the document, especially in the case mentioned in \[1\]. This can be countered by requiring actual digital signatures from each signer, that are bound to their identity/ account. Creating a completely trustless system in the context however is extremely hard to do and not the most pressing business need for the industry at this point, in my opinion. Though, this would be nice.
|
||||
|
||||
\[3\] Adobe, like the EU, has a list of organizations they trust. The Adobe green checkmark is powered by the Adobe trust list, if you want to be trusted by EU standards here: <a href="https://ec.europa.eu/digital-building-blocks/DSS/webapp-demo/validation" target="_blank">https://ec.europa.eu/digital-building-blocks/DSS/webapp-demo/validation</a>, you need to be on the EU trust list. Getting on each list is possible, though the latter is much more work.
|
||||
|
||||
\[4\] Technically, they sign your certificate creation request (created by you), containing your info with their certificate (which is trusted), making your certificate trusted. This way, everything you sign with your certificate is seen as trusted. They created their certificate just like you, the difference is they are on the lists, mentioned in \[3\]
|
||||
|
||||
\[5\] Why does Adobe get to say, what is trusted? They simply happen to have the most used pdf viewer. And since everyone checks there, whom they consider trusted carries weight. If it should be like this, is a different matter.
|
||||
|
||||
\[6\] Self-Signed signatures, even purely visual signatures, are fully legally binding. Why you use changes mainly your confidence in the signature and the burden of proof. Also, some industries require a certain level of signatures e.g. retail loans (QES/ eIDAS Level 3 in the EU).
|
||||
29
apps/marketing/content/blog/the-documenso-manifest.mdx
Normal file
29
apps/marketing/content/blog/the-documenso-manifest.mdx
Normal file
@ -0,0 +1,29 @@
|
||||
---
|
||||
title: The Documenso Manifest
|
||||
description: 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.
|
||||
authorName: 'Timur Ercan'
|
||||
authorImage: '/blog/blog-author-timur.jpeg'
|
||||
authorRole: 'Co-Founder'
|
||||
date: 2023-07-13
|
||||
tags:
|
||||
- Manifesto
|
||||
---
|
||||
|
||||
<figure>
|
||||
<MdxNextImage
|
||||
src="/blog/blog-banner-manifest.jpeg"
|
||||
width="1260"
|
||||
height="630"
|
||||
alt="The Documenso Manifest blog banner"
|
||||
/>
|
||||
|
||||
<figcaption className="text-center">
|
||||
Documenso — The DocuSign Open Source Alternative.
|
||||
</figcaption>
|
||||
</figure>
|
||||
|
||||
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.
|
||||
264
apps/marketing/content/privacy.mdx
Normal file
264
apps/marketing/content/privacy.mdx
Normal file
@ -0,0 +1,264 @@
|
||||
---
|
||||
title: Privacy Policy
|
||||
---
|
||||
|
||||
<article className="prose prose-slate mx-auto">
|
||||
<h1 id="privacy-policy">Privacy Policy</h1>
|
||||
<p>Effective date: 05/28/2023</p>
|
||||
<h3 id="1-introduction">1. Introduction</h3>
|
||||
<p>Welcome to <strong>Documenso Inc.</strong></p>
|
||||
<p>Documenso Inc. (“us”, “we”, or “our”) operates <a href="https://documenso.com">https://documenso.com</a> (hereinafter referred to as “ <strong>Service</strong>”).</p>
|
||||
<p> Our Privacy Policy governs your visit to <a href="https://documenso.com">https://documenso.com</a>, and explains how we collect, safeguard and disclose information that results from your use of our Service.</p>
|
||||
<p> We use your data to provide and improve Service. By using Service, you agree to the collection and use of information in accordance with this policy. Unless otherwise defined in this Privacy Policy, the terms used in this Privacy Policy have the same meanings as in our Terms and Conditions.</p>
|
||||
<p> Our Terms and Conditions (“<strong>Terms</strong>”) govern all use of our Service and together with the Privacy Policy constitutes your agreement with us (“ <strong>agreement</strong>”).</p>
|
||||
<h3 id="2-definitions">2. Definitions</h3>
|
||||
<p><strong>SERVICE</strong> means the https://documenso.com website operated by Documenso Inc.</p>
|
||||
<p><strong>PERSONAL DATA</strong> means data about a living individual who can be identified from those data (or from those and other information either in our possession or likely to come into our possession).</p>
|
||||
<p><strong>USAGE DATA</strong> is data collected automatically either generated by the use of Service or from Service infrastructure itself (for example, the duration of a page visit).</p>
|
||||
<p><strong>COOKIES</strong> are small files stored on your device (computer or mobile device).</p>
|
||||
<p><strong>DATA CONTROLLER</strong> means a natural or legal person who (either alone or jointly or in common with other persons) determines the purposes for which and the manner in which any personal data are, or are to be, processed. For the purpose of this Privacy Policy, we are a Data Controller of your data.</p>
|
||||
<p><strong>DATA PROCESSORS (OR SERVICE PROVIDERS)</strong> means any natural or legal person who processes the data on behalf of the Data Controller. We may use the services of various Service Providers in order to process your data more effectively.</p>
|
||||
<p><strong>DATA SUBJECT</strong> is any living individual who is the subject of Personal Data.</p>
|
||||
<p><strong>THE USER</strong> is the individual using our Service. The User corresponds to the Data Subject, who is the subject of Personal Data.</p>
|
||||
<h3 id="3-information-collection-and-use">3. Information Collection and Use</h3>
|
||||
<p>We collect several different types of information for various purposes to provide and improve our Service to you.</p>
|
||||
<h3 id="4-types-of-data-collected">4. Types of Data Collected</h3>
|
||||
<p><strong>Personal Data</strong></p>
|
||||
<p> While using our Service, we may ask you to provide us with certain personally identifiable information that can be used to contact or identify you (“<strong>Personal Data</strong>”). Personally identifiable information may include, but is not limited to:</p>
|
||||
<ol type="a">
|
||||
<li>Email address</li>
|
||||
<li>First name and last name</li>
|
||||
<li>Cookies and Usage Data</li>
|
||||
</ol>
|
||||
<p>We may use your Personal Data to contact you with newsletters, marketing or promotional materials and other information that may be of interest to you. You may opt out of receiving any, or all, of these communications from us by following the unsubscribe link.</p>
|
||||
<p><strong>Usage Data</strong></p>
|
||||
<p>We may also collect information that your browser sends whenever you visit our Service or when you access Service by or through a mobile device (“<strong>Usage Data</strong>”).</p>
|
||||
<p>This Usage Data may include information such as your computer's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that you visit, the time and date of your visit, the time spent on those pages, unique device identifiers and other diagnostic data.</p>
|
||||
<p>When you access Service with a mobile device, this Usage Data may include information such as the type of mobile device you use, your mobile device unique ID, the IP address of your mobile device, your mobile operating system, the type of mobile Internet browser you use, unique device identifiers and other diagnostic data.</p>
|
||||
<p><strong>Tracking Cookies Data</strong></p>
|
||||
<p>We use cookies and similar tracking technologies to track the activity on our Service and we hold certain information.</p>
|
||||
<p>Cookies are files with a small amount of data which may include an anonymous unique identifier. Cookies are sent to your browser from a website and stored on your device. Other tracking technologies are also used such as beacons, tags and scripts to collect and track information and to improve and analyze our Service.</p>
|
||||
<p>You can instruct your browser to refuse all cookies or to indicate when a cookie is being sent. However, if you do not accept cookies, you may not be able to use some portions of our Service.</p>
|
||||
<p>Examples of Cookies we use:</p>
|
||||
<ol type="a">
|
||||
<li>
|
||||
<strong>Session Cookies:</strong> We use Session Cookies to operate our Service.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Preference Cookies:</strong> We use Preference Cookies to remember your
|
||||
preferences and various settings.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Security Cookies:</strong> We use Security Cookies for security purposes.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Advertising Cookies:</strong> Advertising Cookies are used to serve you with
|
||||
advertisements that may be relevant to you and your interests.
|
||||
</li>
|
||||
</ol>
|
||||
<h3 id="5-use-of-data">5. Use of Data</h3>
|
||||
<p>Documenso Inc. uses the collected data for various purposes:</p>
|
||||
<ol type="a">
|
||||
<li>to provide and maintain our Service;</li>
|
||||
<li>to notify you about changes to our Service;</li>
|
||||
<li>
|
||||
to allow you to participate in interactive features of our Service when you choose to do
|
||||
so;
|
||||
</li>
|
||||
<li>to provide customer support;</li>
|
||||
<li>to gather analysis or valuable information so that we can improve our Service;</li>
|
||||
<li>to monitor the usage of our Service;</li>
|
||||
<li>to detect, prevent and address technical issues;</li>
|
||||
<li>to fulfill any other purpose for which you provide it;</li>
|
||||
<li>
|
||||
to carry out our obligations and enforce our rights arising from any contracts entered
|
||||
into between you and us, including for billing and collection;
|
||||
</li>
|
||||
<li>
|
||||
to provide you with notices about your account and/or subscription, including expiration
|
||||
and renewal notices, email-instructions, etc.;
|
||||
</li>
|
||||
<li>
|
||||
to provide you with news, special offers and general information about other goods,
|
||||
services and events which we offer that are similar to those that you have already
|
||||
purchased or enquired about unless you have opted not to receive such information;
|
||||
</li>
|
||||
<li>in any other way we may describe when you provide the information;</li>
|
||||
<li>for any other purpose with your consent.</li>
|
||||
</ol>
|
||||
<h3 id="6-retention-of-data">6. Retention of Data</h3>
|
||||
<p>We will retain your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.</p>
|
||||
<p>We will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period, except when this data is used to strengthen the security or to improve the functionality of our Service, or we are legally obligated to retain this data for longer time periods.</p>
|
||||
<h3 id="7-transfer-of-data">7. Transfer of Data</h3>
|
||||
<p>Your information, including Personal Data, may be transferred to – and maintained on – computers located outside of your state, province, country or other governmental jurisdiction where the data protection laws may differ from those of your jurisdiction.</p>
|
||||
<p>If you are located outside United States and choose to provide information to us, please note that we transfer the data, including Personal Data, to United States and process it there.</p>
|
||||
<p>Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.</p>
|
||||
<p>Documenso Inc. will take all the steps reasonably necessary to ensure that your data is treated securely and in accordance with this Privacy Policy and no transfer of your Personal Data will take place to an organisation or a country unless there are adequate controls in place including the security of your data and other personal information.</p>
|
||||
<h3 id="8-disclosure-of-data">8. Disclosure of Data</h3>
|
||||
<p>We may disclose personal information that we collect, or you provide:</p>
|
||||
<ol type="a">
|
||||
<li>
|
||||
<strong>Disclosure for Law Enforcement.</strong>
|
||||
</li>
|
||||
<li>
|
||||
Under certain circumstances, we may be required to disclose your Personal Data if required
|
||||
to do so by law or in response to valid requests by public authorities.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Business Transaction.</strong>
|
||||
</li>
|
||||
<li>
|
||||
If we or our subsidiaries are involved in a merger, acquisition or asset sale, your
|
||||
Personal Data may be transferred.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Other cases. We may disclose your information also:</strong>
|
||||
<ol type="i">
|
||||
<li>to our subsidiaries and affiliates;</li>
|
||||
<li>
|
||||
to contractors, service providers, and other third parties we use to support our
|
||||
business;
|
||||
</li>
|
||||
<li>to fulfill the purpose for which you provide it;</li>
|
||||
</ol>
|
||||
</li>
|
||||
</ol>
|
||||
<h3 id="9-security-of-data">9. Security of Data</h3>
|
||||
<p>The security of your data is important to us but remember that no method of transmission over the Internet or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Data, we cannot guarantee its absolute security.</p>
|
||||
<h3 id="10-your-data-protection-rights-under-general-data-protection-regulation-gdpr-">10. Your Data Protection Rights Under General Data Protection Regulation (GDPR)</h3>
|
||||
<p>If you are a resident of the European Union (EU) and European Economic Area (EEA), you have certain data protection rights, covered by GDPR. – See more at <a href="https://eur-lex.europa.eu/eli/reg/2016/679/oj">https://eur-lex.europa.eu/eli/reg/2016/679/oj</a></p>
|
||||
<p>We aim to take reasonable steps to allow you to correct, amend, delete, or limit the use of your Personal Data.</p>
|
||||
<p>If you wish to be informed what Personal Data we hold about you and if you want it to be removed from our systems, please email us at hi@documenso.com.</p>
|
||||
<p>In certain circumstances, you have the following data protection rights:</p>
|
||||
<ol type="a">
|
||||
<li>the right to access, update or to delete the information we have on you;</li>
|
||||
<li>
|
||||
the right of rectification. You have the right to have your information rectified if that
|
||||
information is inaccurate or incomplete;
|
||||
</li>
|
||||
<li>
|
||||
the right to object. You have the right to object to our processing of your Personal Data;
|
||||
</li>
|
||||
<li>
|
||||
the right of restriction. You have the right to request that we restrict the processing of
|
||||
your personal information;
|
||||
</li>
|
||||
<li>
|
||||
the right to data portability. You have the right to be provided with a copy of your
|
||||
Personal Data in a structured, machine-readable and commonly used format;
|
||||
</li>
|
||||
<li>
|
||||
the right to withdraw consent. You also have the right to withdraw your consent at any
|
||||
time where we rely on your consent to process your personal information;
|
||||
</li>
|
||||
</ol>
|
||||
<p>Please note that we may ask you to verify your identity before responding to such requests. Please note, we may not able to provide Service without some necessary data.</p>
|
||||
<p>You have the right to complain to a Data Protection Authority about our collection and use of your Personal Data. For more information, please contact your local data protection authority in the European Economic Area (EEA).</p>
|
||||
<h3 id="11-your-data-protection-rights-under-the-california-privacy-protection-act-caloppa-">11. Your Data Protection Rights under the California Privacy Protection Act (CalOPPA)</h3>
|
||||
<p>CalOPPA is the first state law in the nation to require commercial websites and online services to post a privacy policy. The law’s reach stretches well beyond California to require a person or company in the United States (and conceivable the world) that operates websites collecting personally identifiable information from California consumers to post a conspicuous privacy policy on its website stating exactly the information being collected and those individuals with whom it is being shared, and to comply with this policy. – See more at: <a href="https://consumercal.org/about-cfc/cfc-education-foundation/california-online-privacy-protection-act-caloppa-3/">https://consumercal.org/about-cfc/cfc-education-foundation/california-online-privacy-protection-act-caloppa-3/</a></p>
|
||||
<p>According to CalOPPA we agree to the following:</p>
|
||||
<ol type="a">
|
||||
<li>users can visit our site anonymously;</li>
|
||||
<li>
|
||||
our Privacy Policy link includes the word “Privacy”, and can easily be found on the page
|
||||
specified above on the home page of our website;
|
||||
</li>
|
||||
<li>users will be notified of any privacy policy changes on our Privacy Policy Page;</li>
|
||||
<li>
|
||||
users are able to change their personal information by emailing us at hi@documenso.com.
|
||||
</li>
|
||||
</ol>
|
||||
<p>Our Policy on “Do Not Track” Signals:</p>
|
||||
<p>We honor Do Not Track signals and do not track, plant cookies, or use advertising when a Do Not Track browser mechanism is in place. Do Not Track is a preference you can set in your web browser to inform websites that you do not want to be tracked.</p>
|
||||
<p>You can enable or disable Do Not Track by visiting the Preferences or Settings page of your web browser.</p>
|
||||
<ol>
|
||||
<li>
|
||||
<strong>
|
||||
Your Data Protection Rights under the California Consumer Privacy Act (CCPA)
|
||||
</strong>
|
||||
</li>
|
||||
</ol>
|
||||
<p>If you are a California resident, you are entitled to learn what data we collect about you, ask to delete your data and not to sell (share) it. To exercise your data protection rights, you can make certain requests and ask us:</p>
|
||||
<ol type="a">
|
||||
<li>
|
||||
<strong>What personal information we have about you</strong>. If you make this request, we
|
||||
will return to you:
|
||||
<ol type="i">
|
||||
<li>The categories of personal information we have collected about you.</li>
|
||||
|
||||
<li>The categories of sources from which we collect your personal information.</li>
|
||||
|
||||
<li>
|
||||
The business or commercial purpose for collecting or selling your personal
|
||||
information.
|
||||
</li>
|
||||
|
||||
<li>The categories of third parties with whom we share personal information.</li>
|
||||
|
||||
<li>The specific pieces of personal information we have collected about you.</li>
|
||||
|
||||
<li>
|
||||
A list of categories of personal information that we have sold, along with the
|
||||
category of any other company we sold it to. If we have not sold your personal
|
||||
information, we will inform you of that fact.
|
||||
</li>
|
||||
|
||||
<li>
|
||||
A list of categories of personal information that we have disclosed for a business
|
||||
purpose, along with the category of any other company we shared it with.
|
||||
</li>
|
||||
</ol>
|
||||
<p>Please note, you are entitled to ask us to provide you with this information up to two times in a rolling twelve-month period. When you make this request, the information provided may be limited to the personal information we collected about you in the previous 12 months.</p>
|
||||
</li>
|
||||
<li>
|
||||
<strong>To delete your personal information</strong>. If you make this request, we will
|
||||
delete the personal information we hold about you as of the date of your request from our
|
||||
records and direct any service providers to do the same. In some cases, deletion may be
|
||||
accomplished through de-identification of the information. If you choose to delete your
|
||||
personal information, you may not be able to use certain functions that require your
|
||||
personal information to operate.
|
||||
</li>
|
||||
<li>
|
||||
<strong>To stop selling your personal information</strong>. We don't sell or rent your
|
||||
personal information to any third parties for any purpose. You are the only owner of your
|
||||
Personal Data and can request disclosure or deletion at any time.
|
||||
</li>
|
||||
|
||||
</ol>
|
||||
<p>Please note, if you ask us to delete or stop selling your data, it may impact your experience with us, and you may not be able to participate in certain programs or membership services which require the usage of your personal information to function. But in no circumstances, we will discriminate against you for exercising your rights.</p>
|
||||
<p>To exercise your California data protection rights described above, please send your request(s) by one of the following means:</p>
|
||||
<p>By email: hi@documenso.com</p>
|
||||
<p>Your data protection rights, described above, are covered by the CCPA, short for the California Consumer Privacy Act. To find out more, visit the official <a href="https://leginfo.legislature.ca.gov/faces/billTextClient.xhtml?bill_id=201720180AB375">California Legislative Information website</a>. The CCPA took effect on 01/01/2020.</p>
|
||||
<h3 id="13-service-providers">13. Service Providers</h3>
|
||||
<p>We may employ third party companies and individuals to facilitate our Service (“ <strong>Service Providers</strong>”), provide Service on our behalf, perform Service-related services or assist us in analysing how our Service is used.</p>
|
||||
<p>These third parties have access to your Personal Data only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose.</p>
|
||||
<h3 id="14-analytics">14. Analytics</h3>
|
||||
<p>We may use third-party Service Providers to monitor and analyze the use of our Service.</p>
|
||||
<p><strong>Plausible Analytics</strong></p>
|
||||
<p>Plausible Analytics is an analytics service provided by Conva Ventures Inc. You can find their Privacy Policy here: <a href="https://plausible.io/privacy">https://plausible.io/privacy</a></p>
|
||||
<h3 id="15-ci-cd-tools">15. CI/CD tools</h3>
|
||||
<p>We may use third-party Service Providers to automate the development process of our Service.</p>
|
||||
<p><strong>GitHub</strong></p>
|
||||
<p>GitHub is provided by GitHub, Inc.</p>
|
||||
<p>GitHub is a development platform to host and review code, manage projects, and build software.</p>
|
||||
<p>For more information on what data GitHub collects for what purpose and how the protection of the data is ensured, please visit GitHub Privacy Policy page: <a href="https://help.github.com/en/articles/github-privacy-statement">https://help.github.com/en/articles/github-privacy-statement</a> .</p>
|
||||
<h3 id="16-payments">16. Payments</h3>
|
||||
<p>We may provide paid products and/or services within Service. In that case, we use third-party services for payment processing (e.g. payment processors).</p>
|
||||
<p>We will not store or collect your payment card details. That information is provided directly to our third-party payment processors whose use of your personal information is governed by their Privacy Policy. These payment processors adhere to the standards set by PCI-DSS as managed by the PCI Security Standards Council, which is a joint effort of brands like Visa, Mastercard, American Express and Discover. PCI-DSS requirements help ensure the secure handling of payment information.</p>
|
||||
<p>The payment processors we work with are:</p>
|
||||
<p><strong>Stripe:</strong></p>
|
||||
<p>Their Privacy Policy can be viewed at: <a href="https://stripe.com/us/privacy">https://stripe.com/us/privacy</a></p>
|
||||
<h3 id="17-links-to-other-sites">17. Links to Other Sites</h3>
|
||||
<p>Our Service may contain links to other sites that are not operated by us. If you click a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit.</p>
|
||||
<p>We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.</p>
|
||||
<h3 id="18-children-s-privacy">18. Children's Privacy</h3>
|
||||
<p>Our Services are not intended for use by children under the age of 18 (“ <strong>Child</strong>” or “<strong>Children</strong>”).</p>
|
||||
<p>We do not knowingly collect personally identifiable information from Children under 18. If you become aware that a Child has provided us with Personal Data, please contact us. If we become aware that we have collected Personal Data from Children without verification of parental consent, we take steps to remove that information from our servers.</p>
|
||||
<h3 id="19-changes-to-this-privacy-policy">19. Changes to This Privacy Policy</h3>
|
||||
<p>We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.</p>
|
||||
<p>We will let you know via email and/or a prominent notice on our Service, prior to the change becoming effective and update “effective date” at the top of this Privacy Policy.</p>
|
||||
<p>You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.</p>
|
||||
<h3 id="20-contact-us">20. Contact Us</h3>
|
||||
<p>If you have any questions about this Privacy Policy, please contact us:</p>
|
||||
<p>By email: hi@documenso.com.</p>
|
||||
</article>
|
||||
33
apps/marketing/contentlayer.config.ts
Normal file
33
apps/marketing/contentlayer.config.ts
Normal file
@ -0,0 +1,33 @@
|
||||
import { defineDocumentType, makeSource } from 'contentlayer/source-files';
|
||||
|
||||
export const BlogPost = defineDocumentType(() => ({
|
||||
name: 'BlogPost',
|
||||
filePathPattern: `blog/**/*.mdx`,
|
||||
contentType: 'mdx',
|
||||
fields: {
|
||||
title: { type: 'string', required: true },
|
||||
description: { type: 'string', required: true },
|
||||
date: { type: 'date', required: true },
|
||||
tags: { type: 'list', of: { type: 'string' }, required: false, default: [] },
|
||||
authorName: { type: 'string', required: true },
|
||||
authorImage: { type: 'string', required: false },
|
||||
authorRole: { type: 'string', required: true },
|
||||
},
|
||||
computedFields: {
|
||||
href: { type: 'string', resolve: (post) => `/${post._raw.flattenedPath}` },
|
||||
},
|
||||
}));
|
||||
|
||||
export const Privacy = defineDocumentType(() => ({
|
||||
name: 'Privacy',
|
||||
filePathPattern: 'privacy.mdx',
|
||||
contentType: 'mdx',
|
||||
fields: {
|
||||
title: { type: 'string', required: true },
|
||||
},
|
||||
computedFields: {
|
||||
href: { type: 'string', resolve: (post) => `/${post._raw.flattenedPath}` },
|
||||
},
|
||||
}));
|
||||
|
||||
export default makeSource({ contentDirPath: 'content', documentTypes: [BlogPost, Privacy] });
|
||||
@ -1,5 +1,6 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
const path = require('path');
|
||||
const { withContentlayer } = require('next-contentlayer');
|
||||
|
||||
const { parsed: env } = require('dotenv').config({
|
||||
path: path.join(__dirname, '../../.env.local'),
|
||||
@ -12,4 +13,4 @@ const config = {
|
||||
env,
|
||||
};
|
||||
|
||||
module.exports = config;
|
||||
module.exports = withContentlayer(config);
|
||||
|
||||
@ -15,11 +15,13 @@
|
||||
"@documenso/trpc": "*",
|
||||
"@documenso/ui": "*",
|
||||
"@hookform/resolvers": "^3.1.0",
|
||||
"contentlayer": "^0.3.4",
|
||||
"framer-motion": "^10.12.8",
|
||||
"lucide-react": "^0.214.0",
|
||||
"micro": "^10.0.1",
|
||||
"next": "13.4.9",
|
||||
"next-auth": "^4.22.1",
|
||||
"next-contentlayer": "^0.3.4",
|
||||
"next-plausible": "^3.7.2",
|
||||
"perfect-freehand": "^1.2.0",
|
||||
"react": "18.2.0",
|
||||
|
||||
BIN
apps/marketing/public/blog/blog-author-timur.jpeg
Normal file
BIN
apps/marketing/public/blog/blog-author-timur.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
BIN
apps/marketing/public/blog/blog-banner-announcing-documenso.webp
Normal file
BIN
apps/marketing/public/blog/blog-banner-announcing-documenso.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
BIN
apps/marketing/public/blog/blog-banner-building-documenso.webp
Normal file
BIN
apps/marketing/public/blog/blog-banner-building-documenso.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 41 KiB |
BIN
apps/marketing/public/blog/blog-banner-manifest.jpeg
Normal file
BIN
apps/marketing/public/blog/blog-banner-manifest.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
BIN
apps/marketing/public/blog/blog-fig-building-documenso.webp
Normal file
BIN
apps/marketing/public/blog/blog-fig-building-documenso.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
79
apps/marketing/src/app/(marketing)/blog/[post]/page.tsx
Normal file
79
apps/marketing/src/app/(marketing)/blog/[post]/page.tsx
Normal file
@ -0,0 +1,79 @@
|
||||
import Image from 'next/image';
|
||||
import { notFound } from 'next/navigation';
|
||||
|
||||
import { allBlogPosts } from 'contentlayer/generated';
|
||||
import type { MDXComponents } from 'mdx/types';
|
||||
import { useMDXComponent } from 'next-contentlayer/hooks';
|
||||
|
||||
export const generateStaticParams = async () =>
|
||||
allBlogPosts.map((post) => ({ post: post._raw.flattenedPath }));
|
||||
|
||||
export const generateMetadata = ({ params }: { params: { post: string } }) => {
|
||||
const blogPost = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`);
|
||||
|
||||
if (!blogPost) {
|
||||
notFound();
|
||||
}
|
||||
|
||||
return { title: `Documenso - ${blogPost.title}` };
|
||||
};
|
||||
|
||||
const mdxComponents: MDXComponents = {
|
||||
MdxNextImage: (props: { width: number; height: number; alt?: string; src: string }) => (
|
||||
<Image {...props} alt={props.alt ?? ''} />
|
||||
),
|
||||
};
|
||||
|
||||
export default function BlogPostPage({ params }: { params: { post: string } }) {
|
||||
const post = allBlogPosts.find((post) => post._raw.flattenedPath === `blog/${params.post}`);
|
||||
|
||||
if (!post) {
|
||||
notFound();
|
||||
}
|
||||
|
||||
const MDXContent = useMDXComponent(post.body.code);
|
||||
|
||||
return (
|
||||
<article className="prose prose-slate mx-auto py-8">
|
||||
<div className="mb-6 text-center">
|
||||
<time dateTime={post.date} className="mb-1 text-xs text-gray-600">
|
||||
{new Date(post.date).toLocaleDateString()}
|
||||
</time>
|
||||
|
||||
<h1 className="text-3xl font-bold">{post.title}</h1>
|
||||
|
||||
<div className="not-prose relative -mt-2 flex items-center gap-x-4 border-b border-t py-4">
|
||||
<div className="h-10 w-10 rounded-full bg-gray-50">
|
||||
{post.authorImage && (
|
||||
<img
|
||||
src={post.authorImage}
|
||||
alt={`Image of ${post.authorName}`}
|
||||
className="h-10 w-10 rounded-full bg-gray-50"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="text-sm leading-6">
|
||||
<p className="text-left font-semibold text-gray-900">{post.authorName}</p>
|
||||
<p className="text-gray-600">{post.authorRole}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<MDXContent components={mdxComponents} />
|
||||
|
||||
{post.tags.length > 0 && (
|
||||
<ul className="not-prose flex list-none flex-row space-x-2 px-0">
|
||||
{post.tags.map((tag, i) => (
|
||||
<li
|
||||
key={`tag-${i}`}
|
||||
className="relative z-10 whitespace-nowrap rounded-full bg-gray-50 px-3 py-1.5 font-medium text-gray-600 hover:bg-gray-100"
|
||||
>
|
||||
{tag}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</article>
|
||||
);
|
||||
}
|
||||
80
apps/marketing/src/app/(marketing)/blog/page.tsx
Normal file
80
apps/marketing/src/app/(marketing)/blog/page.tsx
Normal file
@ -0,0 +1,80 @@
|
||||
import { allBlogPosts } from 'contentlayer/generated';
|
||||
|
||||
export default function BlogPage() {
|
||||
const blogPosts = allBlogPosts.sort((a, b) => {
|
||||
const dateA = new Date(a.date);
|
||||
const dateB = new Date(b.date);
|
||||
|
||||
return dateB.getTime() - dateA.getTime();
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="mt-12">
|
||||
<div className="text-center">
|
||||
<h1 className="text-3xl font-bold lg:text-5xl">From the blog</h1>
|
||||
|
||||
<p className="mt-4 text-lg leading-normal text-[#31373D]">
|
||||
Get the latest news from Documenso, including product updates, team announcements and
|
||||
more!
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="mt-10 space-y-16 divide-y divide-gray-100 border-t border-gray-200 ">
|
||||
{blogPosts.map((post, i) => (
|
||||
<article
|
||||
key={`blog-${i}`}
|
||||
className="mx-auto flex max-w-xl flex-col items-start justify-between pt-10 first:pt-0 sm:mt-16 sm:pt-16"
|
||||
>
|
||||
<div className="flex items-center gap-x-4 text-xs">
|
||||
<time dateTime={post.date} className="text-gray-500">
|
||||
{new Date(post.date).toLocaleDateString()}
|
||||
</time>
|
||||
|
||||
{post.tags.length > 0 && (
|
||||
<ul className="flex flex-row space-x-2">
|
||||
{post.tags.map((tag, j) => (
|
||||
<li
|
||||
key={`blog-${i}-tag-${j}`}
|
||||
className="relative z-10 whitespace-nowrap rounded-full bg-gray-50 px-3 py-1.5 font-medium text-gray-600 hover:bg-gray-100"
|
||||
>
|
||||
{tag}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="group relative">
|
||||
<h3 className="mt-3 text-lg font-semibold leading-6 text-gray-900 group-hover:text-gray-600">
|
||||
<a href={post.href}>
|
||||
<span className="absolute inset-0" />
|
||||
{post.title}
|
||||
</a>
|
||||
</h3>
|
||||
<p className="mt-5 line-clamp-3 text-sm leading-6 text-gray-600">
|
||||
{post.description}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="relative mt-4 flex items-center gap-x-4">
|
||||
<div className="h-10 w-10 rounded-full bg-gray-50">
|
||||
{post.authorImage && (
|
||||
<img
|
||||
src={post.authorImage}
|
||||
alt={`Image of ${post.authorName}`}
|
||||
className="h-10 w-10 rounded-full bg-gray-50"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="text-sm leading-6">
|
||||
<p className="font-semibold text-gray-900">{post.authorName}</p>
|
||||
<p className="text-gray-600">{post.authorRole}</p>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
13
apps/marketing/src/app/(marketing)/privacy/page.tsx
Normal file
13
apps/marketing/src/app/(marketing)/privacy/page.tsx
Normal file
@ -0,0 +1,13 @@
|
||||
import { useMDXComponent } from 'next-contentlayer/hooks';
|
||||
|
||||
import privacy from '~/../.contentlayer/generated/Privacy/privacy.mdx.json';
|
||||
|
||||
export const generateMetadata = () => {
|
||||
return { title: `Documenso - ${privacy.title}` };
|
||||
};
|
||||
|
||||
export default function PrivacyPage() {
|
||||
const MDXContent = useMDXComponent(privacy.body.code);
|
||||
|
||||
return <MDXContent />;
|
||||
}
|
||||
@ -43,9 +43,7 @@ export default function RootLayout({ children }: { children: React.ReactNode })
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<PlausibleProvider>
|
||||
{children}
|
||||
</PlausibleProvider>
|
||||
<PlausibleProvider>{children}</PlausibleProvider>
|
||||
<Toaster />
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@ -46,6 +46,10 @@ export const Footer = ({ className, ...props }: FooterProps) => {
|
||||
</div>
|
||||
|
||||
<div className="flex flex-wrap items-center gap-x-4 gap-y-2.5">
|
||||
<Link href="/blog" className="flex-shrink-0 text-sm text-[#8D8D8D] hover:text-[#6D6D6D]">
|
||||
Blog
|
||||
</Link>
|
||||
|
||||
<Link
|
||||
href="/pricing"
|
||||
className="flex-shrink-0 text-sm text-[#8D8D8D] hover:text-[#6D6D6D]"
|
||||
@ -68,12 +72,12 @@ export const Footer = ({ className, ...props }: FooterProps) => {
|
||||
Support
|
||||
</Link>
|
||||
|
||||
{/* <Link
|
||||
<Link
|
||||
href="/privacy"
|
||||
className="flex-shrink-0 text-sm text-[#8D8D8D] hover:text-[#6D6D6D]"
|
||||
>
|
||||
Privacy
|
||||
</Link> */}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
<div className="mx-auto mt-4 w-full max-w-screen-xl px-8 md:mt-12 lg:mt-24">
|
||||
|
||||
@ -15,6 +15,10 @@ export const Header = ({ className, ...props }: HeaderProps) => {
|
||||
</Link>
|
||||
|
||||
<div className="flex items-center gap-x-6">
|
||||
<Link href="/blog" className="text-sm font-semibold text-[#8D8D8D] hover:text-[#6D6D6D]">
|
||||
Blog
|
||||
</Link>
|
||||
|
||||
<Link href="/pricing" className="text-sm font-semibold text-[#8D8D8D] hover:text-[#6D6D6D]">
|
||||
Pricing
|
||||
</Link>
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
{
|
||||
"extends": "@documenso/tsconfig/nextjs.json",
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"allowJs": true,
|
||||
"plugins": [
|
||||
{
|
||||
@ -8,9 +9,8 @@
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"~/*": [
|
||||
"./src/*"
|
||||
]
|
||||
"~/*": ["./src/*"],
|
||||
"contentlayer/generated": ["./.contentlayer/generated"]
|
||||
},
|
||||
"strictNullChecks": true
|
||||
},
|
||||
@ -18,9 +18,8 @@
|
||||
"next-env.d.ts",
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
".next/types/**/*.ts"
|
||||
".next/types/**/*.ts",
|
||||
".contentlayer/generated"
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
||||
7816
package-lock.json
generated
7816
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -116,5 +116,5 @@ module.exports = {
|
||||
},
|
||||
},
|
||||
},
|
||||
plugins: [require('tailwindcss-animate')],
|
||||
plugins: [require('tailwindcss-animate'), require('@tailwindcss/typography')],
|
||||
};
|
||||
|
||||
@ -10,7 +10,9 @@
|
||||
"tailwindcss": "^3.2.7",
|
||||
"tailwindcss-animate": "^1.0.5"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"devDependencies": {
|
||||
"@tailwindcss/typography": "^0.5.9"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user