Compare commits

..

4 Commits

Author SHA1 Message Date
Grant 434d809c95 Set Buy button to 8px radius (design contract)
The primary buy CTA used a 999px pill radius; the brand contract reserves pill
radius for badges and specifies 8px (r-md) for buttons.
2026-06-18 08:03:26 -05:00
Grant b7eb9e0e4a Fix SDK snippets, tier-card fallback prices, and BTCPay-connect copy 2026-06-17 15:24:55 -05:00
Grant e24f6c1aab landing(install): two real paths (Start9 vs from source); honest tier framing
- Restructure the Install section to the correct axis: Option 1 (recommended)
  is the packaged service on Start9 (marketplace or sideload the s9pk); Option 2
  is running the daemon from source on any Linux box / VPS. Both are self-hosting.
- Fix the sideload asset name: keysat.s9pk (was keysat_x86_64.s9pk).
- State the free-Creator-tier funnel on the source card; soften the Start9 CTA
  from "Then activate your license" to "Want more than the Creator tier?" so both
  paths tell the same free-to-start, buy-to-expand story.
- Example-prompt lead-in now acknowledges provisioning (one-click on Start9, or
  the agent clones + launches), instead of assuming a running instance.
2026-06-17 12:56:49 -05:00
Grant 3ee293891a landing(agents): add an Example prompt card to the agent-friendly section
Show the one-liner an operator would actually hand an agent to drive a
Keysat integration (review the docs, gate paid features behind a Pro
license, connect BTCPay). Reuses the install-card + navy code-block styling;
sits below the three capability cards, above the integration-guide link.
2026-06-17 12:19:14 -05:00
2 changed files with 37 additions and 26 deletions
+35 -24
View File
@@ -318,6 +318,12 @@ pre.code .p { color:rgba(245,241,232,0.55); }
/* ---------- Agent-friendly section ---------- */
.agent-grid { display:grid; grid-template-columns:repeat(3, 1fr); gap:24px; }
@media (max-width: 880px) { .agent-grid { grid-template-columns:1fr; } }
.agent-prompt-card { margin-top:24px; }
.agent-prompt {
background:var(--navy-950); color:var(--cream-50);
border-radius:10px; padding:18px 20px;
font-family:var(--font-mono); font-size:13.5px; line-height:1.7;
}
/* ---------- Tier comparison ---------- */
.tier-grid { display:grid; grid-template-columns:repeat(3, 1fr); gap:20px; }
@@ -381,7 +387,7 @@ pre.code .p { color:rgba(245,241,232,0.55); }
.tier-card .tier-buy-cta {
display:block; margin-top:auto;
align-self:stretch; text-align:center;
padding:12px 22px; border-radius:999px;
padding:12px 22px; border-radius:8px;
background:var(--navy-950); color:var(--cream-50);
font-family:var(--font-display); font-weight:600; font-size:14px;
letter-spacing:-0.005em; text-decoration:none;
@@ -820,7 +826,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
</div>
<ol class="flow">
<li class="step"><div class="num">01</div><h3>Install on your Start9</h3><p>One click from <code>registry.keysat.xyz</code> in the StartOS marketplace. (Sideload the <code>.s9pk</code> directly if you prefer.)</p></li>
<li class="step"><div class="num">02</div><h3>Connect BTCPay</h3><p>One click in the StartOS Actions tab. Authorize once on BTCPay's consent page; Keysat registers a webhook automatically.</p></li>
<li class="step"><div class="num">02</div><h3>Connect BTCPay</h3><p>In the admin UI, open Settings &rarr; Payment providers &rarr; Connect BTCPay. Authorize once on BTCPay's consent page; Keysat registers a webhook automatically.</p></li>
<li class="step"><div class="num">03</div><h3>Define products + policies</h3><p>Declare a product, set its price in sats, define a policy (duration, seat cap, trial, entitlements).</p></li>
<li class="step"><div class="num">04</div><h3>Embed your public key</h3><p>Copy your Keysat public key into your app. Add the SDK. Five lines of code verifies a signature at startup.</p></li>
<li class="step"><div class="num">05</div><h3>Share your purchase URL</h3><p>Buyers hit your public URL, pay for your software, and get a signed license that can be verified offline.</p></li>
@@ -834,7 +840,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
<div class="pitch">
<span class="eyebrow" style="color:var(--gold-700); font-size:11.5px; font-weight:700; letter-spacing:0.18em; text-transform:uppercase;">For developers and AI agents</span>
<h3>Five lines, in the language you or your AI agents already write.</h3>
<p>Keysat licenses are Ed25519-signed and Crockford base32-encoded. Verification is pure-function: no network, no daemon, no shared state. Hand the docs to your coding agent and tell it to wire licensing into your software; the integration is small enough to fit in one prompt.</p>
<p>Keysat licenses are Ed25519-signed and base32-encoded (RFC 4648, no padding). Verification is pure-function: no network, no daemon, no shared state. Hand the docs to your coding agent and tell it to wire licensing into your software; the integration is small enough to fit in one prompt.</p>
<ul>
<li>Wire-compatible across SDKs (TypeScript, Rust, Python, Go)</li>
<li>Public key embedded at compile time</li>
@@ -857,9 +863,9 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
)
<span class="k">const</span> ok = verifier.<span class="f">verify</span>(licenseKeyFromUser)
console.<span class="f">log</span>(<span class="s">'licensed:'</span>, ok.productId, ok.expires)</pre>
console.<span class="f">log</span>(<span class="s">'licensed:'</span>, ok.productId, ok.payload.expiresAt)</pre>
<pre class="code" id="code-rs" style="display:none"><span class="c">// Cargo.toml</span>
<span class="c">// licensing-client = "0.1"</span>
<span class="c">// keysat-licensing-client = "0.3"</span>
<span class="k">use</span> licensing_client::{<span class="f">Verifier</span>, <span class="f">PublicKeyPem</span>};
@@ -873,12 +879,12 @@ verifier = <span class="f">Verifier</span>(<span class="f">PublicKey</span>.<spa
ok = verifier.<span class="f">verify</span>(license_key_from_user)
<span class="k">print</span>(<span class="s">"licensed for"</span>, ok.product_id)</pre>
<pre class="code" id="code-go" style="display:none"><span class="k">import</span> keysat <span class="s">"github.com/keysat-xyz/licensing-client-go"</span>
<pre class="code" id="code-go" style="display:none"><span class="k">import</span> keysat <span class="s">"github.com/keysat-xyz/keysat-client-go"</span>
payload, err := keysat.<span class="f">ParseAndVerify</span>(licenseKey, ISSUER_PEM)
<span class="k">if</span> err != <span class="k">nil</span> { <span class="f">log</span>.<span class="f">Fatal</span>(err) }
fmt.<span class="f">Printf</span>(<span class="s">"licensed for %s, expires %s\n"</span>,
payload.ProductSlug, payload.ExpiresAt)</pre>
fmt.<span class="f">Printf</span>(<span class="s">"licensed for %x, expires %d\n"</span>,
payload.ProductID, payload.ExpiresAt)</pre>
</div>
</div>
</div>
@@ -908,6 +914,11 @@ fmt.<span class="f">Printf</span>(<span class="s">"licensed for %s, expires %s\n
<p>HMAC-signed event deliveries on every license / invoice / subscription state change. Every error response carries a stable machine-readable code (<code>tier_cap</code>, <code>not_found</code>, <code>license_revoked</code>) so agents branch deterministically.</p>
</div>
</div>
<div class="agent-prompt-card install-card">
<div class="cap">Example prompt</div>
<p>Install Keysat in one click on your Start9, or have your agent clone the repo and launch it. Then hand off the rest:</p>
<div class="agent-prompt">&ldquo;Review the Keysat docs on GitHub and integrate Keysat licensing into my app. Require a Pro license for my paid features (CSV export, scheduled reports, and the public API), and connect it to my BTCPay Server.&rdquo;</div>
</div>
<div style="margin-top:32px; text-align:center">
<a class="btn ghost" href="https://docs.keysat.xyz/agent.html">Agent integration guide &rarr;</a>
</div>
@@ -946,7 +957,7 @@ fmt.<span class="f">Printf</span>(<span class="s">"licensed for %s, expires %s\n
</div>
<div class="tier-card featured">
<div class="tier-cap gold">Pro</div>
<div class="tier-price"><span class="price-num">250k sats</span><span class="price-sub">/ year</span></div>
<div class="tier-price"><span class="price-num">100k sats</span><span class="price-sub">/ year</span></div>
<p class="tier-pitch">For creators monetizing seriously: multiple products, subscriptions, both Bitcoin and card buyers.</p>
<ul>
<li>Unlimited products, tiers, and codes</li>
@@ -958,7 +969,7 @@ fmt.<span class="f">Printf</span>(<span class="s">"licensed for %s, expires %s\n
</div>
<div class="tier-card">
<div class="tier-cap">Patron</div>
<div class="tier-price"><span class="price-num">500k sats</span><span class="price-sub">/ year</span></div>
<div class="tier-price"><span class="price-num">250k sats</span><span class="price-sub">/ year</span></div>
<p class="tier-pitch">Perpetual license + direct one-on-one support, for creators who want Keysat to keep getting better.</p>
<ul>
<li>Everything in Pro</li>
@@ -977,31 +988,31 @@ fmt.<span class="f">Printf</span>(<span class="s">"licensed for %s, expires %s\n
<div class="wrap">
<div class="section-head">
<span class="eyebrow">Install</span>
<h2>From the marketplace, or sideload directly.</h2>
<p>Either path leaves you in the same place: a running Keysat on your Start9, ready to connect BTCPay.</p>
<h2>One click on Start9, or run it from source.</h2>
<p>Keysat is yours to self-host either way: run the packaged service on your Start9, or clone the repo and run the daemon on any Linux box you control.</p>
</div>
<div class="install-grid">
<div class="install-card featured">
<span class="cap">Recommended</span>
<h3>From the marketplace</h3>
<p>Add the Keysat marketplace to your Start9, then click Install.</p>
<h3>Install on Start9</h3>
<p>One click from the StartOS marketplace. StartOS manages the BTCPay dependency, networking, and backups for you.</p>
<div class="cmd-card">
<span>https://registry.keysat.xyz</span>
<button class="copy" data-copy="https://registry.keysat.xyz">Copy</button>
</div>
<p style="margin-top:16px; font-size:13.5px; color:var(--ink-500)">StartOS dashboard &rarr; Marketplace &rarr; Add &rarr; paste the URL.</p>
<p style="margin-top:14px; font-size:13.5px; color:var(--ink-700)"><strong>Then activate your license:</strong></p>
<p style="margin-top:16px; font-size:13.5px; color:var(--ink-500)">StartOS dashboard &rarr; Marketplace &rarr; Add &rarr; paste the URL. Or sideload <code>keysat.s9pk</code> from <a href="https://github.com/keysat-xyz/keysat/releases/latest">GitHub releases</a>.</p>
<p style="margin-top:14px; font-size:13.5px; color:var(--ink-700)"><strong>Want more than the Creator tier?</strong></p>
<a href="https://licensing.keysat.xyz/buy/keysat" class="btn primary" style="display:inline-flex; margin-top:8px; width:100%; justify-content:center;">Buy a license &rarr;</a>
</div>
<div class="install-card">
<span class="cap">Alternative</span>
<h3>Sideload</h3>
<p>If you'd rather not add the marketplace:</p>
<span class="cap">From source</span>
<h3>Run it yourself</h3>
<p>Prefer your own host, or want an agent to provision it? Clone and run the daemon on any Linux box or VPS:</p>
<ol>
<li>Download <code>keysat_x86_64.s9pk</code> from <a href="https://github.com/keysat-xyz/keysat/releases/latest">GitHub releases</a>.</li>
<li>StartOS dashboard &rarr; Sideload &rarr; drag the file in.</li>
<li>Click Install.</li>
<li><code>git clone</code> <a href="https://github.com/keysat-xyz/keysat">github.com/keysat-xyz/keysat</a>.</li>
<li>Set <code>.env</code> (admin key + your BTCPay), then <code>cargo run --release</code>.</li>
</ol>
<p style="margin-top:16px; font-size:13.5px; color:var(--ink-500)">Runs free at the Creator tier (5 products, 5 policies each). Buy a license to lift the caps and add recurring billing.</p>
</div>
</div>
</div>
@@ -1076,9 +1087,9 @@ fmt.<span class="f">Printf</span>(<span class="s">"licensed for %s, expires %s\n
// Tab switching for code samples
const installCmds = {
ts: 'npm install @keysat/licensing-client',
rs: 'cargo add licensing-client',
rs: 'cargo add keysat-licensing-client',
py: 'pip install keysat-licensing-client',
go: 'go get github.com/keysat-xyz/licensing-client-go',
go: 'go get github.com/keysat-xyz/keysat-client-go',
};
document.querySelectorAll('.code-tabs button').forEach(btn => {
btn.addEventListener('click', () => {
+2 -2
View File
@@ -153,9 +153,9 @@ footer{
<h2>1. Buy a Patron license</h2>
<div class="card featured">
<div class="label">Recommended</div>
<h3>Patron tier on registry.keysat.xyz</h3>
<h3>Patron tier</h3>
<p>Same Keysat binary as the standard license, just priced higher. The admin UI shows a "Patron" badge in your dashboard. The cleanest way to support development. Same purchase flow you&rsquo;re already familiar with from buying any other Keysat license.</p>
<p style="margin-top:14px"><a class="btn" href="https://registry.keysat.xyz">Visit the marketplace &rarr;</a></p>
<p style="margin-top:14px"><a class="btn" href="https://licensing.keysat.xyz/buy/keysat?policy=patron">Buy a Patron license &rarr;</a></p>
</div>
<h2>2. Lightning</h2>