echokit

EchoKit v1.6.0 Deployment Guide

🎯 Mission: Complete P0 Ship Blockers

This guide walks you through the critical deployment tasks to launch EchoKit v1.6.0.


βœ… What’s Been Completed

All code changes from emergent.sh have been committed:


πŸ”΄ P0: Critical Deployment Tasks (Do These Next)

Task 1: Deploy Cloudflare Worker (30 min)

Purpose: License validation service for Pro/LTD customers

Steps:

cd /Users/rkamalapuram/git-personal/echokit/worker
./deploy.sh

The script will:

  1. Authenticate you with Cloudflare (opens browser)
  2. Generate and set ECHOKIT_HMAC_SECRET (save this!)
  3. Generate and set ECHOKIT_ADMIN_TOKEN (save this!)
  4. Deploy the worker

Expected Output:

Published echokit-license (X.XX sec)
  https://echokit-license.<YOUR_SUBDOMAIN>.workers.dev

Save:

Verification:

curl https://echokit-license.<YOUR_SUBDOMAIN>.workers.dev/__health
# Should return: {"ok":true,"name":"EchoKit License API"}

See: ../../../worker/DEPLOY.md for detailed instructions


Task 2: Publish echokit-server to npm (15 min)

Purpose: Make CLI available via npx echokit-server for CI/testing

Prerequisites: npm account with verified email

Steps:

# 1. Login to npm
npm login
# Enter: username, password, email, OTP (if 2FA enabled)

# 2. Verify login
npm whoami

# 3. Publish
cd /Users/rkamalapuram/git-personal/echokit/cli
npm publish --access=public

Expected Output:

+ echokit-server@1.0.0

Verification:

npx echokit-server --help
# Should show CLI help text

Post-Publish:

See: ../../../cli/PUBLISH.md for detailed instructions


Task 3: Upload to Chrome Web Store (45 min)

Purpose: Make extension available for public download

Prerequisites:

Package: store/echokit-api-recorder-mocker-v1.6.0.zip (ready to upload)

Steps:

  1. Go to: https://chrome.google.com/webstore/devconsole
  2. Click New Item
  3. Upload store/echokit-api-recorder-mocker-v1.6.0.zip
  4. Fill listing fields from ../../../store/chrome-web-store.md:
    • Name: EchoKit β€” API Recorder & Mocker
    • Summary: (copy from chrome-web-store.md)
    • Description: (copy from chrome-web-store.md)
    • Category: Developer Tools
  5. Upload icon: extension/icons/icon128.png
  6. Upload promo tiles: store/promo-*.png
  7. Upload screenshots: store/screenshots/*.png
  8. Privacy Policy URL: (host ../../../store/privacy-policy.md on GitHub Pages)
  9. Declare permissions (see chrome-web-store.md)
  10. Submit for review (1-7 days)

See: ../../../store/chrome-web-store.md for listing copy


🟠 P1: High-Value Features (After P0)

License Endpoint UI in Extension

File: extension/shared/app.js Location: showSettingsDialog() function

Add input field after License Key row:

// After license key input, add:
const endpoint = await BG({ type: 'echokit:settings:get', key: 'licenseEndpoint' }) || '';
html += `
  <div class="settings-row">
    <label for="license-endpoint">License Endpoint</label>
    <div style="display: flex; gap: 8px;">
      <input type="text" id="license-endpoint" value="${endpoint}" 
             placeholder="https://echokit-license.your-subdomain.workers.dev"
             style="flex: 1;">
      <button id="test-endpoint" class="secondary">Test</button>
    </div>
    <div class="help-text">Custom license validation endpoint. Leave blank to use default.</div>
  </div>
`;

// In event handlers:
dialog.querySelector('#license-endpoint').addEventListener('change', async (e) => {
  await BG({ type: 'echokit:license:setEndpoint', endpoint: e.target.value.trim() });
});

dialog.querySelector('#test-endpoint').addEventListener('click', async () => {
  const ep = dialog.querySelector('#license-endpoint').value.trim();
  if (!ep) return alert('Enter an endpoint URL first');
  try {
    const res = await fetch(ep + '/__health');
    const data = await res.json();
    if (data.ok) alert('βœ“ Endpoint is healthy: ' + data.name);
    else alert('βœ— Unexpected response: ' + JSON.stringify(data));
  } catch (e) {
    alert('βœ— Connection failed: ' + e.message);
  }
});

Background handler (extension/background.js):

case 'echokit:license:setEndpoint':
  await chrome.storage.sync.set({ echokit_license_endpoint: msg.endpoint });
  return { ok: true };

Update validation function to use custom endpoint if set.


πŸ“‹ Post-Deployment Checklist

After completing P0 tasks:


πŸ”§ Quick Reference

Test CLI locally:

node cli/test/test.js  # All tests should pass

Test Worker locally:

node worker/test.js    # All tests should pass

Mint a test license key (after worker deployment):

curl -X POST https://echokit-license.<YOUR_SUBDOMAIN>.workers.dev/v1/issue \
  -H "Authorization: Bearer <ADMIN_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"plan":"LTD","expiresAt":0}'

Test license validation:

curl -X POST https://echokit-license.<YOUR_SUBDOMAIN>.workers.dev/v1/validate \
  -H "Content-Type: application/json" \
  -d '{"key":"<KEY_FROM_PREVIOUS_STEP>"}'

πŸ“ž Need Help?


Current Status: Ready for P0 deployment. All code complete βœ… Next Action: Run ../../../worker/deploy.sh to deploy the license worker