update: remove em dashes, plans

This commit is contained in:
nate 2026-03-22 06:18:23 +04:00
parent a1d37c6215
commit 1a0b6bb0fe
10 changed files with 31 additions and 30 deletions

View File

@ -56,7 +56,7 @@
<div class="text-xs text-yellow-500/70 uppercase tracking-wider font-mono mb-1">Lifetime</div> <div class="text-xs text-yellow-500/70 uppercase tracking-wider font-mono mb-1">Lifetime</div>
<% if (lifetimeDiscount > 0) { %> <% 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-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 { %> <% } else { %>
<div class="text-2xl font-bold text-gray-100">$<%= lifetimeBase %></div> <div class="text-2xl font-bold text-gray-100">$<%= lifetimeBase %></div>
<% } %> <% } %>
@ -188,7 +188,7 @@
<% } else if (inv.status === 'underpaid') { %> <% } else if (inv.status === 'underpaid') { %>
<div class="flex items-center justify-center gap-2 text-sm"> <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="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>
<div class="text-xs text-gray-600 mt-2"> <div class="text-xs text-gray-600 mt-2">
Expires in <span class="font-mono"><%= mins %>:<%= String(secs).padStart(2, '0') %></span> Expires in <span class="font-mono"><%= mins %>:<%= String(secs).padStart(2, '0') %></span>
@ -226,6 +226,7 @@
<% } %> <% } %>
</div> </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> </main>

View File

@ -95,7 +95,7 @@
<h3>Register</h3> <h3>Register</h3>
<div class="endpoint"><span class="method post">POST</span><span class="path">/account/register</span></div> <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">
<div class="cb-header"><span class="cb-lang">json — request body</span></div> <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> <pre>{ <span class="k">"email"</span>: <span class="s">"you@example.com"</span> } <span class="c">// optional</span></pre>
@ -267,7 +267,7 @@
<!-- $consider --> <!-- $consider -->
<div id="ql-consider" class="section"> <div id="ql-consider" class="section">
<h2>$consider</h2> <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">
<div class="cb-header"><span class="cb-lang">json</span></div> <div class="cb-header"><span class="cb-lang">json</span></div>
<pre><span class="c">// down if response time exceeds 2 seconds</span> <pre><span class="c">// down if response time exceeds 2 seconds</span>

View File

@ -3,9 +3,9 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <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"> <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="stylesheet" href="/assets/tailwind.css?v=<%= it.cssHash %>">
<link rel="preconnect" href="https://fonts.googleapis.com"> <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"> <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> Uptime monitoring<br>that <span class="text-brand">thinks like<br>a developer</span>
</h1> </h1>
<p class="text-lg text-gray-400 max-w-lg mb-8 leading-relaxed"> <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> </p>
<div class="flex flex-wrap gap-4"> <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)"> <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> <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> </div>
<h3 class="font-semibold text-white mb-2">MongoDB-style queries</h3> <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> </div>
<!-- Feature 2 --> <!-- 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> <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> </div>
<h3 class="font-semibold text-white mb-2">JSONPath & CSS selectors</h3> <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> </div>
<!-- Feature 3 --> <!-- 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> <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> </div>
<h3 class="font-semibold text-white mb-2">Sub-keys & API access</h3> <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> </div>
<!-- Feature 7 --> <!-- 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> <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> </div>
<h3 class="font-semibold text-white mb-2">Live dashboard</h3> <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> </div>
<!-- Feature 8 --> <!-- 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> <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> </div>
<h3 class="font-semibold text-white mb-2">Privacy-first accounts</h3> <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> </div>
<!-- Feature 9 --> <!-- Feature 9 -->

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <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="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="stylesheet" href="/assets/tailwind.css?v=<%= it.cssHash %>"> <link rel="stylesheet" href="/assets/tailwind.css?v=<%= it.cssHash %>">
<link rel="stylesheet" href="/assets/app.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 class="w-8 h-8 rounded-full bg-green-500/20 flex items-center justify-center text-green-400 text-lg">✓</div>
<div> <div>
<p class="font-semibold text-white">Account created</p> <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>
</div> </div>
@ -65,7 +65,7 @@
</div> </div>
<div class="pt-5 border-t divider"> <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" <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"> class="w-full input-base px-4 py-3 text-gray-100 placeholder-gray-600 text-sm mb-3">
<div class="flex gap-2"> <div class="flex gap-2">

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <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="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="stylesheet" href="/assets/tailwind.css?v=<%= it.cssHash %>"> <link rel="stylesheet" href="/assets/tailwind.css?v=<%= it.cssHash %>">
<link rel="stylesheet" href="/assets/app.css?v=<%= it.cssHash %>"> <link rel="stylesheet" href="/assets/app.css?v=<%= it.cssHash %>">

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <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 %>"><% } %> <% if (it.description) { %><meta name="description" content="<%= it.description %>"><% } %>
<link rel="icon" href="/favicon.svg" type="image/svg+xml"> <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/tailwind.css?v=<%= it.cssHash %>">

