update: remove em dashes, plans
This commit is contained in:
parent
a1d37c6215
commit
1a0b6bb0fe
|
|
@ -56,7 +56,7 @@
|
|||
<div class="text-xs text-yellow-500/70 uppercase tracking-wider font-mono mb-1">Lifetime</div>
|
||||
<% if (lifetimeDiscount > 0) { %>
|
||||
<div class="text-2xl font-bold text-gray-100">$<%= lifetimePrice.toFixed(0) %> <span class="text-sm font-normal text-gray-600 line-through">$<%= lifetimeBase %></span></div>
|
||||
<div class="text-xs text-green-400/70 mt-1">You've paid us $<%= totalSpent.toFixed(0) %> — we've credited $<%= lifetimeDiscount.toFixed(0) %> toward lifetime</div>
|
||||
<div class="text-xs text-green-400/70 mt-1">You've paid us $<%= totalSpent.toFixed(0) %>, so we've credited $<%= lifetimeDiscount.toFixed(0) %> toward lifetime</div>
|
||||
<% } else { %>
|
||||
<div class="text-2xl font-bold text-gray-100">$<%= lifetimeBase %></div>
|
||||
<% } %>
|
||||
|
|
@ -188,7 +188,7 @@
|
|||
<% } else if (inv.status === 'underpaid') { %>
|
||||
<div class="flex items-center justify-center gap-2 text-sm">
|
||||
<span class="w-2 h-2 rounded-full bg-yellow-500 animate-pulse"></span>
|
||||
<span class="text-yellow-400">Underpaid — please send the remaining amount</span>
|
||||
<span class="text-yellow-400">Underpaid - please send the remaining amount</span>
|
||||
</div>
|
||||
<div class="text-xs text-gray-600 mt-2">
|
||||
Expires in <span class="font-mono"><%= mins %>:<%= String(secs).padStart(2, '0') %></span>
|
||||
|
|
@ -226,6 +226,7 @@
|
|||
<% } %>
|
||||
|
||||
</div>
|
||||
<p class="text-xs text-gray-600 text-center mt-4">You can leave this page. Payments are detected and confirmed automatically.</p>
|
||||
<% } %>
|
||||
</main>
|
||||
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@
|
|||
|
||||
<h3>Register</h3>
|
||||
<div class="endpoint"><span class="method post">POST</span><span class="path">/account/register</span></div>
|
||||
<p class="endpoint-desc">Create a new account. Email is optional — used only for account recovery.</p>
|
||||
<p class="endpoint-desc">Create a new account. Email is optional and used only for account recovery.</p>
|
||||
<div class="cb">
|
||||
<div class="cb-header"><span class="cb-lang">json — request body</span></div>
|
||||
<pre>{ <span class="k">"email"</span>: <span class="s">"you@example.com"</span> } <span class="c">// optional</span></pre>
|
||||
|
|
@ -267,7 +267,7 @@
|
|||
<!-- $consider -->
|
||||
<div id="ql-consider" class="section">
|
||||
<h2>$consider</h2>
|
||||
<p>By default, matching conditions mean the monitor is <strong style="color:#4ade80">up</strong>. Set <code style="color:#93c5fd;background:#0f172a;padding:0.1em 0.35em;border-radius:0.2rem;font-size:0.78rem">"$consider": "down"</code> to flip this — if the conditions match, the monitor is <strong style="color:#f87171">down</strong>.</p>
|
||||
<p>By default, matching conditions mean the monitor is <strong style="color:#4ade80">up</strong>. Set <code style="color:#93c5fd;background:#0f172a;padding:0.1em 0.35em;border-radius:0.2rem;font-size:0.78rem">"$consider": "down"</code> to flip this. If the conditions match, the monitor is <strong style="color:#f87171">down</strong>.</p>
|
||||
<div class="cb">
|
||||
<div class="cb-header"><span class="cb-lang">json</span></div>
|
||||
<pre><span class="c">// down if response time exceeds 2 seconds</span>
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@
|
|||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>PingQL — Uptime monitoring that thinks like a developer</title>
|
||||
<title>PingQL - Uptime monitoring that thinks like a developer</title>
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<meta name="description" content="Monitor uptime with a MongoDB-style query language. Inspect JSON, HTML, headers, certs, and more — not just ping.">
|
||||
<meta name="description" content="Monitor uptime with a MongoDB-style query language. Inspect JSON, HTML, headers, certs, and more.">
|
||||
<link rel="stylesheet" href="/assets/tailwind.css?v=<%= it.cssHash %>">
|
||||
<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">
|
||||
|
|
@ -165,7 +165,7 @@
|
|||
Uptime monitoring<br>that <span class="text-brand">thinks like<br>a developer</span>
|
||||
</h1>
|
||||
<p class="text-lg text-gray-400 max-w-lg mb-8 leading-relaxed">
|
||||
Go beyond simple pings. Write queries against status codes, JSON bodies, HTML selectors, headers, cert expiry — everything your response contains.
|
||||
Go beyond simple pings. Write queries against status codes, JSON bodies, HTML selectors, headers, and cert expiry.
|
||||
</p>
|
||||
<div class="flex flex-wrap gap-4">
|
||||
<a href="/dashboard" class="inline-flex items-center gap-2 px-6 py-3 text-white font-medium rounded-lg transition-all text-sm" style="background:#2563eb;box-shadow:0 1px 3px rgba(0,0,0,0.3),0 0 12px rgba(59,130,246,0.15)">
|
||||
|
|
@ -286,7 +286,7 @@
|
|||
<svg class="w-5 h-5 text-brand" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M17.25 6.75L22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3l-4.5 16.5"/></svg>
|
||||
</div>
|
||||
<h3 class="font-semibold text-white mb-2">MongoDB-style queries</h3>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">Use <code class="text-brand font-mono text-xs">$and</code>, <code class="text-brand font-mono text-xs">$or</code>, <code class="text-brand font-mono text-xs">$lt</code>, <code class="text-brand font-mono text-xs">$regex</code> — a query language you already know.</p>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">Use <code class="text-brand font-mono text-xs">$and</code>, <code class="text-brand font-mono text-xs">$or</code>, <code class="text-brand font-mono text-xs">$lt</code>, <code class="text-brand font-mono text-xs">$regex</code>. A query language you already know.</p>
|
||||
</div>
|
||||
|
||||
<!-- Feature 2 -->
|
||||
|
|
@ -295,7 +295,7 @@
|
|||
<svg class="w-5 h-5 text-brand" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z"/></svg>
|
||||
</div>
|
||||
<h3 class="font-semibold text-white mb-2">JSONPath & CSS selectors</h3>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">Drill into JSON responses with <code class="text-brand font-mono text-xs">$json</code> or scrape any HTML page with <code class="text-brand font-mono text-xs">$select</code> — no API required.</p>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">Drill into JSON responses with <code class="text-brand font-mono text-xs">$json</code> or scrape any HTML page with <code class="text-brand font-mono text-xs">$select</code>. No API required.</p>
|
||||
</div>
|
||||
|
||||
<!-- Feature 3 -->
|
||||
|
|
@ -331,7 +331,7 @@
|
|||
<svg class="w-5 h-5 text-brand" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M15.75 5.25a3 3 0 013 3m3 0a6 6 0 01-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1121.75 8.25z"/></svg>
|
||||
</div>
|
||||
<h3 class="font-semibold text-white mb-2">Sub-keys & API access</h3>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">Create scoped sub-keys for CI pipelines, scripts, or teammates. Full REST API — no dashboard required.</p>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">Create scoped sub-keys for CI pipelines, scripts, or teammates. Full REST API, no dashboard required.</p>
|
||||
</div>
|
||||
|
||||
<!-- Feature 7 -->
|
||||
|
|
@ -340,7 +340,7 @@
|
|||
<svg class="w-5 h-5 text-brand" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M3 13.125C3 12.504 3.504 12 4.125 12h2.25c.621 0 1.125.504 1.125 1.125v6.75C7.5 20.496 6.996 21 6.375 21h-2.25A1.125 1.125 0 013 19.875v-6.75zM9.75 8.625c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125v11.25c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V8.625zM16.5 4.125c0-.621.504-1.125 1.125-1.125h2.25C20.496 3 21 3.504 21 4.125v15.75c0 .621-.504 1.125-1.125 1.125h-2.25a1.125 1.125 0 01-1.125-1.125V4.125z"/></svg>
|
||||
</div>
|
||||
<h3 class="font-semibold text-white mb-2">Live dashboard</h3>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">Real-time updates via SSE. Latency charts, status history, uptime stats — all live without a page refresh.</p>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">Real-time updates via SSE. Latency charts, status history, and uptime stats, all live without a page refresh.</p>
|
||||
</div>
|
||||
|
||||
<!-- Feature 8 -->
|
||||
|
|
@ -349,7 +349,7 @@
|
|||
<svg class="w-5 h-5 text-brand" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M16.5 10.5V6.75a4.5 4.5 0 10-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 002.25-2.25v-6.75a2.25 2.25 0 00-2.25-2.25H6.75a2.25 2.25 0 00-2.25 2.25v6.75a2.25 2.25 0 002.25 2.25z"/></svg>
|
||||
</div>
|
||||
<h3 class="font-semibold text-white mb-2">Privacy-first accounts</h3>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">No email required. No passwords. Just an account key. Emails are hashed if provided — we literally can't read them.</p>
|
||||
<p class="text-sm text-gray-400 leading-relaxed">No email required. No passwords. Just an account key. Emails are hashed if provided, so we literally can't read them.</p>
|
||||
</div>
|
||||
|
||||
<!-- Feature 9 -->
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>PingQL — Sign In</title>
|
||||
<title>PingQL - Sign In</title>
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="/assets/tailwind.css?v=<%= it.cssHash %>">
|
||||
<link rel="stylesheet" href="/assets/app.css?v=<%= it.cssHash %>">
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
<div class="w-8 h-8 rounded-full bg-green-500/20 flex items-center justify-center text-green-400 text-lg">✓</div>
|
||||
<div>
|
||||
<p class="font-semibold text-white">Account created</p>
|
||||
<p class="text-xs text-gray-500">Save your key — it's how you access your account</p>
|
||||
<p class="text-xs text-gray-500">Save your key - it's how you access your account</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -65,7 +65,7 @@
|
|||
</div>
|
||||
|
||||
<div class="pt-5 border-t divider">
|
||||
<label class="block text-xs text-gray-500 uppercase tracking-wider mb-1">Email <span class="text-gray-600 normal-case">(optional — recovery only)</span></label>
|
||||
<label class="block text-xs text-gray-500 uppercase tracking-wider mb-1">Email <span class="text-gray-600 normal-case">(optional, recovery only)</span></label>
|
||||
<input id="email-input" type="email" placeholder="you@example.com"
|
||||
class="w-full input-base px-4 py-3 text-gray-100 placeholder-gray-600 text-sm mb-3">
|
||||
<div class="flex gap-2">
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>PingQL<%= it.title ? ` — ${it.title}` : '' %></title>
|
||||
<title>PingQL<%= it.title ? ` - ${it.title}` : '' %></title>
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="/assets/tailwind.css?v=<%= it.cssHash %>">
|
||||
<link rel="stylesheet" href="/assets/app.css?v=<%= it.cssHash %>">
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>PingQL<%= it.title ? ` — ${it.title}` : '' %></title>
|
||||
<title>PingQL<%= it.title ? ` - ${it.title}` : '' %></title>
|
||||
<% if (it.description) { %><meta name="description" content="<%= it.description %>"><% } %>
|
||||
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
|
||||
<link rel="stylesheet" href="/assets/tailwind.css?v=<%= it.cssHash %>">
|
||||
|
|
|
|||
|
|
@ -22,10 +22,10 @@
|
|||
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.
|
||||
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.
|
||||
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.
|
||||
|
|
@ -36,10 +36,10 @@
|
|||
|
||||
<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>
|
||||
<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.</li>
|
||||
<li><strong>Monitors</strong> - the URLs and configurations you create.</li>
|
||||
<li><strong>Ping results</strong> - status codes, latency, up/down, error messages.</li>
|
||||
</ul>
|
||||
<p>That's it. No device fingerprints, no IP logs, no browser data, no analytics events, no session recordings.</p>
|
||||
|
||||
|
|
@ -72,7 +72,7 @@
|
|||
|
||||
<h2>Payments</h2>
|
||||
<p>
|
||||
We accept cryptocurrency. No card data, no billing address, no name — payments can be entirely anonymous. We never store or see your payment details.
|
||||
We accept cryptocurrency. No card data, no billing address, no name. Payments can be entirely anonymous. We never store or see your payment details.
|
||||
</p>
|
||||
|
||||
<h2>Data retention</h2>
|
||||
|
|
@ -82,7 +82,7 @@
|
|||
|
||||
<h2>Security</h2>
|
||||
<p>
|
||||
All data in transit is encrypted via TLS. All data at rest is on encrypted disks. Your account key is the only credential — there's no password database to breach, no hashed passwords to crack, no OAuth tokens to steal.
|
||||
All data in transit is encrypted via TLS. All data at rest is on encrypted disks. Your account key is the only credential. There's no password database to breach, no hashed passwords to crack, no OAuth tokens to steal.
|
||||
</p>
|
||||
|
||||
<h2>Contact</h2>
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@
|
|||
<% if (!it.isSubKey) { %>
|
||||
<section class="card-static p-6">
|
||||
<h2 class="text-sm font-semibold text-gray-300 mb-1">Recovery Email</h2>
|
||||
<p class="text-xs text-gray-600 mb-4">Used for account recovery only. Stored as a one-way hash — we can't read it.</p>
|
||||
<p class="text-xs text-gray-600 mb-4">Used for account recovery only. Stored as a one-way hash, so we can't read it.</p>
|
||||
<form action="/account/email" method="POST">
|
||||
<input type="hidden" name="_form" value="1">
|
||||
<div class="flex gap-2">
|
||||
|
|
|
|||
|
|
@ -30,13 +30,13 @@
|
|||
</ul>
|
||||
|
||||
<h2>4. Account Responsibility</h2>
|
||||
<p>Your account key is your credential. Keep it safe — you're responsible for everything done with it. One account per person or organization. If we detect accounts created solely to abuse free tier limits, we'll terminate them without notice.</p>
|
||||
<p>Your account key is your credential. Keep it safe. You're responsible for everything done with it. One account per person or organization. If we detect accounts created solely to abuse free tier limits, we'll terminate them without notice.</p>
|
||||
|
||||
<h2>5. Fair Use</h2>
|
||||
<p>Free tier limits exist to make the service sustainable. Using automation, scripts, or any other method to work around them is a violation of these terms and grounds for immediate termination.</p>
|
||||
|
||||
<h2>6. Termination</h2>
|
||||
<p>We may suspend or terminate your account at any time, with or without notice, if we believe you're violating these terms. Given the privacy-first nature of the service, we can't always investigate — abuse that is detectable will result in termination.</p>
|
||||
<p>We may suspend or terminate your account at any time, with or without notice, if we believe you're violating these terms. Given the privacy-first nature of the service, we can't always investigate. Detectable abuse will result in termination.</p>
|
||||
|
||||
<h2>7. Service Availability</h2>
|
||||
<p>PingQL is provided as-is. We aim for high availability but make no guarantees of uptime, data retention, or uninterrupted service. Don't rely solely on PingQL for mission-critical monitoring.</p>
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
<div class="w-8 h-8 rounded-full bg-green-500/20 flex items-center justify-center text-green-400 text-lg">✓</div>
|
||||
<div>
|
||||
<p class="font-semibold text-white">Account created</p>
|
||||
<p class="text-xs text-gray-500">Save your key — it's how you access your account</p>
|
||||
<p class="text-xs text-gray-500">Save your key - it's how you access your account</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
@ -21,7 +21,7 @@
|
|||
<div class="pt-5 border-t divider">
|
||||
<form action="/account/email" method="POST" class="space-y-3">
|
||||
<input type="hidden" name="_form" value="1">
|
||||
<label class="block text-xs text-gray-500 uppercase tracking-wider mb-1">Email <span class="text-gray-600 normal-case">(optional — recovery only)</span></label>
|
||||
<label class="block text-xs text-gray-500 uppercase tracking-wider mb-1">Email <span class="text-gray-600 normal-case">(optional, recovery only)</span></label>
|
||||
<input name="email" type="email" placeholder="you@example.com"
|
||||
class="w-full input-base px-4 py-3 text-gray-100 placeholder-gray-600 text-sm">
|
||||
<div class="flex gap-2">
|
||||
|
|
|
|||
Loading…
Reference in New Issue