Compare commits
4 Commits
b253b7bacf
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 434d809c95 | |||
| b7eb9e0e4a | |||
| e24f6c1aab | |||
| 3ee293891a |
+35
-24
@@ -318,6 +318,12 @@ pre.code .p { color:rgba(245,241,232,0.55); }
|
|||||||
/* ---------- Agent-friendly section ---------- */
|
/* ---------- Agent-friendly section ---------- */
|
||||||
.agent-grid { display:grid; grid-template-columns:repeat(3, 1fr); gap:24px; }
|
.agent-grid { display:grid; grid-template-columns:repeat(3, 1fr); gap:24px; }
|
||||||
@media (max-width: 880px) { .agent-grid { grid-template-columns:1fr; } }
|
@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 comparison ---------- */
|
||||||
.tier-grid { display:grid; grid-template-columns:repeat(3, 1fr); gap:20px; }
|
.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 {
|
.tier-card .tier-buy-cta {
|
||||||
display:block; margin-top:auto;
|
display:block; margin-top:auto;
|
||||||
align-self:stretch; text-align:center;
|
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);
|
background:var(--navy-950); color:var(--cream-50);
|
||||||
font-family:var(--font-display); font-weight:600; font-size:14px;
|
font-family:var(--font-display); font-weight:600; font-size:14px;
|
||||||
letter-spacing:-0.005em; text-decoration:none;
|
letter-spacing:-0.005em; text-decoration:none;
|
||||||
@@ -820,7 +826,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
</div>
|
</div>
|
||||||
<ol class="flow">
|
<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">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 → Payment providers → 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">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">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>
|
<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">
|
<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>
|
<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>
|
<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>
|
<ul>
|
||||||
<li>Wire-compatible across SDKs (TypeScript, Rust, Python, Go)</li>
|
<li>Wire-compatible across SDKs (TypeScript, Rust, Python, Go)</li>
|
||||||
<li>Public key embedded at compile time</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)
|
<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>
|
<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>};
|
<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)
|
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>
|
<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)
|
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) }
|
<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>,
|
fmt.<span class="f">Printf</span>(<span class="s">"licensed for %x, expires %d\n"</span>,
|
||||||
payload.ProductSlug, payload.ExpiresAt)</pre>
|
payload.ProductID, payload.ExpiresAt)</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</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>
|
<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>
|
</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">“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.”</div>
|
||||||
|
</div>
|
||||||
<div style="margin-top:32px; text-align:center">
|
<div style="margin-top:32px; text-align:center">
|
||||||
<a class="btn ghost" href="https://docs.keysat.xyz/agent.html">Agent integration guide →</a>
|
<a class="btn ghost" href="https://docs.keysat.xyz/agent.html">Agent integration guide →</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -946,7 +957,7 @@ fmt.<span class="f">Printf</span>(<span class="s">"licensed for %s, expires %s\n
|
|||||||
</div>
|
</div>
|
||||||
<div class="tier-card featured">
|
<div class="tier-card featured">
|
||||||
<div class="tier-cap gold">Pro</div>
|
<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>
|
<p class="tier-pitch">For creators monetizing seriously: multiple products, subscriptions, both Bitcoin and card buyers.</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Unlimited products, tiers, and codes</li>
|
<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>
|
||||||
<div class="tier-card">
|
<div class="tier-card">
|
||||||
<div class="tier-cap">Patron</div>
|
<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>
|
<p class="tier-pitch">Perpetual license + direct one-on-one support, for creators who want Keysat to keep getting better.</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Everything in Pro</li>
|
<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="wrap">
|
||||||
<div class="section-head">
|
<div class="section-head">
|
||||||
<span class="eyebrow">Install</span>
|
<span class="eyebrow">Install</span>
|
||||||
<h2>From the marketplace, or sideload directly.</h2>
|
<h2>One click on Start9, or run it from source.</h2>
|
||||||
<p>Either path leaves you in the same place: a running Keysat on your Start9, ready to connect BTCPay.</p>
|
<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>
|
||||||
<div class="install-grid">
|
<div class="install-grid">
|
||||||
<div class="install-card featured">
|
<div class="install-card featured">
|
||||||
<span class="cap">Recommended</span>
|
<span class="cap">Recommended</span>
|
||||||
<h3>From the marketplace</h3>
|
<h3>Install on Start9</h3>
|
||||||
<p>Add the Keysat marketplace to your Start9, then click Install.</p>
|
<p>One click from the StartOS marketplace. StartOS manages the BTCPay dependency, networking, and backups for you.</p>
|
||||||
<div class="cmd-card">
|
<div class="cmd-card">
|
||||||
<span>https://registry.keysat.xyz</span>
|
<span>https://registry.keysat.xyz</span>
|
||||||
<button class="copy" data-copy="https://registry.keysat.xyz">Copy</button>
|
<button class="copy" data-copy="https://registry.keysat.xyz">Copy</button>
|
||||||
</div>
|
</div>
|
||||||
<p style="margin-top:16px; font-size:13.5px; color:var(--ink-500)">StartOS dashboard → Marketplace → Add → paste the URL.</p>
|
<p style="margin-top:16px; font-size:13.5px; color:var(--ink-500)">StartOS dashboard → Marketplace → Add → 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>Then activate your license:</strong></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 →</a>
|
<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 →</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="install-card">
|
<div class="install-card">
|
||||||
<span class="cap">Alternative</span>
|
<span class="cap">From source</span>
|
||||||
<h3>Sideload</h3>
|
<h3>Run it yourself</h3>
|
||||||
<p>If you'd rather not add the marketplace:</p>
|
<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>
|
<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><code>git clone</code> <a href="https://github.com/keysat-xyz/keysat">github.com/keysat-xyz/keysat</a>.</li>
|
||||||
<li>StartOS dashboard → Sideload → drag the file in.</li>
|
<li>Set <code>.env</code> (admin key + your BTCPay), then <code>cargo run --release</code>.</li>
|
||||||
<li>Click Install.</li>
|
|
||||||
</ol>
|
</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>
|
</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
|
// Tab switching for code samples
|
||||||
const installCmds = {
|
const installCmds = {
|
||||||
ts: 'npm install @keysat/licensing-client',
|
ts: 'npm install @keysat/licensing-client',
|
||||||
rs: 'cargo add licensing-client',
|
rs: 'cargo add keysat-licensing-client',
|
||||||
py: 'pip install 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 => {
|
document.querySelectorAll('.code-tabs button').forEach(btn => {
|
||||||
btn.addEventListener('click', () => {
|
btn.addEventListener('click', () => {
|
||||||
|
|||||||
+2
-2
@@ -153,9 +153,9 @@ footer{
|
|||||||
<h2>1. Buy a Patron license</h2>
|
<h2>1. Buy a Patron license</h2>
|
||||||
<div class="card featured">
|
<div class="card featured">
|
||||||
<div class="label">Recommended</div>
|
<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’re already familiar with from buying any other Keysat license.</p>
|
<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’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 →</a></p>
|
<p style="margin-top:14px"><a class="btn" href="https://licensing.keysat.xyz/buy/keysat?policy=patron">Buy a Patron license →</a></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h2>2. Lightning</h2>
|
<h2>2. Lightning</h2>
|
||||||
|
|||||||
Reference in New Issue
Block a user