Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions demo/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2043,6 +2043,12 @@ <h4 class="font-bold text-white text-sm">${res.title}</h4>
}
});

// Stripe Payment Link for Pro. Empty keeps the email-only fallback below.
// Set this to the live-mode link (https://buy.stripe.com/...) once Pro is
// sold through Stripe; a test-mode link must never ship here. Pro is
// fulfilled by hand after payment, there is no license automation yet.
window.JOLTRIN_PRO_PAYMENT_LINK = '';

async function initiateProCheckout(e) {
e.preventDefault();
const form = e.target;
Expand Down Expand Up @@ -2095,6 +2101,11 @@ <h4 class="font-bold text-white text-sm">${res.title}</h4>
return;
}

if (window.JOLTRIN_PRO_PAYMENT_LINK) {
window.location.href = `${window.JOLTRIN_PRO_PAYMENT_LINK}?prefilled_email=${encodeURIComponent(email)}`;
return;
}

// No billing backend reachable from this static site (e.g. this is the
// GitHub Pages deployment, which serves static files only). Be honest
// about that instead of faking a checkout session.
Expand Down
2 changes: 2 additions & 0 deletions docs/MONETIZATION_AND_TIERS.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ Commercial tiers are focused entirely on **enterprise governance, compliance, po
| **Enterprise Governance** | **Custom** / Annual Contract | Self-Hosted Enterprise | Commercial | • Enterprise SSO: **Okta** & **Microsoft Entra ID**<br>• Multi-tenant RBAC & tenant isolation boundaries<br>• Real-time audit streaming (SIEM / Kafka)<br>• Custom safety invariant enforcement engine<br>• Fine-grained barrier verification rules<br>• Dedicated enterprise compliance & SLA guarantees | **Foundation Implemented** (`governance/`) |
| **Hosted Cloud** | *Usage-based* | Managed Cloud SaaS | Commercial | • Managed Joltrin instances (zero-ops)<br>• Cloud-hosted MCP hub & multi-agent routing<br>• Multi-region database replication<br>• Managed agent coordination network<br>• Automated off-site snapshots & backup verification | **Planned / In Development** |

Pro is sold through a Stripe Payment Link on the homepage and fulfilled by hand: after payment, setup and license details are emailed within one business day. The webhook and checkout code in `governance/` still switch the hosted server's own tier, but nothing issues a license key to a self-hosted install yet, so the hosted app is not used to sell Pro.

---

## 2. Architectural Boundary: The `governance/` Package
Expand Down
14 changes: 14 additions & 0 deletions tests/homepage.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,20 @@ test.describe('Homepage', () => {
await expect(page.locator('#pro-checkout-status a[href^="mailto:"]')).toBeVisible();
});

test('requesting Pro goes to the Stripe payment link with the email prefilled once one is set', async ({ page }) => {
await page.route('https://buy.stripe.com/**', (route) =>
route.fulfill({ status: 200, contentType: 'text/html', body: '<title>stripe stub</title>' }));
await page.goto('/', { waitUntil: 'domcontentloaded' });
await waitForWasmReady(page);
await page.evaluate(() => { (window as any).JOLTRIN_PRO_PAYMENT_LINK = 'https://buy.stripe.com/live_example'; });
await page.locator('#pricing').getByRole('button', { name: /request pro/i }).click();
const modal = page.locator('#pro-checkout-modal');
await page.fill('#pro-team-name', 'example-team');
await page.fill('#pro-admin-email', 'admin@example.test');
await modal.getByRole('button', { name: /^request pro$/i }).click();
await page.waitForURL('https://buy.stripe.com/live_example?prefilled_email=admin%40example.test', { timeout: 10_000 });
});

test('canonical and social metadata point at joltrinhq.com on all three pages', async ({ request }) => {
for (const [path, expected] of [
['/', 'https://joltrinhq.com/'],
Expand Down
Loading