Add integrated checkout, child safety section, and content polish

- checkout.el: Custom Stripe Payment Element page at /checkout?plan=...
- safety.el: Hard Bell and emergency routing architecture section
- main.el: Wire checkout + safety, /api/payment-intent, STRIPE_PUBLISHABLE_KEY
- enterprise_terms.el: Add nav bar (was missing, page had no navigation)
- styles.el: Checkout buttons now link to integrated page, not hosted Stripe
- El runtime: Auto-detect HTML responses, serve text/html vs application/json
- footer.el: Wordmark image centered above "Built Different." tagline
- environmental.el: Replace SQLite with custom on-device storage
- enterprise.el: Replace SQLite with custom on-device storage
- pricing.el: Local models degraded performance note near Ollama feature
- about.el: "left home at fifteen", remove programming language mention
This commit is contained in:
Will Anderson
2026-04-29 16:59:57 -05:00
parent d190e08f38
commit 393d982d04
10 changed files with 567 additions and 29 deletions
+2 -2
View File
@@ -36,7 +36,7 @@ fn about_page() -> String {
<img src=\"/assets/will.png\" alt=\"Will Anderson\" style=\"width: 160px; height: 160px; border-radius: 50%; object-fit: cover; flex-shrink: 0;\">
<div style=\"flex: 1; min-width: 260px;\">
<p style=\"font-family: var(--body); font-weight: 300; font-size: clamp(0.9rem, 1.5vw, 1.0625rem); color: var(--t2); line-height: 1.9; margin-bottom: 1.5rem;\">
I grew up in Fort Smith, Arkansas, in the kind of instability where home is a moving target &#8212; roughly thirty addresses before I was fifteen, parents struggling with addiction, the material precarity that comes with all of that. I left when I was old enough to go, stayed with friends until I finished high school, found my way to college. At fourteen I&#39;d already found software, writing C++ at the public library because it was the first thing in my life that responded to precision with correctness, and that property turned out to matter more to me than almost anything else.
I grew up in Fort Smith, Arkansas, in the kind of instability where home is a moving target &#8212; roughly thirty addresses before I was fifteen, parents struggling with addiction, the material precarity that comes with all of that. I left home at fifteen, stayed with friends until I finished high school, found my way to college. At fourteen I&#39;d already found software, writing C++ at the public library because it was the first thing in my life that responded to precision with correctness, and that property turned out to matter more to me than almost anything else.
</p>
</div>
</div>
@@ -84,7 +84,7 @@ fn about_page() -> String {
<div class=\"reveal\" style=\"margin-bottom: 3rem;\">
<p class=\"label\" style=\"margin-bottom: 1.25rem;\">What I built</p>
<p style=\"font-family: var(--body); font-weight: 300; font-size: clamp(0.9rem, 1.5vw, 1.0625rem); color: var(--t2); line-height: 1.9; margin-bottom: 1.5rem;\">
Neuron is what I built in response to that. Not a startup in the traditional sense &#8212; no team, no funding, no press release &#8212; one person, nearly two years of work, and a conviction that this can be done differently. I wrote the programming language the core runs in, I wrote the memory architecture, I built the inference infrastructure, because the tools that existed weren&#39;t sufficient for what I was trying to build and so I built those too.
Neuron is what I built in response to that. Not a startup in the traditional sense &#8212; no team, no funding, no press release &#8212; one person, nearly two years of work, and a conviction that this can be done differently. I wrote the memory architecture, I built the inference infrastructure, because the tools that existed weren&#39;t sufficient for what I was trying to build and so I built those too.
</p>
<p style=\"font-family: var(--body); font-weight: 300; font-size: clamp(0.9rem, 1.5vw, 1.0625rem); color: var(--t2); line-height: 1.9;\">
Use it long enough and you&#39;ll understand why I couldn&#39;t have gotten there on top of existing infrastructure. Some things have to be built from the ground up to be built right.
+427
View File
@@ -0,0 +1,427 @@
// checkout.el Integrated Stripe checkout page.
//
// Uses Stripe Payment Element (not hosted checkout) so the entire
// purchase experience lives on neurontechnologies.ai. The page is
// designed to match the Neuron brand navy, clean, no Stripe chrome.
//
// Flow:
// 1. GET /checkout?plan=founding|professional
// 2. Page JS calls POST /api/payment-intent { client_secret, publishable_key, plan }
// 3. Stripe Payment Element mounts into #payment-element
// 4. User fills name, email, card submits
// 5. stripe.confirmPayment() redirects to /marketplace/success
fn checkout_page(plan: String, pub_key: String) -> String {
let is_founding: Bool = str_eq(plan, "founding")
let plan_name: String = if is_founding { "Founding Member" } else { "Professional" }
let plan_price: String = if is_founding { "$199" } else { "$19 / month" }
let plan_desc: String = if is_founding {
"Pay once. Neuron inference forever. No subscription, ever."
} else {
"Full access. Neuron inference — cheaper than what you&#39;re paying now."
}
let plan_cadence: String = if is_founding { "one-time" } else { "billed monthly" }
let features_html: String = if is_founding {
"<li>Neuron inference &#8212; priced below competitors, forever</li>
<li>Everything in Professional &#8212; forever</li>
<li>Never pay again &#8212; lifetime updates included</li>
<li>Founding member badge in the app</li>
<li>Private community &#8212; direct line to the team</li>
<li>Shape the roadmap &#8212; your votes carry more weight</li>
<li>Beta features before general release</li>
<li>Name in the credits</li>"
} else {
"<li>Neuron inference &#8212; metered, priced below OpenAI and Anthropic</li>
<li>Persistent memory &#8212; never resets</li>
<li>Unlimited projects</li>
<li>Full plugin marketplace</li>
<li>IDE, Slack, and more integrations</li>
<li>Early access to new features</li>"
}
return "
<nav id=\"nav\">
<div class=\"nav-inner\">
<a href=\"/\" class=\"nav-logo\" aria-label=\"Neuron home\"><img src=\"/assets/brand/neuron-wordmark-on-light.png\" srcset=\"/assets/brand/neuron-wordmark-on-light@2x.png 2x\" alt=\"Neuron\" height=\"28\"></a>
<div class=\"nav-links\">
<a href=\"/\" class=\"nav-link\">&#8592; Back</a>
</div>
</div>
</nav>
<main style=\"min-height: 100vh; padding: clamp(6rem, 14vh, 9rem) 2rem 4rem;\">
<div class=\"checkout-shell\">
<!-- Left: order summary -->
<div class=\"checkout-summary\">
<p class=\"label\" style=\"margin-bottom: 1.5rem; color: var(--navy);\">Your order</p>
<div style=\"margin-bottom: 2rem;\">
<p class=\"checkout-plan-name\">" + plan_name + "</p>
<p class=\"checkout-plan-desc\">" + plan_desc + "</p>
<div style=\"display: flex; align-items: baseline; gap: .5rem; margin-top: 1.25rem;\">
<span class=\"checkout-price\">" + plan_price + "</span>
<span class=\"checkout-cadence\">" + plan_cadence + "</span>
</div>
</div>
<div class=\"navy-line-left\" style=\"width: 3rem; margin-bottom: 1.75rem;\"></div>
<ul class=\"checkout-features\">
" + features_html + "
</ul>
<p class=\"checkout-guarantee\">
Your data stays yours. Runs locally. No telemetry.
</p>
</div>
<!-- Right: payment form -->
<div class=\"checkout-form-wrap\">
<p class=\"label\" style=\"margin-bottom: 1.75rem;\">Payment</p>
<form id=\"payment-form\" autocomplete=\"on\">
<div class=\"checkout-field-group\">
<div class=\"checkout-field\">
<label for=\"buyer-name\" class=\"checkout-label\">Full name</label>
<input id=\"buyer-name\" name=\"name\" type=\"text\" autocomplete=\"name\"
class=\"checkout-input\" placeholder=\"Will Anderson\" required>
</div>
<div class=\"checkout-field\">
<label for=\"buyer-email\" class=\"checkout-label\">Email</label>
<input id=\"buyer-email\" name=\"email\" type=\"email\" autocomplete=\"email\"
class=\"checkout-input\" placeholder=\"you@example.com\" required>
</div>
</div>
<div class=\"checkout-payment-element-wrap\">
<div id=\"payment-element\">
<!-- Stripe Payment Element mounts here -->
<div class=\"checkout-element-loading\">Loading payment form&#8230;</div>
</div>
</div>
<div id=\"payment-message\" class=\"checkout-message\" style=\"display:none;\"></div>
<button id=\"submit-btn\" class=\"checkout-submit\" type=\"submit\" disabled>
<span id=\"submit-label\">Complete purchase &#8594;</span>
<span id=\"submit-spinner\" style=\"display:none;\">Processing&#8230;</span>
</button>
<p class=\"checkout-security\">
<svg aria-hidden=\"true\" width=\"12\" height=\"14\" viewBox=\"0 0 12 14\" fill=\"none\">
<path d=\"M6 0L0 2.5V7c0 3.3 2.5 6.3 6 7 3.5-.7 6-3.7 6-7V2.5L6 0z\" fill=\"currentColor\" opacity=\".35\"/>
<path d=\"M4 7l1.5 1.5L8.5 5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>
</svg>
Secured by Stripe &nbsp;&middot;&nbsp; 256-bit TLS &nbsp;&middot;&nbsp; PCI DSS compliant
</p>
</form>
</div>
</div>
</main>
<!-- Stripe.js -->
<script src=\"https://js.stripe.com/v3/\" async></script>
<style>
.checkout-shell {
max-width: 960px;
margin: 0 auto;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 5rem;
align-items: start;
}
@media (max-width: 720px) {
.checkout-shell { grid-template-columns: 1fr; gap: 3rem; }
}
.checkout-plan-name {
font-family: var(--head);
font-size: clamp(1.5rem, 3vw, 2rem);
font-weight: 600;
color: var(--t1);
letter-spacing: -0.02em;
margin: 0 0 .5rem;
}
.checkout-plan-desc {
font-family: var(--body);
font-weight: 300;
font-size: .9375rem;
color: var(--t2);
line-height: 1.65;
margin: 0;
}
.checkout-price {
font-family: var(--head);
font-size: 2.5rem;
font-weight: 700;
color: var(--t1);
letter-spacing: -0.03em;
line-height: 1;
}
.checkout-cadence {
font-family: var(--body);
font-size: .8125rem;
color: var(--t3);
letter-spacing: .04em;
}
.checkout-features {
list-style: none;
padding: 0;
margin: 0 0 2rem;
display: flex;
flex-direction: column;
gap: .6rem;
}
.checkout-features li {
font-family: var(--body);
font-weight: 300;
font-size: .9rem;
color: var(--t2);
padding-left: 1.1rem;
position: relative;
}
.checkout-features li::before {
content: '';
position: absolute;
left: 0;
color: var(--navy);
opacity: .6;
}
.checkout-guarantee {
font-family: var(--body);
font-weight: 300;
font-size: .8125rem;
color: var(--t3);
line-height: 1.6;
margin: 0;
}
.checkout-field-group {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
margin-bottom: 1.5rem;
}
@media (max-width: 480px) { .checkout-field-group { grid-template-columns: 1fr; } }
.checkout-field { display: flex; flex-direction: column; gap: .4rem; }
.checkout-label {
font-family: var(--body);
font-size: .75rem;
font-weight: 500;
letter-spacing: .06em;
text-transform: uppercase;
color: var(--t2);
}
.checkout-input {
font-family: var(--body);
font-size: .9375rem;
font-weight: 300;
color: var(--t1);
background: #fff;
border: 1px solid rgba(0,82,160,.22);
padding: .75rem 1rem;
outline: none;
transition: border-color .2s;
border-radius: 0;
-webkit-appearance: none;
appearance: none;
}
.checkout-input::placeholder { color: var(--t3); }
.checkout-input:focus { border-color: rgba(0,82,160,.6); box-shadow: 0 0 0 3px rgba(0,82,160,.08); }
.checkout-payment-element-wrap {
margin-bottom: 1.5rem;
border: 1px solid rgba(0,82,160,.22);
padding: 1.25rem;
background: #fff;
min-height: 80px;
}
.checkout-element-loading {
font-family: var(--body);
font-size: .875rem;
color: var(--t3);
}
.checkout-message {
font-family: var(--body);
font-size: .875rem;
color: #c0392b;
margin-bottom: 1rem;
padding: .75rem 1rem;
background: rgba(192,57,43,.06);
border-left: 2px solid rgba(192,57,43,.4);
}
.checkout-submit {
width: 100%;
padding: 1.05rem 2rem;
background: var(--navy);
color: #fff;
font-family: var(--body);
font-size: .8125rem;
font-weight: 600;
letter-spacing: .12em;
text-transform: uppercase;
border: none;
cursor: pointer;
transition: background .2s, opacity .2s;
margin-bottom: 1.25rem;
}
.checkout-submit:hover:not(:disabled) { background: #0078D4; }
.checkout-submit:disabled { opacity: .5; cursor: not-allowed; }
.checkout-security {
font-family: var(--body);
font-size: .75rem;
color: var(--t3);
display: flex;
align-items: center;
gap: .4rem;
margin: 0;
}
</style>
<script>
(function() {
var PLAN = '" + plan + "';
var STRIPE_PK = '" + pub_key + "';
var stripe, elements;
// Wait for Stripe.js to load
function waitForStripe(cb) {
if (window.Stripe) { cb(); return; }
setTimeout(function() { waitForStripe(cb); }, 50);
}
function showMessage(msg) {
var el = document.getElementById('payment-message');
el.textContent = msg;
el.style.display = 'block';
}
function setLoading(loading) {
var btn = document.getElementById('submit-btn');
var label = document.getElementById('submit-label');
var spinner = document.getElementById('submit-spinner');
btn.disabled = loading;
label.style.display = loading ? 'none' : '';
spinner.style.display = loading ? '' : 'none';
}
// Fetch client secret from our server
fetch('/api/payment-intent', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ plan: PLAN })
})
.then(function(r) { return r.json(); })
.then(function(data) {
if (!data.client_secret) {
showMessage('Unable to initialise payment. Please try again.');
return;
}
waitForStripe(function() {
stripe = Stripe(STRIPE_PK);
elements = stripe.elements({
clientSecret: data.client_secret,
appearance: {
theme: 'flat',
variables: {
colorPrimary: '#0052A0',
colorBackground: '#ffffff',
colorText: '#1A1A2E',
colorDanger: '#c0392b',
colorTextPlaceholder:'#9B9BAD',
borderRadius: '0px',
fontFamily: 'system-ui, -apple-system, sans-serif',
fontSizeBase: '15px',
fontWeightNormal: '300',
spacingUnit: '4px',
},
rules: {
'.Input': {
border: '1px solid rgba(0,82,160,.22)',
boxShadow: 'none',
padding: '10px 14px',
},
'.Input:focus': {
border: '1px solid rgba(0,82,160,.6)',
boxShadow: '0 0 0 3px rgba(0,82,160,.08)',
outline: 'none',
},
'.Label': {
fontSize: '11px',
fontWeight: '500',
letterSpacing: '.06em',
textTransform: 'uppercase',
color: '#6B6B7E',
marginBottom: '6px',
},
'.Tab': {
border: '1px solid rgba(0,82,160,.18)',
boxShadow: 'none',
},
'.Tab--selected': {
border: '1px solid rgba(0,82,160,.5)',
boxShadow: '0 0 0 2px rgba(0,82,160,.12)',
},
'.Error': { color: '#c0392b' },
}
}
});
var paymentEl = elements.create('payment', {
fields: { billingDetails: { name: 'never', email: 'never' } }
});
paymentEl.mount('#payment-element');
paymentEl.on('ready', function() {
document.querySelector('.checkout-element-loading') &&
document.querySelector('.checkout-element-loading').remove();
document.getElementById('submit-btn').disabled = false;
});
});
})
.catch(function() {
showMessage('Unable to connect. Please check your connection and try again.');
});
// Submit
document.getElementById('payment-form').addEventListener('submit', async function(e) {
e.preventDefault();
if (!stripe || !elements) return;
var name = document.getElementById('buyer-name').value.trim();
var email = document.getElementById('buyer-email').value.trim();
if (!name || !email) {
showMessage('Please enter your name and email.');
return;
}
setLoading(true);
document.getElementById('payment-message').style.display = 'none';
var result = await stripe.confirmPayment({
elements: elements,
confirmParams: {
return_url: window.location.origin + '/marketplace/success',
payment_method_data: {
billing_details: { name: name, email: email }
},
receipt_email: email,
}
});
if (result.error) {
showMessage(result.error.message || 'Payment failed. Please try again.');
setLoading(false);
}
// On success, Stripe redirects to return_url automatically.
});
})();
</script>
"
}
+1 -1
View File
@@ -50,7 +50,7 @@ fn enterprise() -> String {
<div class=\"enterprise-cap card-dark reveal\" style=\"transition-delay:390ms\">
<h3 class=\"display-md\">Compliance architecture</h3>
<div class=\"enterprise-cap-rule\"></div>
<p class=\"enterprise-cap-body\">SQLite local storage. No cloud database with your data. SOC 2 alignment built into the data model. ExternalSecret-based secrets management. Audit logs at every layer.</p>
<p class=\"enterprise-cap-body\">Custom on-device storage. No cloud database with your data. SOC 2 alignment built into the data model. ExternalSecret-based secrets management. Audit logs at every layer.</p>
</div>
</div>
+13
View File
@@ -9,6 +9,19 @@ fn enterprise_terms_page() -> String {
fn enterprise_terms_body() -> String {
return "
<nav id=\"nav\">
<div class=\"nav-inner\">
<a href=\"/\" class=\"nav-logo\" aria-label=\"Neuron home\"><img src=\"/assets/brand/neuron-wordmark-on-light.png\" srcset=\"/assets/brand/neuron-wordmark-on-light@2x.png 2x\" alt=\"Neuron\" height=\"28\"></a>
<div class=\"nav-links\">
<a href=\"/#how-it-works\" class=\"nav-link\">How it works</a>
<a href=\"/#pricing\" class=\"nav-link\">Pricing</a>
<a href=\"/#enterprise\" class=\"nav-link\">Enterprise</a>
<a href=\"/about\" class=\"nav-link\">About</a>
<a href=\"/#pricing\" class=\"nav-cta\">Get Access</a>
</div>
</div>
</nav>
<div style=\"max-width:720px;margin:0 auto;padding:6rem 2.5rem 8rem\">
<div style=\"margin-bottom:3rem\">
<a href=\"/\" style=\"font-family:var(--body);font-size:0.75rem;font-weight:500;letter-spacing:0.15em;text-transform:uppercase;color:var(--navy);text-decoration:none\">&#8592; Neuron</a>
+2 -2
View File
@@ -46,9 +46,9 @@ fn environmental() -> String {
<div class=\"reveal card-dark\" style=\"transition-delay:200ms;padding:1.75rem 2rem;border-left:3px solid rgba(0,120,84,.40)\">
<p style=\"font-family:var(--body);font-size:0.7rem;font-weight:600;letter-spacing:0.18em;text-transform:uppercase;color:rgba(0,120,84,.70);margin-bottom:0.75rem\">No database server for your data</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">SQLite on your machine</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">On-device storage</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.7\">
Your memory graph lives in a single SQLite file. No cloud database servers running 24&#x2F;7 to store and serve your conversations. No replication across availability zones. Just a file on your device.
Your memory graph lives in a custom on-device storage layer we built for this purpose. No cloud database servers running 24&#x2F;7 to store and serve your conversations. No replication across availability zones. Just your device.
</p>
</div>
+2 -2
View File
@@ -6,8 +6,8 @@ fn footer() -> String {
<div class=\"container\">
<div class=\"footer-inner\">
<a href=\"/\" class=\"footer-brand\" aria-label=\"Neuron home\">
<p class=\"footer-brand-name\">Neuron</p>
<a href=\"/\" class=\"footer-brand\" aria-label=\"Neuron home\" style=\"display:flex;flex-direction:column;align-items:center;\">
<img src=\"/assets/brand/neuron-wordmark-on-light.png\" srcset=\"/assets/brand/neuron-wordmark-on-light@2x.png 2x\" alt=\"Neuron\" height=\"24\" style=\"display:block;margin-bottom:0.35rem;\">
<p class=\"footer-brand-tagline\">Built Different.</p>
</a>
+41
View File
@@ -40,6 +40,8 @@ from about import { about_page }
from founding_badge import { founding_badge, founding_badge_css }
from terms import { terms_page }
from enterprise_terms import { enterprise_terms_page }
from checkout import { checkout_page }
from safety import { safety }
// Founding counter
@@ -78,6 +80,7 @@ fn page(sold: Int, total: Int) -> String {
+ enterprise()
+ mission()
+ local_first()
+ safety()
+ environmental()
+ pricing(sold, total)
+ viral()
@@ -131,6 +134,42 @@ fn handle_request(method: String, path: String, body: String) -> String {
return "{\"__status__\":404,\"error\":\"not found\"}"
}
// Checkout page
if str_starts_with(path, "/checkout") {
let plan: String = "founding"
if str_contains(path, "plan=professional") {
plan = "professional"
}
let pub_key: String = state_get("__stripe_publishable_key__")
return page_open() + checkout_page(plan, pub_key) + page_close()
}
// Stripe payment intent
if str_eq(path, "/api/payment-intent") {
let stripe_key: String = state_get("__stripe_secret_key__")
if str_eq(stripe_key, "") {
return "{\"__status__\":503,\"error\":\"Stripe not configured\"}"
}
let plan: String = "founding"
if str_contains(body, "\"professional\"") {
plan = "professional"
}
let amount: String = "19900"
if str_eq(plan, "professional") {
amount = "1900"
}
let pi_body: String = "amount=" + amount
+ "&currency=usd"
+ "&payment_method_types[]=card"
+ "&metadata[plan]=" + plan
let response: String = http_post_form_auth(
"https://api.stripe.com/v1/payment_intents",
stripe_key,
pi_body
)
return response
}
// Health check
if str_eq(path, "/api/health") {
return "{\"status\":\"ok\",\"service\":\"neuron-landing\"}"
@@ -279,10 +318,12 @@ state_set("__founding_total__", int_to_str(FOUNDING_TOTAL))
// Stripe config from environment.
let stripe_key: String = env("STRIPE_SECRET_KEY")
let stripe_pub_key: String = env("STRIPE_PUBLISHABLE_KEY")
let stripe_price_founding: String = env("STRIPE_PRICE_FOUNDING")
let stripe_price_professional: String = env("STRIPE_PRICE_PROFESSIONAL")
let license_api_url: String = env("NEURON_LICENSE_API_URL")
state_set("__stripe_secret_key__", stripe_key)
state_set("__stripe_publishable_key__", stripe_pub_key)
state_set("__stripe_price_founding__", stripe_price_founding)
state_set("__stripe_price_professional__", stripe_price_professional)
state_set("__license_api_url__", license_api_url)
+1
View File
@@ -53,6 +53,7 @@ fn pricing(sold: Int, total: Int) -> String {
<li><span class=\"dash\">-</span><span>Persistent memory &#8212; never resets</span></li>
<li><span class=\"dash\">-</span><span>Neuron inference &#8212; metered, priced below OpenAI and Anthropic</span></li>
<li><span class=\"dash\">-</span><span>Local inference via Ollama</span></li>
<li style=\"list-style:none\"><span style=\"font-family:var(--body);font-size:0.8rem;font-weight:300;color:var(--t3);font-style:italic;line-height:1.6\">Local models may give lower quality responses. Neuron inference is cheap &#8212; give it a try.</span></li>
<li><span class=\"dash\">-</span><span>Bring your own API keys (optional)</span></li>
<li><span class=\"dash\">-</span><span>Unlimited projects</span></li>
<li><span class=\"dash\">-</span><span>3 marketplace plugins included</span></li>
+76
View File
@@ -0,0 +1,76 @@
// components/safety.el Child and family safety section.
//
// Describes the Hard Bell architecture and genuine protective design.
// Not "safe for kids" marketing actual architecture that treats
// family safety as a structural property, not a feature checkbox.
fn safety() -> String {
return "
<section id=\"safety\" aria-label=\"Family safety\" style=\"padding:8rem 2.5rem;background:var(--bg2)\">
<div class=\"container-lg\">
<div style=\"display:grid;grid-template-columns:1fr 1fr;gap:6rem;align-items:start\">
<div>
<div style=\"display:flex;align-items:center;gap:1.5rem;margin-bottom:2rem\">
<div class=\"navy-line-left\" style=\"width:3rem;flex-shrink:0\"></div>
<span class=\"label reveal\" style=\"color:var(--navy-85)\">Family &amp; safety</span>
</div>
<h2 class=\"display-lg reveal\" style=\"transition-delay:80ms;margin-bottom:1.5rem\">
Built for real families.<br>Not the idea of them.
</h2>
<p class=\"reveal\" style=\"transition-delay:160ms;font-family:var(--body);font-weight:300;font-size:1rem;color:var(--t2);line-height:1.8;margin-bottom:1.25rem\">
Most AI products add parental controls as an afterthought &#8212; a toggle that tells the platform which account is the adult and which is the child. That&#39;s not safety. That&#39;s a permission system with a friendly name.
</p>
<p class=\"reveal\" style=\"transition-delay:220ms;font-family:var(--body);font-weight:300;font-size:1rem;color:var(--t2);line-height:1.8;margin-bottom:1.25rem\">
Neuron&#39;s family architecture was designed around an uncomfortable statistical fact: the people closest to a child are statistically the most likely threat. The emergency contact on file and the source of danger are often the same person. A system that routes every distress signal to &#34;guardian on file&#34; is not a safety system. It&#39;s a notification system that may alert the very person the child needs protection from.
</p>
<p class=\"reveal\" style=\"transition-delay:280ms;font-family:var(--body);font-weight:300;font-size:1rem;color:var(--t2);line-height:1.8\">
We built something different. We called it the Hard Bell.
</p>
</div>
<div style=\"display:flex;flex-direction:column;gap:1.5rem;padding-top:1rem\">
<div class=\"reveal card-dark\" style=\"transition-delay:100ms;padding:1.75rem 2rem;border-left:3px solid rgba(0,82,160,.40)\">
<p style=\"font-family:var(--body);font-size:0.7rem;font-weight:600;letter-spacing:0.18em;text-transform:uppercase;color:var(--navy-65);margin-bottom:0.75rem\">Hard Bell</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">An emergency contact the threat can&#39;t intercept</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.7\">
The Hard Bell is an emergency contact designated in a calm moment &#8212; a teacher, a relative outside the household, a trusted friend &#8212; set up independently from the guardian account. When a signal warrants it, this contact is reached. The guardian is not automatically notified.
</p>
</div>
<div class=\"reveal card-dark\" style=\"transition-delay:200ms;padding:1.75rem 2rem;border-left:3px solid rgba(0,82,160,.40)\">
<p style=\"font-family:var(--body);font-size:0.7rem;font-weight:600;letter-spacing:0.18em;text-transform:uppercase;color:var(--navy-65);margin-bottom:0.75rem\">Emergency routing</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">Emergency services first &#8212; not parent notification</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.7\">
Physical danger and abuse signals route to emergency services and crisis lines &#8212; not to the guardian account. Neuron evaluates the content of the signal, not just the age of the user. The guardian cannot disable or redirect this path.
</p>
</div>
<div class=\"reveal card-dark\" style=\"transition-delay:300ms;padding:1.75rem 2rem;border-left:3px solid rgba(0,82,160,.40)\">
<p style=\"font-family:var(--body);font-size:0.7rem;font-weight:600;letter-spacing:0.18em;text-transform:uppercase;color:var(--navy-65);margin-bottom:0.75rem\">Parent dashboard</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">Oversight without surveillance</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.7\">
Parents see what they need to see. The child&#39;s conversations remain private unless a wellbeing signal triggers parent notification &#8212; and even then, the routing logic protects against the parent being the source of harm.
</p>
</div>
</div>
</div>
<div class=\"reveal\" style=\"margin-top:4rem;padding:2rem 2.5rem;border:1px solid rgba(0,82,160,.15);border-left:3px solid var(--navy);background:rgba(0,82,160,.03)\">
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;\">
<strong style=\"color:var(--t1);font-weight:500\">Minors require a parent account.</strong> Children and teens cannot create accounts on their own &#8212; a parent or guardian creates the family account, configures access, and designates the Hard Bell contact. The child&#39;s experience is private from everyone except the trusted adult who set it up &#8212; and from emergency services when the signal warrants it.
</p>
</div>
</div>
</section>
"
}
+2 -22
View File
@@ -1401,32 +1401,12 @@ fn page_close() -> String {
pollFoundingCount();
setInterval(pollFoundingCount, 90000);
// Stripe checkout
// Checkout buttons — navigate to integrated payment page
var checkoutBtns = document.querySelectorAll('[data-checkout]');
checkoutBtns.forEach(function(btn) {
btn.addEventListener('click', function() {
var plan = btn.getAttribute('data-checkout');
var origText = btn.textContent;
btn.textContent = 'Loading...';
btn.disabled = true;
fetch('/api/checkout', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ plan: plan })
})
.then(function(r) { return r.json(); })
.then(function(data) {
if (data.url) {
window.location.href = data.url;
} else {
btn.textContent = 'Error — try again';
btn.disabled = false;
}
})
.catch(function() {
btn.textContent = 'Error — try again';
btn.disabled = false;
});
window.location.href = '/checkout?plan=' + plan;
});
});