Landing rewrite: new hero, tier comparison, Go SDK, agent platform refresh
- Hero: simpler headline ('Self-hosted licensing for software creators'),
one consolidated paragraph, no underline. 'Runs on Start9' now links to
start9.com.
- New /#tiers section: side-by-side Creator / Pro / Patron cards with
what's included at each tier. Pro highlighted with gold inset. Honest
framing: Patron is feature-identical to Pro, no fake gates.
- 'Pricing' anchor added to top nav.
- SDK card on the Why page lists Go alongside TS / Rust / Python.
- For developers + AI agents: Go added as a fourth code tab with the
ParseAndVerify example. Install command map extended.
- Case studies: section headline now reads 'Empowering the next
generation of software creators' with new eyebrow 'Real creators
can now build real software'. Made-up stats removed from all three
cases. Each quote now closes with a sentence about Keysat letting
them sell to others like themselves.
- Agent-friendly OpenAPI card mentions Claude (Code or Computer Use),
OpenAI Custom GPTs, and Perplexity Comet. LangChain dropped.
- FAQ: 'What about subscriptions' replaced with 'What's the difference
between the three tiers'. New 'Do I have to use Bitcoin?' question
added to explain BTCPay vs Zaprite.
Case-study photo placeholders are still rendered as placeholders — the
photoreal portraits referenced (assets/case-marisol.jpg,
assets/case-tomas.jpg, assets/case-hana.jpg) were never tracked in any
git history I could find. Drop real photos into assets/ when ready.
This commit is contained in:
+117
-33
@@ -301,6 +301,40 @@ pre.code .p { color:rgba(245,241,232,0.55); }
|
|||||||
.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; } }
|
||||||
|
|
||||||
|
/* ---------- Tier comparison ---------- */
|
||||||
|
.tier-grid { display:grid; grid-template-columns:repeat(3, 1fr); gap:20px; }
|
||||||
|
@media (max-width: 880px) { .tier-grid { grid-template-columns:1fr; } }
|
||||||
|
.tier-card {
|
||||||
|
background:var(--cream-50); border:1px solid var(--border-1);
|
||||||
|
border-radius:14px; padding:28px 26px;
|
||||||
|
display:flex; flex-direction:column; gap:6px;
|
||||||
|
position:relative;
|
||||||
|
}
|
||||||
|
.tier-card.featured {
|
||||||
|
box-shadow:0 0 0 2px var(--gold-500) inset, var(--shadow-sm);
|
||||||
|
}
|
||||||
|
.tier-cap {
|
||||||
|
display:inline-block; font-size:10.5px; font-weight:700;
|
||||||
|
letter-spacing:0.18em; text-transform:uppercase; color:var(--ink-500);
|
||||||
|
margin-bottom:6px;
|
||||||
|
}
|
||||||
|
.tier-cap.gold { color:var(--gold-700); }
|
||||||
|
.tier-price { display:flex; align-items:baseline; gap:8px; margin:0 0 12px; }
|
||||||
|
.tier-price .price-num {
|
||||||
|
font-family:var(--font-display); font-weight:700; font-size:28px;
|
||||||
|
color:var(--navy-950); letter-spacing:-0.02em; line-height:1.1;
|
||||||
|
}
|
||||||
|
.tier-price .price-sub { font-size:13.5px; color:var(--ink-500); }
|
||||||
|
.tier-pitch { font-size:14px; color:var(--ink-700); line-height:1.55; margin:0 0 16px; min-height:42px; }
|
||||||
|
.tier-card ul { list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:7px; }
|
||||||
|
.tier-card li {
|
||||||
|
font-size:13.5px; color:var(--ink-700); padding-left:20px; position:relative; line-height:1.45;
|
||||||
|
}
|
||||||
|
.tier-card li::before {
|
||||||
|
content:'\2713'; position:absolute; left:0; top:0;
|
||||||
|
color:var(--gold-700); font-weight:700;
|
||||||
|
}
|
||||||
|
|
||||||
/* ---------- Install ---------- */
|
/* ---------- Install ---------- */
|
||||||
.install-grid { display:grid; grid-template-columns:1fr 1fr; gap:24px; }
|
.install-grid { display:grid; grid-template-columns:1fr 1fr; gap:24px; }
|
||||||
.install-card { background:var(--cream-50); border:1px solid var(--border-1); border-radius:14px; padding:28px; }
|
.install-card { background:var(--cream-50); border:1px solid var(--border-1); border-radius:14px; padding:28px; }
|
||||||
@@ -522,6 +556,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
<a href="#how">How it works</a>
|
<a href="#how">How it works</a>
|
||||||
<a href="#integrate">Integrate</a>
|
<a href="#integrate">Integrate</a>
|
||||||
<a href="#agents">Agents</a>
|
<a href="#agents">Agents</a>
|
||||||
|
<a href="#tiers">Pricing</a>
|
||||||
<a href="#install">Install</a>
|
<a href="#install">Install</a>
|
||||||
<a href="https://docs.keysat.xyz">Docs</a>
|
<a href="https://docs.keysat.xyz">Docs</a>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -533,19 +568,19 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
<div class="wrap hero-grid">
|
<div class="wrap hero-grid">
|
||||||
<div>
|
<div>
|
||||||
<div class="eyebrow">Software licensing for independent creators</div>
|
<div class="eyebrow">Software licensing for independent creators</div>
|
||||||
<h1><span class="gold">Bitcoin-native</span> self-hosted licensing service for software creators.</h1>
|
<h1>Self-hosted licensing for software creators.</h1>
|
||||||
<p class="lede">
|
<p class="lede">
|
||||||
Buyers pay in Bitcoin via your own BTCPay. Your software verifies signed keys offline. You own the signing key, the customer list, and the payment rails — no SaaS, no middleman, no platform risk.
|
Keysat empowers software creators to monetize their work. Keysat is fully self-hosted and is Bitcoin-native. Your software verifies signed keys offline. You own the signing key, the customer list, and the payment rails — no SaaS, no middleman, no platform risk.
|
||||||
</p>
|
|
||||||
<p class="lede" style="margin-top:14px; color:var(--ink-700); font-size:17px;">
|
|
||||||
Keysat empowers independent software creators to monetize any software they choose to sell — fully open source, free/paid versions, or fully closed source. The licensing layer is agnostic to your decision.
|
|
||||||
</p>
|
</p>
|
||||||
<div class="cta-row">
|
<div class="cta-row">
|
||||||
<a class="btn primary lg" href="#install">Install Keysat <span class="arrow">→</span></a>
|
<a class="btn primary lg" href="#install">Install Keysat <span class="arrow">→</span></a>
|
||||||
<a class="btn secondary lg" href="#how">See how it works</a>
|
<a class="btn secondary lg" href="#how">See how it works</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="trust">
|
<div class="trust">
|
||||||
<span><i data-lucide="server" style="width:14px;height:14px"></i> Runs on Start9</span>
|
<span>
|
||||||
|
<i data-lucide="server" style="width:14px;height:14px"></i>
|
||||||
|
Runs on <a href="https://start9.com" target="_blank" rel="noopener" style="color:inherit; text-decoration:underline; text-underline-offset:2px;">Start9</a>
|
||||||
|
</span>
|
||||||
<span class="dot"></span>
|
<span class="dot"></span>
|
||||||
<span><i data-lucide="bitcoin" style="width:14px;height:14px"></i> Pays via BTCPay</span>
|
<span><i data-lucide="bitcoin" style="width:14px;height:14px"></i> Pays via BTCPay</span>
|
||||||
<span class="dot"></span>
|
<span class="dot"></span>
|
||||||
@@ -612,7 +647,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="icon-wrap"><i data-lucide="wrench"></i></div>
|
<div class="icon-wrap"><i data-lucide="wrench"></i></div>
|
||||||
<h3>SDKs in your language</h3><div class="accent-bar"></div>
|
<h3>SDKs in your language</h3><div class="accent-bar"></div>
|
||||||
<p>Rust, TypeScript, Python — wire-compatible offline verifiers. Five lines of code in your app and you're verifying real signatures.</p>
|
<p>Rust, TypeScript, Python, Go — wire-compatible offline verifiers. Five lines of code in your app and you're verifying real signatures.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -621,9 +656,9 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
<section class="block case-section" id="creators">
|
<section class="block case-section" id="creators">
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="section-head">
|
<div class="section-head">
|
||||||
<span class="eyebrow">Real creators, real software</span>
|
<span class="eyebrow">Real creators can now build real software</span>
|
||||||
<h2>Built by experts in their craft, not coders.</h2>
|
<h2>Empowering the next generation of software creators.</h2>
|
||||||
<p>Empowering the next generation of software creators. The people who actually know the work — accountants, trainers, teachers, builders — can finally ship the tool they’ve always wanted, because AI handed them the keyboard. Keysat is the licensing layer that lets them get paid for what they made.</p>
|
<p>AI software tools now allow specialists to finally ship the tools they’ve always wanted for themselves, without needing any coding background. Keysat is the licensing layer that lets them get paid for what they made.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -652,12 +687,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
<p class="product-tag">Schedule C + 1099 reconciler for solo accountants. Replaces a $1,200/yr software stack with one focused tool.</p>
|
<p class="product-tag">Schedule C + 1099 reconciler for solo accountants. Replaces a $1,200/yr software stack with one focused tool.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<blockquote>“I worked with bloated tax software for twelve years. With AI I built one that fits how I actually think — in three months, on weekends.”</blockquote>
|
<blockquote>“I worked with bloated tax software for twelve years. With AI I built one that fits how I actually think — in three months, on weekends. Now Keysat lets me sell it to the other solo CPAs who were stuck with the same bad tools.”</blockquote>
|
||||||
<div class="stats">
|
|
||||||
<div><span class="stat-num">42</span>active licenses</div>
|
|
||||||
<div><span class="stat-num">$99/yr</span>per seat</div>
|
|
||||||
<div><span class="stat-num">8 mo.</span>since launch</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
@@ -683,12 +713,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
<p class="product-tag">RPE-based programming and autoregulation for one-on-one coaches. Built around how strength athletes actually train.</p>
|
<p class="product-tag">RPE-based programming and autoregulation for one-on-one coaches. Built around how strength athletes actually train.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<blockquote>“I knew exactly what coaches needed because I was the coach. AI handled the engineering — I handled the design.”</blockquote>
|
<blockquote>“I knew exactly what coaches needed because I was the coach. AI handled the engineering — I handled the design. Now Keysat lets me sell it to the other coaches who recognize how it should actually work.”</blockquote>
|
||||||
<div class="stats">
|
|
||||||
<div><span class="stat-num">87</span>active coaches</div>
|
|
||||||
<div><span class="stat-num">20k sats/mo</span>per seat</div>
|
|
||||||
<div><span class="stat-num">14 mo.</span>since launch</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
@@ -714,12 +739,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
<p class="product-tag">Multi-grade week planner for homeschool families with kids on different tracks. Mixes curricula across ages.</p>
|
<p class="product-tag">Multi-grade week planner for homeschool families with kids on different tracks. Mixes curricula across ages.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<blockquote>“I sketched the workflow on a notepad in October. By January my kids’ school days were running on it. Now 200 other families use it too.”</blockquote>
|
<blockquote>“I sketched the workflow on a notepad in October. By January my kids’ school days were running on it. Now Keysat lets me sell it to the other homeschool families who were trying to bend single-student tools to fit their week.”</blockquote>
|
||||||
<div class="stats">
|
|
||||||
<div><span class="stat-num">208</span>families</div>
|
|
||||||
<div><span class="stat-num">$48/yr</span>per family</div>
|
|
||||||
<div><span class="stat-num">11 mo.</span>since launch</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
@@ -761,7 +781,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
<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 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>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Wire-compatible across SDKs (TypeScript, Rust, Python)</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>
|
||||||
<li>Returns product, policy, expiry, entitlements</li>
|
<li>Returns product, policy, expiry, entitlements</li>
|
||||||
<li>Source-available — agents can read the verifier source directly</li>
|
<li>Source-available — agents can read the verifier source directly</li>
|
||||||
@@ -772,6 +792,7 @@ footer.site .bottom a { color:rgba(245,241,232,0.6); }
|
|||||||
<button class="active" data-lang="ts">TypeScript</button>
|
<button class="active" data-lang="ts">TypeScript</button>
|
||||||
<button data-lang="rs">Rust</button>
|
<button data-lang="rs">Rust</button>
|
||||||
<button data-lang="py">Python</button>
|
<button data-lang="py">Python</button>
|
||||||
|
<button data-lang="go">Go</button>
|
||||||
<span class="install" id="install-cmd">npm install @keysat/licensing-client</span>
|
<span class="install" id="install-cmd">npm install @keysat/licensing-client</span>
|
||||||
</div>
|
</div>
|
||||||
<pre class="code" id="code-ts"><span class="k">import</span> { <span class="f">Verifier</span>, <span class="f">PublicKey</span> } <span class="k">from</span> <span class="s">'@keysat/licensing-client'</span>
|
<pre class="code" id="code-ts"><span class="k">import</span> { <span class="f">Verifier</span>, <span class="f">PublicKey</span> } <span class="k">from</span> <span class="s">'@keysat/licensing-client'</span>
|
||||||
@@ -797,6 +818,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>
|
||||||
|
|
||||||
|
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>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -813,7 +840,7 @@ ok = verifier.<span class="f">verify</span>(license_key_from_user)
|
|||||||
<div class="install-card">
|
<div class="install-card">
|
||||||
<div class="cap">OpenAPI 3.1</div>
|
<div class="cap">OpenAPI 3.1</div>
|
||||||
<h3>Discovery built in</h3>
|
<h3>Discovery built in</h3>
|
||||||
<p><code>GET /v1/openapi.json</code> returns a curated, stable spec. Drop the URL into a Custom GPT, OpenAI Assistant, LangChain, or Claude Code — the agent learns the endpoints automatically.</p>
|
<p><code>GET /v1/openapi.json</code> returns a curated, stable spec. Drop the URL into Claude (Code or Computer Use), an OpenAI Custom GPT, or Perplexity’s Comet agent browser — the agent learns the endpoints automatically.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="install-card">
|
<div class="install-card">
|
||||||
<div class="cap">Scoped API keys</div>
|
<div class="cap">Scoped API keys</div>
|
||||||
@@ -865,6 +892,58 @@ ok = verifier.<span class="f">verify</span>(license_key_from_user)
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
<section class="block" id="tiers">
|
||||||
|
<div class="wrap">
|
||||||
|
<div class="section-head">
|
||||||
|
<span class="eyebrow">Pricing</span>
|
||||||
|
<h2>Three tiers. Free forever for solo creators.</h2>
|
||||||
|
<p>Keysat’s gating happens at the operator’s self-license, not at the buyer’s. Every Keysat instance ships at Creator (free); pay only when you outgrow it.</p>
|
||||||
|
</div>
|
||||||
|
<div class="tier-grid">
|
||||||
|
<div class="tier-card">
|
||||||
|
<div class="tier-cap">Creator</div>
|
||||||
|
<div class="tier-price"><span class="price-num">Free</span><span class="price-sub">forever</span></div>
|
||||||
|
<p class="tier-pitch">Solo creator selling one-time or perpetual licenses for a focused catalog.</p>
|
||||||
|
<ul>
|
||||||
|
<li>Up to 5 products</li>
|
||||||
|
<li>Up to 5 tiers per product</li>
|
||||||
|
<li>Up to 10 active discount codes</li>
|
||||||
|
<li>BTCPay (Bitcoin / Lightning) payments</li>
|
||||||
|
<li>All 4 SDKs · full wire format</li>
|
||||||
|
<li>Webhooks, audit log, recovery, analytics opt-in</li>
|
||||||
|
</ul>
|
||||||
|
</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>
|
||||||
|
<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>
|
||||||
|
<li>Recurring subscriptions · trials, grace, auto-renew</li>
|
||||||
|
<li>Zaprite payment gateway — cards, Apple Pay, bank transfers, plus Bitcoin</li>
|
||||||
|
<li>In-place tier upgrades (proration handled)</li>
|
||||||
|
<li>Everything in Creator</li>
|
||||||
|
</ul>
|
||||||
|
</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>
|
||||||
|
<p class="tier-pitch">Honest supporter tier. Same features as Pro; you’re funding Keysat’s development.</p>
|
||||||
|
<ul>
|
||||||
|
<li>Everything in Pro</li>
|
||||||
|
<li>“Patron” badge in your admin dashboard</li>
|
||||||
|
<li>Listed on the Patrons page on keysat.xyz</li>
|
||||||
|
<li>Early access to release-candidate builds</li>
|
||||||
|
<li>Direct support line</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<p style="margin-top:28px; text-align:center; font-size:13.5px; color:var(--ink-500);">
|
||||||
|
No fake feature gates: Patron is feature-identical to Pro. Pricing is a flat annual fee — we don’t take a percentage of your sales.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section class="block tinted" id="install">
|
<section class="block tinted" id="install">
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="section-head">
|
<div class="section-head">
|
||||||
@@ -915,8 +994,12 @@ ok = verifier.<span class="f">verify</span>(license_key_from_user)
|
|||||||
<p>Yes. Define a discount code with type <code>free_license</code> and the buyer redeems it at checkout without paying. Useful for press, beta testers, partners, and giveaways.</p>
|
<p>Yes. Define a discount code with type <code>free_license</code> and the buyer redeems it at checkout without paying. Useful for press, beta testers, partners, and giveaways.</p>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h3>What about subscriptions?</h3>
|
<h3>What’s the difference between the three tiers?</h3>
|
||||||
<p>v0.1 issues fixed-duration licenses (e.g. 1 year) with offline expiry. True recurring billing — auto-renew without buyer interaction — lands in v0.3 alongside license-tier upgrades, volume packs, and Zaprite card payments.</p>
|
<p>Creator is free forever, capped at 5 products / 5 policies per product / 10 active discount codes — plenty for a solo creator selling one-time or perpetual licenses. Pro lifts every cap and unlocks recurring subscriptions plus the Zaprite payment gateway (cards, Apple Pay, bank transfers, in addition to Bitcoin). Patron is Pro with a public supporter badge; same features, you’re funding development. See the tier comparison above for the full breakdown.</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3>Do I have to use Bitcoin?</h3>
|
||||||
|
<p>BTCPay (Bitcoin / Lightning) is the default and available on every tier. On Pro or Patron you can additionally connect Zaprite, which adds card / Apple Pay / bank transfer / more — with payments still landing in your wallet. Pick whichever your buyers prefer; you can switch the active provider at any time.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -966,12 +1049,13 @@ ok = verifier.<span class="f">verify</span>(license_key_from_user)
|
|||||||
ts: 'npm install @keysat/licensing-client',
|
ts: 'npm install @keysat/licensing-client',
|
||||||
rs: 'cargo add licensing-client',
|
rs: 'cargo add licensing-client',
|
||||||
py: 'pip install keysat-licensing-client',
|
py: 'pip install keysat-licensing-client',
|
||||||
|
go: 'go get github.com/keysat-xyz/licensing-client-go',
|
||||||
};
|
};
|
||||||
document.querySelectorAll('.code-tabs button').forEach(btn => {
|
document.querySelectorAll('.code-tabs button').forEach(btn => {
|
||||||
btn.addEventListener('click', () => {
|
btn.addEventListener('click', () => {
|
||||||
const lang = btn.dataset.lang;
|
const lang = btn.dataset.lang;
|
||||||
document.querySelectorAll('.code-tabs button').forEach(b => b.classList.toggle('active', b === btn));
|
document.querySelectorAll('.code-tabs button').forEach(b => b.classList.toggle('active', b === btn));
|
||||||
['ts','rs','py'].forEach(l => {
|
['ts','rs','py','go'].forEach(l => {
|
||||||
document.getElementById('code-' + l).style.display = l === lang ? 'block' : 'none';
|
document.getElementById('code-' + l).style.display = l === lang ? 'block' : 'none';
|
||||||
});
|
});
|
||||||
document.getElementById('install-cmd').textContent = installCmds[lang];
|
document.getElementById('install-cmd').textContent = installCmds[lang];
|
||||||
|
|||||||
Reference in New Issue
Block a user