View File

@ -22,10 +22,10 @@
The rest of the industry The rest of the industry
</h2> </h2>
<p class="text-sm text-gray-400 leading-relaxed"> <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>
<p class="text-sm text-gray-400 leading-relaxed mt-3"> <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>
<p class="text-sm text-gray-400 leading-relaxed mt-3"> <p class="text-sm text-gray-400 leading-relaxed mt-3">
That's the industry standard. We think it's garbage. That's the industry standard. We think it's garbage.
@ -36,10 +36,10 @@
<h2>What we collect</h2> <h2>What we collect</h2>
<ul> <ul>
<li><strong>Account key</strong> a UUID you generate at signup. Stored in plaintext. It's your credential.</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. It's purely a verification token.</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. Obviously.</li> <li><strong>Monitors</strong> - the URLs and configurations you create.</li>
<li><strong>Ping results</strong> — status codes, latency, up/down, error messages. This is the product.</li> <li><strong>Ping results</strong> - status codes, latency, up/down, error messages.</li>
</ul> </ul>
<p>That's it. No device fingerprints, no IP logs, no browser data, no analytics events, no session recordings.</p> <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> <h2>Payments</h2>
<p> <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> </p>
<h2>Data retention</h2> <h2>Data retention</h2>
@ -82,7 +82,7 @@
<h2>Security</h2> <h2>Security</h2>
<p> <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> </p>
<h2>Contact</h2> <h2>Contact</h2>

View File

@ -92,7 +92,7 @@
<% if (!it.isSubKey) { %> <% if (!it.isSubKey) { %>
<section class="card-static p-6"> <section class="card-static p-6">
<h2 class="text-sm font-semibold text-gray-300 mb-1">Recovery Email</h2> <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"> <form action="/account/email" method="POST">
<input type="hidden" name="_form" value="1"> <input type="hidden" name="_form" value="1">
<div class="flex gap-2"> <div class="flex gap-2">

View File

@ -30,13 +30,13 @@
</ul> </ul>
<h2>4. Account Responsibility</h2> <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> <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> <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> <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> <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> <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>

View File

@ -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 class="w-8 h-8 rounded-full bg-green-500/20 flex items-center justify-center text-green-400 text-lg">✓</div>
<div> <div>
<p class="font-semibold text-white">Account created</p> <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>
</div> </div>
@ -21,7 +21,7 @@
<div class="pt-5 border-t divider"> <div class="pt-5 border-t divider">
<form action="/account/email" method="POST" class="space-y-3"> <form action="/account/email" method="POST" class="space-y-3">
<input type="hidden" name="_form" value="1"> <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" <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"> class="w-full input-base px-4 py-3 text-gray-100 placeholder-gray-600 text-sm">
<div class="flex gap-2"> <div class="flex gap-2">