From 8a7d1d3b9fb8747bf371d74943d036a5cb4ac419 Mon Sep 17 00:00:00 2001 From: jwinterm Date: Wed, 29 Jul 2026 08:45:52 -0400 Subject: [PATCH] fix(vegan-iq): align public privacy and product claims --- apps/web/.eslintrc.js | 4 +- apps/web/src/app/about/page.tsx | 2 +- apps/web/src/app/page.tsx | 2 +- .../src/app/products/smirk-wallet/page.tsx | 2 +- .../app/products/suchoice/privacy/page.tsx | 8 +- apps/web/src/app/products/vegan-iq/page.tsx | 146 +++++--- .../app/products/vegan-iq/privacy/page.tsx | 314 ++++++++++++++---- apps/web/src/app/products/webshops/page.tsx | 8 +- .../components/about/founder-signature.tsx | 6 +- package.json | 4 +- pnpm-lock.yaml | 59 ++-- 11 files changed, 405 insertions(+), 150 deletions(-) diff --git a/apps/web/.eslintrc.js b/apps/web/.eslintrc.js index 2e19b2e..0a1d9e1 100644 --- a/apps/web/.eslintrc.js +++ b/apps/web/.eslintrc.js @@ -1,3 +1,3 @@ module.exports = { - extends: ["@repo/config/eslint-preset.js"], -}; \ No newline at end of file + extends: [require.resolve("@repo/config/eslint-preset.js")], +}; diff --git a/apps/web/src/app/about/page.tsx b/apps/web/src/app/about/page.tsx index 9fd39a1..053b9bd 100644 --- a/apps/web/src/app/about/page.tsx +++ b/apps/web/src/app/about/page.tsx @@ -131,7 +131,7 @@ export default function AboutPage() {

Get in Touch

- Have a project in mind? We'd love to hear about it. + Have a project in mind? We’d love to hear about it.

diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index bebe568..ae210a4 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -70,7 +70,7 @@ export default function Home() {

Start a Project

- Have a project in mind? Let's talk about what you need and how we can help. + Have a project in mind? Let’s talk about what you need and how we can help.

diff --git a/apps/web/src/app/products/smirk-wallet/page.tsx b/apps/web/src/app/products/smirk-wallet/page.tsx index 78bdfc6..92aa249 100644 --- a/apps/web/src/app/products/smirk-wallet/page.tsx +++ b/apps/web/src/app/products/smirk-wallet/page.tsx @@ -92,7 +92,7 @@ export default function SmirkWalletPage() {

Encrypted Tips

- Tips are encrypted with the recipient's public key. Only they can claim. + Tips are encrypted with the recipient’s public key. Only they can claim. Senders can reclaim unclaimed tips (no lost funds).

diff --git a/apps/web/src/app/products/suchoice/privacy/page.tsx b/apps/web/src/app/products/suchoice/privacy/page.tsx index f2e963d..26eecce 100644 --- a/apps/web/src/app/products/suchoice/privacy/page.tsx +++ b/apps/web/src/app/products/suchoice/privacy/page.tsx @@ -26,7 +26,7 @@ export default function SuchoicePrivacyPage() {

1. Introduction

- Such Software ("we", "our", or "us") operates the Suchoice mobile and web application (the "App"). + Such Software (“we”, “our”, or “us”) operates the Suchoice mobile and web application (the “App”). This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our App.

@@ -35,7 +35,7 @@ export default function SuchoicePrivacyPage() {

2. Information We Collect

Camera and Photos

- Our App requires access to your device's camera and photo library to function. + Our App requires access to your device’s camera and photo library to function. When you take a picture of a menu or select one from your gallery, the image is sent to our secure backend servers for processing by AI to extract menu items. We do not store these images. They are processed in memory and immediately discarded after the text is extracted.

@@ -45,7 +45,7 @@ export default function SuchoicePrivacyPage() { We use Google AdMob to display advertisements in the App. AdMob may collect and use data, including device identifiers (such as the Android Advertising ID or iOS IDFA), IP addresses, and usage data, to provide personalized advertising.

- You can learn more about how Google uses information from sites or apps that use their services by visiting: Google's Privacy & Terms. + You can learn more about how Google uses information from sites or apps that use their services by visiting: Google’s Privacy & Terms.

In-App Purchases and Subscriptions

@@ -79,7 +79,7 @@ export default function SuchoicePrivacyPage() {
-

5. Children's Privacy

+

5. Children’s Privacy

These Services do not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13. In the case we discover that a child under 13 has provided us with personal information, we immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us so that we will be able to do necessary actions.

diff --git a/apps/web/src/app/products/vegan-iq/page.tsx b/apps/web/src/app/products/vegan-iq/page.tsx index 23bf87c..25d329a 100644 --- a/apps/web/src/app/products/vegan-iq/page.tsx +++ b/apps/web/src/app/products/vegan-iq/page.tsx @@ -9,11 +9,13 @@ import type { Metadata } from "next"; export const metadata: Metadata = { title: "Vegan IQ: Plant-Based Trivia Game | Such Software", - description: "Test your plant-based knowledge with 1,000+ trivia questions across 8 categories, plus a daily challenge and weekly quiz. Free vegan trivia for iOS and Android.", + description: + "Test your plant-based knowledge with 1,000+ trivia questions across 8 categories, plus a daily challenge and weekly quiz. Free vegan trivia for iOS and Android.", alternates: { canonical: "/products/vegan-iq" }, openGraph: { title: "Vegan IQ: Plant-Based Trivia Game | Such Software", - description: "Test your plant-based knowledge with 1,000+ trivia questions across 8 categories, plus a daily challenge and weekly quiz. Free vegan trivia for iOS and Android.", + description: + "Test your plant-based knowledge with 1,000+ trivia questions across 8 categories, plus a daily challenge and weekly quiz. Free vegan trivia for iOS and Android.", type: "website", images: ["/images/og/vegan-iq.png"], }, @@ -24,35 +26,77 @@ export const metadata: Metadata = { }; const features = [ - { name: "1,000+ Questions", description: "Curated trivia questions backed by verified data from USDA, Poore & Nemecek, NIH, and FAOSTAT. No AI-generated content." }, - { name: "8 Categories", description: "Nutrition, environment, ingredients, food history, animal welfare, health, cooking, and culture." }, - { name: "Daily Challenge", description: "A fresh set of questions every day. Build a streak and keep your knowledge sharp." }, - { name: "Weekly Quiz", description: "New themed quiz each week with fresh content to test how far you've come." }, - { name: "Swipe & Tap", description: "Swipe right for true, left for false. Tap your answer for multiple choice. Fast, intuitive gameplay." }, - { name: "Dark & Light Mode", description: "Play in whichever theme you prefer. Automatic or manual switching." }, - { name: "SFX & Haptics", description: "Satisfying sound effects and haptic feedback on correct and incorrect answers." }, - { name: "Share Facts", description: "Found an interesting fact? Share it with friends directly from the app." }, + { + name: "1,000+ Questions", + description: + "Source-linked trivia developed with an automated drafting and review pipeline, release checks, and human review.", + }, + { + name: "8 Categories", + description: + "Nutrition, environment, ingredients, food history, animal welfare, health, cooking, and culture.", + }, + { + name: "Daily Challenge", + description: + "One shared challenge question every day. Build a streak and keep your knowledge sharp.", + }, + { + name: "Weekly Quiz", + description: "A new quiz set each week to test how far you've come.", + }, + { + name: "Swipe & Tap", + description: + "Swipe right for true, left for false. Tap your answer for multiple choice. Fast, intuitive gameplay.", + }, + { + name: "Dark & Light Mode", + description: + "Play in whichever theme you prefer. Automatic or manual switching.", + }, + { + name: "SFX & Haptics", + description: + "Satisfying sound effects and haptic feedback on correct and incorrect answers.", + }, + { + name: "Share Facts", + description: + "Found an interesting fact? Share it with friends directly from the app.", + }, ]; export default function VeganIqPage() { return (
- - + +
-
- +
+ ← Back to Products @@ -71,16 +115,26 @@ export default function VeganIqPage() {

- Think you know your vegan facts? Vegan IQ puts your plant-based knowledge to the test with over 1,000 trivia questions across 8 categories. - Every question is backed by verified data from sources like the USDA, Poore & Nemecek (2018), NIH, and FAOSTAT. + Think you know your vegan facts? Vegan IQ puts your plant-based + knowledge to the test with over 1,000 trivia questions across 8 + categories. Questions are linked to a growing source catalog that + includes the USDA, Poore & Nemecek (2018), NIH, and FAOSTAT.

- +

Features

@@ -97,13 +151,28 @@ export default function VeganIqPage() {

Data Sources

- Every question in Vegan IQ is grounded in real data. We do not use LLMs to generate question content. Our sources include: + Question candidates can use automated and LLM-assisted drafting + and review. Before publication, release candidates pass schema and + source-mapping checks and are reviewed for quality. Core sources + include:

    -
  • USDA FoodData Central — nutritional composition of plant-based foods
  • -
  • Poore & Nemecek, Science (2018) — environmental impact data for food production
  • -
  • National Institutes of Health (NIH) — health and dietary reference data
  • -
  • FAOSTAT — global food production and agricultural statistics from the UN FAO
  • +
  • + USDA FoodData Central — nutritional composition + of plant-based foods +
  • +
  • + Poore & Nemecek, Science (2018) — environmental + impact data for food production +
  • +
  • + National Institutes of Health (NIH) — health + and dietary reference data +
  • +
  • + FAOSTAT — global food production and + agricultural statistics from the UN FAO +
@@ -112,7 +181,10 @@ export default function VeganIqPage() {

Legal

  • - + Privacy Policy
  • diff --git a/apps/web/src/app/products/vegan-iq/privacy/page.tsx b/apps/web/src/app/products/vegan-iq/privacy/page.tsx index 0e17afb..beb8d75 100644 --- a/apps/web/src/app/products/vegan-iq/privacy/page.tsx +++ b/apps/web/src/app/products/vegan-iq/privacy/page.tsx @@ -13,126 +13,298 @@ export default function VeganIqPrivacyPage() { return (
    -
    - +
    + ← Back to Vegan IQ

    Privacy Policy for Vegan IQ

    -

    Last updated: March 26, 2026

    +

    Last updated: July 29, 2026

    -

    1. Introduction

    +

    1. Scope

    - Such Software ("we", "our", or "us") operates the Vegan IQ mobile application (the "App"). - This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our App. + Such Software ("we", "our", or "us") + operates the Vegan IQ mobile application (the "App"). + This policy describes the data used by the current iOS and Android + releases, why it is used, and the choices available to you. Vegan + IQ does not require an account.

    -

    2. Information We Collect

    -

    Local Data

    +

    + 2. Data on your device +

    - Vegan IQ stores your score history, preferences, and game progress locally on your device using shared_preferences. - This data never leaves your device. There are no user accounts, no server-side storage, and no leaderboards. - We do not collect your name, email address, photos, location, or any other personal information. -

    - -

    Advertising

    -

    - We use Google AdMob to display advertisements in the App. AdMob may collect and use data, including device identifiers (such as the Android Advertising ID or iOS IDFA), IP addresses, and usage data, to provide personalized advertising. -

    -

    - You can learn more about how Google uses information from sites or apps that use their services by visiting: Google's Privacy & Terms. -

    - -

    In-App Purchases

    -

    - Vegan IQ offers in-app purchases to remove ads. Purchases are processed entirely by Apple (via StoreKit) or Google (via Google Play Billing) depending on your platform. - We do not process or store your payment information (such as credit card numbers) directly; this is handled securely by Apple or Google. + The App stores quiz progress, scores, streaks, achievements, + question-feedback choices, notification state, leaderboard + choices, purchase entitlements, sound and haptic settings, theme, + onboarding state, and downloaded question content locally. You can + remove this local data by clearing the App's storage or + uninstalling it. Some of the same gameplay events or results are + also processed as described below.

    -

    3. How We Use Your Information

    -

    We use the information described above to:

    +

    + 3. Data we process +

    +

    + Anonymous installation identifier +

    +

    + On first launch, the App creates a random identifier for that + installation. We use it to associate analytics events and, when + you use the relevant features, challenge answers, weekly results, + question feedback, or opt-in leaderboard statistics. It is not an + advertising identifier and is not connected to a Vegan IQ account. + If you choose a public leaderboard display name, that name is + connected to this identifier. +

    + +

    + App use and gameplay +

    +

    + We use Firebase Analytics to understand app launches, screens and + tabs viewed, quiz and challenge interactions, answers, scores, + streaks, achievements, shares, prompts, and purchase-funnel + events. Related data can include app version, session information, + locale, device model, operating-system version, product + identifiers, transaction identifiers, value, and currency. + Firebase may also receive an app-instance identifier, IP address, + and coarse region inferred from network information. +

    + +

    Diagnostics

    +

    + Firebase Crashlytics processes crash reports, non-fatal errors, + stack traces, app and device state, app version, installation + identifiers, and analytics breadcrumbs so we can diagnose + reliability problems. +

    + +

    + Challenges, feedback, and leaderboards +

    +

    + Our API stores the random installation identifier with + daily-challenge answers, weekly-quiz scores, and question ratings. + Leaderboards are off by default. If you opt in, we store a + statistics snapshot and either no name (statistics-only mode) or + the public display name you choose. Public boards can show that + display name and score or streak. We do not ask for your legal + name. +

    + +

    Notifications

    +

    + If you opt in to notifications, Firebase Cloud Messaging and Apple + Push Notification service or Google Play Services process a push + token and device delivery information. Our API stores that token + with platform and app version so it can deliver challenge and quiz + reminders. The App also schedules some reminders locally on your + device. +

    + +

    App integrity

    +

    + Firebase App Check uses Apple DeviceCheck on iOS and Play + Integrity on Android to produce short-lived app-attestation + tokens. Our API verifies those tokens to reduce automated abuse. + Apple, Google, and Firebase may process device or integrity + signals to provide this service; our server receives the resulting + token and claims, not the underlying hardware signals. +

    + +

    Purchases

    +

    + Apple or Google processes payments and purchase history for + optional tips and entitlements. We do not receive or store your + full payment-card details. The App receives product and + transaction information needed to deliver and restore the + purchase. +

    + +

    + What we do not collect +

    +

    + The App does not ask for an account, email address, phone number, + contacts, photos, precise location, health data, or payment-card + number. The current 1.4 release does not initialize, request, or + display ads and does not request permission to track. Older + versions that displayed ads may have used Google AdMob and its + consent tools; update the App to the current release. +

    +
    + +
    +

    + 4. Why we use data +

    +

    We use the data above to:

      -
    • Serve advertisements to support the free version of the App.
    • -
    • Process in-app purchases to remove ads.
    • -
    • Store your game progress and preferences locally on your device.
    • +
    • + provide quizzes, content updates, streaks, leaderboards, + purchases, and notifications; +
    • +
    • protect the API and maintain the security of the App;
    • +
    • measure feature use and improve content and usability;
    • +
    • diagnose crashes, errors, and performance problems; and
    • +
    • comply with legal obligations and enforce our terms.
    -

    4. Third-Party Services

    +

    + 5. Service providers and disclosure +

    - The App uses third-party services that may collect information used to identify you. - Link to privacy policy of third party service providers used by the app: + We disclose data only as needed to operate the App, to comply with + law, or to protect rights and safety. Our principal providers are + Google Firebase (Analytics, Crashlytics, Cloud Messaging, and App + Check), Google Play, Apple App Store and Apple device services, + and infrastructure providers that host our API. Their processing + is governed by their terms and privacy policies.

    +

    + We do not sell personal information, share it for cross-context + behavioral advertising, or track your activity across other + companies' apps or websites. +

    -

    5. Ad Consent & Opt-Out

    +

    + 6. Retention and your choices +

    - When you first launch Vegan IQ, the app will display a consent dialog (powered by Google's User Messaging Platform) if you are located in a region that requires consent for personalized advertising (such as the European Economic Area under GDPR, or California under CCPA/CPRA). -

    -

    For EU/EEA Users (GDPR)

    -

    - You will be presented with a consent form before any ads are shown. You may choose to accept or decline personalized advertising. If you decline, you will still see ads, but they will not be personalized based on your activity. You can change your consent at any time by reinstalling the app or contacting us. -

    -

    For California Users (CCPA/CPRA)

    -

    - Under the California Consumer Privacy Act, you have the right to opt out of the "sale" or "sharing" of your personal information. Google AdMob's use of device identifiers for personalized advertising may constitute a "sale" or "sharing" under CCPA. You can opt out via the consent dialog shown on first launch, or by adjusting your device's ad tracking settings: + Custom-backend records are retained while needed to provide the + related feature or until you delete them. Notification tokens + remain until disabled or deleted. Firebase and store data follows + the retention configured for, or controlled by, those services; + some diagnostics and aggregate reporting may be retained after + identifiers are removed.

      -
    • iOS: Settings → Privacy & Security → Tracking → disable "Allow Apps to Request to Track"
    • -
    • Android: Settings → Privacy → Ads → enable "Opt out of Ads Personalization" (or "Delete advertising ID")
    • +
    • + Notifications: turn them off in Vegan IQ + Settings or device settings. +
    • +
    • + Leaderboards: leave the boards in Settings to + delete your leaderboard row and statistics. +
    • +
    • + Custom server data: choose Settings → Anonymous + data → Delete server data to remove challenge answers, weekly + results, question feedback, leaderboard records, and the + registered push token for that installation. +
    • +
    • + Local data: clear App storage or uninstall the + App. +
    -

    Remove Ads Entirely

    - You can purchase "Remove Ads" within the app to permanently disable all advertising. This eliminates all ad-related data collection. + Depending on where you live, you may also have rights to access, + correct, delete, restrict, or object to processing, to receive a + portable copy, and to appeal or complain to a regulator. We will + not discriminate against you for exercising a privacy right. The + App can copy your anonymous installation ID from Settings to help + us locate a request. Contact{" "} + + privacy@such.software + + .

    -

    6. Your Rights

    -

    Depending on your location, you may have the following rights regarding your data:

    -
      -
    • Right to know what personal data is collected and how it is used.
    • -
    • Right to delete your personal data. Since we store data only locally on your device, you can delete all app data by uninstalling the app or clearing app data in your device settings.
    • -
    • Right to opt out of personalized advertising (see Section 5 above).
    • -
    • Right to non-discrimination for exercising your privacy rights.
    • -
    -

    - To exercise any of these rights, contact us at privacy@such.software. +

    7. Children

    +

    + Vegan IQ is a general-audience trivia app and is not directed to + children under 13. We do not knowingly collect personal + information from a child under 13. If you believe a child provided + such information, contact us so we can investigate and delete it.

    -

    7. Children's Privacy

    +

    + 8. Security and international processing +

    - These Services do not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13. In the case we discover that a child under 13 has provided us with personal information, we immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us so that we will be able to do necessary actions. + We use technical and organizational safeguards appropriate to the + data, including encrypted transport and app attestation. No system + is completely secure. We and our providers may process data in the + United States and other countries where safeguards and legal + rights may differ from those in your country.

    -

    8. Changes to This Privacy Policy

    +

    + 9. Changes and contact +

    - We may update our Privacy Policy from time to time. Thus, you are advised to review this page periodically for any changes. We will notify you of any changes by posting the new Privacy Policy on this page. -

    -
    - -
    -

    9. Contact Us

    -

    - If you have any questions or suggestions about our Privacy Policy, do not hesitate to contact us at privacy@such.software. + We may update this policy as the App changes. We will post the + revised policy here and update the date above. Material changes + will be communicated where required. For questions or privacy + requests, email{" "} + + privacy@such.software + + .

    diff --git a/apps/web/src/app/products/webshops/page.tsx b/apps/web/src/app/products/webshops/page.tsx index bb05c7d..9291afc 100644 --- a/apps/web/src/app/products/webshops/page.tsx +++ b/apps/web/src/app/products/webshops/page.tsx @@ -114,7 +114,7 @@ export default function WebshopsPage() { We run a single Medusa v2 commerce platform that spins up a completely distinct, fully-branded storefront for every tenant, your colors, your typography, your layout, your dark mode. One battle-tested engine underneath; a store that looks and feels like - nobody else's on top. No large setup fee, no monthly retainer: we build, host, and + nobody else’s on top. No large setup fee, no monthly retainer: we build, host, and maintain it on revenue share, so we only win when you make sales.

    @@ -140,7 +140,7 @@ export default function WebshopsPage() { Per-tenant theming is the whole point

    - Most "multi-store" platforms give every shop the same skeleton with a swapped logo. + Most “multi-store” platforms give every shop the same skeleton with a swapped logo. Ours derives an entire visual system per tenant from your theme configuration: palette, fonts, spacing, component styling, and a matched dark mode across both the storefront and checkout. Two shops on the same backend can look nothing alike. @@ -171,7 +171,7 @@ export default function WebshopsPage() {

    Theming runs all the way down: product pages, catalog grids, cart, and checkout each - carry the shop's palette, type, and layout. And the platform is more than a catalog, + carry the shop’s palette, type, and layout. And the platform is more than a catalog, service shops get a real{" "} booking calendar: yoga classes and coaching calls are scheduled right on the product page, themed to match. Here is a @@ -183,7 +183,7 @@ export default function WebshopsPage() { {/* Feature grid, the real platform capabilities */}

    - What's built in + What’s built in

    {features.map((f) => ( diff --git a/apps/web/src/components/about/founder-signature.tsx b/apps/web/src/components/about/founder-signature.tsx index b5db1bb..65c0c93 100644 --- a/apps/web/src/components/about/founder-signature.tsx +++ b/apps/web/src/components/about/founder-signature.tsx @@ -35,10 +35,10 @@ export const FounderSignature = () => {

    - "Accessibility isn't bolted on. It's there from the first line of code." + “Accessibility isn’t bolted on. It’s there from the first line of code.”

    - John Winter Murphy holds a PhD in Materials Engineering from UT-Dallas (2014), focused on semiconductor devices for radiation detection. From 2015 to 2021 he was a scientist at Lawrence Livermore National Laboratory, developing radiation detector systems and the lab's radioisotope battery program. He brings that same lab-bench rigor to software, and an insistence that it stay accessible to everyone, with front-ends engineered and audited against WCAG 2.2 AA. + John Winter Murphy holds a PhD in Materials Engineering from UT-Dallas (2014), focused on semiconductor devices for radiation detection. From 2015 to 2021 he was a scientist at Lawrence Livermore National Laboratory, developing radiation detector systems and the lab’s radioisotope battery program. He brings that same lab-bench rigor to software, and an insistence that it stay accessible to everyone, with front-ends engineered and audited against WCAG 2.2 AA.

    He previously co-founded Patrn LLC (art101.io), a series of art-history NFT drops, and Tabby Labs, which was developing a cryptocurrency wallet with an interactive world inside. @@ -94,4 +94,4 @@ export const FounderSignature = () => {

    ); -}; \ No newline at end of file +}; diff --git a/package.json b/package.json index af99c32..2d78e2c 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,11 @@ "minimatch": "^9.0.7", "picomatch": "^4.0.4", "ajv": "^8.17.1", + "eslint>ajv": "6.12.6", + "@eslint/eslintrc>ajv": "6.12.6", "brace-expansion": "^2.0.3", "postcss": "^8.5.14", "fast-uri": "^3.1.2" } } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7db5308..cd4e9e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,8 @@ overrides: minimatch: ^9.0.7 picomatch: ^4.0.4 ajv: ^8.17.1 + eslint>ajv: 6.12.6 + '@eslint/eslintrc>ajv': 6.12.6 brace-expansion: ^2.0.3 postcss: ^8.5.14 fast-uri: ^3.1.2 @@ -823,8 +825,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -1360,12 +1362,12 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.1.2: - resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} - fastq@1.20.1: resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} @@ -1478,7 +1480,7 @@ packages: glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} @@ -1739,8 +1741,8 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2181,6 +2183,10 @@ packages: property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2254,10 +2260,6 @@ packages: remark-rehype@11.1.2: resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - resend@4.8.0: resolution: {integrity: sha512-R8eBOFQDO6dzRTDmaMEdpqrkmgSjPpVXt4nGfWsZdYOet0kqra0xgbvTES6HmCriZEXbmGk3e0DiGIaLFTFSHA==} engines: {node: '>=18'} @@ -2594,6 +2596,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2712,7 +2717,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: - ajv: 8.18.0 + ajv: 6.12.6 debug: 4.4.3 espree: 9.6.1 globals: 13.24.0 @@ -2726,7 +2731,7 @@ snapshots: '@eslint/eslintrc@3.3.3': dependencies: - ajv: 8.18.0 + ajv: 6.12.6 debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 @@ -3267,12 +3272,12 @@ snapshots: acorn@8.15.0: {} - ajv@8.18.0: + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.2 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 ansi-regex@5.0.1: {} @@ -3867,7 +3872,7 @@ snapshots: '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.3.0 - ajv: 8.18.0 + ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 @@ -3914,7 +3919,7 @@ snapshots: '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 8.18.0 + ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 @@ -4026,9 +4031,9 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-levenshtein@2.0.6: {} + fast-json-stable-stringify@2.1.0: {} - fast-uri@3.1.2: {} + fast-levenshtein@2.0.6: {} fastq@1.20.1: dependencies: @@ -4460,7 +4465,7 @@ snapshots: json-buffer@3.0.1: {} - json-schema-traverse@1.0.0: {} + json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -5082,6 +5087,8 @@ snapshots: property-information@7.1.0: {} + punycode@2.3.1: {} + queue-microtask@1.2.3: {} react-dom@18.3.1(react@18.3.1): @@ -5200,8 +5207,6 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 - require-from-string@2.0.2: {} - resend@4.8.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@react-email/render': 1.1.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -5680,6 +5685,10 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + util-deprecate@1.0.2: {} vfile-matter@5.0.1: