diff --git a/apps/web/contentlayer.config.ts b/apps/web/contentlayer.config.ts
index 1658bc06b..4d1baa1ee 100644
--- a/apps/web/contentlayer.config.ts
+++ b/apps/web/contentlayer.config.ts
@@ -2,13 +2,14 @@ import { makeSource } from "contentlayer/source-files";
import rehypeSlug from "rehype-slug";
import remarkGfm from "remark-gfm";
+import { LegalPost } from "./src/contentlayer/documents/legal";
import { Post } from "./src/contentlayer/documents/post";
import autolinkHeadings from "./src/contentlayer/plugins/autolink-headings";
import prettyCode from "./src/contentlayer/plugins/pretty-code";
export default makeSource({
contentDirPath: "src/content/",
- documentTypes: [Post],
+ documentTypes: [Post, LegalPost],
mdx: {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeSlug, prettyCode, autolinkHeadings],
diff --git a/apps/web/src/app/legal/[slug]/layout.tsx b/apps/web/src/app/legal/[slug]/layout.tsx
new file mode 100644
index 000000000..fe800ca92
--- /dev/null
+++ b/apps/web/src/app/legal/[slug]/layout.tsx
@@ -0,0 +1,11 @@
+import * as React from "react";
+
+import { MarketingLayout } from "@/components/layout/marketing-layout";
+
+export default function BlogLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return {children};
+}
diff --git a/apps/web/src/app/legal/[slug]/page.tsx b/apps/web/src/app/legal/[slug]/page.tsx
new file mode 100644
index 000000000..7e7dcf040
--- /dev/null
+++ b/apps/web/src/app/legal/[slug]/page.tsx
@@ -0,0 +1,40 @@
+import type { Metadata } from "next";
+import { notFound } from "next/navigation";
+import { allLegalPosts } from "contentlayer/generated";
+
+import { Mdx } from "@/components/content/mdx";
+import { Shell } from "@/components/dashboard/shell";
+import { BackButton } from "@/components/layout/back-button";
+
+export const dynamic = "force-static";
+
+export async function generateStaticParams() {
+ return allLegalPosts.map((post) => ({
+ slug: post.slug,
+ }));
+}
+
+export default function PostPage({ params }: { params: { slug: string } }) {
+ const post = allLegalPosts.find((post) => post.slug === params.slug);
+
+ if (!post) {
+ notFound();
+ }
+
+ // TODO: add author.avatar and author.url
+ return (
+ <>
+
+
+
+
+
{post.title}
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/apps/web/src/components/layout/footer.tsx b/apps/web/src/components/layout/footer.tsx
index 80b24924a..2f9e89825 100644
--- a/apps/web/src/components/layout/footer.tsx
+++ b/apps/web/src/components/layout/footer.tsx
@@ -1,3 +1,5 @@
+import Link from "next/link";
+
export function Footer() {
return (
+
+
+ Terms
+ {" "}
+ {"/"}
+
+ Privacy
+
+
);
}
diff --git a/apps/web/src/content/legal/privacy.mdx b/apps/web/src/content/legal/privacy.mdx
new file mode 100644
index 000000000..2607bfc6d
--- /dev/null
+++ b/apps/web/src/content/legal/privacy.mdx
@@ -0,0 +1,41 @@
+---
+title: Privacy Policy
+updatedAt: 2023-05-29
+---
+
+Welcome to [openstatus.dev](/) (the "Site"), hosted by OpenStatus ("OpenStatus",
+"we", "us", and/or "our"). OpenStatus provides a platform for creating and
+managing short links (the "Services")1. We value your privacy and are
+dedicated to protecting your personal data. This Privacy Policy covers how we
+collect, handle, and disclose personal data on our Platform.
+
+If you have any questions, comments, or concerns regarding this Privacy Policy,
+our data practices, or would like to exercise your rights, do not hesitate to
+contact us.
+
+## To Whom Does This Policy Apply
+
+This Privacy Policy applies to customers and site visitors. Each customer is
+responsible for posting its own terms, conditions, and privacy policies, and
+ensuring compliance with all applicable laws and regulations.
+
+## Changes To This Privacy Policy
+
+This Privacy Policy may change from time to time, as our Platform and our
+business may change. Your continued use of the Platform after any changes to
+this Privacy Policy indicates your agreement with the terms of the revised
+Privacy Policy.
+
+## What Information Do We Collect
+
+We collect information directly from you when you provide it to us explicitly on
+our Site. We do not use third-party cookies on our Site.
+
+## What We Use Your Information For
+
+We use your information to provide our Services, to improve our Platform, to
+understand how you use our Platform, and to communicate with you.
+
+## How To Contact Us
+
+For privacy-related questions, please contact us at privacy@openstatus.dev.
diff --git a/apps/web/src/content/legal/terms.mdx b/apps/web/src/content/legal/terms.mdx
new file mode 100644
index 000000000..101b5145f
--- /dev/null
+++ b/apps/web/src/content/legal/terms.mdx
@@ -0,0 +1,99 @@
+---
+title: Terms of Service
+updatedAt: 2023-05-29
+---
+
+Subject to these Terms of Service (this "Agreement"), [openstatus.dev](/)
+("OpenStatus", "we", "us" and/or "our") provides access to OpenStatus's cloud
+platform as a service (collectively, the "Services"). By using or accessing the
+Services, you acknowledge that you have read, understand, and agree to be bound
+by this Agreement.
+
+If you are entering into this Agreement on behalf of a company, business or
+other legal entity, you represent that you have the authority to bind such
+entity to this Agreement, in which case the term "you" shall refer to such
+entity. If you do not have such authority, or if you do not agree with this
+Agreement, you must not accept this Agreement and may not use the Services.
+
+## 1. Acceptance of Terms
+
+By signing up and using the services provided by OpenStatus (referred to as the
+"Service"), you are agreeing to be bound by the following terms and conditions
+("Terms of Service"). The Service is owned and operated by OpenStatus ("Us",
+"We", or "Our").
+
+## 2. Description of Service
+
+OpenStatus provides an open source monitoring and status page tool. ("the
+Product"). The Product is accessible at openstatus.dev and other domains and
+subdomains controlled by Us (collectively, "the Website").
+
+## 3. Fair Use
+
+You are responsible for your use of the Service and for any content that you
+post or transmit through the Service. You may not use the Service for any
+purpose that is illegal or infringes upon the rights of others.
+
+We reserve the right to suspend or terminate your access to the Service if we
+determine, in our sole discretion, that you have violated these Terms of
+Service, including but not limited to, adding phishing links, spam links, scam
+links, or other inappropriate or illegal content.
+
+## 4. Intellectual Property Rights
+
+You acknowledge and agree that the Service and its entire contents, features,
+and functionality, including but not limited to all information, software, code,
+text, displays, graphics, photographs, video, audio, design, presentation,
+selection, and arrangement, are owned by Us, our licensors, or other providers
+of such material and are protected by United States and international copyright,
+trademark, patent, trade secret, and other intellectual property or proprietary
+rights laws.
+
+## 5. Changes to these Terms
+
+We reserve the right to revise and update these Terms of Service from time to
+time in our sole discretion. All changes are effective immediately when we post
+them, and apply to all access to and use of the Website thereafter. Your
+continued use of the Website following the posting of revised Terms of Service
+means that you accept and agree to the changes.
+
+## 6. Contact Information
+
+Questions or comments about the Website or these Terms of Service may be
+directed to our support team at support@openstatus.dev.
+
+## 7. Disclaimer of Warranties
+
+THE SERVICE AND ITS CONTENT ARE PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS
+WITHOUT ANY WARRANTIES OF ANY KIND. WE DISCLAIM ALL WARRANTIES, INCLUDING, BUT
+NOT LIMITED TO, THE WARRANTY OF TITLE, MERCHANTABILITY, NON-INFRINGEMENT OF
+THIRD PARTIES’ RIGHTS, AND FITNESS FOR PARTICULAR PURPOSE.
+
+## 8. Limitation of Liability
+
+IN NO EVENT WILL WE, OUR AFFILIATES OR THEIR LICENSORS, SERVICE PROVIDERS,
+EMPLOYEES, AGENTS, OFFICERS OR DIRECTORS BE LIABLE FOR DAMAGES OF ANY KIND,
+UNDER ANY LEGAL THEORY, ARISING OUT OF OR IN CONNECTION WITH YOUR USE, OR
+INABILITY TO USE, THE WEBSITE, THE SERVICE, ANY WEBSITES LINKED TO IT, ANY
+CONTENT ON THE WEBSITE OR SUCH OTHER WEBSITES, INCLUDING ANY DIRECT, INDIRECT,
+SPECIAL, INCIDENTAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES.
+
+## 9. Governing Law and Jurisdiction
+
+These Terms of Service and any dispute or claim arising out of or related to
+them, their subject matter or their formation (in each case, including
+non-contractual disputes or claims) shall be governed by and construed in
+accordance with the internal laws of France without giving effect to any choice
+or conflict of law provision or rule. Any legal suit, action, or proceeding
+arising out of, or related to, these Terms of Service or the Website shall be
+instituted exclusively in the federal courts of France.
+
+---
+
+By using OpenStatus , you acknowledge that you have read these Terms of Service,
+understood them, and agree to be bound by them. If you do not agree to these
+Terms of Service, you are not authorized to use the Service. We reserve the
+right to change these Terms of Service at any time, so please review them
+frequently.
+
+Thank you for using OpenStatus!
diff --git a/apps/web/src/contentlayer/documents/legal.ts b/apps/web/src/contentlayer/documents/legal.ts
new file mode 100644
index 000000000..d1580e663
--- /dev/null
+++ b/apps/web/src/contentlayer/documents/legal.ts
@@ -0,0 +1,23 @@
+import { defineDocumentType } from "contentlayer/source-files";
+
+export const LegalPost = defineDocumentType(() => ({
+ name: "LegalPost",
+ filePathPattern: `legal/*.mdx`,
+ contentType: "mdx",
+ fields: {
+ title: {
+ type: "string",
+ required: true,
+ },
+ updatedAt: {
+ type: "string",
+ required: true,
+ },
+ },
+ computedFields: {
+ slug: {
+ type: "string",
+ resolve: (post) => post._raw.sourceFileName.replace(/\.mdx$/, ""),
+ },
+ },
+}));
diff --git a/apps/web/src/middleware.ts b/apps/web/src/middleware.ts
index cd4274890..29d770dbf 100644
--- a/apps/web/src/middleware.ts
+++ b/apps/web/src/middleware.ts
@@ -55,6 +55,7 @@ export default authMiddleware({
"/api/checker/cron/10m",
"/blog",
"/blog/(.*)",
+ "/legal/(.*)",
"/discord",
"/github",
],