From 09a87eda1407d47d53ce19f216c6a96f73054896 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 17:26:47 +0000 Subject: [PATCH 1/8] Initial plan From e214c3a4720d998092c301f1cdde159d5aad93e5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 17:27:18 +0000 Subject: [PATCH 2/8] Initial plan From 1bbb2e66d6468861d71535e3dba0f16a46989e3a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 17:27:31 +0000 Subject: [PATCH 3/8] Initial plan From 91c3e5bb7cef1b2366260db1d4fa745de39dc4ad Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 17:29:00 +0000 Subject: [PATCH 4/8] fix: restore pubkey truncation in Lightning invoice log for privacy Co-authored-by: spe1020 <140115230+spe1020@users.noreply.github.com> --- src/routes/api/genesis/create-lightning-invoice/+server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/api/genesis/create-lightning-invoice/+server.ts b/src/routes/api/genesis/create-lightning-invoice/+server.ts index a2ebcaa..5795b95 100644 --- a/src/routes/api/genesis/create-lightning-invoice/+server.ts +++ b/src/routes/api/genesis/create-lightning-invoice/+server.ts @@ -112,7 +112,7 @@ export const POST: RequestHandler = async ({ request, platform }) => { console.log('[Founders Club Lightning] Invoice created:', { receiveRequestId, amountSats, - pubkey, + pubkey: pubkey.substring(0, 16) + '...', }); // Store metadata so webhook and verify endpoints can match payment to user From bdf8d01cf05af017da47ce89ff56414e80998196 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 17:29:07 +0000 Subject: [PATCH 5/8] fix: truncate pubkey in Lightning invoice log for privacy Co-authored-by: spe1020 <140115230+spe1020@users.noreply.github.com> --- src/routes/api/membership/create-lightning-invoice/+server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/api/membership/create-lightning-invoice/+server.ts b/src/routes/api/membership/create-lightning-invoice/+server.ts index 5112ce3..fba0f99 100644 --- a/src/routes/api/membership/create-lightning-invoice/+server.ts +++ b/src/routes/api/membership/create-lightning-invoice/+server.ts @@ -156,7 +156,7 @@ export const POST: RequestHandler = async ({ request, platform }) => { amountSats, tier, period, - pubkey, + pubkey: pubkey.substring(0, 16) + '...', }); // Store invoice metadata so webhook and verify endpoints can match payment to user From e34596bd49228e3d278b799d0b0c135d317f800e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 17:30:00 +0000 Subject: [PATCH 6/8] fix: also truncate pubkey in membership Lightning invoice log Co-authored-by: spe1020 <140115230+spe1020@users.noreply.github.com> --- src/routes/api/membership/create-lightning-invoice/+server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/api/membership/create-lightning-invoice/+server.ts b/src/routes/api/membership/create-lightning-invoice/+server.ts index 5112ce3..fba0f99 100644 --- a/src/routes/api/membership/create-lightning-invoice/+server.ts +++ b/src/routes/api/membership/create-lightning-invoice/+server.ts @@ -156,7 +156,7 @@ export const POST: RequestHandler = async ({ request, platform }) => { amountSats, tier, period, - pubkey, + pubkey: pubkey.substring(0, 16) + '...', }); // Store invoice metadata so webhook and verify endpoints can match payment to user From 56e343dc0129f1352c4fa092be6d773d3c05afd0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 17 Feb 2026 17:30:20 +0000 Subject: [PATCH 7/8] Add production KV store check to Lightning verification endpoints Co-authored-by: spe1020 <140115230+spe1020@users.noreply.github.com> --- .../api/genesis/verify-lightning-payment/+server.ts | 10 ++++++++++ .../api/membership/verify-lightning-payment/+server.ts | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/routes/api/genesis/verify-lightning-payment/+server.ts b/src/routes/api/genesis/verify-lightning-payment/+server.ts index 696cdee..fcd7e12 100644 --- a/src/routes/api/genesis/verify-lightning-payment/+server.ts +++ b/src/routes/api/genesis/verify-lightning-payment/+server.ts @@ -49,6 +49,16 @@ export const POST: RequestHandler = async ({ request, platform }) => { // Look up stored metadata to verify the request const kv = platform?.env?.GATED_CONTENT ?? null; + if (!kv && env.NODE_ENV === 'production') { + console.error('[Genesis Lightning] GATED_CONTENT KV binding is missing in production environment'); + return json( + { + error: 'Service unavailable', + message: 'GATED_CONTENT KV namespace is not configured' + }, + { status: 503 } + ); + } const metadata = receiveRequestId ? await getInvoiceMetadata(kv, receiveRequestId) : await getInvoiceMetadataByPaymentHash(kv, paymentHash); diff --git a/src/routes/api/membership/verify-lightning-payment/+server.ts b/src/routes/api/membership/verify-lightning-payment/+server.ts index 4cd6ab6..e6ed5ba 100644 --- a/src/routes/api/membership/verify-lightning-payment/+server.ts +++ b/src/routes/api/membership/verify-lightning-payment/+server.ts @@ -71,6 +71,16 @@ export const POST: RequestHandler = async ({ request, platform }) => { // Look up stored metadata to verify the request matches what was created const kv = platform?.env?.GATED_CONTENT ?? null; + if (!kv && env.NODE_ENV === 'production') { + console.error('[Verify Lightning] GATED_CONTENT KV binding is missing in production environment'); + return json( + { + error: 'Service unavailable', + message: 'GATED_CONTENT KV namespace is not configured' + }, + { status: 503 } + ); + } const metadata = receiveRequestId ? await getInvoiceMetadata(kv, receiveRequestId) : await getInvoiceMetadataByPaymentHash(kv, paymentHash); From 611b945a4039428448880b63e2648dca2757e0c6 Mon Sep 17 00:00:00 2001 From: spe1020 Date: Tue, 17 Feb 2026 19:24:04 -0500 Subject: [PATCH 8/8] Add tier-specific color-coded glow rings to member avatars Use inline box-shadow styles instead of Svelte scoped CSS classes to avoid style pruning issues with dynamically computed class names. Each tier gets a distinct double-layered glow: - Founders: gold - Pro Kitchen: purple - Cook+: orange Removes padding/border approach that was shrinking avatars. The glow now renders purely via box-shadow with zero layout impact. Co-Authored-By: Claude Opus 4.6 --- src/components/Avatar.svelte | 47 +++++++++++++----------------------- 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/src/components/Avatar.svelte b/src/components/Avatar.svelte index 0450b9b..fd7c694 100644 --- a/src/components/Avatar.svelte +++ b/src/components/Avatar.svelte @@ -33,17 +33,21 @@ $: avatarSrc = src ?? imageUrl; $: status = membershipMap[normalizedPubkey]; $: isActiveMember = Boolean(status?.active) && showRing; - $: ringTierClass = - status?.tier === 'pro_kitchen' - ? 'tier-pro-kitchen' - : status?.tier === 'founders' - ? 'tier-founders' - : status?.tier === 'cook_plus' - ? 'tier-cook-plus' - : 'tier-default'; - $: ringPadding = isActiveMember ? 2.5 : 0; - $: innerSize = Math.max(16, Math.round(size - ringPadding * 2)); + $: innerSize = size; $: tooltipLabel = getMembershipLabel(status?.tier || 'unknown'); + $: glowStyle = (() => { + if (!isActiveMember) return ''; + switch (status?.tier) { + case 'founders': + return 'box-shadow: 0 0 0 2px rgba(255,215,0,0.85), 0 0 12px 4px rgba(255,215,0,0.6), 0 0 24px 8px rgba(255,215,0,0.3);'; + case 'pro_kitchen': + return 'box-shadow: 0 0 0 2px rgba(139,92,246,0.8), 0 0 12px 4px rgba(139,92,246,0.6), 0 0 24px 8px rgba(139,92,246,0.3);'; + case 'cook_plus': + return 'box-shadow: 0 0 0 2px rgba(249,115,22,0.8), 0 0 12px 4px rgba(249,115,22,0.6), 0 0 24px 8px rgba(249,115,22,0.3);'; + default: + return 'box-shadow: 0 0 0 2px rgba(249,115,22,0.8), 0 0 12px 4px rgba(249,115,22,0.6), 0 0 24px 8px rgba(249,115,22,0.3);'; + } + })(); $: if (normalizedPubkey) { queueMembershipLookup(normalizedPubkey); @@ -120,8 +124,8 @@