diff --git a/.vscode/settings.json b/.vscode/settings.json
index 3a710c698..77ef08c6d 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -31,6 +31,7 @@
"cacheable",
"Callouts",
"Camo",
+ "CCPAOPTOUT",
"CDON",
"classname",
"cleandist",
diff --git a/bun.lockb b/bun.lockb
index 5027d45e2..2788234e1 100644
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/docs/legal/privacy-policy.md b/docs/legal/privacy-policy.md
index 40eb44845..e7bc156a6 100644
--- a/docs/legal/privacy-policy.md
+++ b/docs/legal/privacy-policy.md
@@ -8,6 +8,23 @@ We use Your Personal data to provide and improve the Service. By using the Servi
## Interpretation and Definitions
+### California Consumer Privacy Act (CCPA)
+
+If you are a California resident, you have specific rights regarding your personal information under the California Consumer Privacy Act (CCPA). This section describes your CCPA rights and explains how to exercise those rights.
+
+#### Rights under CCPA
+
+Under CCPA, California residents have the following rights:
+
+1. Right to Know: You have the right to request that we disclose certain information to you about our collection and use of your personal information over the past 12 months.
+2. Right to Delete: You have the right to request that we delete any of your personal information that we collected from you and retained, subject to certain exceptions.
+3. Right to Opt-Out of Sale: You have the right to opt-out of the sale of your personal information. Note that we do not sell personal information as defined by the CCPA.
+4. Right to Non-Discrimination: You have the right not to be discriminated against for exercising any of your CCPA rights.
+
+#### Exercising Your CCPA Rights
+
+To exercise your rights under CCPA and to opt-out of the sale of your personal information, you can click on the "Do not sell my personal information" link in the footer of any page on our website.
+
### Interpretation
The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.
diff --git a/packages/website/package.json b/packages/website/package.json
index 8cbda1602..e23c74498 100644
--- a/packages/website/package.json
+++ b/packages/website/package.json
@@ -22,6 +22,7 @@
"@vanilla-extract/dynamic": "^2.1.2",
"compare-versions": "^6.1.1",
"immer": "^10.1.1",
+ "js-cookie": "^3.0.5",
"markdown-to-jsx": "^7.5.0",
"nanostores": "^0.11.3",
"react": "^18.3.1",
@@ -34,6 +35,7 @@
"@astrojs/check": "^0.9.3",
"@astrojs/react": "^3.6.2",
"@astrojs/vercel": "^7.8.1",
+ "@types/js-cookie": "^3.0.6",
"@types/react": "^18.3.5",
"@types/react-dom": "^18",
"@types/three": "^0.160.0",
diff --git a/packages/website/src/components/Footer.astro b/packages/website/src/components/Footer.astro
index 238e8cf17..de5f09988 100644
--- a/packages/website/src/components/Footer.astro
+++ b/packages/website/src/components/Footer.astro
@@ -116,6 +116,9 @@ const gameDefinitions = await fetchGameDefinitions();
>
Ad settings
+
+ Do not sell my personal information
+
diff --git a/packages/website/src/pages/auth/[provider]/_index.tsx b/packages/website/src/pages/auth/[provider]/_index.tsx
index 4547514b0..310a783ec 100644
--- a/packages/website/src/pages/auth/[provider]/_index.tsx
+++ b/packages/website/src/pages/auth/[provider]/_index.tsx
@@ -23,7 +23,15 @@ interface AuthorizeProps {
provider: AuthProvider;
}
-export function Authorize({ provider }: AuthorizeProps) {
+export function Authorize(props: AuthorizeProps) {
+ return (
+
+
+
+ );
+}
+
+function Content({ provider }: AuthorizeProps) {
const mutateApp = App.useMutation();
useEffect(() => {
diff --git a/packages/website/src/pages/legal/do-not-sell-my-personal-information/_index.tsx b/packages/website/src/pages/legal/do-not-sell-my-personal-information/_index.tsx
new file mode 100644
index 000000000..bdef2df68
--- /dev/null
+++ b/packages/website/src/pages/legal/do-not-sell-my-personal-information/_index.tsx
@@ -0,0 +1,35 @@
+import { Flex, Switch, Text } from '@radix-ui/themes';
+import Cookies from 'js-cookie';
+import { useEffect, useState } from 'react';
+import { App } from '../../../stores/app';
+
+export function Toggles() {
+ return (
+
+
+
+ );
+}
+
+function Content() {
+ const [doNotSell, setDoNotSell] = useState(false);
+
+ useEffect(() => {
+ setDoNotSell(Cookies.get('CCPAOPTOUT') !== undefined);
+ }, []);
+
+ useEffect(() => {
+ if (doNotSell) {
+ Cookies.set('CCPAOPTOUT', 'true', { sameSite: 'Lax', expires: Infinity });
+ } else {
+ Cookies.remove('CCPAOPTOUT');
+ }
+ }, [doNotSell]);
+
+ return (
+
+ Do not sell my personal information
+
+
+ );
+}
diff --git a/packages/website/src/pages/legal/do-not-sell-my-personal-information/index.astro b/packages/website/src/pages/legal/do-not-sell-my-personal-information/index.astro
new file mode 100644
index 000000000..8046d8185
--- /dev/null
+++ b/packages/website/src/pages/legal/do-not-sell-my-personal-information/index.astro
@@ -0,0 +1,22 @@
+---
+import { Flex, Heading, Text } from '@radix-ui/themes';
+import { PageWrapper } from '../../../components/PageWrapper';
+import RootLayout from '../../../layouts/RootLayout.astro';
+import { Toggles } from './_index';
+---
+
+
+
+
+ Do not sell my personal information
+
+ BlitzKit does not sell any of your personal information. However,
+ third-party party services may use your personal information to enhance
+ your experience and to collect analytics. You can stop the sale of your
+ personal data using the option below.
+
+
+
+
+
+