feat: privacy page at /privacy, drop query language nav link
This commit is contained in:
parent
5dd514aa94
commit
62b67aaa7c
|
|
@ -138,8 +138,7 @@
|
|||
<a href="/" class="font-mono text-lg font-bold tracking-tight">Ping<span class="text-blue-400">QL</span></a>
|
||||
<nav class="hidden md:flex items-center gap-7 text-sm text-gray-400">
|
||||
<a href="/docs" class="hover:text-gray-200 transition-colors">Docs</a>
|
||||
<a href="/docs#ql-fields" class="hover:text-gray-200 transition-colors">Query Language</a>
|
||||
<a href="#privacy" class="hover:text-gray-200 transition-colors">Privacy</a>
|
||||
<a href="/privacy" class="hover:text-gray-200 transition-colors">Privacy</a>
|
||||
<a href="#pricing" class="hover:text-gray-200 transition-colors">Pricing</a>
|
||||
</nav>
|
||||
<div class="flex items-center gap-3">
|
||||
|
|
@ -598,6 +597,7 @@
|
|||
<a href="/dashboard" class="hover:text-gray-300 transition-colors">Dashboard</a>
|
||||
<a href="/docs" class="hover:text-gray-300 transition-colors">Docs</a>
|
||||
<a href="/privacy" class="hover:text-gray-300 transition-colors">Privacy</a>
|
||||
<a href="#pricing" class="hover:text-gray-300 transition-colors">Pricing</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="text-xs text-gray-600">
|
||||
|
|
|
|||
|
|
@ -0,0 +1,163 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en" class="dark scroll-smooth">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Privacy — PingQL</title>
|
||||
<meta name="description" content="PingQL's privacy policy. No tracking, no data sales, no ads. We store what we need and nothing more.">
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
<script>
|
||||
tailwind.config = {
|
||||
theme: {
|
||||
extend: {
|
||||
fontFamily: {
|
||||
mono: ['JetBrains Mono', 'SF Mono', 'Fira Code', 'ui-monospace', 'monospace'],
|
||||
sans: ['Inter', 'system-ui', '-apple-system', 'sans-serif'],
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
body { background: #0a0a0a; }
|
||||
.grid-bg {
|
||||
background-image:
|
||||
linear-gradient(rgba(59, 130, 246, 0.03) 1px, transparent 1px),
|
||||
linear-gradient(90deg, rgba(59, 130, 246, 0.03) 1px, transparent 1px);
|
||||
background-size: 64px 64px;
|
||||
}
|
||||
.prose-custom h2 { font-size: 1.25rem; font-weight: 600; color: #f3f4f6; margin-top: 2.5rem; margin-bottom: 0.75rem; }
|
||||
.prose-custom p { color: #9ca3af; line-height: 1.75; margin-bottom: 1rem; }
|
||||
.prose-custom ul { margin-bottom: 1rem; padding-left: 1.25rem; }
|
||||
.prose-custom li { color: #9ca3af; line-height: 1.75; margin-bottom: 0.25rem; list-style-type: disc; }
|
||||
.prose-custom strong { color: #e5e7eb; font-weight: 600; }
|
||||
.prose-custom a { color: #60a5fa; text-decoration: none; }
|
||||
.prose-custom a:hover { text-decoration: underline; }
|
||||
</style>
|
||||
</head>
|
||||
<body class="bg-[#0a0a0a] text-gray-100 font-sans antialiased grid-bg">
|
||||
|
||||
<!-- Header -->
|
||||
<header class="border-b border-gray-800/60 bg-[#0a0a0a]/80 backdrop-blur-md">
|
||||
<div class="max-w-6xl mx-auto px-6 py-4 flex items-center justify-between">
|
||||
<a href="/" class="font-mono text-lg font-bold tracking-tight">Ping<span class="text-blue-400">QL</span></a>
|
||||
<div class="flex items-center gap-3">
|
||||
<a href="/dashboard" class="text-sm text-gray-400 hover:text-gray-200 transition-colors">Sign in</a>
|
||||
<a href="/dashboard" class="text-sm bg-blue-600 hover:bg-blue-500 text-white px-4 py-2 rounded-lg font-medium transition-colors">Get started</a>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="max-w-2xl mx-auto px-6 py-20">
|
||||
|
||||
<!-- Hero -->
|
||||
<div class="mb-12">
|
||||
<div class="inline-flex items-center gap-2 px-3 py-1 rounded-full border border-green-800/50 text-xs text-green-400 mb-6 font-mono">
|
||||
<span class="w-2 h-2 rounded-full bg-green-500"></span>
|
||||
Actually private
|
||||
</div>
|
||||
<h1 class="text-4xl font-bold tracking-tight mb-4">Privacy Policy</h1>
|
||||
<p class="text-gray-400 text-lg leading-relaxed">
|
||||
The short version: we collect the minimum needed to run the service. We don't sell it, share it, or monetize it. Ever.
|
||||
</p>
|
||||
<p class="text-xs text-gray-600 mt-4">Last updated: March 2026</p>
|
||||
</div>
|
||||
|
||||
<!-- The industry problem -->
|
||||
<div class="rounded-xl border border-red-900/30 bg-red-950/10 p-6 mb-10">
|
||||
<h2 class="text-base font-semibold text-red-400 mb-3 flex items-center gap-2">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"/></svg>
|
||||
The rest of the industry
|
||||
</h2>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">
|
||||
Most SaaS monitoring tools are free or cheap because <strong>you're the product</strong>. They're backed by investors who need returns, which means your usage data, your infrastructure details, your URLs, your team — all of it gets fed into ad networks, sold to data brokers, or used to build "anonymized" datasets that aren't actually anonymous.
|
||||
</p>
|
||||
<p class="text-sm text-gray-400 leading-relaxed mt-3">
|
||||
They require your email "for alerts" and then spam you, add you to nurture sequences, sell your address, and share it with their parent company's 47 "trusted partners." They embed Segment, Mixpanel, Intercom, Hotjar, Google Analytics, and a dozen other trackers on every page — harvesting your behavior and shipping it to Silicon Valley servers whether you want it or not.
|
||||
</p>
|
||||
<p class="text-sm text-gray-400 leading-relaxed mt-3">
|
||||
That's the industry standard. We think it's garbage.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="prose-custom">
|
||||
|
||||
<h2>What we collect</h2>
|
||||
<ul>
|
||||
<li><strong>Account key</strong> — a UUID you generate at signup. Stored in plaintext. It's your credential.</li>
|
||||
<li><strong>Email (optional)</strong> — only if you provide one for account recovery. Stored as a one-way SHA-256 hash. We cannot read it, search for it, or recover it. It's purely a verification token.</li>
|
||||
<li><strong>Monitors</strong> — the URLs and configurations you create. Obviously.</li>
|
||||
<li><strong>Ping results</strong> — status codes, latency, up/down, error messages. This is the product.</li>
|
||||
</ul>
|
||||
<p>That's it. No device fingerprints, no IP logs, no browser data, no analytics events, no session recordings.</p>
|
||||
|
||||
<h2>What we don't collect</h2>
|
||||
<ul>
|
||||
<li>Your name, company, or any identity information</li>
|
||||
<li>Your IP address (beyond what your browser sends in the HTTP request, which we don't log)</li>
|
||||
<li>Browsing behavior or page analytics</li>
|
||||
<li>Third-party tracking scripts of any kind</li>
|
||||
<li>Cookies beyond the session cookie that keeps you logged in</li>
|
||||
</ul>
|
||||
|
||||
<h2>What we never do</h2>
|
||||
<ul>
|
||||
<li><strong>Sell your data.</strong> Not to anyone, ever, for any reason.</li>
|
||||
<li><strong>Share your data</strong> with advertisers, data brokers, or "partners."</li>
|
||||
<li><strong>Use your monitor URLs or configs</strong> to build datasets, train models, or infer anything about your business.</li>
|
||||
<li><strong>Send marketing email</strong> unless you explicitly ask for it (you won't, because we don't have that feature).</li>
|
||||
<li><strong>Require your email.</strong> You can use PingQL completely anonymously.</li>
|
||||
</ul>
|
||||
|
||||
<h2>Third parties</h2>
|
||||
<p>
|
||||
We use <strong>Cloudflare</strong> for DNS and DDoS protection. They see your IP when you connect. Their privacy policy applies to that layer.
|
||||
We use <strong>Stripe</strong> for payment processing (when billing is live). They handle card data — we never touch it.
|
||||
That's the complete list of third parties with access to anything.
|
||||
</p>
|
||||
<p>
|
||||
No Segment. No Mixpanel. No Intercom. No Hotjar. No Google Analytics. No Facebook Pixel. Nothing.
|
||||
</p>
|
||||
|
||||
<h2>Data retention</h2>
|
||||
<p>
|
||||
Ping history is retained for 90 days by default. Account data is kept until you delete your account. If you want everything deleted, contact us and we'll do it.
|
||||
</p>
|
||||
|
||||
<h2>Where data is stored</h2>
|
||||
<p>
|
||||
Servers are in Prague, Czech Republic (EU). GDPR applies.
|
||||
</p>
|
||||
|
||||
<h2>Security</h2>
|
||||
<p>
|
||||
Data in transit is encrypted via TLS. Postgres data is on encrypted disks. Your account key is the only credential — there's no password database to breach.
|
||||
</p>
|
||||
|
||||
<h2>Contact</h2>
|
||||
<p>
|
||||
Questions? <a href="mailto:hi@pingql.com">hi@pingql.com</a>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="border-t border-gray-800/50 py-12 px-6 mt-12">
|
||||
<div class="max-w-5xl mx-auto flex flex-col sm:flex-row items-center justify-between gap-6">
|
||||
<div class="flex items-center gap-6">
|
||||
<a href="/" class="text-lg font-bold tracking-tight font-mono">Ping<span class="text-blue-400">QL</span></a>
|
||||
<nav class="flex items-center gap-5 text-sm text-gray-500">
|
||||
<a href="/dashboard" class="hover:text-gray-300 transition-colors">Dashboard</a>
|
||||
<a href="/docs" class="hover:text-gray-300 transition-colors">Docs</a>
|
||||
<a href="/privacy" class="hover:text-gray-300 transition-colors">Privacy</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="text-xs text-gray-600">Built by Ico ♟</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -229,4 +229,5 @@ export const dashboard = new Elysia()
|
|||
})
|
||||
|
||||
// Docs
|
||||
.get("/docs", () => Bun.file(`${dashDir}/docs.html`));
|
||||
.get("/docs", () => Bun.file(`${dashDir}/docs.html`))
|
||||
.get("/privacy", () => Bun.file(`${dashDir}/privacy.html`));
|
||||
|
|
|
|||
Loading…
Reference in New Issue