Add privacy policy and terms of service pages; fix footer links (#placeholder)

This commit is contained in:
Hermes
2026-05-27 18:10:02 -07:00
parent 00aa123f73
commit e780e5aa60
4 changed files with 250 additions and 31 deletions
+12 -25
View File
@@ -108,26 +108,10 @@ export default function AboutPage() {
</h2> </h2>
<div className="grid grid-cols-2 md:grid-cols-4 gap-6"> <div className="grid grid-cols-2 md:grid-cols-4 gap-6">
{[ {[
{ { name: "Caddy", role: "Reverse Proxy & SSL", icon: "🔒" },
name: "Caddy", { name: "Docker", role: "Container Runtime", icon: "🐳" },
role: "Reverse Proxy & SSL", { name: "Node.js", role: "API Backend", icon: "🟢" },
icon: "🔒", { name: "Technitium", role: "DNS Server", icon: "🌐" },
},
{
name: "Docker",
role: "Container Runtime",
icon: "🐳",
},
{
name: "Node.js",
role: "API Backend",
icon: "🟢",
},
{
name: "Technitium",
role: "DNS Server",
icon: "🌐",
},
].map((tech) => ( ].map((tech) => (
<div <div
key={tech.name} key={tech.name}
@@ -147,8 +131,7 @@ export default function AboutPage() {
<div className="max-w-3xl mx-auto text-center"> <div className="max-w-3xl mx-auto text-center">
<h2 className="text-2xl font-bold text-white mb-6">Get In Touch</h2> <h2 className="text-2xl font-bold text-white mb-6">Get In Touch</h2>
<p className="text-surface-300 mb-8"> <p className="text-surface-300 mb-8">
Have questions, feedback, or want to contribute? We&apos;d love to Have questions, feedback, or want to contribute? We&apos;d love to hear from you.
hear from you.
</p> </p>
<div className="flex flex-col sm:flex-row gap-4 justify-center"> <div className="flex flex-col sm:flex-row gap-4 justify-center">
<a <a
@@ -158,13 +141,17 @@ export default function AboutPage() {
Email Us Email Us
</a> </a>
<a <a
href="#" href="https://discord.gg/dashcaddy"
target="_blank"
rel="noopener noreferrer"
className="px-6 py-3 rounded-lg border border-surface-700 hover:border-surface-500 text-surface-300 font-medium transition-colors" className="px-6 py-3 rounded-lg border border-surface-700 hover:border-surface-500 text-surface-300 font-medium transition-colors"
> >
Join Discord Join Discord
</a> </a>
<a <a
href="#" href="https://github.com/dashcaddy"
target="_blank"
rel="noopener noreferrer"
className="px-6 py-3 rounded-lg border border-surface-700 hover:border-surface-500 text-surface-300 font-medium transition-colors" className="px-6 py-3 rounded-lg border border-surface-700 hover:border-surface-500 text-surface-300 font-medium transition-colors"
> >
GitHub GitHub
@@ -194,4 +181,4 @@ export default function AboutPage() {
<Footer /> <Footer />
</> </>
); );
} }
+114
View File
@@ -0,0 +1,114 @@
import Navbar from "@/components/Navbar";
import Footer from "@/components/Footer";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Privacy Policy - DashCaddy",
description:
"How DashCaddy handles your data. We believe in privacy — your server, your data, never leaving your network.",
};
export default function PrivacyPage() {
return (
<>
<Navbar />
<main className="flex-1">
<section className="pt-32 pb-20 px-4">
<div className="max-w-3xl mx-auto">
<h1 className="text-4xl font-bold text-white mb-8">
Privacy Policy
</h1>
<div className="space-y-6 text-surface-300 leading-relaxed">
<p className="text-surface-400 text-sm">
Last updated: June 2025
</p>
<h2 className="text-xl font-semibold text-white">
Your Server, Your Data
</h2>
<p>
DashCaddy runs entirely on your own hardware. We do not operate
any cloud services, and DashCaddy never phones home. All data
container configurations, DNS records, SSL certificates, and
usage statistics stays on your server.
</p>
<h2 className="text-xl font-semibold text-white">
What We Collect
</h2>
<p>
When you purchase a premium license, our payment processor
(Stripe) collects standard billing information. We receive only
your email address and a license key no credit card numbers
touch our servers.
</p>
<p>
During license activation, your server sends a one-time machine
fingerprint to generate a unique license key. This fingerprint
contains no personal information and is used solely to bind your
license to your hardware.
</p>
<h2 className="text-xl font-semibold text-white">
License Server
</h2>
<p>
Premium features require a license server URL to validate your
subscription. When you configure this, your server will make a
brief HTTPS call to our license server to verify your key is
active. The call includes only your license key and machine
identifier no content of your services is ever transmitted.
</p>
<p>
The license server is hosted on infrastructure we control. We
do not sell, share, or monetise any data from this process.
</p>
<h2 className="text-xl font-semibold text-white">
Cookies
</h2>
<p>
The DashCaddy dashboard itself uses no tracking cookies. The
license server uses a single HttpOnly session cookie during
your browser session to manage authenticated license
management operations. No third-party analytics or advertising
cookies are used anywhere in the product.
</p>
<h2 className="text-xl font-semibold text-white">
Third Parties
</h2>
<p>
DashCaddy's premium checkout is processed by Stripe, Inc. Their
privacy policy governs any data you share with them. We do not
receive your payment card details under any circumstances.
</p>
<h2 className="text-xl font-semibold text-white">
Changes to This Policy
</h2>
<p>
If this policy changes, the date at the top of the page will
reflect the update. We will never retroactively change how we
handle data already collected.
</p>
<h2 className="text-xl font-semibold text-white">Contact</h2>
<p>
Questions about privacy? Email{" "}
<a
href="mailto:privacy@dashcaddy.net"
className="text-brand-400 hover:text-brand-300"
>
privacy@dashcaddy.net
</a>
.
</p>
</div>
</div>
</section>
</main>
<Footer />
</>
);
}
+119
View File
@@ -0,0 +1,119 @@
import Navbar from "@/components/Navbar";
import Footer from "@/components/Footer";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Terms of Service - DashCaddy",
description:
"The terms under which you may use DashCaddy. Plain language, no fine print surprises.",
};
export default function TermsPage() {
return (
<>
<Navbar />
<main className="flex-1">
<section className="pt-32 pb-20 px-4">
<div className="max-w-3xl mx-auto">
<h1 className="text-4xl font-bold text-white mb-8">
Terms of Service
</h1>
<div className="space-y-6 text-surface-300 leading-relaxed">
<p className="text-surface-400 text-sm">
Last updated: June 2025
</p>
<h2 className="text-xl font-semibold text-white">
Acceptance of Terms
</h2>
<p>
By purchasing or using DashCaddy, you agree to these terms. If
you do not agree, do not use the software.
</p>
<h2 className="text-xl font-semibold text-white">
License Grant
</h2>
<p>
DashCaddy is provided under a commercial license. A valid
license key grants you the right to use premium features on one
server installation. Licenses are bound to your hardware and
are not transferable. A free tier covering core features is
available without a license.
</p>
<h2 className="text-xl font-semibold text-white">
Permitted Use
</h2>
<p>
You may use DashCaddy to manage your own servers or those of
your clients. You may not redistribute, resell, or sublicense
the software. You may not reverse engineer the license
validation system.
</p>
<h2 className="text-xl font-semibold text-white">
Subscription & Billing
</h2>
<p>
Subscriptions are billed in advance on a monthly, quarterly,
or annual basis depending on your plan. Cancelling a
subscription stops future billing; you retain access to
premium features until the end of your current billing
period. No refunds are offered for partial periods, unless
required by applicable law.
</p>
<h2 className="text-xl font-semibold text-white">
Service Availability
</h2>
<p>
DashCaddy is software you run on your own infrastructure. We
do not guarantee uptime for the license validation server. If
our license server is temporarily unavailable, premium
features gracefully degrade your services continue to run
normally; they simply stop enforcing license eligibility
checks until connectivity is restored.
</p>
<h2 className="text-xl font-semibold text-white">
Disclaimer
</h2>
<p>
DashCaddy is provided "as is" without warranty of any kind.
We are not liable for any damages arising from the use of this
software. It is your responsibility to ensure your
configuration is secure and your backups are current.
</p>
<h2 className="text-xl font-semibold text-white">
Account Termination
</h2>
<p>
We reserve the right to revoke a license key if it is used in
violation of these terms, including use on more servers than
the license permits, or attempting to circumvent license
validation.
</p>
<h2 className="text-xl font-semibold text-white">
Contact
</h2>
<p>
Questions? Email{" "}
<a
href="mailto:legal@dashcaddy.net"
className="text-brand-400 hover:text-brand-300"
>
legal@dashcaddy.net
</a>
.
</p>
</div>
</div>
</section>
</main>
<Footer />
</>
);
}
+5 -6
View File
@@ -19,16 +19,15 @@ export default function Footer() {
links: [ links: [
{ label: 'Getting Started', href: '/docs' }, { label: 'Getting Started', href: '/docs' },
{ label: 'API Reference', href: '/docs#api' }, { label: 'API Reference', href: '/docs#api' },
{ label: 'Community', href: '#' }, { label: 'Discord', href: 'https://discord.gg/dashcaddy' },
], ],
}, },
{ {
title: 'Support', title: 'Support',
links: [ links: [
{ label: 'Contact', href: 'mailto:support@dashcaddy.net' }, { label: 'Contact', href: 'mailto:support@dashcaddy.net' },
{ label: 'Discord', href: '#' }, { label: 'Privacy Policy', href: '/privacy' },
{ label: 'Privacy Policy', href: '#' }, { label: 'Terms of Service', href: '/terms' },
{ label: 'Terms of Service', href: '#' },
], ],
}, },
]; ];
@@ -41,7 +40,7 @@ export default function Footer() {
</svg> </svg>
), ),
label: 'Discord', label: 'Discord',
href: '#', href: 'https://discord.gg/dashcaddy',
}, },
]; ];
@@ -126,4 +125,4 @@ export default function Footer() {
</div> </div>
</footer> </footer>
); );
} }