fix(vegan-iq): align public privacy and product claims

This commit is contained in:
jwinterm
2026-07-29 08:45:52 -04:00
parent f01f5b2e92
commit 8a7d1d3b9f
11 changed files with 405 additions and 150 deletions
+1 -1
View File
@@ -1,3 +1,3 @@
module.exports = {
extends: ["@repo/config/eslint-preset.js"],
extends: [require.resolve("@repo/config/eslint-preset.js")],
};
+1 -1
View File
@@ -131,7 +131,7 @@ export default function AboutPage() {
<div id="contact">
<h2 className="text-3xl font-bold mb-3 tracking-tight">Get in Touch</h2>
<p className="text-muted-foreground text-lg mb-12 max-w-2xl">
Have a project in mind? We'd love to hear about it.
Have a project in mind? We’d love to hear about it.
</p>
<ContactForm />
</div>
+1 -1
View File
@@ -70,7 +70,7 @@ export default function Home() {
<div id="contact" className="w-full max-w-6xl text-left mb-12 section-container border-l-4 border-l-cyan-500">
<h2 className="text-3xl font-bold mb-3 tracking-tight text-foreground">Start a Project</h2>
<p className="text-muted-foreground text-lg max-w-3xl leading-relaxed">
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.
</p>
</div>
<ContactForm />
@@ -92,7 +92,7 @@ export default function SmirkWalletPage() {
<Card className="glass-card border-amber-500/20">
<h3 className="text-xl font-bold mb-3">Encrypted Tips</h3>
<p className="text-muted-foreground">
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).
</p>
</Card>
@@ -26,7 +26,7 @@ export default function SuchoicePrivacyPage() {
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">1. Introduction</h2>
<p>
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.
</p>
</section>
@@ -35,7 +35,7 @@ export default function SuchoicePrivacyPage() {
<h2 className="text-2xl font-semibold mt-8 mb-4">2. Information We Collect</h2>
<h3 className="text-xl font-medium mt-4 mb-2">Camera and Photos</h3>
<p>
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.
<strong>We do not store these images.</strong> They are processed in memory and immediately discarded after the text is extracted.
</p>
@@ -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.
</p>
<p>
You can learn more about how Google uses information from sites or apps that use their services by visiting: <a href="https://policies.google.com/technologies/partner-sites" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:underline">Google's Privacy & Terms</a>.
You can learn more about how Google uses information from sites or apps that use their services by visiting: <a href="https://policies.google.com/technologies/partner-sites" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:underline">Google’s Privacy & Terms</a>.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">In-App Purchases and Subscriptions</h3>
@@ -79,7 +79,7 @@ export default function SuchoicePrivacyPage() {
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">5. Children's Privacy</h2>
<h2 className="text-2xl font-semibold mt-8 mb-4">5. Children’s Privacy</h2>
<p>
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.
</p>
+109 -37
View File
@@ -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 (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground">
<JsonLd data={breadcrumbLd([
{ name: "Home", path: "/" },
{ name: "Products", path: "/products" },
{ name: "Vegan IQ", path: "/products/vegan-iq" },
])} />
<JsonLd data={softwareAppLd({
name: "Vegan IQ",
path: "/products/vegan-iq",
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.",
category: "GameApplication",
operatingSystem: "Android, iOS",
price: "0",
})} />
<JsonLd
data={breadcrumbLd([
{ name: "Home", path: "/" },
{ name: "Products", path: "/products" },
{ name: "Vegan IQ", path: "/products/vegan-iq" },
])}
/>
<JsonLd
data={softwareAppLd({
name: "Vegan IQ",
path: "/products/vegan-iq",
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.",
category: "GameApplication",
operatingSystem: "Android, iOS",
price: "0",
})}
/>
<Header />
<div id="main-content" className="z-10 w-full max-w-4xl mx-auto py-20 px-4 pb-24 md:pb-20">
<Link href="/products" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-block">
<div
id="main-content"
className="z-10 w-full max-w-4xl mx-auto py-20 px-4 pb-24 md:pb-20"
>
<Link
href="/products"
className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-block"
>
← Back to Products
</Link>
@@ -71,16 +115,26 @@ export default function VeganIqPage() {
<div className="prose dark:prose-invert max-w-none mb-12">
<p className="text-xl text-muted-foreground leading-relaxed">
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.
</p>
</div>
<div className="mb-12">
<StoreButtons links={[
{ platform: "google", href: "https://play.google.com/store/apps/details?id=com.veganiq.vegan_iq" },
{ platform: "apple", href: "https://apps.apple.com/us/app/vegan-iq-plant-based-trivia/id6761139580" },
]} />
<StoreButtons
links={[
{
platform: "google",
href: "https://play.google.com/store/apps/details?id=com.veganiq.vegan_iq",
},
{
platform: "apple",
href: "https://apps.apple.com/us/app/vegan-iq-plant-based-trivia/id6761139580",
},
]}
/>
</div>
<h2 className="text-2xl font-bold mb-6">Features</h2>
@@ -97,13 +151,28 @@ export default function VeganIqPage() {
<h2 className="text-2xl font-bold mb-4">Data Sources</h2>
<div className="prose dark:prose-invert max-w-none">
<p className="text-muted-foreground leading-relaxed">
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:
</p>
<ul className="list-disc pl-6 space-y-2 text-muted-foreground mt-4">
<li><strong>USDA FoodData Central</strong> — nutritional composition of plant-based foods</li>
<li><strong>Poore & Nemecek, Science (2018)</strong> — environmental impact data for food production</li>
<li><strong>National Institutes of Health (NIH)</strong> — health and dietary reference data</li>
<li><strong>FAOSTAT</strong> — global food production and agricultural statistics from the UN FAO</li>
<li>
<strong>USDA FoodData Central</strong> — nutritional composition
of plant-based foods
</li>
<li>
<strong>Poore & Nemecek, Science (2018)</strong> — environmental
impact data for food production
</li>
<li>
<strong>National Institutes of Health (NIH)</strong> — health
and dietary reference data
</li>
<li>
<strong>FAOSTAT</strong> — global food production and
agricultural statistics from the UN FAO
</li>
</ul>
</div>
</div>
@@ -112,7 +181,10 @@ export default function VeganIqPage() {
<h2 className="text-2xl font-bold mb-4">Legal</h2>
<ul className="space-y-2">
<li>
<Link href="/products/vegan-iq/privacy" className="text-blue-600 dark:text-blue-400 hover:underline">
<Link
href="/products/vegan-iq/privacy"
className="text-blue-600 dark:text-blue-400 hover:underline"
>
Privacy Policy
</Link>
</li>
@@ -13,126 +13,298 @@ export default function VeganIqPrivacyPage() {
return (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground">
<Header />
<div id="main-content" className="z-10 w-full max-w-3xl mx-auto py-20 px-4 pb-24 md:pb-20">
<Link href="/products/vegan-iq" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-block">
<div
id="main-content"
className="z-10 w-full max-w-3xl mx-auto py-20 px-4 pb-24 md:pb-20"
>
<Link
href="/products/vegan-iq"
className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-block"
>
← Back to Vegan IQ
</Link>
<h1 className="text-4xl font-bold mb-8">Privacy Policy for Vegan IQ</h1>
<div className="prose dark:prose-invert max-w-none space-y-6">
<p className="text-muted-foreground">Last updated: March 26, 2026</p>
<p className="text-muted-foreground">Last updated: July 29, 2026</p>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">1. Introduction</h2>
<h2 className="text-2xl font-semibold mt-8 mb-4">1. Scope</h2>
<p>
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 (&quot;we&quot;, &quot;our&quot;, or &quot;us&quot;)
operates the Vegan IQ mobile application (the &quot;App&quot;).
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.
</p>
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">2. Information We Collect</h2>
<h3 className="text-xl font-medium mt-4 mb-2">Local Data</h3>
<h2 className="text-2xl font-semibold mt-8 mb-4">
2. Data on your device
</h2>
<p>
Vegan IQ stores your score history, preferences, and game progress locally on your device using shared_preferences.
<strong> This data never leaves your device.</strong> 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.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">Advertising</h3>
<p>
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.
</p>
<p>
You can learn more about how Google uses information from sites or apps that use their services by visiting: <a href="https://policies.google.com/technologies/partner-sites" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:underline">Google's Privacy & Terms</a>.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">In-App Purchases</h3>
<p>
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&apos;s storage or
uninstalling it. Some of the same gameplay events or results are
also processed as described below.
</p>
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">3. How We Use Your Information</h2>
<p>We use the information described above to:</p>
<h2 className="text-2xl font-semibold mt-8 mb-4">
3. Data we process
</h2>
<h3 className="text-xl font-medium mt-4 mb-2">
Anonymous installation identifier
</h3>
<p>
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.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">
App use and gameplay
</h3>
<p>
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.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">Diagnostics</h3>
<p>
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.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">
Challenges, feedback, and leaderboards
</h3>
<p>
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.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">Notifications</h3>
<p>
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.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">App integrity</h3>
<p>
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.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">Purchases</h3>
<p>
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.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">
What we do not collect
</h3>
<p>
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.
</p>
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">
4. Why we use data
</h2>
<p>We use the data above to:</p>
<ul className="list-disc pl-6 space-y-2">
<li>Serve advertisements to support the free version of the App.</li>
<li>Process in-app purchases to remove ads.</li>
<li>Store your game progress and preferences locally on your device.</li>
<li>
provide quizzes, content updates, streaks, leaderboards,
purchases, and notifications;
</li>
<li>protect the API and maintain the security of the App;</li>
<li>measure feature use and improve content and usability;</li>
<li>diagnose crashes, errors, and performance problems; and</li>
<li>comply with legal obligations and enforce our terms.</li>
</ul>
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">4. Third-Party Services</h2>
<h2 className="text-2xl font-semibold mt-8 mb-4">
5. Service providers and disclosure
</h2>
<p>
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.
</p>
<ul className="list-disc pl-6 space-y-2">
<li><a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:underline">Google Play Services</a></li>
<li><a href="https://support.google.com/admob/answer/6128543?hl=en" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:underline">AdMob</a></li>
<li><a href="https://www.apple.com/legal/privacy/" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:underline">Apple App Store</a></li>
<li>
<a
href="https://firebase.google.com/support/privacy"
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 hover:underline"
>
Firebase privacy and security
</a>
</li>
<li>
<a
href="https://policies.google.com/privacy"
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 hover:underline"
>
Google Privacy Policy
</a>
</li>
<li>
<a
href="https://www.apple.com/legal/privacy/"
target="_blank"
rel="noopener noreferrer"
className="text-blue-600 hover:underline"
>
Apple Privacy Policy
</a>
</li>
</ul>
<p>
We do not sell personal information, share it for cross-context
behavioral advertising, or track your activity across other
companies&apos; apps or websites.
</p>
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">5. Ad Consent & Opt-Out</h2>
<h2 className="text-2xl font-semibold mt-8 mb-4">
6. Retention and your choices
</h2>
<p>
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).
</p>
<h3 className="text-xl font-medium mt-4 mb-2">For EU/EEA Users (GDPR)</h3>
<p>
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.
</p>
<h3 className="text-xl font-medium mt-4 mb-2">For California Users (CCPA/CPRA)</h3>
<p>
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.
</p>
<ul className="list-disc pl-6 space-y-2">
<li><strong>iOS:</strong> Settings → Privacy & Security → Tracking → disable "Allow Apps to Request to Track"</li>
<li><strong>Android:</strong> Settings → Privacy → Ads → enable "Opt out of Ads Personalization" (or "Delete advertising ID")</li>
<li>
<strong>Notifications:</strong> turn them off in Vegan IQ
Settings or device settings.
</li>
<li>
<strong>Leaderboards:</strong> leave the boards in Settings to
delete your leaderboard row and statistics.
</li>
<li>
<strong>Custom server data:</strong> 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.
</li>
<li>
<strong>Local data:</strong> clear App storage or uninstall the
App.
</li>
</ul>
<h3 className="text-xl font-medium mt-4 mb-2">Remove Ads Entirely</h3>
<p>
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{" "}
<a
href="mailto:privacy@such.software"
className="text-blue-600 hover:underline"
>
privacy@such.software
</a>
.
</p>
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">6. Your Rights</h2>
<p>Depending on your location, you may have the following rights regarding your data:</p>
<ul className="list-disc pl-6 space-y-2">
<li><strong>Right to know</strong> what personal data is collected and how it is used.</li>
<li><strong>Right to delete</strong> 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.</li>
<li><strong>Right to opt out</strong> of personalized advertising (see Section 5 above).</li>
<li><strong>Right to non-discrimination</strong> for exercising your privacy rights.</li>
</ul>
<p className="mt-4">
To exercise any of these rights, contact us at <a href="mailto:privacy@such.software" className="text-blue-600 hover:underline">privacy@such.software</a>.
<h2 className="text-2xl font-semibold mt-8 mb-4">7. Children</h2>
<p>
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.
</p>
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">7. Children's Privacy</h2>
<h2 className="text-2xl font-semibold mt-8 mb-4">
8. Security and international processing
</h2>
<p>
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.
</p>
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">8. Changes to This Privacy Policy</h2>
<h2 className="text-2xl font-semibold mt-8 mb-4">
9. Changes and contact
</h2>
<p>
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.
</p>
</section>
<section>
<h2 className="text-2xl font-semibold mt-8 mb-4">9. Contact Us</h2>
<p>
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{" "}
<a
href="mailto:privacy@such.software"
className="text-blue-600 hover:underline"
>
privacy@such.software
</a>
.
</p>
</section>
</div>
+4 -4
View File
@@ -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.
</p>
@@ -140,7 +140,7 @@ export default function WebshopsPage() {
Per-tenant theming is the whole point
</h2>
<p className="text-muted-foreground leading-relaxed max-w-3xl mb-4">
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() {
</h2>
<p className="text-muted-foreground mb-8 max-w-3xl">
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{" "}
<span className="font-medium text-foreground">booking calendar</span>: 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 */}
<section aria-labelledby="features-heading" className="mb-16">
<h2 id="features-heading" className="text-2xl md:text-3xl font-bold mb-8">
What's built in
What’s built in
</h2>
<div className="grid md:grid-cols-2 gap-6">
{features.map((f) => (
@@ -35,10 +35,10 @@ export const FounderSignature = () => {
<div className="prose dark:prose-invert max-w-none">
<p className="text-muted-foreground leading-relaxed italic border-l-4 border-primary/20 pl-6 text-lg">
"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.”
</p>
<p className="text-muted-foreground leading-relaxed mt-6">
John Winter Murphy holds a <span className="text-foreground font-semibold">PhD in Materials Engineering from UT-Dallas (2014)</span>, focused on semiconductor devices for radiation detection. From <span className="text-foreground font-semibold">2015 to 2021 he was a scientist at Lawrence Livermore National Laboratory</span>, 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 <span className="text-foreground font-semibold">accessible to everyone</span>, with front-ends engineered and audited against WCAG 2.2 AA.
John Winter Murphy holds a <span className="text-foreground font-semibold">PhD in Materials Engineering from UT-Dallas (2014)</span>, focused on semiconductor devices for radiation detection. From <span className="text-foreground font-semibold">2015 to 2021 he was a scientist at Lawrence Livermore National Laboratory</span>, 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 <span className="text-foreground font-semibold">accessible to everyone</span>, with front-ends engineered and audited against WCAG 2.2 AA.
</p>
<p className="text-muted-foreground leading-relaxed mt-4">
He previously co-founded <span className="text-foreground font-semibold">Patrn LLC</span> (<a href="https://art101.io" target="_blank" rel="noopener noreferrer" className="text-foreground font-semibold underline decoration-primary/50 hover:text-primary transition-colors">art101.io</a>), a series of art-history NFT drops, and <span className="text-foreground font-semibold">Tabby Labs</span>, which was developing a cryptocurrency wallet with an interactive world inside.
+2
View File
@@ -31,6 +31,8 @@
"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"
+34 -25
View File
@@ -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: