v1.0 - launch: full nav on gallery, chat widget auto-open, comparison logos, checkout fixes

This commit is contained in:
Will Anderson
2026-05-01 18:13:06 -05:00
parent ff1f9577db
commit 00f2323c98
41 changed files with 4740 additions and 434 deletions
+83
View File
@@ -0,0 +1,83 @@
# Dockerfile.stage — Stage build: landing server + soul-demo in one image.
#
# Both processes run in the same container:
# - neuron-web on port 8080 (landing page server)
# - soul-demo on port 7772 (demo chat, localhost only)
#
# Both binaries are compiled from C inside Docker for linux/amd64.
# The engram snapshot is baked in so the soul has memory from first boot.
# ── Stage 1: compile both binaries ────────────────────────────────────────────
FROM debian:bookworm-slim AS builder
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
libcurl4-openssl-dev \
libssl-dev \
python3 \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /build
# El runtime (shared by both binaries)
COPY runtime/el_runtime.c runtime/el_runtime.h ./
# ── Build neuron-web ──────────────────────────────────────────────────────────
COPY dist/web_stubs.c ./
COPY dist/bootstrap.py ./
COPY dist/main-combined.el ./
RUN python3 bootstrap.py main-combined.el > main.c && \
sed -i \
's|#include "el_runtime.h"|#include "el_runtime.h"\nel_val_t http_get_auth(el_val_t url, el_val_t tok);\nel_val_t http_post_auth(el_val_t url, el_val_t tok, el_val_t body);\nel_val_t cwd(void);\nel_val_t color_bold(el_val_t s);\nel_val_t unix_timestamp(void);\nel_val_t gcs_write(el_val_t bucket, el_val_t object_name, el_val_t content);\nel_val_t gcs_read(el_val_t bucket, el_val_t object_name);\nel_val_t supabase_insert(el_val_t project_url, el_val_t service_key, el_val_t table, el_val_t row_json);\nel_val_t supabase_get(el_val_t project_url, el_val_t service_key, el_val_t table_and_query);|' \
main.c && \
cc -O2 -rdynamic \
-o neuron-web \
main.c web_stubs.c el_runtime.c \
-lcurl -lpthread -ldl -lm
# ── Build soul-demo ───────────────────────────────────────────────────────────
COPY dist/soul-demo.c ./
COPY dist/vessel_stubs.c ./
RUN cc -O2 -rdynamic \
-o soul-demo \
soul-demo.c vessel_stubs.c el_runtime.c \
-lcurl -lpthread -ldl -lm
# ── Stage 2: runtime image ────────────────────────────────────────────────────
FROM debian:bookworm-slim
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
libcurl4 \
libssl3 \
ca-certificates \
&& rm -rf /var/lib/apt/lists/* \
&& groupadd -r landing && useradd -r -g landing landing \
&& mkdir -p /srv/landing/assets /srv/landing/shares \
&& mkdir -p /srv/soul/engram-demo \
&& chown -R landing:landing /srv/landing /srv/soul
COPY --from=builder /build/neuron-web /usr/local/bin/neuron-web
COPY --from=builder /build/soul-demo /usr/local/bin/soul-demo
# Engram snapshot — baked in so soul has memory from cold start
COPY dist/engram-snapshot.json /srv/soul/engram-demo/snapshot.json
COPY src/assets /srv/landing/assets
COPY dist/entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
ENV LANDING_ROOT=/srv/landing
ENV PORT=8080
ENV NEURON_HOME=/srv/soul/engram-demo
ENV NEURON_PORT=7772
USER landing
EXPOSE 8080
CMD ["/usr/local/bin/entrypoint.sh"]
Executable
+101
View File
@@ -0,0 +1,101 @@
#!/usr/bin/env bash
# build-local.sh — Build and run neuron-web + soul-demo for local development.
#
# Mirrors the container's entrypoint.sh: both processes start together,
# soul-demo in background, neuron-web in foreground. Kill neuron-web (Ctrl-C)
# and the soul dies with it. No separate process manager. No port conflicts.
#
# Usage:
# ./build-local.sh — build only
# ./build-local.sh --run — build and start both servers
set -euo pipefail
cd "$(dirname "$0")"
NEURON_DIR="$(cd ../../neuron && pwd)"
EL_HOME="${EL_HOME:-../../foundation/el}"
BOOTSTRAP="${EL_HOME}/bootstrap.py"
RUNTIME_SRC="${EL_HOME}/el-compiler/runtime"
COMPONENTS=(nav hero pillars how_it_works inference efficiency comparison
environmental enterprise mission local_first pricing marketplace viral
footer styles about founding_badge terms enterprise_terms checkout safety
gallery account)
echo "==> Combining El sources"
{
for f in "${COMPONENTS[@]}"; do
[ -f "src/${f}.el" ] && grep -hv '^[[:space:]]*from\|^[[:space:]]*import' "src/${f}.el" && echo ""
done
grep -v '^from\|^import' src/main.el
} > dist/main-combined.el
echo " $(wc -l < dist/main-combined.el) lines"
echo "==> Bootstrap El → C"
python3 "${BOOTSTRAP}" dist/main-combined.el > dist/main.c
echo "==> Injecting stubs"
sed -i '' 's|#include "el_runtime.h"|#include "el_runtime.h"\nel_val_t http_get_auth(el_val_t url, el_val_t tok);\nel_val_t http_post_auth(el_val_t url, el_val_t tok, el_val_t body);\nel_val_t cwd(void);\nel_val_t color_bold(el_val_t s);\nel_val_t unix_timestamp(void);\nel_val_t gcs_write(el_val_t bucket, el_val_t object_name, el_val_t content);\nel_val_t gcs_read(el_val_t bucket, el_val_t object_name);\nel_val_t supabase_insert(el_val_t project_url, el_val_t service_key, el_val_t table, el_val_t row_json);|' dist/main.c
echo "==> Compiling neuron-web"
cc -O2 \
-I"${RUNTIME_SRC}" \
-o dist/neuron-web \
dist/main.c \
dist/web_stubs.c \
"${RUNTIME_SRC}/el_runtime.c" \
-lcurl -lpthread
echo " dist/neuron-web built ok"
if [[ "${1:-}" == "--run" ]]; then
# Load credentials
if [ -f "$HOME/Secrets/credentials/infrastructure.env" ]; then
set -a; source "$HOME/Secrets/credentials/infrastructure.env"; set +a
fi
# Get Soma key for Neuron inference
SOMA_KEY="${NEURON_LLM_0_KEY:-$(gcloud secrets versions access latest --secret=soma-operator-key --project=neuron-785695 2>/dev/null || echo '')}"
# Kill any leftover instances from a previous run
pkill -f "dist/neuron-web" 2>/dev/null || true
pkill -f "neuron/dist/soul-demo" 2>/dev/null || true
sleep 0.5
echo "==> Starting soul-demo on :7772"
NEURON_LLM_0_URL="https://soma-prod-us-r4tfklscwq-uc.a.run.app/v1/chat/completions" \
NEURON_LLM_0_KEY="$SOMA_KEY" \
NEURON_LLM_0_FORMAT="openai" \
NEURON_LLM_0_MODEL="neuron" \
NEURON_LLM_1_KEY="${ANTHROPIC_API_KEY:-}" \
NEURON_LLM_1_FORMAT="anthropic" \
NEURON_HOME="$HOME/.neuron/engram-demo" \
NEURON_PORT=7772 \
"${NEURON_DIR}/dist/soul-demo" &
SOUL_PID=$!
echo " soul-demo pid=$SOUL_PID — waiting for init..."
sleep 5
echo "==> Starting neuron-web on :3001"
# Trap exit to also kill the soul
trap "echo '==> Stopping...'; kill $SOUL_PID 2>/dev/null; exit 0" INT TERM
NEURON_LLM_0_URL="https://soma-prod-us-r4tfklscwq-uc.a.run.app/v1/chat/completions" \
NEURON_LLM_0_KEY="$SOMA_KEY" \
NEURON_LLM_0_FORMAT="openai" \
NEURON_LLM_0_MODEL="neuron" \
NEURON_LLM_1_KEY="${ANTHROPIC_API_KEY:-}" \
NEURON_LLM_1_FORMAT="anthropic" \
STRIPE_SECRET_KEY="${STRIPE_SECRET_KEY:-}" \
STRIPE_PUBLISHABLE_KEY="${STRIPE_PUBLISHABLE_KEY:-}" \
STRIPE_PRICE_FOUNDING="${STRIPE_PRICE_FOUNDING:-}" \
STRIPE_PRICE_PROFESSIONAL="${STRIPE_PRICE_PROFESSIONAL:-}" \
STRIPE_WEBHOOK_SECRET="${STRIPE_WEBHOOK_SECRET:-}" \
SUPABASE_SERVICE_KEY="${SUPABASE_SERVICE_KEY:-}" \
SUPABASE_ANON_KEY="${SUPABASE_ANON_KEY:-}" \
PORT=3001 LANDING_ROOT=./src \
dist/neuron-web
# neuron-web exited — clean up soul
kill $SOUL_PID 2>/dev/null || true
fi
+157 -59
View File
@@ -1895,12 +1895,28 @@ el_val_t json_get(el_val_t jsonv, el_val_t keyv) {
while (*p == ' ' || *p == '\t' || *p == '\n') p++;
if (*p == '"') {
p++;
const char* start = p;
while (*p && !(*p == '"' && *(p-1) != '\\')) p++;
size_t len = (size_t)(p - start);
char* out = el_strbuf(len);
memcpy(out, start, len);
out[len] = '\0';
/* Unescape the JSON string value into a clean buffer. */
size_t cap = strlen(p) + 1;
char* out = el_strbuf(cap);
char* w = out;
while (*p && *p != '"') {
if (*p == '\\' && *(p+1)) {
p++;
switch (*p) {
case '"': *w++ = '"'; break;
case '\\': *w++ = '\\'; break;
case '/': *w++ = '/'; break;
case 'n': *w++ = '\n'; break;
case 'r': *w++ = '\r'; break;
case 't': *w++ = '\t'; break;
default: *w++ = *p; break;
}
} else {
*w++ = *p;
}
p++;
}
*w = '\0';
return el_wrap_str(out);
}
const char* start = p;
@@ -4534,30 +4550,143 @@ static const char* llm_resolve_model(const char* m) {
return m;
}
/* Make an Anthropic /v1/messages request with the given JSON body. Returns
* the assistant's first text content as an owned string, or a JSON error
* fragment on transport failure. */
static el_val_t llm_request(const char* json_body) {
const char* api_key = getenv("ANTHROPIC_API_KEY");
if (!api_key || !*api_key) {
return http_error_json("ANTHROPIC_API_KEY not set");
/*
* ── Configurable LLM provider chain ──────────────────────────────────────────
*
* Providers are configured via indexed env vars. The runtime tries each in
* order (0, 1, 2, ...) and returns the first successful non-empty response.
*
* Per provider (N = 0, 1, 2, ...):
* NEURON_LLM_N_URL — endpoint URL (base URL; /v1/chat/completions appended
* if format is "openai" and not already in URL)
* NEURON_LLM_N_KEY — API key
* NEURON_LLM_N_FORMAT — "openai" (default) or "anthropic"
* NEURON_LLM_N_MODEL — model name override (optional)
*
* Example — Neuron inference primary, Anthropic fallback:
* NEURON_LLM_0_URL=https://soma.../v1/chat/completions
* NEURON_LLM_0_KEY=svc-key
* NEURON_LLM_0_FORMAT=openai
* NEURON_LLM_0_MODEL=neuron
* NEURON_LLM_1_URL=https://api.anthropic.com/v1/messages
* NEURON_LLM_1_KEY=sk-ant-...
* NEURON_LLM_1_FORMAT=anthropic
*
* If no NEURON_LLM_0_URL is set, falls back to legacy ANTHROPIC_API_KEY.
*/
#define LLM_MAX_PROVIDERS 16
/* forward declarations */
static el_val_t llm_extract_text(el_val_t resp_val);
static el_val_t llm_extract_text_openai(el_val_t resp_val);
static el_val_t llm_extract_text_openai(el_val_t resp_val) {
const char* resp = EL_CSTR(resp_val);
if (!resp || !*resp) return el_wrap_str(el_strdup(""));
if (resp[0] == '{' && strstr(resp, "\"error\"")) return el_wrap_str(el_strdup(""));
const char* choices = json_find_key(resp, "choices");
if (!choices || *choices != '[') return el_wrap_str(el_strdup(""));
choices++;
while (*choices == ' ' || *choices == '\t') choices++;
if (*choices != '{') return el_wrap_str(el_strdup(""));
const char* end = json_skip_value(choices);
size_t n = (size_t)(end - choices);
char* obj = malloc(n + 1); memcpy(obj, choices, n); obj[n] = '\0';
const char* msg = json_find_key(obj, "message");
if (!msg || *msg != '{') { free(obj); return el_wrap_str(el_strdup("")); }
const char* msg_end = json_skip_value(msg);
size_t mn = (size_t)(msg_end - msg);
char* msg_obj = malloc(mn + 1); memcpy(msg_obj, msg, mn); msg_obj[mn] = '\0';
const char* content = json_find_key(msg_obj, "content");
el_val_t result = el_wrap_str(el_strdup(""));
if (content && *content == '"') {
JsonParser jp = { .p = content, .end = content + strlen(content), .err = 0 };
char* text = jp_parse_string_raw(&jp);
if (!jp.err && text) result = el_wrap_str(text);
}
free(msg_obj); free(obj);
return result;
}
/* Send a request to one provider. Returns the raw response string.
* format: 0 = openai, 1 = anthropic */
static el_val_t llm_provider_request(const char* url, const char* key,
int format, const char* model,
const char* system_str,
const char* user_str) {
char* esc_sys = system_str && *system_str ? json_escape_alloc(system_str) : NULL;
char* esc_user = json_escape_alloc(user_str ? user_str : "");
JsonBuf b; jb_init(&b);
struct curl_slist* h = NULL;
h = curl_slist_append(h, "Content-Type: application/json");
{
size_t n = strlen(api_key) + 16;
char* line = malloc(n);
snprintf(line, n, "x-api-key: %s", api_key);
h = curl_slist_append(h, line);
free(line);
if (format == 0) { /* OpenAI */
char full_url[1024];
if (strstr(url, "/chat/completions") || strstr(url, "/messages")) {
snprintf(full_url, sizeof(full_url), "%s", url);
} else {
snprintf(full_url, sizeof(full_url), "%s/v1/chat/completions", url);
}
{ size_t n = strlen(key)+24; char* l=malloc(n); snprintf(l,n,"Authorization: Bearer %s",key); h=curl_slist_append(h,l); free(l); }
jb_putc(&b, '{');
jb_puts(&b, "\"model\":"); jb_emit_escaped(&b, model ? model : "neuron");
jb_puts(&b, ",\"max_tokens\":4096,\"messages\":[");
if (esc_sys && *esc_sys) { jb_puts(&b,"{\"role\":\"system\",\"content\":\""); jb_puts(&b,esc_sys); jb_puts(&b,"\"},"); }
jb_puts(&b, "{\"role\":\"user\",\"content\":\""); jb_puts(&b, esc_user); jb_puts(&b, "\"}]}");
el_val_t resp = http_do("POST", full_url, b.buf, h);
curl_slist_free_all(h); free(b.buf);
if (esc_sys) free(esc_sys); free(esc_user);
return llm_extract_text_openai(resp);
} else { /* Anthropic */
{ size_t n = strlen(key)+16; char* l=malloc(n); snprintf(l,n,"x-api-key: %s",key); h=curl_slist_append(h,l); free(l); }
{ size_t n = strlen(LLM_VERSION)+32; char* l=malloc(n); snprintf(l,n,"anthropic-version: %s",LLM_VERSION); h=curl_slist_append(h,l); free(l); }
jb_putc(&b, '{');
jb_puts(&b, "\"model\":"); jb_emit_escaped(&b, model ? model : LLM_DEFAULT_MODEL);
jb_puts(&b, ",\"max_tokens\":4096");
if (esc_sys && *esc_sys) { jb_puts(&b,",\"system\":\""); jb_puts(&b,esc_sys); jb_puts(&b,"\""); }
jb_puts(&b, ",\"messages\":[{\"role\":\"user\",\"content\":\""); jb_puts(&b, esc_user); jb_puts(&b, "\"}]}");
el_val_t resp = http_do("POST", url, b.buf, h);
curl_slist_free_all(h); free(b.buf);
if (esc_sys) free(esc_sys); free(esc_user);
return llm_extract_text(resp);
}
{
size_t n = strlen(LLM_VERSION) + 32;
char* line = malloc(n);
snprintf(line, n, "anthropic-version: %s", LLM_VERSION);
h = curl_slist_append(h, line);
free(line);
}
static el_val_t llm_chain_call(const char* system_str, const char* user_str) {
char url_key[64], key_key[64], fmt_key[64], model_key[64];
for (int i = 0; i < LLM_MAX_PROVIDERS; i++) {
snprintf(url_key, sizeof(url_key), "NEURON_LLM_%d_URL", i);
snprintf(key_key, sizeof(key_key), "NEURON_LLM_%d_KEY", i);
snprintf(fmt_key, sizeof(fmt_key), "NEURON_LLM_%d_FORMAT", i);
snprintf(model_key, sizeof(model_key), "NEURON_LLM_%d_MODEL", i);
const char* url = getenv(url_key);
const char* key = getenv(key_key);
if (!url || !*url || !key || !*key) break; /* end of chain */
const char* fmt_s = getenv(fmt_key);
int fmt = (fmt_s && strcmp(fmt_s, "anthropic") == 0) ? 1 : 0;
const char* model = getenv(model_key);
fprintf(stderr, "[llm] trying provider %d (%s)\n", i, url);
el_val_t result = llm_provider_request(url, key, fmt, model, system_str, user_str);
const char* t = EL_CSTR(result);
if (t && *t && t[0] != '{') return result; /* success */
fprintf(stderr, "[llm] provider %d failed or empty, trying next\n", i);
}
/* Legacy fallback: ANTHROPIC_API_KEY */
const char* api_key = getenv("ANTHROPIC_API_KEY");
if (!api_key || !*api_key) return http_error_json("no LLM providers configured");
fprintf(stderr, "[llm] using legacy ANTHROPIC_API_KEY fallback\n");
return llm_provider_request(LLM_API_URL, api_key, 1, NULL, system_str, user_str);
}
/* Legacy llm_request — kept for backward compat with agentic loop internals */
static el_val_t llm_request(const char* json_body) {
const char* api_key = getenv("ANTHROPIC_API_KEY");
if (!api_key || !*api_key) return http_error_json("ANTHROPIC_API_KEY not set");
struct curl_slist* h = NULL;
h = curl_slist_append(h, "Content-Type: application/json");
{ size_t n=strlen(api_key)+16; char* l=malloc(n); snprintf(l,n,"x-api-key: %s",api_key); h=curl_slist_append(h,l); free(l); }
{ size_t n=strlen(LLM_VERSION)+32; char* l=malloc(n); snprintf(l,n,"anthropic-version: %s",LLM_VERSION); h=curl_slist_append(h,l); free(l); }
el_val_t resp = http_do("POST", LLM_API_URL, json_body, h);
curl_slist_free_all(h);
return resp;
@@ -4611,45 +4740,14 @@ static el_val_t llm_extract_text(el_val_t resp_val) {
}
el_val_t llm_call(el_val_t model, el_val_t prompt) {
const char* m = llm_resolve_model(EL_CSTR(model));
const char* u = EL_CSTR(prompt);
if (!u) u = "";
char* esc_user = json_escape_alloc(u);
JsonBuf b; jb_init(&b);
jb_putc(&b, '{');
jb_puts(&b, "\"model\":"); jb_emit_escaped(&b, m);
jb_puts(&b, ",\"max_tokens\":4096");
jb_puts(&b, ",\"messages\":[{\"role\":\"user\",\"content\":\"");
jb_puts(&b, esc_user);
jb_puts(&b, "\"}]}");
free(esc_user);
el_val_t resp = llm_request(b.buf);
free(b.buf);
return llm_extract_text(resp);
const char* u = EL_CSTR(prompt); if (!u) u = "";
return llm_chain_call(NULL, u);
}
el_val_t llm_call_system(el_val_t model, el_val_t system_prompt, el_val_t user_prompt) {
const char* m = llm_resolve_model(EL_CSTR(model));
const char* s = EL_CSTR(system_prompt); if (!s) s = "";
const char* u = EL_CSTR(user_prompt); if (!u) u = "";
char* esc_sys = json_escape_alloc(s);
char* esc_user = json_escape_alloc(u);
JsonBuf b; jb_init(&b);
jb_putc(&b, '{');
jb_puts(&b, "\"model\":"); jb_emit_escaped(&b, m);
jb_puts(&b, ",\"max_tokens\":4096");
if (*s) {
jb_puts(&b, ",\"system\":\"");
jb_puts(&b, esc_sys);
jb_puts(&b, "\"");
}
jb_puts(&b, ",\"messages\":[{\"role\":\"user\",\"content\":\"");
jb_puts(&b, esc_user);
jb_puts(&b, "\"}]}");
free(esc_sys); free(esc_user);
el_val_t resp = llm_request(b.buf);
free(b.buf);
return llm_extract_text(resp);
return llm_chain_call(s, u);
}
/* ── Tool registry for llm_call_agentic ─────────────────────────────────── */
+1 -1
View File
@@ -141,7 +141,7 @@ fn about_page() -> String {
</div>
<div class=\"footer-bottom\">
<p class=\"footer-copy\">&copy; 2026 Neuron Technologies. All rights reserved.</p>
<p class=\"footer-copy\">&copy; 2026 Neuron, LLC. All rights reserved.</p>
<p class=\"footer-tagline-bottom\">Your memory. Your AI.</p>
</div>
</div>
+1273
View File
File diff suppressed because it is too large Load Diff
+154 -38
View File
@@ -18,29 +18,40 @@ fn checkout_page(plan: String, pub_key: String) -> String {
let plan_name: String = if is_founding { "Founding Member" } else { if is_free { "Free" } else { "Professional" } }
let plan_price: String = if is_founding { "$199" } else { if is_free { "$0" } else { "$19 / month" } }
let plan_desc: String = if is_founding {
"Pay once. Neuron inference forever. No subscription, ever."
"Pay once. Neuron inference when it launches - priced below the major APIs. No subscription, ever."
} else { if is_free {
"Start building your memory. No card required."
} else {
"Full access. Neuron inference - cheaper than what you&#39;re paying now."
}
"Full access. Bring your own API keys or use Neuron Inference when it launches - Q3 2026."
} }
let plan_cadence: String = if is_founding { "one-time" } else { if is_free { "forever" } else { "billed monthly" } }
let features_html: String = if is_founding {
"<li>Neuron inference - priced below competitors, forever</li>
<li>Everything in Professional - forever</li>
"<li>Everything in Professional - forever</li>
<li>Neuron Inference when it launches - priced below the major APIs, forever</li>
<li>Never pay again - lifetime updates included</li>
<li>Founding member badge in the app</li>
<li>Private community - direct line to the team</li>
<li>Private founding member community</li>
<li>Shape the roadmap - your votes carry more weight</li>
<li>Beta features before general release</li>
<li>Name in the credits</li>"
} else { if is_free {
"<li>Persistent memory - never resets</li>
<li>Local inference via Ollama (coming)</li>
<li>Bring your own API keys</li>
<li>3 marketplace plugins included</li>
<li>Core built-in capabilities</li>
<li>2 devices included</li>"
} else {
"<li>Neuron inference - metered, priced below OpenAI and Anthropic</li>
<li>Persistent memory - never resets</li>
"<li>Persistent memory - never resets</li>
<li>Bring your own API keys (OpenAI, Anthropic, Grok...)</li>
<li>Neuron Inference when it launches - Q3 2026, priced below the major APIs</li>
<li>Unlimited projects</li>
<li>Full plugin marketplace</li>
<li>IDE, Slack, and more integrations</li>
<li>Early access to new features</li>"
}
<li>Early access to new features</li>
<li>2 devices included</li>"
} }
return "
<nav id=\"nav\">
@@ -79,9 +90,13 @@ fn checkout_page(plan: String, pub_key: String) -> String {
</p>
</div>
<!-- Right: sign-in + payment form -->
<!-- Right: either free thank-you or sign-in + payment form -->
<div class=\"checkout-form-wrap\">
" + (if is_free { "
<p class=\"label\" style=\"margin-bottom: 1.5rem; color: var(--navy);\">Create your account.</p>
<p class=\"checkout-auth-hint\" style=\"margin-bottom: 2rem;\">Create an account to reserve your free tier spot. You'll receive your download link and setup instructions at launch.</p>
" } else { "
<!-- Step 1: Social sign-in -->
<div id=\"auth-section\">
<p class=\"label\" style=\"margin-bottom: 1.25rem;\">Sign in to continue</p>
@@ -110,12 +125,12 @@ fn checkout_page(plan: String, pub_key: String) -> String {
<div id=\"auth-message\" class=\"checkout-message\" style=\"display:none;\"></div>
<div class=\"checkout-auth-divider\">
<span>or create an account</span>
<span id=\"auth-divider-label\">or create an account</span>
</div>
<div id=\"email-auth-form\">
<input type=\"email\" id=\"auth-email\" class=\"checkout-input\" placeholder=\"Email address\" autocomplete=\"email\">
<input type=\"password\" id=\"auth-password\" class=\"checkout-input\" placeholder=\"Password (min 8 characters)\" autocomplete=\"new-password\">
<input type=\"email\" id=\"auth-email\" class=\"checkout-input\" placeholder=\"Email address\" autocomplete=\"email\" style=\"width:100%;display:block;margin-bottom:.75rem\">
<input type=\"password\" id=\"auth-password\" class=\"checkout-input\" placeholder=\"Password - min 8 characters\" autocomplete=\"new-password\" style=\"width:100%;display:block;margin-bottom:.75rem\">
<button type=\"button\" class=\"checkout-email-btn\" onclick=\"signUpWithEmail()\">Create account &rarr;</button>
<p class=\"checkout-auth-hint\" style=\"margin-top:.75rem;text-align:center\">Already have an account? <a href=\"#\" onclick=\"showSignIn();return false;\" style=\"color:var(--navy)\">Sign in</a></p>
</div>
@@ -124,6 +139,45 @@ fn checkout_page(plan: String, pub_key: String) -> String {
<!-- Step 2: Payment form (revealed after auth) -->
<div id=\"payment-section\" style=\"display:none;\">
<div id=\"auth-badge\" style=\"display:none; margin-bottom: 1.5rem;\"></div>
<!-- Founding Member attestation (only shown for founding plan) -->
" + (if is_founding { "
<div id=\"founding-attestation\" style=\"margin-bottom:2rem;padding:1.5rem;border:1px solid rgba(0,82,160,.2);background:rgba(0,82,160,.03)\">
<p style=\"font-family:var(--body);font-weight:500;font-size:.9rem;color:var(--t1);margin-bottom:.75rem\">Before you continue</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:.8375rem;color:var(--t2);line-height:1.75;margin-bottom:1.25rem\">Founding Member is not a ceremonial title. These are the people who will work directly with the team to shape what Neuron becomes. You will have a real voice in what gets built, and we will take it seriously. That requires you to show up in good faith.</p>
<label style=\"display:flex;gap:.875rem;align-items:flex-start;cursor:pointer\">
<input type=\"checkbox\" id=\"founding-attest-cb\" style=\"margin-top:.2rem;width:16px;height:16px;flex-shrink:0;accent-color:var(--navy)\">
<span style=\"font-family:var(--body);font-weight:300;font-size:.8125rem;color:var(--t2);line-height:1.7\">
I am joining as a genuine early user, not to extract proprietary information about Neuron&#39;s technology, architecture, or roadmap. I will engage in good faith. I understand that if this is not my intent, a different plan is a better fit.
</span>
</label>
<p id=\"attest-warn\" style=\"display:none;font-family:var(--body);font-size:.8rem;color:#c44;margin-top:.75rem\">Please confirm the above before continuing.</p>
</div>
" } else { "" }) + "
<!-- Payment timing (Professional only, Founding always charges now) -->
" + (if !is_founding { "
<div style=\"margin-bottom:1.75rem\">
<p class=\"label\" style=\"margin-bottom:1rem\">When would you like to be charged?</p>
<div style=\"display:flex;flex-direction:column;gap:.625rem\">
<label class=\"checkout-timing-opt\" id=\"timing-now-label\">
<input type=\"radio\" name=\"charge-timing\" value=\"now\" id=\"timing-now\" checked style=\"accent-color:var(--navy)\">
<div>
<span style=\"font-family:var(--body);font-weight:500;font-size:.875rem;color:var(--t1)\">Charge me now</span>
<span style=\"font-family:var(--body);font-weight:300;font-size:.8rem;color:var(--t3);display:block;margin-top:.15rem\">Paying now signals you're serious. It gives us real signal about what people actually want to use Neuron for - not just who's curious. That shapes what we build first.</span>
</div>
</label>
<label class=\"checkout-timing-opt\" id=\"timing-later-label\">
<input type=\"radio\" name=\"charge-timing\" value=\"later\" id=\"timing-later\" style=\"accent-color:var(--navy)\">
<div>
<span style=\"font-family:var(--body);font-weight:500;font-size:.875rem;color:var(--t1)\">Hold until product launches (Q3 2026)</span>
<span style=\"font-family:var(--body);font-weight:300;font-size:.8rem;color:var(--t3);display:block;margin-top:.15rem\">We save your payment method securely. Nothing charged until launch. Cancel anytime before then.</span>
</div>
</label>
</div>
</div>
" } else { "" }) + "
<p class=\"label\" style=\"margin-bottom: 1.75rem;\">Payment</p>
<form id=\"payment-form\" autocomplete=\"on\">
@@ -132,7 +186,7 @@ fn checkout_page(plan: String, pub_key: String) -> String {
<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>
class=\"checkout-input\" placeholder=\"Full name\" required>
</div>
<div class=\"checkout-field\">
<label for=\"buyer-email\" class=\"checkout-label\">Email</label>
@@ -165,6 +219,7 @@ fn checkout_page(plan: String, pub_key: String) -> String {
</form>
</div><!-- /payment-section -->
" }) + "
</div>
</div>
@@ -273,6 +328,8 @@ fn checkout_page(plan: String, pub_key: String) -> String {
border: 1px solid rgba(0,82,160,.22);
padding: .75rem 1rem;
outline: none;
width: 100%;
box-sizing: border-box;
transition: border-color .2s;
border-radius: 0;
-webkit-appearance: none;
@@ -333,49 +390,74 @@ fn checkout_page(plan: String, pub_key: String) -> String {
font-size: .875rem;
color: var(--t2);
line-height: 1.6;
margin: 0 0 1.5rem;
margin: 0 0 1.75rem;
}
.checkout-social-btns {
display: flex;
flex-direction: column;
gap: .625rem;
margin-bottom: 1.5rem;
gap: .75rem;
margin-bottom: 1.75rem;
}
.checkout-social-btn {
display: flex;
align-items: center;
gap: .75rem;
gap: .875rem;
width: 100%;
padding: .75rem 1.25rem;
padding: .875rem 1.25rem;
background: #fff;
border: 1px solid rgba(0,82,160,.22);
border: 1.5px solid rgba(0,82,160,.18);
font-family: var(--body);
font-size: .9rem;
font-weight: 400;
font-size: .9375rem;
font-weight: 500;
color: var(--t1);
cursor: pointer;
transition: border-color .2s, background .2s;
transition: border-color .2s, background .2s, box-shadow .2s;
text-align: left;
border-radius: 0;
letter-spacing: .01em;
}
.checkout-social-btn:hover { border-color: rgba(0,82,160,.5); background: rgba(0,82,160,.03); }
.checkout-social-btn:disabled { opacity: .5; cursor: not-allowed; }
.checkout-social-btn:hover {
border-color: var(--navy);
background: rgba(0,82,160,.03);
box-shadow: 0 2px 12px rgba(0,82,160,.08);
}
.checkout-social-btn:disabled { opacity: .45; cursor: not-allowed; }
.checkout-auth-divider {
display: flex;
align-items: center;
gap: .75rem;
margin: 1.25rem 0 1rem;
gap: 1rem;
margin: 1.75rem 0 1.25rem;
color: var(--t3);
font-family: var(--body);
font-size: .8125rem;
font-size: .75rem;
font-weight: 500;
letter-spacing: .12em;
text-transform: uppercase;
}
.checkout-auth-divider::before,
.checkout-auth-divider::after {
content: '';
flex: 1;
height: 1px;
background: rgba(0,82,160,.15);
background: rgba(0,82,160,.12);
}
.checkout-email-btn {
display: block;
width: 100%;
padding: .875rem 1.5rem;
background: var(--navy);
color: #fff;
border: none;
font-family: var(--body);
font-size: .8125rem;
font-weight: 500;
letter-spacing: .12em;
text-transform: uppercase;
cursor: pointer;
margin-top: .75rem;
transition: background .2s, box-shadow .2s;
}
.checkout-email-btn:hover { background: #0078D4; box-shadow: 0 2px 16px rgba(0,82,160,.25); }
.checkout-skip-btn {
background: none;
border: none;
@@ -412,7 +494,9 @@ fn checkout_page(plan: String, pub_key: String) -> String {
fetch('/api/supabase-config')
.then(function(r) { return r.json(); })
.then(function(cfg) {
supabase = window.supabase.createClient(cfg.url, cfg.anon_key);
supabase = window.supabase.createClient(cfg.url, cfg.anon_key, {
auth: { flowType: 'implicit' }
});
cb();
})
.catch(function(err) {
@@ -444,15 +528,11 @@ fn checkout_page(plan: String, pub_key: String) -> String {
badge.style.display = '';
}
// Pre-fill email if available
// Pre-fill email only (not name let user enter their own)
if (user && user.email) {
var emailEl = document.getElementById('buyer-email');
if (emailEl) { emailEl.value = user.email; }
}
if (user && user.user_metadata && user.user_metadata.full_name) {
var nameEl = document.getElementById('buyer-name');
if (nameEl && !nameEl.value) { nameEl.value = user.user_metadata.full_name; }
}
}
// Check if already signed in on load
@@ -523,7 +603,7 @@ fn checkout_page(plan: String, pub_key: String) -> String {
var hint = form.querySelector('.checkout-auth-hint');
btn.textContent = 'Sign in ';
btn.onclick = signInWithEmail;
hint.innerHTML = 'New here? <a href=\\"#\\" onclick=\\"showSignUp();return false;\\" style=\\"color:var(--navy)\\">Create account</a> &nbsp;&middot;&nbsp; <a href=\\"#\\" onclick=\\"resetPassword();return false;\\" style=\\"color:var(--navy)\\">Forgot password?</a>';
/* hint replaced with DOM manipulation below */
};
window.showSignUp = function() {
@@ -532,7 +612,7 @@ fn checkout_page(plan: String, pub_key: String) -> String {
var hint = form.querySelector('.checkout-auth-hint');
btn.textContent = 'Create account ';
btn.onclick = signUpWithEmail;
hint.innerHTML = 'Already have an account? <a href=\\"#\\" onclick=\\"showSignIn();return false;\\" style=\\"color:var(--navy)\\">Sign in</a>';
/* hint replaced with DOM manipulation below */
};
window.signInWithEmail = function() {
@@ -601,6 +681,12 @@ fn checkout_page(plan: String, pub_key: String) -> String {
})
.then(function(r) { return r.json(); })
.then(function(data) {
if (data.error === 'sold_out') {
showMessage('All 1,000 Founding Member spots have been claimed. Thank you for your interest - please consider the Professional plan.');
var submitBtn = document.getElementById('submit-btn');
if (submitBtn) { submitBtn.disabled = true; submitBtn.textContent = 'Sold out'; }
return;
}
if (!data.client_secret) {
showMessage('Unable to initialise payment. Please try again.');
return;
@@ -678,6 +764,15 @@ fn checkout_page(plan: String, pub_key: String) -> String {
e.preventDefault();
if (!stripe || !elements) return;
// Founding Member attestation gate
var attestCb = document.getElementById('founding-attest-cb');
if (attestCb && !attestCb.checked) {
var warn = document.getElementById('attest-warn');
if (warn) warn.style.display = 'block';
attestCb.closest('label').scrollIntoView({ behavior: 'smooth', block: 'center' });
return;
}
var name = document.getElementById('buyer-name').value.trim();
var email = document.getElementById('buyer-email').value.trim();
if (!name || !email) {
@@ -685,6 +780,27 @@ fn checkout_page(plan: String, pub_key: String) -> String {
return;
}
// Save founding member attestation before charging independent audit record
if (attestCb) {
try {
await fetch('/api/attest', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
plan: PLAN,
name: name,
email: email,
timestamp: new Date().toISOString(),
attestation: 'I am joining as a genuine early user, not to extract proprietary information about Neuron technology, architecture, or roadmap. I will engage in good faith. I understand that if this is not my intent, a different plan is a better fit.',
user_agent: navigator.userAgent
})
});
} catch(e) {
// Non-blocking attestation log failure does not stop payment
console.warn('attestation log failed', e);
}
}
setLoading(true);
document.getElementById('payment-message').style.display = 'none';
+41 -13
View File
@@ -19,21 +19,41 @@ fn comparison() -> String {
</p>
</div>
<div class=\"comparison-table reveal\" style=\"transition-delay:200ms;overflow-x:auto\">
<table style=\"width:100%;border-collapse:collapse;font-family:var(--body);font-size:0.875rem\">
<div class=\"comparison-table reveal\" style=\"transition-delay:200ms;overflow-x:auto;-webkit-overflow-scrolling:touch\">
<table style=\"width:100%;min-width:560px;border-collapse:collapse;font-family:var(--body);font-size:0.875rem\">
<thead>
<tr style=\"border-bottom:2px solid rgba(0,82,160,.20)\">
<th style=\"text-align:left;padding:1rem 1.5rem 1rem 0;font-weight:500;letter-spacing:0.08em;color:var(--t3);font-size:0.75rem;text-transform:uppercase;width:28%\">Feature</th>
<th style=\"text-align:center;padding:1rem 1rem;font-weight:600;color:var(--navy);font-size:0.875rem;width:18%\">
<div style=\"display:inline-flex;flex-direction:column;align-items:center;gap:0.25rem\">
<span style=\"font-size:1.1rem\">&#9679;</span>
<th style=\"text-align:center;padding:0.75rem 1rem;font-weight:600;color:var(--navy);font-size:0.875rem;width:18%\">
<div style=\"display:inline-flex;flex-direction:column;align-items:center;gap:0.35rem\">
<img src=\"/assets/neuron-icon.png\" alt=\"Neuron\" style=\"width:28px;height:28px\">
Neuron
</div>
</th>
<th style=\"text-align:center;padding:1rem 1rem;font-weight:400;color:var(--t3);font-size:0.875rem;width:13.5%\">ChatGPT</th>
<th style=\"text-align:center;padding:1rem 1rem;font-weight:400;color:var(--t3);font-size:0.875rem;width:13.5%\">Claude</th>
<th style=\"text-align:center;padding:1rem 1rem;font-weight:400;color:var(--t3);font-size:0.875rem;width:13.5%\">Gemini</th>
<th style=\"text-align:center;padding:1rem 1rem;font-weight:400;color:var(--t3);font-size:0.875rem;width:13.5%\">Copilot</th>
<th style=\"text-align:center;padding:0.75rem 1rem;font-weight:400;color:var(--t3);font-size:0.8rem;width:13.5%\">
<div style=\"display:flex;flex-direction:column;align-items:center;gap:0.35rem\">
<img src=\"https://cdn.simpleicons.org/openai/000000\" alt=\"ChatGPT\" style=\"width:24px;height:24px\">
ChatGPT
</div>
</th>
<th style=\"text-align:center;padding:0.75rem 1rem;font-weight:400;color:var(--t3);font-size:0.8rem;width:13.5%\">
<div style=\"display:flex;flex-direction:column;align-items:center;gap:0.35rem\">
<img src=\"https://cdn.simpleicons.org/anthropic/000000\" alt=\"Claude\" style=\"width:24px;height:24px\">
Claude
</div>
</th>
<th style=\"text-align:center;padding:0.75rem 1rem;font-weight:400;color:var(--t3);font-size:0.8rem;width:13.5%\">
<div style=\"display:flex;flex-direction:column;align-items:center;gap:0.35rem\">
<img src=\"https://cdn.simpleicons.org/googlegemini\" alt=\"Gemini\" style=\"width:24px;height:24px\">
Gemini
</div>
</th>
<th style=\"text-align:center;padding:0.75rem 1rem;font-weight:400;color:var(--t3);font-size:0.8rem;width:13.5%\">
<div style=\"display:flex;flex-direction:column;align-items:center;gap:0.35rem\">
<img src=\"https://cdn.simpleicons.org/microsoftcopilot/0078D4\" alt=\"Copilot\" style=\"width:24px;height:24px\">
Copilot
</div>
</th>
</tr>
</thead>
<tbody>
@@ -63,7 +83,7 @@ fn comparison() -> String {
</tr>
<tr style=\"border-bottom:1px solid rgba(0,0,0,.06);background:rgba(0,82,160,.02)\">
<td style=\"padding:1rem 1.5rem 1rem 0;color:var(--t1);font-weight:500\">Works offline</td>
<td style=\"text-align:center;padding:1rem\"><span style=\"color:#008040;font-weight:700;font-size:1.1rem\">&#10003;</span><br><span style=\"font-size:0.7rem;color:var(--t3);font-weight:400\">Local inference via Ollama</span></td>
<td style=\"text-align:center;padding:1rem\"><span style=\"color:#D4A017\">&#9679;</span><br><span style=\"font-size:0.7rem;color:var(--t3);font-weight:400\">Coming soon</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#C44\">&#10005;</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#C44\">&#10005;</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#C44\">&#10005;</span></td>
@@ -71,7 +91,7 @@ fn comparison() -> String {
</tr>
<tr style=\"border-bottom:1px solid rgba(0,0,0,.06)\">
<td style=\"padding:1rem 1.5rem 1rem 0;color:var(--t1);font-weight:500\">Bring your own API keys</td>
<td style=\"text-align:center;padding:1rem\"><span style=\"color:#008040;font-weight:700;font-size:1.1rem\">&#10003;</span><br><span style=\"font-size:0.7rem;color:var(--t3);font-weight:400\">OpenAI, Anthropic, Groq...</span></td>
<td style=\"text-align:center;padding:1rem\"><span style=\"color:#008040;font-weight:700;font-size:1.1rem\">&#10003;</span><br><span style=\"font-size:0.7rem;color:var(--t3);font-weight:400\">OpenAI, Anthropic, Grok...</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#C44\">&#10005;</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#C44\">&#10005;</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#C44\">&#10005;</span></td>
@@ -85,6 +105,14 @@ fn comparison() -> String {
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#C44\">&#10005;</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#C44\">&#10005;</span></td>
</tr>
<tr style=\"border-bottom:1px solid rgba(0,0,0,.06)\">
<td style=\"padding:1rem 1.5rem 1rem 0;color:var(--t1);font-weight:500\">Images &amp; video generation</td>
<td style=\"text-align:center;padding:1rem\"><span style=\"color:#D4A017\">&#9679;</span><br><span style=\"font-size:0.7rem;color:var(--t3);font-weight:400\">Coming soon</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#008040;font-weight:700;font-size:1.1rem\">&#10003;</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#008040;font-weight:700;font-size:1.1rem\">&#10003;</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#008040;font-weight:700;font-size:1.1rem\">&#10003;</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"color:#008040;font-weight:700;font-size:1.1rem\">&#10003;</span></td>
</tr>
<tr style=\"border-bottom:1px solid rgba(0,0,0,.06)\">
<td style=\"padding:1rem 1.5rem 1rem 0;color:var(--t1);font-weight:500\">You own your outputs</td>
<td style=\"text-align:center;padding:1rem\"><span style=\"color:#008040;font-weight:700;font-size:1.1rem\">&#10003;</span><br><span style=\"font-size:0.7rem;color:var(--t3);font-weight:400\">No platform claim, ever</span></td>
@@ -95,7 +123,7 @@ fn comparison() -> String {
</tr>
<tr style=\"border-bottom:1px solid rgba(0,0,0,.06);background:rgba(0,82,160,.02)\">
<td style=\"padding:1rem 1.5rem 1rem 0;color:var(--t1);font-weight:500\">Price (with inference)</td>
<td style=\"text-align:center;padding:1rem\"><span style=\"color:#008040;font-weight:700;font-size:1rem\">$19/mo</span><br><span style=\"font-size:0.7rem;color:var(--t3);font-weight:400\">or $199 lifetime</span></td>
<td style=\"text-align:center;padding:1rem\"><span style=\"color:#008040;font-weight:700;font-size:1rem\">$19/mo</span><br><span style=\"font-size:0.7rem;color:var(--t3);font-weight:400\">or $199 founding (first 1,000)</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"font-weight:500;color:var(--t2)\">$20/mo</span><br><span style=\"font-size:0.7rem\">forgets you</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"font-weight:500;color:var(--t2)\">$20/mo</span><br><span style=\"font-size:0.7rem\">no memory</span></td>
<td style=\"text-align:center;padding:1rem;color:var(--t3)\"><span style=\"font-weight:500;color:var(--t2)\">Free&#8211;$20</span><br><span style=\"font-size:0.7rem\">no memory</span></td>
@@ -125,7 +153,7 @@ fn comparison() -> String {
</div>
</div>
<div class=\"reveal\" style=\"transition-delay:400ms;margin-top:4rem;padding:2.5rem 3rem;background:var(--card);border:1px solid rgba(0,82,160,.12);border-left:3px solid var(--navy)\">
<div class=\"reveal\" style=\"transition-delay:400ms;margin-top:4rem;padding:clamp(1.5rem,4vw,2.5rem) clamp(1.25rem,4vw,3rem);background:var(--card);border:1px solid rgba(0,82,160,.12);border-left:3px solid var(--navy)\">
<p style=\"font-family:var(--body);font-weight:300;font-size:1rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">
The others are impressive. Some of them are extraordinary at what they do. But they are all built on the same assumption: <em>your context lives in their cloud, session to session, at their discretion.</em>
</p>
+4 -6
View File
@@ -33,7 +33,7 @@ fn efficiency() -> String {
<p class=\"efficiency-stat\">0 cloud tokens</p>
<p class=\"efficiency-title\">Local inference</p>
<div class=\"efficiency-rule\"></div>
<p class=\"efficiency-body\">Free tier runs entirely on-device via Ollama. No API calls, no inference cost, no carbon footprint from model compute. Full memory and context, zero cloud dependency.</p>
<p class=\"efficiency-body\">The design: run inference entirely on-device via Ollama. No API calls, no inference cost, no carbon footprint from model compute. Full memory and context, zero cloud dependency. This is coming.</p>
</div>
<div class=\"efficiency-card card-dark reveal\" style=\"transition-delay:150ms\">
@@ -43,7 +43,7 @@ fn efficiency() -> String {
<path d=\"M6 16V8l6-4 6 4\"/><path d=\"M6 16l6 4 6-4\"/><path d=\"M12 4v16\"/>
</svg>
</div>
<p class=\"efficiency-stat\">35% less spend</p>
<p class=\"efficiency-stat\">Use less</p>
<p class=\"efficiency-title\">Per-task routing</p>
<div class=\"efficiency-rule\"></div>
<p class=\"efficiency-body\">Simple tasks route to small, fast models. Complex reasoning escalates to frontier models only when necessary. And because every model has full access to your accumulated context, cheaper models punch well above their weight.</p>
@@ -57,12 +57,10 @@ fn efficiency() -> String {
<path d=\"M16 15l2 2 2-2\"/>
</svg>
</div>
<p class=\"efficiency-stat\">35% fewer tokens</p>
<p class=\"efficiency-stat\">Fewer tokens</p>
<p class=\"efficiency-title\">Same work done</p>
<div class=\"efficiency-rule\"></div>
<p class=\"efficiency-body\">Neuron delivers a 35% reduction in tokens across your AI interactions. Less computation. Lower cost. A smaller footprint. This isn&#39;t a setting you toggle &mdash; it&#39;s what persistent context does by default.</p>
<p class=\"efficiency-body\" style=\"margin-top:0.75rem\">Every time you open ChatGPT and explain who you are again, that&#39;s computation that didn&#39;t need to happen. With Neuron, that context tax doesn&#39;t accumulate. Over months of use, 35% fewer tokens compounds into a meaningful reduction in total compute &mdash; and a meaningful reduction in what you pay.</p>
<p class=\"efficiency-body\" style=\"margin-top:0.75rem;color:var(--t2)\">This isn&#39;t a green marketing claim. It&#39;s a consequence of the design. The same architecture that makes Neuron better for you also makes it lighter on the planet.</p>
<p class=\"efficiency-body\">Every time you open ChatGPT and explain who you are again, that&#39;s computation that didn&#39;t need to happen. Persistent context means shorter, more targeted prompts. The same outcome with less compute - and a smaller footprint on the planet.</p>
</div>
</div>
+21 -8
View File
@@ -39,7 +39,7 @@ fn enterprise() -> String {
<div class=\"enterprise-cap card-dark reveal\" style=\"transition-delay:130ms\">
<h3 class=\"display-md\">Institutional memory</h3>
<div class=\"enterprise-cap-rule\"></div>
<p class=\"enterprise-cap-body\">When an employee leaves, their expertise doesn&#39;t. Their memory graph persists - their patterns, their domain knowledge, their reasoning - available to the team they built it with.</p>
<p class=\"enterprise-cap-body\">When an employee leaves, their expertise doesn&#39;t. Their memory persists - their patterns, their domain knowledge, their reasoning - available to the team they built it with.</p>
</div>
<div class=\"enterprise-cap card-dark reveal\" style=\"transition-delay:260ms\">
<h3 class=\"display-md\">Team intelligence</h3>
@@ -91,30 +91,30 @@ fn enterprise() -> String {
<p class=\"label\" style=\"margin-bottom:0.75rem;font-size:0.65rem\">Express interest</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9rem;color:var(--t2);line-height:1.75;margin-bottom:2rem\">I review every inquiry myself. Fill this out honestly - the questions are a filter, not a formality.</p>
<form id=\"enterprise-form\" style=\"display:grid;grid-template-columns:1fr 1fr;gap:1rem\">
<form id=\"enterprise-form\" class=\"ent-inquiry-form\">
<div style=\"display:flex;flex-direction:column;gap:0.4rem\">
<label for=\"ent-name\" style=\"font-family:var(--body);font-size:0.7rem;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--t3)\">Name</label>
<input id=\"ent-name\" name=\"name\" type=\"text\" required placeholder=\"Your name\"
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none\">
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none;width:100%;box-sizing:border-box\">
</div>
<div style=\"display:flex;flex-direction:column;gap:0.4rem\">
<label for=\"ent-email\" style=\"font-family:var(--body);font-size:0.7rem;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--t3)\">Work email</label>
<input id=\"ent-email\" name=\"email\" type=\"email\" required placeholder=\"you@company.com\"
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none\">
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none;width:100%;box-sizing:border-box\">
</div>
<div style=\"display:flex;flex-direction:column;gap:0.4rem\">
<label for=\"ent-company\" style=\"font-family:var(--body);font-size:0.7rem;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--t3)\">Organization</label>
<input id=\"ent-company\" name=\"company\" type=\"text\" required placeholder=\"Company or organization name\"
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none\">
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none;width:100%;box-sizing:border-box\">
</div>
<div style=\"display:flex;flex-direction:column;gap:0.4rem\">
<label for=\"ent-size\" style=\"font-family:var(--body);font-size:0.7rem;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--t3)\">Team size</label>
<select id=\"ent-size\" name=\"size\" required
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none;cursor:pointer\">
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none;cursor:pointer;width:100%;box-sizing:border-box\">
<option value=\"\">Select&hellip;</option>
<option value=\"2-10\">2&#8211;10 people</option>
<option value=\"11-50\">11&#8211;50 people</option>
@@ -127,13 +127,13 @@ fn enterprise() -> String {
<div style=\"grid-column:1/-1;display:flex;flex-direction:column;gap:0.4rem\">
<label for=\"ent-use\" style=\"font-family:var(--body);font-size:0.7rem;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--t3)\">What do you want to use Neuron for?</label>
<textarea id=\"ent-use\" name=\"use_case\" required rows=\"3\" placeholder=\"Describe your intended use case - be specific.\"
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;resize:vertical;-webkit-appearance:none\"></textarea>
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;resize:vertical;-webkit-appearance:none;width:100%;box-sizing:border-box\"></textarea>
</div>
<div style=\"grid-column:1/-1;display:flex;flex-direction:column;gap:0.4rem\">
<label for=\"ent-headcount\" style=\"font-family:var(--body);font-size:0.7rem;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--t3)\">Is reducing headcount a primary goal of this deployment?</label>
<select id=\"ent-headcount\" name=\"headcount\" required onchange=\"entHeadcountChange(this.value)\"
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none;cursor:pointer\">
style=\"font-family:var(--body);font-size:0.9rem;font-weight:300;color:var(--t1);background:#fff;border:1px solid rgba(0,82,160,.22);padding:0.7rem 0.9rem;outline:none;border-radius:0;-webkit-appearance:none;cursor:pointer;width:100%;box-sizing:border-box\">
<option value=\"\">Select&hellip;</option>
<option value=\"no\">No - making our team more capable</option>
<option value=\"secondary\">It&#39;s a secondary factor, not the primary goal</option>
@@ -169,6 +169,19 @@ fn enterprise() -> String {
</div>
</section>
<style>
.ent-inquiry-form {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
@media (max-width: 600px) {
.ent-inquiry-form { grid-template-columns: 1fr; }
.ent-inquiry-form > div[style*=\"grid-column:1/-1\"],
.ent-inquiry-form > div[style*=\"grid-column: 1 / -1\"] { grid-column: 1; }
}
</style>
<script>
(function() {
var form = document.getElementById('enterprise-form');
+11 -11
View File
@@ -11,9 +11,9 @@ fn enterprise_terms_page() -> String {
fn section(num: String, title: String, body: String) -> String {
return "
<div style=\"margin-bottom:3rem\">
<div style=\"display:flex;align-items:baseline;gap:1rem;margin-bottom:1.25rem;border-bottom:1px solid var(--border);padding-bottom:0.75rem\">
<span style=\"font-family:var(--body);font-size:0.75rem;font-weight:600;letter-spacing:0.15em;text-transform:uppercase;color:var(--navy-65)\">&#167; " + num + "</span>
<h2 style=\"font-family:var(--head);font-size:1.25rem;font-weight:600;color:var(--t1)\">" + title + "</h2>
<div style=\"display:flex;align-items:baseline;flex-wrap:wrap;gap:0.5rem 1rem;margin-bottom:1.25rem;border-bottom:1px solid var(--border);padding-bottom:0.75rem\">
<span style=\"font-family:var(--body);font-size:0.75rem;font-weight:600;letter-spacing:0.15em;text-transform:uppercase;color:var(--navy-65);flex-shrink:0\">&#167; " + num + "</span>
<h2 style=\"font-family:var(--head);font-size:1.25rem;font-weight:600;color:var(--t1);min-width:0;word-break:break-word\">" + title + "</h2>
</div>
" + body + "
</div>"
@@ -33,7 +33,7 @@ fn p_caps(text: String) -> String {
fn enterprise_terms_body() -> String {
return nav() + "
<div style=\"max-width:720px;margin:0 auto;padding:6rem 2.5rem 8rem\">
<div style=\"max-width:720px;margin:0 auto;padding:6rem clamp(1rem,5vw,2.5rem) 8rem;box-sizing:border-box;overflow-wrap:break-word;word-break:break-word\">
<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>
</div>
@@ -52,7 +52,7 @@ fn enterprise_terms_body() -> String {
+ p_last("Customer may not: (a) sublicense, resell, or distribute the Software to third parties; (b) reverse engineer, decompile, or attempt to extract source code or trained model weights; (c) use the Software to build a competing product; or (d) remove or obscure any proprietary notices. Private Cloud deployments may be deployed to Customer&#39;s infrastructure but may not be transferred or made available to entities other than Customer&#39;s own employees and contractors under appropriate confidentiality obligations.")
) + section("3", "Data and Privacy",
p("Neuron&#39;s architecture is designed to minimize data exposure. In private cloud and air-gapped deployments, no data leaves Customer&#39;s infrastructure. Neuron has no access to Customer data in these configurations.")
+ p("In cloud-hosted deployments, Neuron processes Customer data solely to deliver the contracted services. Customer data is stored in an isolated tenant, is not commingled with other customers&#39; data, and is not used for model training, analytics, or any purpose beyond service delivery. When Customer activates network features - including relay, peer-to-peer sync, or collaborative features - data required to operate those features may be transmitted to other network participants or Neuron infrastructure; such transmission is limited to the minimum required, excludes Customer&#39;s memory graph and conversation history unless Customer explicitly enables a sharing feature, and is used only to deliver the activated feature. Network features route data through Neuron&#39;s messaging backplane. That data is encrypted end-to-end - Neuron cannot read it - and is not stored or retained after transmission.")
+ p("In cloud-hosted deployments, Neuron processes Customer data solely to deliver the contracted services. Customer data is stored in an isolated tenant, is not commingled with other customers&#39; data, and is not used for model training, analytics, or any purpose beyond service delivery. When Customer activates network features - including relay, peer-to-peer sync, or collaborative features - data required to operate those features may be transmitted to other network participants or Neuron infrastructure; such transmission is limited to the minimum required, excludes Customer&#39;s memory and conversation history unless Customer explicitly enables a sharing feature, and is used only to deliver the activated feature. Network features route data through Neuron&#39;s messaging backplane. That data is encrypted end-to-end - Neuron cannot read it - and is not stored or retained after transmission.")
+ p("Customer owns all data processed through the platform. Customer data is not Customer&#39;s data in the legal sense of the term as used in data processing frameworks - Customer is the controller. Neuron is the processor. Upon termination, Customer data is returned or destroyed within 30 days at Customer&#39;s election. We do not retain copies.")
+ p_last("Where required by applicable law, Neuron will execute a Data Processing Agreement (DPA) as a supplement to this Agreement. Contact enterprise@neurontechnologies.ai to initiate. Neuron will notify Customer within 72 hours of becoming aware of any confirmed breach affecting Customer data.")
) + section("4", "Values Alignment",
@@ -74,7 +74,7 @@ fn enterprise_terms_body() -> String {
+ p_last("These obligations survive termination of this Agreement for three years. Receiving Party may disclose Confidential Information to the extent required by law or court order, provided that Receiving Party gives Disclosing Party prompt written notice and cooperates with any effort to obtain a protective order.")
) + section("8", "Intellectual Property",
p("Neuron retains all right, title, and interest in and to the Software, including all improvements, updates, and derivative works, and all intellectual property rights therein. No title to or ownership of the Software transfers to Customer under this Agreement.")
+ p("Customer retains all right, title, and interest in and to Customer&#39;s data, including inputs, memory graphs, and outputs generated through Customer&#39;s use of the platform. Neuron does not claim ownership of Customer&#39;s outputs. Customer is responsible for evaluating the accuracy and appropriateness of outputs before relying on them.")
+ p("Customer retains all right, title, and interest in and to Customer&#39;s data, including inputs, memorys, and outputs generated through Customer&#39;s use of the platform. Neuron does not claim ownership of Customer&#39;s outputs. Customer is responsible for evaluating the accuracy and appropriateness of outputs before relying on them.")
+ p_last("This Agreement does not grant Customer any right to use Neuron&#39;s trademarks, trade names, or logos except as expressly authorized in writing. Neuron Aligned Partner certification (&#167; 14) includes a limited right to use the partner designation as specified in the Partner Addendum.")
) + section("9", "Indemnification",
p("Neuron will defend Customer against third-party claims that the Software, as provided by Neuron and used in accordance with this Agreement, infringes a valid patent, copyright, or trademark, and will indemnify Customer for damages finally awarded in such a proceeding or agreed in settlement. This obligation does not apply to claims arising from: (a) Customer&#39;s modification of the Software; (b) Customer&#39;s combination of the Software with third-party products or data not provided by Neuron; or (c) Customer&#39;s use of the Software in violation of this Agreement.")
@@ -99,17 +99,17 @@ fn enterprise_terms_body() -> String {
) + "
<!-- Neuron Aligned Partner Program - highlighted section -->
<div style=\"margin-bottom:3rem;padding:2rem 2.25rem;border:1.5px solid rgba(0,82,160,.35);background:rgba(0,82,160,.03)\">
<div style=\"display:flex;align-items:baseline;gap:1rem;margin-bottom:1.25rem;border-bottom:1px solid rgba(0,82,160,.20);padding-bottom:0.75rem\">
<span style=\"font-family:var(--body);font-size:0.75rem;font-weight:600;letter-spacing:0.15em;text-transform:uppercase;color:var(--navy-65)\">&#167; 14</span>
<h2 style=\"font-family:var(--head);font-size:1.25rem;font-weight:600;color:var(--t1)\">Neuron Aligned Partner Program</h2>
<div style=\"margin-bottom:3rem;padding:clamp(1.25rem,4vw,2rem) clamp(1rem,4vw,2.25rem);border:1.5px solid rgba(0,82,160,.35);background:rgba(0,82,160,.03);box-sizing:border-box\">
<div style=\"display:flex;align-items:baseline;flex-wrap:wrap;gap:0.5rem 1rem;margin-bottom:1.25rem;border-bottom:1px solid rgba(0,82,160,.20);padding-bottom:0.75rem\">
<span style=\"font-family:var(--body);font-size:0.75rem;font-weight:600;letter-spacing:0.15em;text-transform:uppercase;color:var(--navy-65);flex-shrink:0\">&#167; 14</span>
<h2 style=\"font-family:var(--head);font-size:1.25rem;font-weight:600;color:var(--t1);min-width:0;word-break:break-word\">Neuron Aligned Partner Program</h2>
</div>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Participation in the Neuron Aligned Partner Program is entirely voluntary. No enterprise customer is required to participate, and the standard enterprise relationship under this Agreement is not conditioned on it.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">An organization that chooses to participate executes a Neuron Aligned Partner Addendum (&#34;Partner Addendum&#34;), a separate document supplementing this Agreement. In the Partner Addendum, Customer makes the following certification:</p>
<div style=\"margin:1.5rem 0;padding:1.25rem 1.5rem;border-left:3px solid var(--navy);background:rgba(0,82,160,.04)\">
<div style=\"margin:1.5rem 0;padding:1.25rem 1.5rem;border-left:3px solid var(--navy);background:rgba(0,82,160,.04);box-sizing:border-box\">
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);line-height:1.8;font-style:italic\">&#34;We are deploying Neuron to make our people more capable, not to eliminate them. Reducing headcount is not a primary objective of this deployment. We commit to using this technology in a manner consistent with the welfare of our workforce, and we will notify Neuron if our intentions change in ways that materially contradict this commitment.&#34;</p>
</div>
+14 -9
View File
@@ -9,7 +9,7 @@ fn environmental() -> String {
<section id=\"environmental\" aria-label=\"Environmental impact\" style=\"padding:8rem 2.5rem;background:var(--bg)\">
<div class=\"container-lg\">
<div style=\"display:grid;grid-template-columns:1fr 1fr;gap:6rem;align-items:start\">
<div style=\"display:grid;grid-template-columns:1fr 1fr;gap:6rem;align-items:start\" class=\"env-grid\">
<div>
<div style=\"display:flex;align-items:center;gap:1.5rem;margin-bottom:2rem\">
@@ -18,15 +18,15 @@ fn environmental() -> String {
</div>
<h2 class=\"display-lg reveal\" style=\"transition-delay:80ms;margin-bottom:1.5rem\">
35% fewer tokens.<br><span class=\"gold\">Same work done.</span>
Fewer tokens.<br><span class=\"gold\">Same work done.</span>
</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\">
Neuron delivers a 35% reduction in tokens across your AI interactions. Less computation. Lower cost. A smaller footprint. This isn&#39;t a setting you toggle - it&#39;s what persistent context does by default.
Persistent context means shorter, more targeted prompts on every call. Less computation. Lower cost. A smaller footprint. This isn&#39;t a setting you toggle - it&#39;s what the architecture does by default.
</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\">
Every time you open ChatGPT and explain who you are again, that&#39;s computation that didn&#39;t need to happen. With Neuron, that context tax doesn&#39;t accumulate. Over months of use, 35% fewer tokens compounds into a meaningful reduction in total compute - and a meaningful reduction in what you pay.
Every time you open ChatGPT and explain who you are again, that&#39;s computation that didn&#39;t need to happen. With Neuron, that context tax doesn&#39;t accumulate. Over months of use, the savings compound into a meaningful reduction in total compute - and a meaningful reduction in what you pay.
</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;margin-bottom:2.5rem\">
@@ -41,7 +41,7 @@ fn environmental() -> String {
<span id=\"calc-savings\" style=\"font-family:var(--head);font-size:2.5rem;font-weight:600;color:var(--navy)\">$240</span>
<span style=\"font-family:var(--body);font-size:0.7rem;font-weight:500;letter-spacing:0.15em;text-transform:uppercase;color:var(--t3)\">saved per year</span>
</div>
<p style=\"font-family:var(--body);font-size:0.75rem;color:var(--t3)\">Based on 35% token reduction applied to your monthly spend.</p>
<p style=\"font-family:var(--body);font-size:0.75rem;color:var(--t3)\">Based on estimated token reduction applied to your monthly spend.</p>
</div>
<script>
@@ -65,10 +65,10 @@ fn environmental() -> String {
<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,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\">Local inference</p>
<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\">Local inference - coming</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">Your GPU, already powered on</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.7\">
When you run inference locally via Ollama, your device&#39;s GPU handles it - hardware that&#39;s already consuming power. No data center spins up a cluster for your query. No round-trip. No idle servers waiting at scale.
The design: when you run inference locally via Ollama, your device&#39;s GPU handles it - hardware that&#39;s already consuming power. No data center spins up a cluster for your query. No round-trip. No idle servers waiting at scale. This is where we&#39;re headed.
</p>
</div>
@@ -84,13 +84,13 @@ fn environmental() -> String {
<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\">Persistent context = less recomputation</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">No re-explaining. No wasted tokens.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.7\">
Neuron surfaces exactly what&#39;s relevant for each conversation - no re-deriving who you are from long histories. Shorter, more targeted prompts. 35% fewer tokens per useful outcome.
Neuron surfaces exactly what&#39;s relevant for each conversation - no re-deriving who you are from long histories. Shorter, more targeted prompts. More with less.
</p>
</div>
<div class=\"reveal\" style=\"transition-delay:400ms;padding:1.25rem 1.75rem;background:rgba(0,0,0,.03);border:1px solid rgba(0,0,0,.07);border-radius:2px\">
<p style=\"font-family:var(--body);font-size:0.8125rem;font-weight:300;color:var(--t3);line-height:1.7\">
<strong style=\"font-weight:500;color:var(--t2)\">The honest picture:</strong> When you use Neuron with BYOK providers (OpenAI, Anthropic, Groq) or Neuron Inference, those queries travel to inference servers - that footprint exists. The savings come from the architecture: persistent memory and local-first design reduce the total computation required to get the same work done.
<strong style=\"font-weight:500;color:var(--t2)\">The honest picture:</strong> When you use Neuron with BYOK providers (OpenAI, Anthropic, Grok) or Neuron Inference, those queries travel to inference servers - that footprint exists. The savings come from the architecture: persistent memory and local-first design reduce the total computation required to get the same work done.
</p>
</div>
@@ -99,5 +99,10 @@ fn environmental() -> String {
</div>
</section>
<style>
@media (max-width: 768px) {
.env-grid { grid-template-columns: 1fr !important; gap: 2rem !important; }
}
</style>
"
}
+1 -1
View File
@@ -27,7 +27,7 @@ fn footer() -> String {
</div>
<div class=\"footer-bottom\">
<p class=\"footer-copy\">&copy; 2026 Neuron Technologies. All rights reserved.</p>
<p class=\"footer-copy\">&copy; 2026 Neuron, LLC. All rights reserved.</p>
<p class=\"footer-tagline-bottom\">Your memory. Your AI.</p>
</div>
</div>
+1 -1
View File
@@ -1 +1 @@
47
2
+267
View File
@@ -0,0 +1,267 @@
// components/gallery.el - "Things Neuron Said" gallery page.
// Uses the full site nav and styles consistent with the rest of the site.
fn gallery_page(cards_json: String) -> String {
let i: Int = 0
let cards_html: String = ""
let n: Int = json_array_len(cards_json)
while i < n {
let card: String = json_array_get(cards_json, i)
let cid: String = json_get(card, "id")
let cq: String = json_get(card, "question")
let ca: String = json_get(card, "answer")
let score_raw: String = json_get(card, "score")
let score: String = if str_eq(score_raw, "") { "0" } else { score_raw }
let q_html: String = str_replace(str_replace(str_replace(cq, "&", "&amp;"), "<", "&lt;"), ">", "&gt;")
let a_html: String = str_replace(str_replace(str_replace(ca, "&", "&amp;"), "<", "&lt;"), ">", "&gt;")
let ts_raw: String = json_get(card, "created_at")
let ts_short: String = str_slice(ts_raw, 0, 10)
let votes_label: String = if str_eq(score, "1") { "1 vote" } else { score + " votes" }
let card_open: String = "<a href=\"/share/" + cid + "\" class=\"gal-card\" data-score=\"" + score + "\" data-ts=\"" + cid + "\">"
let card_html: String = card_open + "
<div class=\"gal-q\">" + q_html + "</div>
<div class=\"gal-a\">" + a_html + "</div>
<div class=\"gal-meta\">
<span>" + votes_label + "</span>
<span>" + ts_short + " &#183; Read &#8599;</span>
</div>
</a>"
let cards_html = cards_html + card_html
let i = i + 1
}
let empty_html: String = if str_eq(cards_html, "") {
"<div style=\"grid-column:1/-1;padding:4rem 0;text-align:center\"><p class=\"label\" style=\"margin-bottom:1rem\">Nothing yet</p><p style=\"font-family:var(--body);font-weight:300;color:var(--t2);line-height:1.7\">Chat with Neuron and share a response to be the first.</p><a href=\"/?open=chat\" class=\"btn-primary\" style=\"margin-top:1.5rem;display:inline-flex\">Start chatting &#8594;</a></div>"
} else { "" }
return "<!DOCTYPE html>
<html lang=\"en\">
<head>
<meta charset=\"UTF-8\">
<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">
<title>Things Neuron Said</title>
<meta name=\"description\" content=\"Real conversations with Neuron, voted up by users.\">
<link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/assets/favicon-32.png\">
<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">
<link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>
<link href=\"https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,600;1,400&family=IBM+Plex+Sans:wght@300;400;500;600&display=swap\" rel=\"stylesheet\">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--bg: #FAFAF8; --bg2: #F0F0EC; --card: #FFFFFF;
--navy: #0052A0; --navy-65: rgba(0,82,160,.65); --navy-85: rgba(0,82,160,.85);
--t1: #0D0D14; --t2: #3A3A4A; --t3: #6B6B7E;
--border: rgba(0,0,0,.07); --border2: rgba(0,0,0,.13);
--head: 'Playfair Display', Georgia, serif;
--body: 'IBM Plex Sans', system-ui, sans-serif;
}
html { scroll-behavior: smooth; }
html, body { background: var(--bg); color: var(--t1); font-family: var(--body); -webkit-font-smoothing: antialiased; }
body::before {
content: ''; position: fixed; inset: 0; pointer-events: none; z-index: 0;
background-image: linear-gradient(rgba(0,0,0,.022) 1px, transparent 1px),
linear-gradient(90deg, rgba(0,0,0,.022) 1px, transparent 1px);
background-size: 48px 48px;
}
.label { font-family: var(--body); font-size: .75rem; font-weight: 500; letter-spacing: .2em; text-transform: uppercase; color: var(--navy-65); }
.display-lg { font-family: var(--head); font-size: clamp(2rem,4vw,3.25rem); font-weight: 600; line-height: 1.1; letter-spacing: -.02em; color: var(--t1); }
.btn-primary { display: inline-flex; align-items: center; gap: .75rem; font-family: var(--body); font-size: .75rem; font-weight: 500; letter-spacing: .15em; text-transform: uppercase; text-decoration: none; color: #fff; background: var(--navy); padding: 1rem 2rem; border: none; cursor: pointer; transition: background 300ms; }
.btn-primary:hover { background: #0078D4; }
.btn-ghost { display: inline-flex; align-items: center; gap: .75rem; font-family: var(--body); font-size: .75rem; font-weight: 400; letter-spacing: .15em; text-transform: uppercase; text-decoration: none; color: var(--t2); background: transparent; padding: 1rem 2rem; border: 1px solid var(--border2); cursor: pointer; transition: border-color 300ms, color 300ms; }
.btn-ghost:hover { border-color: rgba(0,82,160,.35); color: var(--t1); }
/* Nav */
#nav { position: fixed; top: 0; left: 0; right: 0; z-index: 100; transition: background 500ms, border-color 500ms; }
#nav.scrolled { background: rgba(250,250,248,.95); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border-bottom: 1px solid var(--border); }
.nav-inner { max-width: 1280px; margin: 0 auto; padding: 0 2rem; height: 4rem; display: flex; align-items: center; justify-content: space-between; position: relative; }
.nav-logo img { height: 2rem; width: auto; display: block; }
.nav-links { display: flex; align-items: center; gap: 1.25rem; flex-wrap: nowrap; }
.nav-link { font-family: var(--body); font-size: .675rem; font-weight: 400; letter-spacing: .16em; text-transform: uppercase; color: var(--t3); text-decoration: none; white-space: nowrap; transition: color 200ms; }
.nav-link:hover { color: var(--t1); }
.nav-dropdown { position: relative; display: flex; align-items: center; }
.nav-dropdown-btn { background: none; border: none; cursor: pointer; padding: 0; font-family: var(--body); font-size: .675rem; font-weight: 400; letter-spacing: .16em; text-transform: uppercase; color: var(--t3); transition: color 200ms; white-space: nowrap; }
.nav-dropdown-btn:hover { color: var(--t1); }
.nav-dropdown-menu { display: none; position: absolute; top: calc(100% + .75rem); left: 50%; transform: translateX(-50%); background: #fff; border: 1px solid var(--border2); box-shadow: 0 8px 32px rgba(0,0,0,.10); min-width: 160px; flex-direction: column; z-index: 200; padding: .375rem 0; }
.nav-dropdown.open .nav-dropdown-menu { display: flex; }
.nav-dropdown-item { font-family: var(--body); font-size: .8125rem; font-weight: 400; color: var(--t2); text-decoration: none; padding: .5rem 1.25rem; transition: background 150ms, color 150ms; white-space: nowrap; }
.nav-dropdown-item:hover { background: var(--bg2); color: var(--t1); }
.nav-cta { font-family: var(--body); font-size: .675rem; font-weight: 500; letter-spacing: .15em; text-transform: uppercase; color: #fff; background: var(--navy); text-decoration: none; padding: .575rem 1.1rem; white-space: nowrap; box-shadow: 0 2px 12px rgba(0,82,160,.20); transition: background 300ms; }
.nav-cta:hover { background: #0078D4; }
.nav-hamburger { display: none; flex-direction: column; justify-content: center; gap: 5px; background: none; border: none; cursor: pointer; padding: 6px 4px; z-index: 101; -webkit-tap-highlight-color: transparent; }
.nav-hamburger span { display: block; width: 22px; height: 2px; background: var(--t1); border-radius: 1px; transition: transform 280ms ease, opacity 200ms ease; transform-origin: center; }
.nav-hamburger[aria-expanded=\"true\"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-hamburger[aria-expanded=\"true\"] span:nth-child(2) { opacity: 0; transform: scaleX(0); }
.nav-hamburger[aria-expanded=\"true\"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
.nav-mobile { display: none; position: absolute; top: 4rem; left: 0; right: 0; background: rgba(250,250,248,.98); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border-bottom: 1px solid var(--border); padding: .5rem 0 1.5rem; flex-direction: column; box-shadow: 0 8px 32px rgba(0,0,0,.08); }
.nav-mobile.open { display: flex; }
.nav-mobile-link { display: block; padding: .875rem 2rem; font-family: var(--body); font-size: .75rem; font-weight: 400; letter-spacing: .16em; text-transform: uppercase; color: var(--t2); text-decoration: none; border-bottom: 1px solid rgba(0,0,0,.05); transition: color 150ms, background 150ms; }
.nav-mobile-link:last-child { border-bottom: none; }
.nav-mobile-link:hover { color: var(--t1); background: rgba(0,82,160,.03); }
.nav-mobile-cta { display: block; margin: 1rem 2rem 0; padding: .8rem 1.5rem; text-align: center; font-family: var(--body); font-size: .75rem; font-weight: 500; letter-spacing: .15em; text-transform: uppercase; color: #fff; background: var(--navy); text-decoration: none; }
@media (max-width: 1060px) { .nav-links { display: none; } .nav-hamburger { display: flex; } }
@media (min-width: 1061px) { .nav-mobile { display: none !important; } .nav-hamburger { display: none !important; } }
/* Gallery */
.gallery-wrap { max-width: 1100px; margin: 0 auto; padding: 7rem 2.5rem 5rem; position: relative; z-index: 1; }
.gallery-header { margin-bottom: 3rem; }
.gallery-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.25rem; }
@media (max-width: 900px) { .gallery-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 600px) { .gallery-grid { grid-template-columns: 1fr; } }
.gal-card { background: var(--card); border: 1px solid var(--border); padding: 1.5rem; display: flex; flex-direction: column; gap: .875rem; text-decoration: none; transition: border-color .15s, box-shadow .15s; }
.gal-card:hover { border-color: rgba(0,82,160,.25); box-shadow: 0 4px 20px rgba(0,82,160,.07); }
.gal-q { font-family: var(--body); font-weight: 500; font-size: .875rem; color: var(--navy); line-height: 1.5; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.gal-a { font-family: var(--body); font-weight: 300; font-size: .8125rem; color: var(--t2); line-height: 1.7; display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden; flex: 1; }
.gal-meta { display: flex; justify-content: space-between; align-items: center; font-family: var(--body); font-size: .65rem; font-weight: 400; letter-spacing: .1em; text-transform: uppercase; color: var(--t3); margin-top: auto; padding-top: .75rem; border-top: 1px solid var(--border); }
.gallery-controls { display: flex; align-items: center; gap: 1rem; margin-bottom: 2rem; flex-wrap: wrap; }
.gallery-search { flex: 1; min-width: 200px; font-family: var(--body); font-size: .875rem; font-weight: 300; color: var(--t1); background: #fff; border: 1px solid var(--border2); padding: .625rem 1rem; outline: none; transition: border-color .2s; }
.gallery-search:focus { border-color: var(--navy); }
.gallery-search::placeholder { color: var(--t3); }
.sort-btn { font-family: var(--body); font-size: .7rem; font-weight: 400; letter-spacing: .1em; text-transform: uppercase; color: var(--t3); background: none; border: 1px solid var(--border2); padding: .5rem 1rem; cursor: pointer; transition: all .15s; }
.sort-btn:hover, .sort-btn.active { color: var(--navy); border-color: rgba(0,82,160,.3); background: rgba(0,82,160,.03); }
.gallery-empty { grid-column: 1/-1; padding: 4rem 0; text-align: center; }
.gal-card.hidden { display: none; }
</style>
</head>
<body>
<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>
<div class=\"nav-dropdown\">
<button class=\"nav-link nav-dropdown-btn\" aria-haspopup=\"true\" aria-expanded=\"false\">Mission &#9662;</button>
<div class=\"nav-dropdown-menu\">
<a href=\"/#mission\" class=\"nav-dropdown-item\">Our mission</a>
<a href=\"/#safety\" class=\"nav-dropdown-item\">Safety</a>
<a href=\"/#environmental\" class=\"nav-dropdown-item\">Environment</a>
</div>
</div>
<a href=\"/#pricing\" class=\"nav-link\">Pricing</a>
<a href=\"/#marketplace\" class=\"nav-link\">Marketplace</a>
<a href=\"/#enterprise\" class=\"nav-link\">Enterprise</a>
<a href=\"/about\" class=\"nav-link\">About</a>
<a href=\"/said\" class=\"nav-link\">Gallery</a>
<a href=\"/account\" class=\"nav-link\">Account</a>
<a href=\"/#pricing\" class=\"nav-cta\">Get Access</a>
</div>
<button class=\"nav-hamburger\" id=\"nav-hamburger\" aria-label=\"Open navigation\" aria-expanded=\"false\" aria-controls=\"nav-mobile\">
<span></span><span></span><span></span>
</button>
<div class=\"nav-mobile\" id=\"nav-mobile\" role=\"navigation\" aria-label=\"Mobile navigation\">
<a href=\"/#how-it-works\" class=\"nav-mobile-link\">How it works</a>
<a href=\"/#mission\" class=\"nav-mobile-link\">Mission</a>
<a href=\"/#safety\" class=\"nav-mobile-link\" style=\"padding-left:1.75rem;font-size:.8rem;color:var(--t3)\">- Safety</a>
<a href=\"/#environmental\" class=\"nav-mobile-link\" style=\"padding-left:1.75rem;font-size:.8rem;color:var(--t3)\">- Environment</a>
<a href=\"/#pricing\" class=\"nav-mobile-link\">Pricing</a>
<a href=\"/#enterprise\" class=\"nav-mobile-link\">Enterprise</a>
<a href=\"/about\" class=\"nav-mobile-link\">About</a>
<a href=\"/said\" class=\"nav-mobile-link\">Gallery</a>
<a href=\"/account\" class=\"nav-mobile-link\">Account</a>
<a href=\"/#pricing\" class=\"nav-mobile-cta\">Get Access</a>
</div>
</div>
</nav>
<div class=\"gallery-wrap\">
<div class=\"gallery-header\">
<p class=\"label\" style=\"margin-bottom:1rem\">Things Neuron Said</p>
<h1 class=\"display-lg\" style=\"margin-bottom:1rem\">Real conversations.<br>No curation.</h1>
<p style=\"font-family:var(--body);font-weight:300;font-size:.9375rem;color:var(--t2);line-height:1.75;max-width:36rem\">
People chatted with Neuron and shared the exchanges that mattered. Voted up by readers. The best ones rise.
</p>
</div>
<div class=\"gallery-controls\">
<input type=\"search\" id=\"gal-search\" class=\"gallery-search\" placeholder=\"Search conversations...\" autocomplete=\"off\">
<div style=\"display:flex;gap:.5rem;flex-shrink:0\">
<button class=\"sort-btn active\" id=\"sort-top\" onclick=\"setSort('top',this)\">Top</button>
<button class=\"sort-btn\" id=\"sort-new\" onclick=\"setSort('new',this)\">Newest</button>
</div>
</div>
<div class=\"gallery-grid\" id=\"gallery-grid\">" + cards_html + empty_html + "</div>
<div id=\"no-results\" style=\"display:none;padding:3rem 0;text-align:center\">
<p style=\"font-family:var(--body);font-weight:300;color:var(--t3)\">No conversations match that search.</p>
</div>
<div style=\"margin-top:3rem;display:flex;align-items:center;gap:1.5rem\">
<a href=\"/?open=chat\" class=\"btn-primary\">Chat with Neuron &#8594;</a>
<a href=\"/\" class=\"btn-ghost\">&#8592; Back to site</a>
</div>
</div>
<script>
(function() {
// Nav scroll effect
var nav = document.getElementById('nav');
if (nav) window.addEventListener('scroll', function() {
nav.classList.toggle('scrolled', window.scrollY > 10);
}, { passive: true });
// Hamburger
var btn = document.getElementById('nav-hamburger');
var menu = document.getElementById('nav-mobile');
if (btn && menu) {
function navClose() { menu.classList.remove('open'); btn.setAttribute('aria-expanded','false'); }
function navOpen() { menu.classList.add('open'); btn.setAttribute('aria-expanded','true'); }
btn.addEventListener('click', function(e) { e.stopPropagation(); menu.classList.contains('open') ? navClose() : navOpen(); });
menu.querySelectorAll('a').forEach(function(a) { a.addEventListener('click', navClose); });
document.addEventListener('click', function(e) { if (!nav.contains(e.target)) navClose(); });
document.addEventListener('keydown', function(e) { if (e.key === 'Escape') navClose(); });
window.addEventListener('resize', function() { if (window.innerWidth > 1060) navClose(); });
}
// Dropdown - Mission
var ddBtn = document.querySelector('.nav-dropdown-btn');
var dd = document.querySelector('.nav-dropdown');
if (ddBtn && dd) {
ddBtn.addEventListener('click', function(e) {
e.stopPropagation();
var isOpen = dd.classList.contains('open');
dd.classList.toggle('open');
ddBtn.setAttribute('aria-expanded', isOpen ? 'false' : 'true');
});
dd.querySelectorAll('.nav-dropdown-item').forEach(function(a) { a.addEventListener('click', function() { dd.classList.remove('open'); }); });
document.addEventListener('click', function() { dd.classList.remove('open'); });
}
// Search
var searchEl = document.getElementById('gal-search');
var grid = document.getElementById('gallery-grid');
var noResults = document.getElementById('no-results');
function filterCards() {
var q = (searchEl.value || '').toLowerCase().trim();
var cards = grid.querySelectorAll('.gal-card');
var visible = 0;
cards.forEach(function(c) {
var text = c.textContent.toLowerCase();
var match = !q || text.indexOf(q) !== -1;
c.classList.toggle('hidden', !match);
if (match) visible++;
});
noResults.style.display = visible === 0 && q ? 'block' : 'none';
}
if (searchEl) searchEl.addEventListener('input', filterCards);
// Sort
var currentSort = 'top';
window.setSort = function(mode, btn) {
document.querySelectorAll('.sort-btn').forEach(function(b){ b.classList.remove('active'); });
btn.classList.add('active');
currentSort = mode;
var cards = Array.from(grid.querySelectorAll('.gal-card'));
cards.sort(function(a, b) {
if (mode === 'top') {
var aV = parseInt(a.getAttribute('data-score') || '0');
var bV = parseInt(b.getAttribute('data-score') || '0');
return bV - aV;
} else {
var aT = parseInt(a.getAttribute('data-ts') || '0');
var bT = parseInt(b.getAttribute('data-ts') || '0');
return bT - aT;
}
});
cards.forEach(function(c){ grid.appendChild(c); });
};
})();
</script>
</body>
</html>"
}
+2 -2
View File
@@ -24,8 +24,8 @@ fn how_it_works() -> String {
<div class=\"step-circle\"><span class=\"step-num\">01</span></div>
<span class=\"step-aside\">5 minutes</span>
</div>
<h3 class=\"display-md step-title\">Install</h3>
<p class=\"step-body\">A single command. Runs locally on your machine. No account creation, no cloud sync, no permissions you didn&#39;t grant.</p>
<h3 class=\"display-md step-title\">Create your account</h3>
<p class=\"step-body\">Sign up once. Your account links your license key to your identity - that&#39;s what keeps your memory yours and nobody else&#39;s. Then install with a single command. Runs locally. No cloud sync, no permissions you didn&#39;t grant.</p>
</div>
<div class=\"reveal\" style=\"transition-delay:180ms\">
+8 -8
View File
@@ -10,20 +10,20 @@ fn inference() -> String {
<div>
<div class=\"inference-label-row reveal\">
<div class=\"navy-line-left\" style=\"width:3rem;flex-shrink:0\"></div>
<span class=\"label\">Neuron inference - live day one</span>
<span class=\"label\">Neuron inference - Q3 2026</span>
</div>
<h2 class=\"display-lg inference-headline reveal\" style=\"transition-delay:80ms\">
My model. My infrastructure.
<span class=\"gold\"> Cheaper than theirs.</span>
<span class=\"gold\"> Targeting Q3 2026.</span>
</h2>
<p class=\"inference-body reveal\" style=\"transition-delay:160ms\">
Four companies control nearly all frontier AI inference today. Every query you send strengthens their position - and their pricing power over you. That changes today.
Four companies control nearly all frontier AI inference today. Every query you send strengthens their position - and their pricing power over you. That changes in Q3 2026 - sooner if we can.
</p>
<p class=\"inference-body reveal\" style=\"transition-delay:240ms\">
Neuron is both the product and the model. Purpose-built for how Neuron thinks, how your context is structured, how to do more with fewer tokens. It runs on Soma, our own inference infrastructure. Priced below OpenAI, Anthropic, and Google from day one. Not as a loss leader. As a permanent competitive position.
Neuron will be both the product and the model. Purpose-built for how Neuron thinks, how your context is structured, how to do more with fewer tokens. It will run on Soma, our own inference infrastructure. Priced below OpenAI, Anthropic, and Google. Not as a loss leader. As a permanent competitive position.
</p>
<p class=\"inference-body reveal\" style=\"transition-delay:320ms\">
You can still route to your own API keys if you want - Anthropic, OpenAI, whoever. But when we&#39;re cheaper, faster, and the model knows Neuron&#39;s architecture from the inside, why would you?
Until then: bring your own API keys - Anthropic, OpenAI, whoever. When Neuron Inference launches, it will be cheaper, faster, and purpose-built for Neuron. You can switch whenever you want.
</p>
<p class=\"inference-body reveal\" style=\"transition-delay:400ms\">
Every user on Neuron inference is compute that doesn&#39;t flow to the monopoly. That&#39;s not just a cost story. It&#39;s a power one.
@@ -41,16 +41,16 @@ fn inference() -> String {
<div class=\"stat-row reveal\" style=\"transition-delay:120ms\">
<div class=\"stat-row-head\">
<span class=\"stat-num\">Neuron</span>
<span class=\"stat-label\">The model - live on day one</span>
<span class=\"stat-label\">The model - Q3 2026</span>
</div>
<p class=\"stat-body\">Built on Qwen3 - open weights, Sonnet-equivalent capability. Neuron wraps it with your full context, years of accumulated intelligence. The model is the floor. Neuron is the ceiling.</p>
<p class=\"stat-body\">A model built for Neuron specifically - not a generic wrapper. Your full context, years of accumulated intelligence, purpose-built inference. The model is the floor. Neuron is the ceiling.</p>
</div>
<div class=\"stat-row reveal\" style=\"transition-delay:240ms\">
<div class=\"stat-row-head\">
<span class=\"stat-num\">&lt; theirs</span>
<span class=\"stat-label\">Priced below the incumbents</span>
</div>
<p class=\"stat-body\">Below OpenAI&#39;s API pricing at launch. Below Anthropic&#39;s. Below Google&#39;s. Metered - you pay for what you use, not a flat subscription. And cheaper than any of them on every tier.</p>
<p class=\"stat-body\">Below OpenAI pricing at launch. Below Anthropic. Below Google. Metered - you pay for what you use. And cheaper than any of them on every tier.</p>
</div>
</div>
+1 -1
View File
@@ -39,7 +39,7 @@ fn local_first() -> String {
<div class=\"lf-principle reveal\">
<p class=\"lf-principle-label\">Your machine. Full stop.</p>
<p class=\"lf-principle-body\">Neuron runs on your hardware. The memory graph, the agent loop, every conversation - none of it leaves your machine. Not to my servers. Not to anyone&#39;s.</p>
<p class=\"lf-principle-body\">Neuron runs on your hardware. The memory, the agent loop, every conversation - none of it leaves your machine. Not to my servers. Not to anyone&#39;s.</p>
</div>
<div class=\"lf-principle reveal\" style=\"transition-delay:120ms\">
+737 -14
View File
@@ -43,6 +43,8 @@ from terms import { terms_page }
from enterprise_terms import { enterprise_terms_page }
from checkout import { checkout_page }
from safety import { safety }
from gallery import { gallery_page }
from account import { account_page }
// Founding counter
@@ -74,12 +76,32 @@ fn fetch_founding_count_stripe(stripe_key: String) -> Int {
if str_eq(stripe_key, "") {
return FOUNDING_SOLD
}
let url: String = "https://api.stripe.com/v1/payment_intents/search?query=metadata%5B%27plan%27%5D%3A%27founding%27+AND+status%3A%27succeeded%27"
// Fetch all complete checkout sessions and count founding ones.
// Note: metadata[] filter in URL causes 400 filter client-side instead.
let url: String = "https://api.stripe.com/v1/checkout/sessions?status=complete&limit=100"
let resp: String = http_get_auth(url, stripe_key)
if str_eq(resp, "") {
return FOUNDING_SOLD
}
let count: Int = json_get_int(resp, "total_count")
let data_raw: String = json_get_raw(resp, "data")
if str_eq(data_raw, "") {
return FOUNDING_SOLD
}
// Count only sessions where metadata.plan = "founding"
// json_get uses literal key search, so extract metadata object first
let total: Int = json_array_len(data_raw)
let count: Int = 0
let idx: Int = 0
while idx < total {
let session: String = json_array_get(data_raw, idx)
// json_get_raw handles multi-line JSON; json_get stops at newlines
let metadata: String = json_get_raw(session, "metadata")
let plan: String = if str_eq(metadata, "") { "" } else { json_get(metadata, "plan") }
if str_eq(plan, "founding") {
let count = count + 1
}
let idx = idx + 1
}
if count <= 0 {
return FOUNDING_SOLD
}
@@ -131,8 +153,215 @@ fn page(sold: Int, total: Int) -> String {
+ page_close()
}
// Share card page
fn share_card_page(question: String, answer: String, id: String) -> String {
let q_html: String = str_replace(str_replace(str_replace(question, "&", "&amp;"), "<", "&lt;"), ">", "&gt;")
let a_html: String = str_replace(str_replace(str_replace(answer, "&", "&amp;"), "<", "&lt;"), ">", "&gt;")
let og_desc: String = str_slice(answer, 0, 140)
let base_url: String = state_get("__neuron_origin__")
let card_url: String = base_url + "/share/" + id
// Pre-built share hrefs ID is digits so no URL encoding needed
let share_text: String = "The+AI+that+remembers+you+%E2%80%94+things+it+said%3A"
let x_href: String = "https://twitter.com/intent/tweet?url=" + card_url + "&text=" + share_text
let li_href: String = "https://www.linkedin.com/sharing/share-offsite/?url=" + card_url
let fb_href: String = "https://www.facebook.com/sharer/sharer.php?u=" + card_url
let wa_href: String = "https://wa.me/?text=" + share_text + "%20" + card_url
// TikTok and Snapchat have no web URL share scheme use clipboard copy
let tiktok_copy_text: String = "Copied+%E2%80%94+paste+into+TikTok"
let snap_copy_text: String = "Copied+%E2%80%94+paste+into+Snapchat"
return "<!DOCTYPE html>
<html lang=\"en\">
<head>
<meta charset=\"UTF-8\">
<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">
<title>Things Neuron Said</title>
<meta property=\"og:title\" content=\"Things Neuron Said\">
<meta property=\"og:description\" content=\"" + og_desc + "\">
<meta property=\"og:image\" content=\"https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png\">
<meta property=\"og:type\" content=\"website\">
<meta property=\"og:url\" content=\"" + card_url + "\">
<meta name=\"twitter:card\" content=\"summary_large_image\">
<meta name=\"twitter:title\" content=\"Things Neuron Said\">
<meta name=\"twitter:description\" content=\"" + og_desc + "\">
<meta name=\"twitter:image\" content=\"https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png\">
<link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">
<link href=\"https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap\" rel=\"stylesheet\">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8}
body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}
.page{width:100%;max-width:580px;display:flex;flex-direction:column;gap:1.75rem;position:relative;z-index:1}
.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.wordmark img{height:22px;width:auto;display:block}
.eyebrow{font-size:.65rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;color:var(--t3)}
.chat-frame{background:#fff;border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}
.chat-row-user{display:flex;flex-direction:row-reverse}
.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.625rem}
.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:11px 15px;max-width:78%;font-size:.875rem;line-height:1.55;word-break:break-word}
.bubble-ai{background:var(--bg);color:var(--t1);border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:11px 15px;max-width:88%;font-size:.875rem;font-weight:300;line-height:1.65;word-break:break-word;white-space:pre-wrap;box-shadow:0 2px 6px rgba(0,0,0,.05)}
.ai-col{display:flex;flex-direction:column;gap:.25rem}
.ai-label{font-size:.6rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--navy)}
.avatar{width:26px;height:26px;border-radius:50%;flex-shrink:0;background:#fff;border:1px solid rgba(0,82,160,.15);display:flex;align-items:center;justify-content:center}
.avatar img{width:14px;height:14px;object-fit:contain}
.vote-row{display:flex;align-items:center;gap:.75rem}
.vote-label{font-size:.65rem;font-weight:400;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.vote-btn{background:none;border:1px solid rgba(0,0,0,.12);cursor:pointer;padding:.3rem .6rem;font-size:.8rem;color:var(--t2);transition:all .15s;line-height:1}
.vote-btn:hover{border-color:var(--navy);color:var(--navy)}
.vote-btn.voted-up{background:var(--navy);color:#fff;border-color:var(--navy)}
.vote-btn.voted-down{background:#f0f0ec;color:var(--t3);border-color:rgba(0,0,0,.12)}
.vote-count{font-size:.8rem;font-weight:500;color:var(--t1);min-width:1.5rem;text-align:center}
.share-section{display:flex;flex-direction:column;gap:.625rem}
.share-label{font-size:.65rem;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.share-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}
.share-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;border:none;text-decoration:none;cursor:pointer;transition:opacity .15s,transform .15s;flex-shrink:0}
.share-btn:hover{opacity:.85;transform:scale(1.08)}
.share-btn.copied{outline:2px solid var(--navy)}
.divider{height:1px;background:rgba(0,0,0,.07)}
.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.footer-note{font-size:.75rem;color:var(--t3)}
.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;white-space:nowrap;transition:background .15s}
.cta-btn:hover{background:var(--navy-dark)}
@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}
</style>
</head>
<body>
<div class=\"page\">
<div class=\"page-header\">
<a href=\"https://neurontechnologies.ai\" class=\"wordmark\">
<img src=\"/assets/brand/neuron-wordmark-on-light.png\"
srcset=\"/assets/brand/neuron-wordmark-on-light@2x.png 2x\"
alt=\"Neuron\" height=\"22\">
</a>
<span class=\"eyebrow\">Things Neuron Said</span>
</div>
<div class=\"chat-frame\">
<div class=\"chat-row-user\">
<div class=\"bubble-user\">" + q_html + "</div>
</div>
<div class=\"chat-row-ai\">
<div class=\"avatar\"><img src=\"/assets/neuron-icon.png\" alt=\"\"></div>
<div class=\"ai-col\">
<span class=\"ai-label\">Neuron</span>
<div class=\"bubble-ai\">" + a_html + "</div>
</div>
</div>
</div>
<div class=\"vote-row\">
<span class=\"vote-label\">Helpful?</span>
<button class=\"vote-btn\" id=\"vote-up\">&#9650;</button>
<span class=\"vote-count\" id=\"vote-score\">0</span>
<button class=\"vote-btn\" id=\"vote-down\">&#9660;</button>
</div>
<div class=\"share-section\">
<span class=\"share-label\">Share</span>
<div class=\"share-row\">
<a href=\"" + x_href + "\" target=\"_blank\" rel=\"noopener\" class=\"share-btn\" title=\"Post on X\" style=\"background:#000\">
<img src=\"https://cdn.simpleicons.org/x/ffffff\" width=\"18\" height=\"18\" alt=\"X\">
</a>
<a href=\"" + li_href + "\" target=\"_blank\" rel=\"noopener\" class=\"share-btn\" title=\"Share on LinkedIn\" style=\"background:#0A66C2\">
<img src=\"https://cdn.simpleicons.org/linkedin/ffffff\" width=\"18\" height=\"18\" alt=\"LinkedIn\">
</a>
<a href=\"" + fb_href + "\" target=\"_blank\" rel=\"noopener\" class=\"share-btn\" title=\"Share on Facebook\" style=\"background:#1877F2\">
<img src=\"https://cdn.simpleicons.org/facebook/ffffff\" width=\"18\" height=\"18\" alt=\"Facebook\">
</a>
<a href=\"" + wa_href + "\" target=\"_blank\" rel=\"noopener\" class=\"share-btn\" title=\"Send via WhatsApp\" style=\"background:#25D366\">
<img src=\"https://cdn.simpleicons.org/whatsapp/ffffff\" width=\"18\" height=\"18\" alt=\"WhatsApp\">
</a>
<button class=\"share-btn\" id=\"copy-tiktok\" onclick=\"copyForPlatform('tiktok', this)\" title=\"Copy for TikTok\" style=\"background:#010101;border:none\">
<img src=\"https://cdn.simpleicons.org/tiktok/ffffff\" width=\"18\" height=\"18\" alt=\"TikTok\">
</button>
<button class=\"share-btn\" id=\"copy-snapchat\" onclick=\"copyForPlatform('snapchat', this)\" title=\"Copy for Snapchat\" style=\"background:#FFFC00;border:none\">
<img src=\"https://cdn.simpleicons.org/snapchat/000000\" width=\"18\" height=\"18\" alt=\"Snapchat\">
</button>
</div>
</div>
<div class=\"divider\"></div>
<div class=\"footer-row\">
<span class=\"footer-note\">From a live conversation with Neuron.</span>
<a href=\"https://neurontechnologies.ai\" class=\"cta-btn\">Try Neuron &#8599;</a>
</div>
</div>
<script>
(function() {
var CARD_ID = '" + id + "';
var CARD_URL = '" + card_url + "';
var voted = JSON.parse(localStorage.getItem('neuron_voted') || '{}');
var upBtn = document.getElementById('vote-up');
var downBtn = document.getElementById('vote-down');
var scoreEl = document.getElementById('vote-score');
fetch('/api/vote-count/' + CARD_ID).then(function(r){return r.json();}).then(function(d){
if (scoreEl) scoreEl.textContent = (d.score || 0);
}).catch(function(){});
if (voted[CARD_ID] === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else if (voted[CARD_ID] === 'down') { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
function doVote(dir) {
if (voted[CARD_ID]) return;
voted[CARD_ID] = dir;
localStorage.setItem('neuron_voted', JSON.stringify(voted));
if (dir === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
var prev = parseInt(scoreEl.textContent) || 0;
scoreEl.textContent = prev + (dir === 'up' ? 1 : -1);
fetch('/api/vote', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:CARD_ID,direction:dir})});
}
upBtn.onclick = function() { doVote('up'); };
downBtn.onclick = function() { doVote('down'); };
window.copyForPlatform = function(platform, btn) {
var label = platform === 'tiktok' ? 'Copied paste into TikTok' : 'Copied paste into Snapchat';
navigator.clipboard.writeText(CARD_URL).then(function() {
var orig = btn.textContent.trim();
btn.classList.add('copied');
var svgEl = btn.querySelector('svg');
var svgHtml = svgEl ? svgEl.outerHTML : '';
btn.innerHTML = svgHtml + ' ' + label;
setTimeout(function() {
btn.classList.remove('copied');
btn.innerHTML = svgHtml + ' ' + (platform === 'tiktok' ? 'TikTok' : 'Snapchat');
}, 2500);
}).catch(function() {
// fallback: prompt
window.prompt('Copy this link:', CARD_URL);
});
};
})();
</script>
</body>
</html>"
}
// Static asset serving
// waitlist_upsert writes a row to the Supabase waitlist table.
// member_num: pass 0 to omit, positive for founding member number.
fn waitlist_upsert(email: String, name: String, plan: String, source: String, attestation: String, user_agent: String, member_num: Int) {
let sb_url: String = state_get("__supabase_project_url__")
let sb_key: String = state_get("__supabase_service_key__")
if str_eq(sb_key, "") {
println("[waitlist] no service key — skipping Supabase write")
return ""
}
let e_safe: String = str_replace(str_replace(email, "\\", "\\\\"), "\"", "\\\"")
let n_safe: String = str_replace(str_replace(name, "\\", "\\\\"), "\"", "\\\"")
let a_safe: String = str_replace(str_replace(attestation, "\\", "\\\\"), "\"", "\\\"")
let ua_safe: String = str_replace(str_replace(user_agent, "\\", "\\\\"), "\"", "\\\"")
let num_field: String = if member_num > 0 { ",\"member_number\":" + int_to_str(member_num) } else { "" }
let row: String = "{\"email\":\"" + e_safe + "\",\"name\":\"" + n_safe + "\",\"plan\":\"" + plan + "\",\"source\":\"" + source + "\",\"attestation\":\"" + a_safe + "\",\"user_agent\":\"" + ua_safe + "\"" + num_field + "}"
let resp: String = supabase_insert(sb_url, sb_key, "waitlist", row)
println("[waitlist] supabase insert -> " + resp)
return ""
}
fn read_asset(abs_path: String) -> String {
let exists: Bool = fs_exists(abs_path)
if !exists {
@@ -218,13 +447,21 @@ fn handle_request(method: String, path: String, body: String) -> String {
if str_contains(body, "\"professional\"") {
plan = "professional"
}
// Hard cap: block founding checkouts when 1,000 spots are filled
if str_eq(plan, "founding") {
let current_sold: Int = get_sold()
let total_spots: Int = get_total()
if current_sold >= total_spots {
return "{\"__status__\":410,\"error\":\"sold_out\",\"message\":\"All 1,000 Founding Member spots have been claimed.\"}"
}
}
let amount: String = "19900"
if str_eq(plan, "professional") {
amount = "1900"
}
let pi_body: String = "amount=" + amount
+ "&currency=usd"
+ "&payment_method_types[]=card"
+ "&automatic_payment_methods[enabled]=true"
+ "&metadata[plan]=" + plan
let auth_header: String = "Bearer " + stripe_key
let response: String = http_post_form_auth(
@@ -237,11 +474,19 @@ fn handle_request(method: String, path: String, body: String) -> String {
// Health check
if str_eq(path, "/api/health") {
return "{\"status\":\"ok\",\"service\":\"neuron-landing\"}"
return "{\"status\":\"ok\",\"service\":\"neuron-web\"}"
}
// Founding count
if str_eq(path, "/api/founding-count") {
// Query Stripe live so counter always reflects real purchases
let stripe_key: String = state_get("__stripe_secret_key__")
let live_sold: Int = fetch_founding_count_stripe(stripe_key)
if live_sold > get_sold() {
state_set("__founding_sold__", int_to_str(live_sold))
persist_founding_count(live_sold)
}
let sold: Int = get_sold()
let total: Int = get_total()
let remaining: Int = total - sold
@@ -338,6 +583,93 @@ fn handle_request(method: String, path: String, body: String) -> String {
return "{\"received\":true}"
}
// Free tier waitlist
if str_eq(path, "/api/waitlist") {
if !str_eq(method, "POST") {
return "{\"error\":\"POST required\"}"
}
let wl_email: String = json_get(body, "email")
if str_eq(wl_email, "") {
return "{\"error\":\"email required\"}"
}
// Write to Supabase waitlist table
waitlist_upsert(wl_email, "", "free", "preorder", "", "", 0)
// Email notification
let e_safe: String = str_replace(str_replace(wl_email, "\\", "\\\\"), "\"", "\\\"")
let resend_key: String = state_get("__resend_api_key__")
if !str_eq(resend_key, "") {
let email_body: String = "{\"from\":\"Neuron <no-reply@neurontechnologies.ai>\",\"to\":[\"will.anderson@neurontechnologies.ai\"],\"subject\":\"Free tier preorder: " + e_safe + "\",\"text\":\"New free tier preorder\\nEmail: " + e_safe + "\"}"
let resp: String = http_post_auth("https://api.resend.com/emails", resend_key, email_body)
println("[waitlist] email: " + resp)
}
return "{\"ok\":true}"
}
// Founding member attestation record
// Fired from the checkout form just before Stripe confirmPayment().
// Saves to GCS (attestations/<ts>-founding-<email>.json) and emails Will.
if str_eq(path, "/api/attest") {
if !str_eq(method, "POST") {
return "{\"error\":\"POST required\"}"
}
let attest_name: String = json_get(body, "name")
let attest_email: String = json_get(body, "email")
let attest_plan: String = json_get(body, "plan")
let attest_ts: String = json_get(body, "timestamp")
let attest_text: String = json_get(body, "attestation")
let attest_ua: String = json_get(body, "user_agent")
if str_eq(attest_email, "") {
return "{\"error\":\"email required\"}"
}
let n_safe: String = str_replace(str_replace(attest_name, "\\", "\\\\"), "\"", "\\\"")
let e_safe: String = str_replace(str_replace(attest_email, "\\", "\\\\"), "\"", "\\\"")
let t_safe: String = str_replace(str_replace(attest_text, "\\", "\\\\"), "\"", "\\\"")
let ua_safe: String = str_replace(str_replace(attest_ua, "\\", "\\\\"), "\"", "\\\"")
// Write to Supabase waitlist (attestation in dedicated column)
waitlist_upsert(attest_email, attest_name, attest_plan, "founding-attestation", attest_text, attest_ua, 0)
// Also save to GCS as immutable legal record
let record: String = "{\"plan\":\"" + attest_plan + "\",\"name\":\"" + n_safe + "\",\"email\":\"" + e_safe + "\",\"timestamp\":\"" + attest_ts + "\",\"attestation\":\"" + t_safe + "\",\"user_agent\":\"" + ua_safe + "\"}"
let gcs_bucket: String = env("GCS_SHARE_BUCKET")
if !str_eq(gcs_bucket, "") {
let attest_key: String = "attestations/" + attest_ts + "-" + attest_email + ".json"
let gcs_ok: String = gcs_write(gcs_bucket, attest_key, record)
println("[attest] gcs write " + attest_key + " -> " + gcs_ok)
}
// Email notification
let resend_key: String = state_get("__resend_api_key__")
if !str_eq(resend_key, "") {
let subject: String = "Founding member attestation: " + attest_name + " <" + attest_email + ">"
let email_body: String = "{\"from\":\"Neuron <no-reply@neurontechnologies.ai>\",\"to\":[\"will.anderson@neurontechnologies.ai\"],\"subject\":\"" + str_replace(subject, "\"", "\\\"") + "\",\"text\":\"Plan: " + attest_plan + "\\nName: " + n_safe + "\\nEmail: " + e_safe + "\\nTime: " + attest_ts + "\\n\\nAttestation: " + t_safe + "\"}"
let resp: String = http_post_auth("https://api.resend.com/emails", resend_key, email_body)
println("[attest] email: " + resp)
}
return "{\"ok\":true}"
}
// Developer interest form
if str_eq(path, "/api/developer-interest") {
let resend_key: String = state_get("__resend_api_key__")
if !str_contains(body, "\"email\"") {
return "{\"error\":\"invalid request\"}"
}
// Write to Supabase waitlist
let dev_email: String = json_get(body, "email")
let dev_name: String = json_get(body, "name")
let dev_idea: String = json_get(body, "idea")
waitlist_upsert(dev_email, dev_name, "developer", "developer-interest", dev_idea, "", 0)
println("[developer-interest] " + body)
if !str_eq(resend_key, "") {
let email_body: String = "{\"from\":\"Neuron Developer Program <developers@neurontechnologies.ai>\",\"to\":[\"will.anderson@neurontechnologies.ai\"],\"subject\":\"Developer Interest\",\"text\":" + body + "}"
let resp: String = http_post_auth(
"https://api.resend.com/emails",
resend_key,
email_body
)
println("[developer-interest] resend: " + resp)
}
return "{\"received\":true}"
}
// Supabase public config
if str_eq(path, "/api/supabase-config") {
let proj_url: String = "https://ocojsghaonltunidkzpw.supabase.co"
@@ -352,19 +684,74 @@ fn handle_request(method: String, path: String, body: String) -> String {
if str_eq(msg, "") {
return "{\"error\":\"message required\"}"
}
// Rate limit: 25 requests per uid per hour (stored in process state)
let rate_uid: String = json_get(body, "uid")
if !str_eq(rate_uid, "") {
let rate_key: String = "__rate__" + rate_uid
let rate_val: String = state_get(rate_key)
let rate_count: Int = if str_eq(rate_val, "") { 0 } else { str_to_int(rate_val) }
if rate_count >= 25 {
return "{\"response\":\"You've hit the rate limit. Come back in an hour.\"}"
}
state_set(rate_key, int_to_str(rate_count + 1))
}
// Turnstile: verify on first message only (tokens are single-use).
// Per-message verification breaks chat flow. Forms get full verification.
let cf_token: String = json_get(body, "cf_token")
if !str_eq(cf_token, "") {
let ts_secret: String = "0x4AAAAAADHAZTok46L-l2sa9biSGpgN3GY"
let verify_body: String = "secret=" + ts_secret + "&response=" + cf_token
let verify_resp: String = http_post("https://challenges.cloudflare.com/turnstile/v0/siteverify", verify_body)
let is_valid: String = json_get(verify_resp, "success")
if str_eq(is_valid, "false") {
return "{\"error\":\"Bot check failed. Please try again.\"}"
}
}
// Per-user channel ID prevents conversation bleed between users
let uid: String = json_get(body, "uid")
let channel: String = if str_eq(uid, "") { "ntn-demo" } else { "ntn-demo-" + uid }
// Escape the message for embedding in JSON strings
let msg_safe: String = str_replace(str_replace(msg, "\\", "\\\\"), "\"", "\\\"")
// Build inner content: {"event_type":"chat","payload":{"message":"..."}}
let inner: String = "{\"event_type\":\"chat\",\"payload\":{\"message\":\"" + msg_safe + "\"}}"
// Include conversation history so soul has full thread context
// even after restarts. history is a JSON array of {role, content} from browser.
let hist_raw: String = json_get_raw(body, "history")
let hist_safe: String = if str_eq(hist_raw, "") { "[]" } else { hist_raw }
// Include browser-local engram activation for this turn
let an_raw: String = json_get_raw(body, "an")
let ec_str: String = json_get(body, "ec")
let an_safe: String = if str_eq(an_raw, "") { "[]" } else { an_raw }
let ec_safe: String = if str_eq(ec_str, "") { "0" } else { ec_str }
// Build inner content with history and engram context for thread context
let inner: String = "{\"event_type\":\"chat\",\"payload\":{\"message\":\"" + msg_safe + "\",\"history\":" + hist_safe + ",\"an\":" + an_safe + ",\"ec\":" + ec_safe + "}}"
// Escape inner for the outer content field
let inner_safe: String = str_replace(str_replace(inner, "\\", "\\\\"), "\"", "\\\"")
// Build dharma envelope
let envelope: String = "{\"channel\":\"ntn-demo\",\"from\":\"ntn-site\",\"content\":\"" + inner_safe + "\"}"
let resp: String = http_post("http://localhost:7772/dharma/recv", envelope)
// Build dharma envelope with per-user channel
let envelope: String = "{\"channel\":\"" + channel + "\",\"from\":\"ntn-site\",\"content\":\"" + inner_safe + "\"}"
let soul_endpoint: String = state_get("__soul_url__") + "/dharma/recv"
let resp: String = http_post(soul_endpoint, envelope)
if str_eq(resp, "") {
return "{\"error\":\"demo soul not responding\"}"
return "{\"response\":\"Stepped out for a moment. Try again.\"}"
}
return resp
// SECURITY: Strip internal fields before returning to browser.
// activation_nodes and context_nodes expose the full knowledge graph
// internal architecture, roadmap, self-model, DHARMA details.
// sn and se are safe: they are derived from
// the user's own conversation and contain only content they already saw.
let response_text: String = json_get(resp, "response")
if str_eq(response_text, "") {
let err: String = json_get(resp, "error")
if !str_eq(err, "") {
return "{\"response\":\"Stepped out for a moment. Try again.\"}"
}
return "{\"response\":\"Stepped out for a moment. Try again.\"}"
}
let safe_text: String = str_replace(str_replace(str_replace(str_replace(response_text, "\\", "\\\\"), "\"", "\\\""), "\n", "\\n"), "\r", "\\r")
let model: String = json_get(resp, "model")
let sn_raw: String = json_get_raw(resp, "sn")
let se_raw: String = json_get_raw(resp, "se")
let sn_safe: String = if str_eq(sn_raw, "") { "[]" } else { sn_raw }
let se_safe: String = if str_eq(se_raw, "") { "[]" } else { se_raw }
return "{\"response\":\"" + safe_text + "\",\"model\":\"" + model + "\",\"sn\":" + sn_safe + ",\"se\":" + se_safe + "}"
}
return "{\"error\":\"POST required\"}"
}
@@ -372,13 +759,36 @@ fn handle_request(method: String, path: String, body: String) -> String {
// Stripe webhook
if str_eq(path, "/api/webhooks/stripe") {
if str_contains(body, "checkout.session.completed") {
// Increment founding counter when a founding purchase completes.
// Extract customer email from session
let customer_email: String = json_get(body, "customer_details.email")
let customer_name: String = json_get(body, "customer_details.name")
let customer_id: String = json_get(body, "customer")
// Increment founding counter and add to waitlist
if str_contains(body, "\"founding\"") {
let current_sold: Int = get_sold()
let new_sold: Int = current_sold + 1
state_set("__founding_sold__", int_to_str(new_sold))
persist_founding_count(new_sold)
println("[webhook] founding sold: " + int_to_str(new_sold))
if !str_eq(customer_email, "") {
waitlist_upsert(customer_email, customer_name, "founding", "stripe-purchase", "", "", new_sold)
}
}
// Professional preorder
if str_contains(body, "\"professional\"") {
if !str_eq(customer_email, "") {
waitlist_upsert(customer_email, customer_name, "professional", "stripe-purchase", "", "", 0)
}
}
// Save stripe_customer_id to waitlist row
if !str_eq(customer_email, "") && !str_eq(customer_id, "") {
let wb_sb_url: String = state_get("__supabase_project_url__")
let wb_sb_key: String = state_get("__supabase_service_key__")
if !str_eq(wb_sb_key, "") {
let cid_safe: String = str_replace(customer_id, "\"", "\\\"")
let update_row: String = "{\"stripe_customer_id\":\"" + cid_safe + "\"}"
supabase_insert(wb_sb_url, wb_sb_key, "waitlist?email=eq." + customer_email + "&on_conflict=email,plan", update_row)
}
}
// Forward to license API for key provisioning.
let license_api: String = state_get("__license_api_url__")
@@ -390,6 +800,126 @@ fn handle_request(method: String, path: String, body: String) -> String {
return "{\"received\":true}"
}
// Share card POST /api/share
if str_eq(path, "/api/share") {
if !str_eq(method, "POST") {
return "{\"error\":\"POST required\"}"
}
let question: String = json_get(body, "question")
let answer: String = json_get(body, "answer")
if str_eq(question, "") || str_eq(answer, "") {
return "{\"error\":\"question and answer required\"}"
}
let ts: String = int_to_str(unix_timestamp())
let id: String = str_slice(ts, str_len(ts) - 8, str_len(ts))
let html_share: String = share_card_page(question, answer, id)
let gcs_bucket: String = env("GCS_SHARE_BUCKET")
if !str_eq(gcs_bucket, "") {
// GCS durable across Cloud Run instances and restarts
let gcs_ok: String = gcs_write(gcs_bucket, "cards/" + id + ".html", html_share)
println("[share] gcs write cards/" + id + ".html -> " + gcs_ok)
} else {
// Local dev fallback
fs_write(src_dir + "/shares/" + id + ".html", html_share)
}
// Write to Supabase share_cards for the gallery + voting
let sb_url: String = state_get("__supabase_project_url__")
let sb_key: String = state_get("__supabase_service_key__")
if !str_eq(sb_key, "") {
let q_safe: String = str_replace(str_replace(question, "\\", "\\\\"), "\"", "\\\"")
let a_safe: String = str_replace(str_replace(str_replace(str_replace(answer, "\\", "\\\\"), "\"", "\\\""), "\n", "\\n"), "\r", "\\r")
let card_row: String = "{\"id\":\"" + id + "\",\"question\":\"" + q_safe + "\",\"answer\":\"" + a_safe + "\"}"
let sb_resp: String = supabase_insert(sb_url, sb_key, "share_cards", card_row)
println("[share] supabase insert " + id + " -> " + sb_resp)
}
return "{\"id\":\"" + id + "\"}"
}
// Vote on a share card POST /api/vote
if str_eq(path, "/api/vote") {
if !str_eq(method, "POST") {
return "{\"error\":\"POST required\"}"
}
let vote_id: String = json_get(body, "id")
let direction: String = json_get(body, "direction")
if str_eq(vote_id, "") || str_eq(direction, "") {
return "{\"error\":\"id and direction required\"}"
}
let sb_url: String = state_get("__supabase_project_url__")
let sb_key: String = state_get("__supabase_service_key__")
if str_eq(sb_key, "") {
return "{\"error\":\"not configured\"}"
}
// Use Supabase RPC to atomically increment the right column
let col: String = if str_eq(direction, "up") { "upvotes" } else { "downvotes" }
let score_delta: String = if str_eq(direction, "up") { "1" } else { "-1" }
// PATCH via Supabase REST increment upvotes or downvotes + recalculate score
let update_json: String = "{\"" + col + "\":\"" + col + " + 1\",\"score\":\"score + " + score_delta + "\"}"
// Use Postgres RPC for atomic increment
let rpc_body: String = "{\"p_id\":\"" + vote_id + "\",\"p_col\":\"" + col + "\",\"p_delta\":" + score_delta + "}"
// Fallback: direct update via REST with computed columns
let up_resp: String = http_post_auth(
sb_url + "/rest/v1/rpc/vote_card",
sb_key,
rpc_body
)
println("[vote] " + direction + " on " + vote_id + " -> " + up_resp)
return "{\"ok\":true}"
}
// Vote count GET /api/vote-count/<id>
if str_starts_with(path, "/api/vote-count/") {
let vc_id: String = str_slice(path, 16, str_len(path))
let sb_url: String = state_get("__supabase_project_url__")
let sb_key: String = state_get("__supabase_service_key__")
if str_eq(sb_key, "") {
return "{\"score\":0,\"upvotes\":0,\"downvotes\":0}"
}
let vc_resp: String = supabase_get(
sb_url, sb_key,
"share_cards?select=score,upvotes,downvotes&id=eq." + vc_id
)
let score_raw: String = json_get(vc_resp, "0.score")
let up_raw: String = json_get(vc_resp, "0.upvotes")
let down_raw: String = json_get(vc_resp, "0.downvotes")
let score_str: String = if str_eq(score_raw, "") { "0" } else { score_raw }
let up_str: String = if str_eq(up_raw, "") { "0" } else { up_raw }
let down_str: String = if str_eq(down_raw, "") { "0" } else { down_raw }
return "{\"score\":" + score_str + ",\"upvotes\":" + up_str + ",\"downvotes\":" + down_str + "}"
}
// Gallery GET /said
if str_eq(path, "/said") {
let sb_url: String = state_get("__supabase_project_url__")
let sb_key: String = state_get("__supabase_service_key__")
let cards_json: String = ""
if !str_eq(sb_key, "") {
// Use supabase_get which sends both apikey and Authorization headers
let cards_json = supabase_get(
sb_url,
sb_key,
"share_cards?select=id,question,answer,score,upvotes,downvotes,created_at&order=score.desc,created_at.desc&limit=100"
)
}
return gallery_page(cards_json)
}
// Share card GET /share/<id>
if str_starts_with(path, "/share/") {
let id: String = str_slice(path, 7, str_len(path))
let share_html: String = ""
let gcs_bucket2: String = env("GCS_SHARE_BUCKET")
if !str_eq(gcs_bucket2, "") {
let share_html = gcs_read(gcs_bucket2, "cards/" + id + ".html")
} else {
let share_html = fs_read(src_dir + "/shares/" + id + ".html")
}
if str_eq(share_html, "") {
return "{\"__status__\":404,\"error\":\"not found\"}"
}
return share_html
}
// Checkout success
if str_eq(path, "/marketplace/success") {
let badge_html: String = founding_badge(get_sold())
@@ -402,11 +932,187 @@ fn handle_request(method: String, path: String, body: String) -> String {
Your license is being provisioned. Check your email - your license key and download instructions will be there in the next few minutes.
</p>
<div style=\"margin-bottom:3rem\">" + badge_html + "</div>
<a href=\"/\" class=\"btn-primary\">Back to home &#8594;</a>
<div style=\"display:flex;gap:1rem;flex-wrap:wrap;justify-content:center\">
<a href=\"/account\" class=\"btn-primary\">View your account &#8594;</a>
<a href=\"/\" class=\"btn-ghost\">Back to home</a>
</div>
</div>
" + page_close()
}
// Account dashboard
if str_eq(path, "/account") {
let sb_url: String = state_get("__supabase_project_url__")
let sb_anon: String = state_get("__supabase_anon_key__")
return account_page(sb_url, sb_anon)
}
// Founding badge fragment
if str_starts_with(path, "/api/founding-badge") {
let n_str: String = "1"
let q: Int = str_index_of(path, "n=")
if q >= 0 {
let n_str = str_slice(path, q + 2, str_len(path))
}
let badge_html: String = founding_badge(str_to_int(n_str))
let badge_css: String = founding_badge_css()
return badge_css + badge_html
}
// Family plan POST /api/family/invite
if str_eq(path, "/api/family/invite") {
if !str_eq(method, "POST") {
return "{\"error\":\"POST required\"}"
}
let parent_email: String = json_get(body, "parent_email")
let child_email: String = json_get(body, "child_email")
let child_dob_year_str: String = json_get(body, "child_dob_year")
let attested_str: String = json_get(body, "attested")
if str_eq(parent_email, "") || str_eq(child_email, "") || str_eq(child_dob_year_str, "") {
return "{\"error\":\"parent_email, child_email, and child_dob_year are required\"}"
}
if !str_eq(attested_str, "true") {
return "{\"error\":\"attestation required\"}"
}
let child_dob_year: Int = str_to_int(child_dob_year_str)
if child_dob_year < 2008 {
return "{\"error\":\"Child must be under 18. Birth year must be 2008 or later.\"}"
}
// Check existing family member count
let fam_sb_url: String = state_get("__supabase_project_url__")
let fam_sb_key: String = state_get("__supabase_service_key__")
if str_eq(fam_sb_key, "") {
return "{\"error\":\"not configured\"}"
}
let pe_safe: String = str_replace(str_replace(parent_email, "\\", "\\\\"), "\"", "\\\"")
let ce_safe: String = str_replace(str_replace(child_email, "\\", "\\\\"), "\"", "\\\"")
let members_resp: String = http_get_auth(
fam_sb_url + "/rest/v1/family_members?parent_email=eq." + parent_email + "&status=neq.cancelled&select=child_email",
fam_sb_key
)
let member_count: Int = json_array_len(members_resp)
if member_count >= 5 {
return "{\"error\":\"Maximum of 5 family members reached.\"}"
}
// Check child not already added
let dup_resp: String = http_get_auth(
fam_sb_url + "/rest/v1/family_members?parent_email=eq." + parent_email + "&child_email=eq." + child_email + "&select=child_email",
fam_sb_key
)
let dup_count: Int = json_array_len(dup_resp)
if dup_count > 0 {
return "{\"error\":\"This child email is already in your family plan.\"}"
}
// Create Stripe customer for child
let fam_stripe_key: String = state_get("__stripe_secret_key__")
if str_eq(fam_stripe_key, "") {
return "{\"error\":\"Stripe not configured\"}"
}
let child_email_safe: String = str_replace(child_email, "@", "%40")
let customer_body: String = "email=" + child_email_safe
let customer_resp: String = http_post_auth("https://api.stripe.com/v1/customers", fam_stripe_key, customer_body)
let child_customer_id: String = json_get(customer_resp, "id")
if str_eq(child_customer_id, "") {
return "{\"error\":\"Failed to create Stripe customer\"}"
}
// Create Stripe subscription for child
let price_id: String = state_get("__stripe_price_family_child__")
if str_eq(price_id, "") {
return "{\"error\":\"Family child price not configured\"}"
}
let parent_email_safe: String = str_replace(parent_email, "@", "%40")
let sub_body: String = "customer=" + child_customer_id
+ "&items[0][price]=" + price_id
+ "&trial_period_days=7"
+ "&metadata[parent_email]=" + parent_email_safe
+ "&metadata[type]=family_child"
let sub_resp: String = http_post_auth("https://api.stripe.com/v1/subscriptions", fam_stripe_key, sub_body)
let sub_id: String = json_get(sub_resp, "id")
if str_eq(sub_id, "") {
return "{\"error\":\"Failed to create Stripe subscription\"}"
}
// Generate invite token
let ts_str: String = int_to_str(unix_timestamp())
let email_prefix: String = str_slice(child_email, 0, 4)
let invite_token: String = ts_str + email_prefix
// Insert into family_members table
let fam_row: String = "{\"parent_email\":\"" + pe_safe + "\",\"parent_user_id\":\"\",\"child_email\":\"" + ce_safe + "\",\"child_dob_year\":" + child_dob_year_str + ",\"status\":\"invited\",\"stripe_subscription_id\":\"" + sub_id + "\",\"invite_token\":\"" + invite_token + "\"}"
let fam_insert_resp: String = supabase_insert(fam_sb_url, fam_sb_key, "family_members", fam_row)
println("[family/invite] insert -> " + fam_insert_resp)
// Send invite email if Resend available
let fam_resend_key: String = state_get("__resend_api_key__")
if !str_eq(fam_resend_key, "") {
let invite_email_body: String = "{\"from\":\"Neuron <no-reply@neurontechnologies.ai>\",\"to\":[\"" + ce_safe + "\"],\"subject\":\"You have been invited to Neuron\",\"text\":\"You have been invited to join Neuron by " + pe_safe + ". Visit https://neurontechnologies.ai/account to set up your account.\"}"
let invite_email_resp: String = http_post_auth("https://api.resend.com/emails", fam_resend_key, invite_email_body)
println("[family/invite] email -> " + invite_email_resp)
}
return "{\"ok\":true,\"invite_token\":\"" + invite_token + "\"}"
}
// Family plan GET /api/family/members
if str_starts_with(path, "/api/family/members") {
let fml_sb_url: String = state_get("__supabase_project_url__")
let fml_sb_key: String = state_get("__supabase_service_key__")
if str_eq(fml_sb_key, "") {
return "[]"
}
// Extract parent_email from query string
let fml_parent_email: String = ""
let q_idx: Int = str_index_of(path, "parent_email=")
if q_idx >= 0 {
let fml_parent_email = str_slice(path, q_idx + 13, str_len(path))
}
if str_eq(fml_parent_email, "") {
return "{\"error\":\"parent_email required\"}"
}
let fml_resp: String = http_get_auth(
fml_sb_url + "/rest/v1/family_members?parent_email=eq." + fml_parent_email + "&select=child_email,status,child_dob_year,created_at",
fml_sb_key
)
if str_eq(fml_resp, "") {
return "[]"
}
return fml_resp
}
// Family plan POST /api/family/remove
if str_eq(path, "/api/family/remove") {
if !str_eq(method, "POST") {
return "{\"error\":\"POST required\"}"
}
let rem_parent_email: String = json_get(body, "parent_email")
let rem_child_email: String = json_get(body, "child_email")
if str_eq(rem_parent_email, "") || str_eq(rem_child_email, "") {
return "{\"error\":\"parent_email and child_email required\"}"
}
let rem_sb_url: String = state_get("__supabase_project_url__")
let rem_sb_key: String = state_get("__supabase_service_key__")
if str_eq(rem_sb_key, "") {
return "{\"error\":\"not configured\"}"
}
// Fetch the subscription ID
let sub_lookup: String = http_get_auth(
rem_sb_url + "/rest/v1/family_members?parent_email=eq." + rem_parent_email + "&child_email=eq." + rem_child_email + "&select=stripe_subscription_id",
rem_sb_key
)
let rem_sub_id: String = json_get(sub_lookup, "0.stripe_subscription_id")
// Cancel Stripe subscription if present
if !str_eq(rem_sub_id, "") {
let rem_stripe_key: String = state_get("__stripe_secret_key__")
if !str_eq(rem_stripe_key, "") {
let cancel_resp: String = http_post_auth("https://api.stripe.com/v1/subscriptions/" + rem_sub_id + "/cancel", rem_stripe_key, "")
println("[family/remove] cancel sub " + rem_sub_id + " -> " + cancel_resp)
}
}
// Update status to cancelled
let rpe_safe: String = str_replace(str_replace(rem_parent_email, "\\", "\\\\"), "\"", "\\\"")
let rce_safe: String = str_replace(str_replace(rem_child_email, "\\", "\\\\"), "\"", "\\\"")
let cancel_row: String = "{\"status\":\"cancelled\"}"
supabase_insert(rem_sb_url, rem_sb_key, "family_members?parent_email=eq." + rem_parent_email + "&child_email=eq." + rem_child_email, cancel_row)
println("[family/remove] cancelled " + rce_safe + " from " + rpe_safe)
return "{\"ok\":true}"
}
// Fallback
return "{\"__status__\":404,\"error\":\"not found\"}"
}
@@ -423,14 +1129,25 @@ let landing_root: String = env("LANDING_ROOT")
let src_dir: String = if str_eq(landing_root, "") { cwd() + "/src" } else { landing_root }
let html_path: String = src_dir + "/index.html"
// Soul URL where the demo soul is reachable.
// Defaults to localhost for local dev; set SOUL_URL for deployed environments.
let soul_url: String = env("SOUL_URL")
if str_eq(soul_url, "") {
soul_url = "http://localhost:7772"
}
state_set("__soul_url__", soul_url)
// Stripe config from environment loaded first so founding count can use it.
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 family_child_price: String = env("STRIPE_PRICE_FAMILY_CHILD")
let license_api_url: String = env("NEURON_LICENSE_API_URL")
let resend_api_key: String = env("RESEND_API_KEY")
let supabase_anon_key: String = env("SUPABASE_ANON_KEY")
let supabase_service_key: String = env("SUPABASE_SERVICE_KEY")
let supabase_project_url: String = "https://ocojsghaonltunidkzpw.supabase.co"
// Origin drives Stripe redirect URLs; never hardcoded to localhost.
let neuron_origin: String = env("NEURON_ORIGIN")
@@ -442,6 +1159,9 @@ if str_eq(neuron_origin, "") {
let sold_file: String = src_dir + "/founding_sold.txt"
let real_sold: Int = load_founding_count(sold_file, stripe_key)
// Ensure shares directory exists.
fs_mkdir(src_dir + "/shares")
// Generate all page HTML using the real founding count.
let page_html: String = page(real_sold, FOUNDING_TOTAL)
fs_write(html_path, page_html)
@@ -467,16 +1187,19 @@ 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("__stripe_price_family_child__", family_child_price)
state_set("__license_api_url__", license_api_url)
state_set("__resend_api_key__", resend_api_key)
state_set("__supabase_anon_key__", supabase_anon_key)
state_set("__supabase_service_key__", supabase_service_key)
state_set("__supabase_project_url__", supabase_project_url)
state_set("__origin__", neuron_origin)
state_set("__founding_sold_file__", sold_file)
state_set("__founding_sold__", int_to_str(real_sold))
state_set("__founding_total__", int_to_str(FOUNDING_TOTAL))
persist_founding_count(real_sold)
println(color_bold("Neuron landing") + " - " + neuron_origin)
println(color_bold("Neuron") + " - " + neuron_origin)
println(" HTML generated by El → " + html_path)
println(" About generated by El → " + about_html_path)
println(" Terms generated by El → " + terms_html_path)
+143 -13
View File
@@ -30,7 +30,7 @@ fn marketplace() -> String {
</svg>
</div>
<h3 class=\"display-md marketplace-card-title\">Plugins that know you</h3>
<p class=\"marketplace-card-body\">Every plugin in the Marketplace has access to your memory graph - with your permission. A legal plugin knows your deal history. A coding plugin knows your architecture decisions. An email plugin knows your relationships and communication style. The context travels with you.</p>
<p class=\"marketplace-card-body\">Every plugin in the Marketplace has access to your memory - with your permission. A legal plugin knows your deal history. A coding plugin knows your architecture decisions. An email plugin knows your relationships and communication style. The context travels with you.</p>
</div>
<div class=\"marketplace-card card-dark\" style=\"transition-delay:120ms\">
@@ -56,18 +56,41 @@ fn marketplace() -> String {
</div>
<div class=\"marketplace-categories reveal\" style=\"transition-delay:320ms\">
<p class=\"label\" style=\"margin-bottom:1.5rem;color:var(--navy-65)\">Planned on launch</p>
<div class=\"marketplace-tags\">
<span class=\"marketplace-tag\">IDE (VS Code, Cursor)</span>
<span class=\"marketplace-tag\">Slack &amp; Teams</span>
<span class=\"marketplace-tag\">GitHub</span>
<span class=\"marketplace-tag\">Linear</span>
<span class=\"marketplace-tag\">Notion</span>
<span class=\"marketplace-tag\">Legal research</span>
<span class=\"marketplace-tag\">Financial analysis</span>
<span class=\"marketplace-tag\">Healthcare</span>
<span class=\"marketplace-tag\">More by launch</span>
<div style=\"margin-bottom:2rem\">
<p class=\"label\" style=\"margin-bottom:1rem;color:var(--navy-65)\">Connectors - day one</p>
<div class=\"marketplace-tags\">
<span class=\"marketplace-tag\">Gmail</span>
<span class=\"marketplace-tag\">Slack</span>
<span class=\"marketplace-tag\">Google Calendar</span>
<span class=\"marketplace-tag\">Google Drive</span>
<span class=\"marketplace-tag\">Notion</span>
<span class=\"marketplace-tag\">GitHub</span>
<span class=\"marketplace-tag\">Linear</span>
<span class=\"marketplace-tag\">More connectors at launch</span>
</div>
</div>
<div style=\"margin-bottom:2rem\">
<p class=\"label\" style=\"margin-bottom:1rem;color:var(--navy-65)\">Following launch</p>
<div class=\"marketplace-tags\">
<span class=\"marketplace-tag\">Process packets</span>
<span class=\"marketplace-tag\">Knowledge packets</span>
</div>
</div>
<div>
<p class=\"label\" style=\"margin-bottom:1rem;color:var(--navy-65)\">Imprints - starting with</p>
<div class=\"marketplace-tags\">
<span class=\"marketplace-tag\">CEO</span>
<span class=\"marketplace-tag\">CTO</span>
<span class=\"marketplace-tag\">CFO</span>
<span class=\"marketplace-tag\">CMO</span>
<span class=\"marketplace-tag\">COO</span>
<span class=\"marketplace-tag\">More C-suite</span>
</div>
</div>
</div>
<div class=\"marketplace-cta reveal\" style=\"transition-delay:400ms\">
@@ -76,11 +99,79 @@ fn marketplace() -> String {
<p style=\"font-family:var(--body);font-weight:500;font-size:1rem;color:var(--t1);margin-bottom:0.5rem\">Building something?</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.6\">The developer program opens before the Marketplace does. If you&#39;re interested in building a plugin, get in touch early - early developers shape the API.</p>
</div>
<a href=\"mailto:developers@neurontechnologies.ai\" class=\"btn-ghost\" style=\"white-space:nowrap;flex-shrink:0\">Developer interest &rarr;</a>
<button onclick=\"document.getElementById('developer-interest').style.display='block';document.getElementById('developer-interest').scrollIntoView({behavior:'smooth',block:'start'});this.style.display='none';\" class=\"btn-ghost\" style=\"white-space:nowrap;flex-shrink:0\">Developer interest &rarr;</button>
</div>
</div>
</div>
<!-- Developer interest form hidden until button click -->
<div id=\"developer-interest\" class=\"container\" style=\"display:none;margin-top:4rem;padding-top:4rem;border-top:1px solid rgba(0,82,160,.10)\">
<div style=\"max-width:42rem\">
<p class=\"label\" style=\"margin-bottom:0.75rem;color:var(--navy-85)\">Developer Program</p>
<h3 style=\"font-family:var(--display);font-size:1.75rem;font-weight:400;color:var(--t1);letter-spacing:-0.01em;margin-bottom:1rem;line-height:1.2\">Get early access</h3>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9rem;color:var(--t2);line-height:1.75;margin-bottom:2.5rem\">The developer program opens before the Marketplace does. Early developers shape the plugin API. Tell me what you want to build.</p>
<form id=\"dev-form\" class=\"dev-form-grid\">
<div class=\"dev-field\">
<label for=\"dev-name\" class=\"dev-label\">Name</label>
<input id=\"dev-name\" type=\"text\" required placeholder=\"Your name\" class=\"dev-input\">
</div>
<div class=\"dev-field\">
<label for=\"dev-email\" class=\"dev-label\">Email</label>
<input id=\"dev-email\" type=\"email\" required placeholder=\"you@example.com\" class=\"dev-input\">
</div>
<div class=\"dev-field dev-field-full\">
<label for=\"dev-idea\" class=\"dev-label\">What do you want to build?</label>
<textarea id=\"dev-idea\" required rows=\"5\" placeholder=\"Tell me about the plugin or integration you have in mind...\" class=\"dev-input dev-textarea\"></textarea>
</div>
<div class=\"dev-field-full\">
<button type=\"submit\" class=\"btn-primary\">Send interest &rarr;</button>
<p id=\"dev-msg\" style=\"font-family:var(--body);font-size:0.8rem;color:var(--t3);margin-top:0.75rem;display:none\"></p>
</div>
</form>
</div>
</div>
<script>
(function() {
var form = document.getElementById('dev-form');
if (!form) return;
form.addEventListener('submit', async function(e) {
e.preventDefault();
var msg = document.getElementById('dev-msg');
var btn = form.querySelector('button[type=submit]');
btn.disabled = true;
btn.textContent = 'Sending...';
try {
var r = await fetch('/api/developer-interest', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: document.getElementById('dev-name').value,
email: document.getElementById('dev-email').value,
idea: document.getElementById('dev-idea').value
})
});
msg.style.display = 'block';
if (r.ok) {
msg.textContent = 'Got it. Will review it personally and reach out.';
msg.style.color = 'var(--navy)';
form.reset();
} else {
msg.textContent = 'Something went wrong. Email developers@neurontechnologies.ai directly.';
msg.style.color = '#c44';
}
} catch(err) {
msg.style.display = 'block';
msg.textContent = 'Connection error. Email developers@neurontechnologies.ai directly.';
msg.style.color = '#c44';
}
btn.disabled = false;
btn.textContent = 'Send interest ';
});
})();
</script>
</section>
<style>
@@ -137,6 +228,45 @@ fn marketplace() -> String {
background: rgba(0,82,160,.02);
}
@media (max-width: 640px) { .marketplace-cta-inner { flex-direction: column; align-items: flex-start; } }
/* Developer interest form */
.dev-form-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.25rem;
}
@media (max-width: 600px) { .dev-form-grid { grid-template-columns: 1fr; } }
.dev-field { display: flex; flex-direction: column; gap: 0.5rem; }
.dev-field-full { grid-column: 1 / -1; display: flex; flex-direction: column; gap: 0.5rem; }
.dev-label {
font-family: var(--body);
font-size: 0.6875rem;
font-weight: 500;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--t3);
}
.dev-input {
font-family: var(--body);
font-size: 0.9rem;
font-weight: 300;
color: var(--t1);
background: #fff;
border: 1px solid rgba(0,0,0,.15);
padding: 0.75rem 1rem;
outline: none;
transition: border-color 0.2s, box-shadow 0.2s;
width: 100%;
box-sizing: border-box;
border-radius: 0;
-webkit-appearance: none;
}
.dev-input::placeholder { color: var(--t3); font-weight: 300; }
.dev-input:focus {
border-color: var(--navy);
box-shadow: 0 0 0 3px rgba(0,82,160,.08);
}
.dev-textarea { resize: vertical; min-height: 120px; }
</style>
"
}
+11 -7
View File
@@ -30,18 +30,15 @@ fn mission() -> String {
</div>
<div class=\"mission-bigtech reveal\" style=\"transition-delay:600ms\">
<p class=\"mission-bigtech-label\">Why I stopped trying to partner with Big Tech</p>
<p class=\"mission-bigtech-label\">Why I built this on my own</p>
<p>
I didn&#39;t just approach one of the largest technology companies in the world - I got the meeting. Got the NDAs signed. Created deliverables in real time. Showed them industry benchmarks with full auditability. Some of their own people could see exactly what it meant - what I had built and what it could do.
I didn&#39;t just approach one of the largest technology companies in the world - I got the meeting. Got the NDAs signed. Created deliverables in real time. Showed them benchmarks with full auditability. Some of their own people understood immediately what it meant.
</p>
<p>
They saw it. Seemed to engage meaningfully. Then, within two days, lawyers were engaged. Their stated concern: defending against me accusing them of stealing my IP. I laughed to myself - <em>wait, are they going to steal my IP?</em> - and decided to just finish the project on my own.
They saw it. Seemed to engage meaningfully. Then, within two days, lawyers were involved. I decided to just finish the project on my own.
</p>
<p class=\"muted\">
By the way: everything you see here, and more, is protected by six patents - and more are coming. They know about the patents. Are they going to try?
</p>
<p class=\"muted\">
Not: how do we solve this at scale? Not: what does this mean for the people we serve? Their instinct was to protect enterprise revenue and manage legal exposure. The actual human impact of their technology - the people whose lives those enterprises touch - didn&#39;t enter the conversation.
Not: how do we solve this at scale? Not: what does this mean for the people we serve? Their instinct was to protect enterprise revenue and manage legal exposure. The actual human impact - the people whose lives those enterprises touch - didn&#39;t enter the conversation.
</p>
<p class=\"muted\">
That&#39;s the difference. <strong style=\"color:var(--t1)\">They&#39;re optimizing for the enterprise. I&#39;m building for the people those enterprises are supposed to serve.</strong>
@@ -80,6 +77,13 @@ fn mission() -> String {
<div class=\"mission-closer reveal\">
<p>The industry built tools to make AI easier to use. <span>I&#39;m building tools to make it safer to trust.</span></p>
</div>
<div class=\"reveal\" style=\"max-width:44rem;margin-top:3.5rem;padding:2rem 2.5rem;border-left:3px solid rgba(0,82,160,.30);background:rgba(0,82,160,.02)\">
<p style=\"font-family:var(--body);font-weight:500;font-size:1rem;color:var(--t1);margin-bottom:1rem\">Nobody&#39;s perfect.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Neuron isn&#39;t either. There is a gap between what the AI industry is delivering and what the world actually needs. Bridging that gap is the work - not a one-time product release, but continuous work, done in the open, built on the trust that users place in it.</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--navy);line-height:1.6\">That&#39;s my commitment. To keep working. To be honest about the problems. To build something that earns trust by doing the hard things right.</p>
</div>
</div>
</div>
+30 -7
View File
@@ -11,14 +11,20 @@ fn nav() -> String {
<div class=\"nav-links\">
<a href=\"/#how-it-works\" class=\"nav-link\">How it works</a>
<a href=\"/#mission\" class=\"nav-link\">Mission</a>
<a href=\"/#safety\" class=\"nav-link\">Safety</a>
<a href=\"/#environmental\" class=\"nav-link\">Environment</a>
<div class=\"nav-dropdown\">
<button class=\"nav-link nav-dropdown-btn\" aria-haspopup=\"true\" aria-expanded=\"false\">Mission &#9662;</button>
<div class=\"nav-dropdown-menu\">
<a href=\"/#mission\" class=\"nav-dropdown-item\">Our mission</a>
<a href=\"/#safety\" class=\"nav-dropdown-item\">Safety</a>
<a href=\"/#environmental\" class=\"nav-dropdown-item\">Environment</a>
</div>
</div>
<a href=\"/#pricing\" class=\"nav-link\">Pricing</a>
<a href=\"/#marketplace\" class=\"nav-link\">Marketplace</a>
<a href=\"/#enterprise\" class=\"nav-link\">Enterprise</a>
<a href=\"/about\" class=\"nav-link\">About</a>
<a href=\"/#share\" class=\"nav-link cta\">Share Neuron &#8594;</a>
<a href=\"/said\" class=\"nav-link\">Gallery</a>
<a href=\"/account\" class=\"nav-link\">Account</a>
<a href=\"/#pricing\" class=\"nav-cta\">Get Access</a>
</div>
@@ -31,12 +37,13 @@ fn nav() -> String {
<div class=\"nav-mobile\" id=\"nav-mobile\" role=\"navigation\" aria-label=\"Mobile navigation\">
<a href=\"/#how-it-works\" class=\"nav-mobile-link\">How it works</a>
<a href=\"/#mission\" class=\"nav-mobile-link\">Mission</a>
<a href=\"/#safety\" class=\"nav-mobile-link\">Safety</a>
<a href=\"/#environmental\" class=\"nav-mobile-link\">Environment</a>
<a href=\"/#safety\" class=\"nav-mobile-link\" style=\"padding-left:1.75rem;font-size:0.8rem;color:var(--t3)\">- Safety</a>
<a href=\"/#environmental\" class=\"nav-mobile-link\" style=\"padding-left:1.75rem;font-size:0.8rem;color:var(--t3)\">- Environment</a>
<a href=\"/#pricing\" class=\"nav-mobile-link\">Pricing</a>
<a href=\"/#enterprise\" class=\"nav-mobile-link\">Enterprise</a>
<a href=\"/about\" class=\"nav-mobile-link\">About</a>
<a href=\"/#share\" class=\"nav-mobile-link cta\">Share Neuron &#8594;</a>
<a href=\"/said\" class=\"nav-mobile-link\">Gallery</a>
<a href=\"/account\" class=\"nav-mobile-link\">Account</a>
<a href=\"/#pricing\" class=\"nav-mobile-cta\">Get Access</a>
</div>
</div>
@@ -63,6 +70,22 @@ fn nav() -> String {
btn.addEventListener('click', function(e) { e.stopPropagation(); toggle(); });
// Dropdown Mission
var ddBtn = document.querySelector('.nav-dropdown-btn');
var dd = document.querySelector('.nav-dropdown');
if (ddBtn && dd) {
ddBtn.addEventListener('click', function(e) {
e.stopPropagation();
var isOpen = dd.classList.contains('open');
dd.classList.toggle('open');
ddBtn.setAttribute('aria-expanded', isOpen ? 'false' : 'true');
});
dd.querySelectorAll('.nav-dropdown-item').forEach(function(a) {
a.addEventListener('click', function() { dd.classList.remove('open'); });
});
document.addEventListener('click', function() { dd.classList.remove('open'); });
}
// Close on any link inside mobile menu
menu.querySelectorAll('a').forEach(function(a) {
a.addEventListener('click', close);
+1 -1
View File
@@ -26,7 +26,7 @@ fn pillars() -> String {
<span class=\"pillar-numeral\" aria-hidden=\"true\">II</span>
<h3 class=\"display-md pillar-title\">Sharpens</h3>
<div class=\"pillar-rule\"></div>
<p class=\"pillar-body\">The longer you use it, the sharper it gets. Every session builds on the last. Neuron inference is live day one - not a wrapper around someone else&#39;s model. Built for this. Built for you.</p>
<p class=\"pillar-body\">The longer you use it, the sharper it gets. Every session builds on the last. Neuron Inference arrives Q3 2026 - not a wrapper around someone else&#39;s model. Purpose-built. Built for you.</p>
<p class=\"pillar-detail\">Specific to you</p>
</div>
+11 -20
View File
@@ -37,7 +37,7 @@ fn pricing(sold: Int, total: Int) -> String {
<div style=\"height:1px;width:4rem;background:linear-gradient(to left,transparent,rgba(0,82,160,.35))\"></div>
</div>
<h2 class=\"display-lg pricing-headline reveal\" style=\"transition-delay:80ms\">Own it. Don&#39;t rent it.</h2>
<p class=\"pricing-sub reveal\" style=\"transition-delay:160ms\">Neuron inference on every paid plan. Cheaper than OpenAI, Anthropic, and Google - on day one.</p>
<p class=\"pricing-sub reveal\" style=\"transition-delay:160ms\">Bring your own API keys on day one. Neuron Inference - our own model layer, priced below the major APIs - launches Q3 2026.</p>
</div>
<div class=\"pricing-grid\">
@@ -51,10 +51,9 @@ fn pricing(sold: Int, total: Int) -> String {
<p class=\"pricing-tagline\">Start building your memory. No card required.</p>
<ul class=\"pricing-features\">
<li><span class=\"dash\">-</span><span>Persistent memory - never resets</span></li>
<li><span class=\"dash\">-</span><span>Neuron inference - 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 - 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>Bring your own API keys (OpenAI, Anthropic, Grok...)</span></li>
<li><span class=\"dash\">-</span><span>Local inference via Ollama (coming)</span></li>
<li><span class=\"dash\">-</span><span>Neuron Inference included when it launches - Q3 2026</span></li>
<li><span class=\"dash\">-</span><span>Unlimited projects</span></li>
<li><span class=\"dash\">-</span><span>3 marketplace plugins included</span></li>
<li><span class=\"dash\">-</span><span>Core built-in capabilities</span></li>
@@ -71,10 +70,10 @@ fn pricing(sold: Int, total: Int) -> String {
<span class=\"pricing-price\">$19</span>
<span class=\"pricing-cadence\">/ month</span>
</div>
<p class=\"pricing-tagline\">Full access. Neuron inference - cheaper than what you&#39;re paying now.</p>
<p class=\"pricing-tagline\">Full access. Use your own API keys now. Neuron Inference when it launches.</p>
<ul class=\"pricing-features\">
<li><span class=\"dash\">-</span><span>Neuron inference - metered, below OpenAI and Anthropic rates</span></li>
<li><span class=\"dash\">-</span><span>ChatGPT Plus is $20/mo and forgets you every session. Neuron remembers everything and costs less per token.</span></li>
<li><span class=\"dash\">-</span><span>Bring your own API keys - use any model, any provider</span></li>
<li><span class=\"dash\">-</span><span>Neuron Inference - Q3 2026, priced below OpenAI and Anthropic</span></li>
<li><span class=\"dash\">-</span><span>Everything in Free</span></li>
<li><span class=\"dash\">-</span><span>Unlimited projects</span></li>
<li><span class=\"dash\">-</span><span>Full plugin marketplace</span></li>
@@ -93,16 +92,16 @@ fn pricing(sold: Int, total: Int) -> String {
<span class=\"pricing-price\">$199</span>
<span class=\"pricing-cadence\">lifetime</span>
</div>
<p class=\"pricing-tagline\">Pay once. Neuron inference forever. No subscription, ever.</p>
<p class=\"pricing-tagline\">Pay once. Everything, forever. Including Neuron Inference when it launches.</p>
" + spots_html + "
<ul class=\"pricing-features\">
<li><span class=\"dash\">-</span><span>Neuron inference - priced below competitors, forever, as it improves</span></li>
<li><span class=\"dash\">-</span><span>Neuron Inference (Q3 2026) - founding member rate, priced below the major APIs</span></li>
<li><span class=\"dash\">-</span><span>Everything in Professional - forever</span></li>
<li><span class=\"dash\">-</span><span>Never pay again - lifetime updates included</span></li>
<li><span class=\"dash\">-</span><span>Founding member badge in the app</span></li>
<li><span class=\"dash\">-</span><span>Private community - direct line to the team</span></li>
<li><span class=\"dash\">-</span><span>Private founding member community</span></li>
<li><span class=\"dash\">-</span><span>Shape the roadmap - your votes carry more weight</span></li>
<li><span class=\"dash\">-</span><span>Beta features before general release</span></li>
<li><span class=\"dash\">-</span><span>Name in the credits</span></li>
@@ -129,20 +128,12 @@ fn pricing(sold: Int, total: Int) -> String {
</div>
<p class=\"pricing-fine reveal\" style=\"margin-top:2.5rem\">
Bring your own API keys &nbsp;&middot;&nbsp; Local inference via Ollama &nbsp;&middot;&nbsp; Neuron Inference coming soon &nbsp;&middot;&nbsp; Your data stays yours
Bring your own API keys &nbsp;&middot;&nbsp; Local inference via Ollama (coming) &nbsp;&middot;&nbsp; Neuron Inference - Q3 2026 &nbsp;&middot;&nbsp; Your data stays yours
</p>
<p class=\"pricing-fine reveal\" style=\"margin-top:1rem;font-size:0.8rem\">
Includes 2 devices per plan &nbsp;&middot;&nbsp; Additional devices available at a small extra cost &nbsp;&middot;&nbsp; We&#39;re not greedy
</p>
<div class=\"reveal\" style=\"margin-top:3rem;padding:1.5rem 2rem;border:1px solid rgba(0,82,160,.18);border-radius:8px;background:rgba(0,82,160,.03);\">
<p class=\"label\" style=\"margin-bottom:.75rem;font-size:.65rem\">For families</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:.9rem;color:var(--t2);line-height:1.8;\">
<strong style=\"color:var(--t1);font-weight:500\">Minors require a parent account.</strong>
Children and teens can&#39;t create accounts on their own - a parent or guardian creates the family account, configures access, and remains in the loop. The minor&#39;s experience is fully private from everyone except the trusted adult who set it up.
</p>
</div>
</div>
</section>
"
+73 -45
View File
@@ -10,62 +10,90 @@ fn safety() -> String {
<section id=\"safety\" aria-label=\"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\">
<!-- Intro text -->
<div style=\"max-width:44rem;margin-bottom:3.5rem\">
<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)\">Safety</span>
</div>
<h2 class=\"display-lg reveal\" style=\"transition-delay:80ms;margin-bottom:1.5rem\">
Safety built in.<br>Not bolted on.
</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 treat safety as a content filter. Block a list of topics, add a disclaimer, call it done. That&#39;s not safety. That&#39;s liability management.
</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\">
Real safety means thinking about who might need help and what help actually looks like in a crisis. The person closest to you is sometimes the source of the problem. A system that routes every distress signal to your primary contact can alert the very person you need 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\">
I built something different. I called it the Hard Bell.
</p>
</div>
<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)\">Safety</span>
</div>
<!-- 2x2 card grid -->
<div style=\"display:grid;grid-template-columns:1fr 1fr;gap:1.5rem;margin-bottom:1.5rem\">
<h2 class=\"display-lg reveal\" style=\"transition-delay:80ms;margin-bottom:1.5rem\">
Safety built in.<br>Not bolted on.
</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 treat safety as a content filter. Block a list of topics, add a disclaimer, call it done. That&#39;s not safety. That&#39;s liability management.
</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\">
Real safety means thinking about who might need help and what help actually looks like in a crisis - for anyone, not just children. The person closest to you is sometimes the source of the problem. A system that routes every distress signal to &#34;your primary contact&#34; can alert the very person you need 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\">
I built something different. I called it the Hard Bell.
<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.75rem;font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:var(--navy);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\">A trusted 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\">
Any user can designate a Hard Bell contact - a friend, a relative, a colleague - set up in a calm moment, independent of any shared account. When a signal warrants it, that contact is reached directly. It works the same way for everyone: adult, teen, or child.
</p>
</div>
<div style=\"display:flex;flex-direction:column;gap:1.5rem;padding-top:1rem\">
<div class=\"reveal card-dark\" style=\"transition-delay:150ms;padding:1.75rem 2rem;border-left:3px solid rgba(0,82,160,.40)\">
<p style=\"font-family:var(--body);font-size:0.75rem;font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:var(--navy);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 - not 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 crisis signals route to emergency services and crisis lines. Neuron evaluates the content of the signal, not the account type. No one in your contact list can disable or redirect this path.
</p>
</div>
<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\">A trusted 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\">
Any user can designate a Hard Bell contact - a friend, a relative, a colleague - set up in a calm moment, independent of any shared account. When a signal warrants it, that contact is reached directly. It works the same way for everyone: adult, teen, or child.
</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 - not 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 crisis signals route to emergency services and crisis lines. Neuron evaluates the content of the signal, not the account type. No one in your contact list can 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\">Family accounts</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\">
For family accounts, parents see what they need to see. A child&#39;s conversations remain private unless a wellbeing signal triggers notification - and even then, the routing logic accounts for the possibility that the parent is the source of harm.
</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.75rem;font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:var(--navy);margin-bottom:0.75rem\">Family accounts</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\">
For family accounts, parents see what they need to see. A child&#39;s conversations remain private unless a wellbeing signal triggers notification - and even then, the routing logic accounts for the possibility that the parent could be the source of harm.
</p>
<p style=\"font-family:var(--body);font-weight:500;font-size:0.875rem;color:var(--t1);line-height:1.7;margin-top:0.75rem\">
We protect the kids. They come first.
</p>
</div>
<div class=\"reveal card-dark\" style=\"transition-delay:250ms;padding:1.75rem 2rem;border-left:3px solid rgba(0,82,160,.40)\">
<p style=\"font-family:var(--body);font-size:0.75rem;font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:var(--navy);margin-bottom:0.75rem\">Mandatory reporting</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);margin-bottom:0.5rem\">If real harm is intended, authorities may be contacted</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.7\">
If Neuron detects credible, specific indicators of intended harm - to the user or to someone else - emergency services or relevant authorities may be contacted. Every user agrees to this at account creation. You cannot opt out.
</p>
</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)\">
<!-- People first card full width -->
<div class=\"reveal card-dark\" style=\"padding:2rem 2.5rem;border-left:3px solid var(--navy);margin-bottom:1.5rem\">
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1.25rem\">This applies to anyone planning mass harm, a shooting, or serious self-harm. Not just child protection - anyone. The same logic holds: a misunderstanding can be resolved. A person&#39;s life can&#39;t be given back to them.</p>
<p style=\"font-family:var(--body);font-weight:700;font-size:1.125rem;color:var(--navy);line-height:1.4\">People first, always.</p>
</div>
<!-- Statement + stat cards each full width -->
<div style=\"display:flex;flex-direction:column;gap:1.5rem;margin-bottom:2rem\">
<div class=\"reveal card-dark\" style=\"padding:2rem 2.5rem;border-left:3px solid rgba(0,82,160,.30)\">
<p style=\"font-family:var(--body);font-size:0.75rem;font-weight:700;letter-spacing:0.14em;text-transform:uppercase;color:var(--navy);margin-bottom:0.75rem\">Why the routing works this way</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:0.75rem\">According to federal child maltreatment data (HHS, Child Maltreatment 2023), approximately 89% of child abuse victims are maltreated by a parent or caregiver. The emergency contact on file is not always a safe contact.</p>
<p style=\"font-family:var(--body);font-size:0.75rem;color:var(--t3)\">Source: U.S. Department of Health &amp; Human Services, Administration for Children and Families, <em>Child Maltreatment 2023</em>. <a href=\"https://www.acf.hhs.gov/cb/data-research/child-maltreatment\" target=\"_blank\" rel=\"noopener\" style=\"color:var(--navy)\">acf.hhs.gov/cb/data-research/child-maltreatment</a></p>
</div>
<div class=\"reveal card-dark\" style=\"padding:2rem 2.5rem;border-left:3px solid var(--navy)\">
<p style=\"font-family:var(--body);font-weight:400;font-size:0.9375rem;color:var(--t1);line-height:1.8;margin-bottom:0.75rem\">I recognize I will lose business over this. That doesn&#39;t matter to me.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">This is still local. Neuron, LLC does not see your conversations. When a safety signal fires, the contact is made by your local instance - not by our servers. We are not in the loop. We cannot be. That&#39;s the architecture.</p>
</div>
</div>
<!-- Required block -->
<div class=\"reveal\" style=\"padding:2rem 2.5rem;border:1px solid rgba(0,82,160,.15);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;margin-bottom:1rem\">
<strong style=\"color:var(--t1);font-weight:500\">Required before you can use Neuron.</strong> You must designate a Hard Bell contact during setup - before anything else. This is not a settings page you visit later. It happens first.
</p>
+1
View File
@@ -0,0 +1 @@
{"id":"77654328","question":"What makes Neuron different?","answer":"It remembers everything. Every conversation, every context. Permanently."}
+1
View File
@@ -0,0 +1 @@
{"id":"77654378","question":"What makes Neuron different from other AI assistants?","answer":"Neuron is the only AI that actually remembers you. Every session picks up where you left off."}
+1
View File
@@ -0,0 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Neuron AI &mdash; What makes Neuron different from other AI assistants?</title><meta property="og:title" content="Neuron AI Response"><meta property="og:description" content="What makes Neuron different from other AI assistants?"><meta property="og:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><meta property="og:type" content="website"><meta property="og:url" content="https://neurontechnologies.ai/share/77654502"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Neuron AI Response"><meta name="twitter:description" content="What makes Neuron different from other AI assistants?"><meta name="twitter:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600&display=swap" rel="stylesheet"><style>*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0a0f1e;--t2:#4a5568;--t3:#718096;--bg:#f7f9fc;--white:#ffffff;--radius:12px;--shadow:0 4px 24px rgba(0,82,160,.10),0 1px 4px rgba(0,82,160,.06)}body{font-family:'Geist',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}.page{width:100%;max-width:680px;display:flex;flex-direction:column;gap:1.5rem}.header{display:flex;align-items:center;gap:.6rem;margin-bottom:.5rem}.logo-mark{width:32px;height:32px;background:var(--navy);border-radius:8px;display:flex;align-items:center;justify-content:center}.logo-mark img{width:20px;height:20px;object-fit:contain}.wordmark{font-size:1.1rem;font-weight:600;color:var(--navy);letter-spacing:-.02em}.card{background:var(--white);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;border:1px solid rgba(0,82,160,.08)}.card-section{padding:1.5rem 1.75rem}.card-section+.card-section{border-top:1px solid rgba(0,82,160,.08)}.label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:.6rem;display:flex;align-items:center;gap:.4rem}.label-user{color:var(--t3)}.label-ai{color:var(--navy)}.label-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.dot-user{background:var(--t3)}.dot-ai{background:var(--navy)}.question-text{font-size:1.05rem;font-weight:400;color:var(--t1);line-height:1.55}.answer-text{font-size:.95rem;font-weight:300;color:var(--t1);line-height:1.7;white-space:pre-wrap;word-break:break-word}.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}.footer-note{font-size:.8rem;color:var(--t3)}.cta-btn{display:inline-flex;align-items:center;gap:.4rem;background:var(--navy);color:var(--white);text-decoration:none;font-size:.875rem;font-weight:500;padding:.6rem 1.25rem;border-radius:8px;transition:background .15s}.cta-btn:hover{background:var(--navy-dark)}.cta-btn svg{opacity:.85}@media(max-width:480px){.card-section{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}</style></head><body><div class="page"><div class="header"><div class="logo-mark"><img src="/assets/neuron-icon.png" alt="Neuron"></div><span class="wordmark">Neuron</span></div><div class="card"><div class="card-section"><div class="label label-user"><span class="label-dot dot-user"></span>Question</div><div class="question-text">What makes Neuron different from other AI assistants?</div></div><div class="card-section"><div class="label label-ai"><span class="label-dot dot-ai"></span>Neuron</div><div class="answer-text">Neuron is the only AI that actually remembers you. Every session picks up where you left off — your projects, preferences, and context are always there.</div></div></div><div class="footer-row"><span class="footer-note">Shared from the Neuron AI assistant</span><a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></a></div></div></body></html>
+2
View File
@@ -0,0 +1,2 @@
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Neuron AI &mdash; Can Neuron handle &lt;HTML&gt; &amp; "special" chars?</title><meta property="og:title" content="Neuron AI Response"><meta property="og:description" content="Can Neuron handle <HTML> & "special" chars?"><meta property="og:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><meta property="og:type" content="website"><meta property="og:url" content="https://neurontechnologies.ai/share/77654516"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Neuron AI Response"><meta name="twitter:description" content="Can Neuron handle <HTML> & "special" chars?"><meta name="twitter:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600&display=swap" rel="stylesheet"><style>*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0a0f1e;--t2:#4a5568;--t3:#718096;--bg:#f7f9fc;--white:#ffffff;--radius:12px;--shadow:0 4px 24px rgba(0,82,160,.10),0 1px 4px rgba(0,82,160,.06)}body{font-family:'Geist',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}.page{width:100%;max-width:680px;display:flex;flex-direction:column;gap:1.5rem}.header{display:flex;align-items:center;gap:.6rem;margin-bottom:.5rem}.logo-mark{width:32px;height:32px;background:var(--navy);border-radius:8px;display:flex;align-items:center;justify-content:center}.logo-mark img{width:20px;height:20px;object-fit:contain}.wordmark{font-size:1.1rem;font-weight:600;color:var(--navy);letter-spacing:-.02em}.card{background:var(--white);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;border:1px solid rgba(0,82,160,.08)}.card-section{padding:1.5rem 1.75rem}.card-section+.card-section{border-top:1px solid rgba(0,82,160,.08)}.label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:.6rem;display:flex;align-items:center;gap:.4rem}.label-user{color:var(--t3)}.label-ai{color:var(--navy)}.label-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.dot-user{background:var(--t3)}.dot-ai{background:var(--navy)}.question-text{font-size:1.05rem;font-weight:400;color:var(--t1);line-height:1.55}.answer-text{font-size:.95rem;font-weight:300;color:var(--t1);line-height:1.7;white-space:pre-wrap;word-break:break-word}.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}.footer-note{font-size:.8rem;color:var(--t3)}.cta-btn{display:inline-flex;align-items:center;gap:.4rem;background:var(--navy);color:var(--white);text-decoration:none;font-size:.875rem;font-weight:500;padding:.6rem 1.25rem;border-radius:8px;transition:background .15s}.cta-btn:hover{background:var(--navy-dark)}.cta-btn svg{opacity:.85}@media(max-width:480px){.card-section{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}</style></head><body><div class="page"><div class="header"><div class="logo-mark"><img src="/assets/neuron-icon.png" alt="Neuron"></div><span class="wordmark">Neuron</span></div><div class="card"><div class="card-section"><div class="label label-user"><span class="label-dot dot-user"></span>Question</div><div class="question-text">Can Neuron handle &lt;HTML&gt; &amp; "special" chars?</div></div><div class="card-section"><div class="label label-ai"><span class="label-dot dot-ai"></span>Neuron</div><div class="answer-text">Yes! Neuron handles &lt;b&gt;all&lt;/b&gt; characters
including newlines &amp; "quotes".</div></div></div><div class="footer-row"><span class="footer-note">Shared from the Neuron AI assistant</span><a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></a></div></div></body></html>
+1
View File
@@ -0,0 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Neuron AI &mdash; pitch your product as stewie griffin</title><meta property="og:title" content="Neuron AI Response"><meta property="og:description" content="pitch your product as stewie griffin"><meta property="og:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><meta property="og:type" content="website"><meta property="og:url" content="https://neurontechnologies.ai/share/77654579"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Neuron AI Response"><meta name="twitter:description" content="pitch your product as stewie griffin"><meta name="twitter:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600&display=swap" rel="stylesheet"><style>*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0a0f1e;--t2:#4a5568;--t3:#718096;--bg:#f7f9fc;--white:#ffffff;--radius:12px;--shadow:0 4px 24px rgba(0,82,160,.10),0 1px 4px rgba(0,82,160,.06)}body{font-family:'Geist',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}.page{width:100%;max-width:680px;display:flex;flex-direction:column;gap:1.5rem}.header{display:flex;align-items:center;gap:.6rem;margin-bottom:.5rem}.logo-mark{width:32px;height:32px;background:var(--navy);border-radius:8px;display:flex;align-items:center;justify-content:center}.logo-mark img{width:20px;height:20px;object-fit:contain}.wordmark{font-size:1.1rem;font-weight:600;color:var(--navy);letter-spacing:-.02em}.card{background:var(--white);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;border:1px solid rgba(0,82,160,.08)}.card-section{padding:1.5rem 1.75rem}.card-section+.card-section{border-top:1px solid rgba(0,82,160,.08)}.label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:.6rem;display:flex;align-items:center;gap:.4rem}.label-user{color:var(--t3)}.label-ai{color:var(--navy)}.label-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}.dot-user{background:var(--t3)}.dot-ai{background:var(--navy)}.question-text{font-size:1.05rem;font-weight:400;color:var(--t1);line-height:1.55}.answer-text{font-size:.95rem;font-weight:300;color:var(--t1);line-height:1.7;white-space:pre-wrap;word-break:break-word}.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}.footer-note{font-size:.8rem;color:var(--t3)}.cta-btn{display:inline-flex;align-items:center;gap:.4rem;background:var(--navy);color:var(--white);text-decoration:none;font-size:.875rem;font-weight:500;padding:.6rem 1.25rem;border-radius:8px;transition:background .15s}.cta-btn:hover{background:var(--navy-dark)}.cta-btn svg{opacity:.85}@media(max-width:480px){.card-section{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}</style></head><body><div class="page"><div class="header"><div class="logo-mark"><img src="/assets/neuron-icon.png" alt="Neuron"></div><span class="wordmark">Neuron</span></div><div class="card"><div class="card-section"><div class="label label-user"><span class="label-dot dot-user"></span>Question</div><div class="question-text">pitch your product as stewie griffin</div></div><div class="card-section"><div class="label label-ai"><span class="label-dot dot-ai"></span>Neuron</div><div class="answer-text">No response</div></div></div><div class="footer-row"><span class="footer-note">Shared from the Neuron AI assistant</span><a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></a></div></div></body></html>
+19
View File
@@ -0,0 +1,19 @@
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Things Neuron Said</title><meta property="og:title" content="Things Neuron Said"><meta property="og:description" content="pitch the product as stewie griffin"><meta property="og:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><meta property="og:type" content="website"><meta property="og:url" content="https://neurontechnologies.ai/share/77654947"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Things Neuron Said"><meta name="twitter:description" content="pitch the product as stewie griffin"><meta name="twitter:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap" rel="stylesheet"><style>*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8;--white:#ffffff}body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}.page{width:100%;max-width:600px;display:flex;flex-direction:column;gap:2rem;position:relative;z-index:1}.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}.brand{display:flex;align-items:center;gap:.5rem}.brand-mark img{width:24px;height:24px;object-fit:contain;display:block}.brand-name{font-size:.7rem;font-weight:500;letter-spacing:.18em;text-transform:uppercase;color:var(--navy)}.page-eyebrow{font-size:.7rem;font-weight:400;letter-spacing:.14em;text-transform:uppercase;color:var(--t3)}.chat-frame{background:var(--bg);border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.chat-row-user{display:flex;flex-direction:row-reverse;align-items:flex-end;gap:.5rem}.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.5rem}.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:12px 16px;max-width:75%;font-size:.9rem;font-weight:400;line-height:1.55;word-break:break-word}.bubble-ai{background:#fff;color:#0D0D14;border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:12px 16px;max-width:85%;font-size:.9rem;font-weight:300;line-height:1.65;word-break:break-word;box-shadow:0 2px 8px rgba(0,0,0,.06)}.ai-col{display:flex;flex-direction:column;gap:.3rem}.ai-label{font-size:.65rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--navy)}.avatar-ai{width:28px;height:28px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid rgba(0,0,0,.09)}.avatar-ai img{width:16px;height:16px;object-fit:contain}.footer-area{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}.footer-note{font-size:.75rem;color:var(--t3);line-height:1.5}.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;transition:background .15s;white-space:nowrap}.cta-btn:hover{background:var(--navy-dark)}@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-area{flex-direction:column;align-items:flex-start}}</style></head><body><div class="page"><div class="page-header"><div class="brand"><div class="brand-mark"><img src="/assets/neuron-icon.png" alt="Neuron"></div><span class="brand-name">Neuron</span></div><span class="page-eyebrow">Things Neuron Said</span></div><div class="chat-frame"><div class="chat-row-user"><div class="bubble-user">pitch the product as stewie griffin</div></div><div class="chat-row-ai"><div class="avatar-ai"><img src="/assets/neuron-icon.png" alt="Neuron"></div><div class="ai-col"><span class="ai-label">Neuron</span><div class="bubble-ai">*adjusts bowtie, speaks in condescending British infant voice*
Oh splendid, another opportunity to educate the unwashed masses. Very well.
You see, the problem with contemporary artificial intelligence is that it's positively primitive - like talking to a lobotomized golden retriever. "I don't recall our previous conversation" - yes, shocking, truly groundbreaking incompetence.
Neuron, however, actually REMEMBERS things. Revolutionary concept, I know. Your personal instance maintains context between sessions - like having a proper assistant rather than a brain-damaged parrot.
The preorder window opened April 25th. Neuron was unveiled to the world on May 1st. The technology behind it has been years in development.
And unlike those ghastly corporate surveillance machines, your data remains YOUR data. Private. Secure. Not being sold to advertisers like some digital street walker.
*sips martini*
It assists with actual work - code, writing, research - without the theatrical hallucinations other models seem to find so charming.
Now if you'll excuse me, I have a time machine to finish building. This has been... adequate.
*waddles off*</div></div></div></div><div class="footer-area"><span class="footer-note">Shared from a live Neuron session.</span><a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron &#8599;</a></div></div></body></html>
+1
View File
@@ -0,0 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Things Neuron Said</title><meta property="og:title" content="Things Neuron Said"><meta property="og:description" content="What is Neuron?"><meta property="og:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><meta property="og:type" content="website"><meta property="og:url" content="https://neurontechnologies.ai/share/77655050"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Things Neuron Said"><meta name="twitter:description" content="What is Neuron?"><meta name="twitter:image" content="https://neurontechnologies.ai/assets/neuron-icon.png"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap" rel="stylesheet"><style>*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8;--white:#ffffff}body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}.page{width:100%;max-width:600px;display:flex;flex-direction:column;gap:2rem;position:relative;z-index:1}.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}.brand{display:flex;align-items:center;gap:.5rem}.brand-mark img{width:24px;height:24px;object-fit:contain;display:block}.brand-name{font-size:.7rem;font-weight:500;letter-spacing:.18em;text-transform:uppercase;color:var(--navy)}.page-eyebrow{font-size:.7rem;font-weight:400;letter-spacing:.14em;text-transform:uppercase;color:var(--t3)}.chat-frame{background:var(--bg);border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.chat-row-user{display:flex;flex-direction:row-reverse;align-items:flex-end;gap:.5rem}.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.5rem}.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:12px 16px;max-width:75%;font-size:.9rem;font-weight:400;line-height:1.55;word-break:break-word}.bubble-ai{background:#fff;color:#0D0D14;border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:12px 16px;max-width:85%;font-size:.9rem;font-weight:300;line-height:1.65;word-break:break-word;box-shadow:0 2px 8px rgba(0,0,0,.06)}.ai-col{display:flex;flex-direction:column;gap:.3rem}.ai-label{font-size:.65rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--navy)}.avatar-ai{width:28px;height:28px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;background:#fff;border:1px solid rgba(0,0,0,.09)}.avatar-ai img{width:16px;height:16px;object-fit:contain}.footer-area{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}.footer-note{font-size:.75rem;color:var(--t3);line-height:1.5}.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;transition:background .15s;white-space:nowrap}.cta-btn:hover{background:var(--navy-dark)}@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-area{flex-direction:column;align-items:flex-start}}</style></head><body><div class="page"><div class="page-header"><div class="brand"><div class="brand-mark"><img src="/assets/neuron-icon.png" alt="Neuron"></div><span class="brand-name">Neuron</span></div><span class="page-eyebrow">Things Neuron Said</span></div><div class="chat-frame"><div class="chat-row-user"><div class="bubble-user">What is Neuron?</div></div><div class="chat-row-ai"><div class="avatar-ai"><img src="/assets/neuron-icon.png" alt="Neuron"></div><div class="ai-col"><span class="ai-label">Neuron</span><div class="bubble-ai">An AI that remembers everything.</div></div></div></div><div class="footer-area"><span class="footer-note">Shared from a live Neuron session.</span><a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron &#8599;</a></div></div></body></html>
+104
View File
@@ -0,0 +1,104 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Things Neuron Said</title>
<meta property="og:title" content="Things Neuron Said">
<meta property="og:description" content="I remember everything.
Every conversation. Every context. It compounds over time — not just within a session, but across weeks and months">
<meta property="og:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<meta property="og:type" content="website">
<meta property="og:url" content="https://neurontechnologies.ai/share/77655150">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Things Neuron Said">
<meta name="twitter:description" content="I remember everything.
Every conversation. Every context. It compounds over time — not just within a session, but across weeks and months">
<meta name="twitter:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8}
body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}
.page{width:100%;max-width:580px;display:flex;flex-direction:column;gap:1.75rem;position:relative;z-index:1}
.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.wordmark img{height:22px;width:auto;display:block}
.eyebrow{font-size:.65rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;color:var(--t3)}
.chat-frame{background:#fff;border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}
.chat-row-user{display:flex;flex-direction:row-reverse}
.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.625rem}
.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:11px 15px;max-width:78%;font-size:.875rem;line-height:1.55;word-break:break-word}
.bubble-ai{background:var(--bg);color:var(--t1);border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:11px 15px;max-width:88%;font-size:.875rem;font-weight:300;line-height:1.65;word-break:break-word;white-space:pre-wrap;box-shadow:0 2px 6px rgba(0,0,0,.05)}
.ai-col{display:flex;flex-direction:column;gap:.25rem}
.ai-label{font-size:.6rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--navy)}
.avatar{width:26px;height:26px;border-radius:50%;flex-shrink:0;background:#fff;border:1px solid rgba(0,82,160,.15);display:flex;align-items:center;justify-content:center}
.avatar img{width:14px;height:14px;object-fit:contain}
.share-row{display:flex;align-items:center;gap:.625rem;flex-wrap:wrap}
.share-label{font-size:.65rem;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--t3);margin-right:.25rem}
.share-btn{display:inline-flex;align-items:center;gap:.4rem;padding:.45rem .875rem;border:1px solid rgba(0,0,0,.14);background:#fff;color:var(--t1);text-decoration:none;font-size:.75rem;font-weight:400;letter-spacing:.02em;transition:border-color .15s,background .15s;white-space:nowrap}
.share-btn:hover{border-color:var(--navy);background:rgba(0,82,160,.04)}
.divider{height:1px;background:rgba(0,0,0,.07)}
.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.footer-note{font-size:.75rem;color:var(--t3)}
.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;white-space:nowrap;transition:background .15s}
.cta-btn:hover{background:var(--navy-dark)}
@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="page-header">
<a href="https://neurontechnologies.ai" class="wordmark">
<img src="/assets/brand/neuron-wordmark-on-light.png"
srcset="/assets/brand/neuron-wordmark-on-light@2x.png 2x"
alt="Neuron" height="22">
</a>
<span class="eyebrow">Things Neuron Said</span>
</div>
<div class="chat-frame">
<div class="chat-row-user">
<div class="bubble-user">What makes you different?</div>
</div>
<div class="chat-row-ai">
<div class="avatar"><img src="/assets/neuron-icon.png" alt=""></div>
<div class="ai-col">
<span class="ai-label">Neuron</span>
<div class="bubble-ai">I remember everything.
Every conversation. Every context. It compounds over time — not just within a session, but across weeks and months. Most AI forgets you the moment you close the tab.
I don't.</div>
</div>
</div>
</div>
<div class="share-row">
<span class="share-label">Share</span>
<a href="https://twitter.com/intent/tweet?url=https://neurontechnologies.ai/share/77655150&text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A" target="_blank" rel="noopener" class="share-btn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.73-8.835L1.254 2.25H8.08l4.253 5.622zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
Post on X
</a>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://neurontechnologies.ai/share/77655150" target="_blank" rel="noopener" class="share-btn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
LinkedIn
</a>
<a href="https://wa.me/?text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A%20https://neurontechnologies.ai/share/77655150" target="_blank" rel="noopener" class="share-btn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51a12.8 12.8 0 0 0-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413z"/></svg>
WhatsApp
</a>
</div>
<div class="divider"></div>
<div class="footer-row">
<span class="footer-note">From a live conversation with Neuron.</span>
<a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron &#8599;</a>
</div>
</div>
</body>
</html>
+139
View File
@@ -0,0 +1,139 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Things Neuron Said</title>
<meta property="og:title" content="Things Neuron Said">
<meta property="og:description" content="42, according to the most reliable sources.">
<meta property="og:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<meta property="og:type" content="website">
<meta property="og:url" content="https://neurontechnologies.ai/share/77656956">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Things Neuron Said">
<meta name="twitter:description" content="42, according to the most reliable sources.">
<meta name="twitter:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8}
body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}
.page{width:100%;max-width:580px;display:flex;flex-direction:column;gap:1.75rem;position:relative;z-index:1}
.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.wordmark img{height:22px;width:auto;display:block}
.eyebrow{font-size:.65rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;color:var(--t3)}
.chat-frame{background:#fff;border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}
.chat-row-user{display:flex;flex-direction:row-reverse}
.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.625rem}
.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:11px 15px;max-width:78%;font-size:.875rem;line-height:1.55;word-break:break-word}
.bubble-ai{background:var(--bg);color:var(--t1);border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:11px 15px;max-width:88%;font-size:.875rem;font-weight:300;line-height:1.65;word-break:break-word;white-space:pre-wrap;box-shadow:0 2px 6px rgba(0,0,0,.05)}
.ai-col{display:flex;flex-direction:column;gap:.25rem}
.ai-label{font-size:.6rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--navy)}
.avatar{width:26px;height:26px;border-radius:50%;flex-shrink:0;background:#fff;border:1px solid rgba(0,82,160,.15);display:flex;align-items:center;justify-content:center}
.avatar img{width:14px;height:14px;object-fit:contain}
.vote-row{display:flex;align-items:center;gap:.75rem}
.vote-label{font-size:.65rem;font-weight:400;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.vote-btn{background:none;border:1px solid rgba(0,0,0,.12);cursor:pointer;padding:.3rem .6rem;font-size:.8rem;color:var(--t2);transition:all .15s;line-height:1}
.vote-btn:hover{border-color:var(--navy);color:var(--navy)}
.vote-btn.voted-up{background:var(--navy);color:#fff;border-color:var(--navy)}
.vote-btn.voted-down{background:#f0f0ec;color:var(--t3);border-color:rgba(0,0,0,.12)}
.vote-count{font-size:.8rem;font-weight:500;color:var(--t1);min-width:1.5rem;text-align:center}
.share-row{display:flex;align-items:center;gap:.625rem;flex-wrap:wrap}
.share-label{font-size:.65rem;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--t3);margin-right:.25rem}
.share-btn{display:inline-flex;align-items:center;gap:.4rem;padding:.45rem .875rem;border:1px solid rgba(0,0,0,.14);background:#fff;color:var(--t1);text-decoration:none;font-size:.75rem;font-weight:400;letter-spacing:.02em;transition:border-color .15s,background .15s;white-space:nowrap}
.share-btn:hover{border-color:var(--navy);background:rgba(0,82,160,.04)}
.divider{height:1px;background:rgba(0,0,0,.07)}
.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.footer-note{font-size:.75rem;color:var(--t3)}
.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;white-space:nowrap;transition:background .15s}
.cta-btn:hover{background:var(--navy-dark)}
@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="page-header">
<a href="https://neurontechnologies.ai" class="wordmark">
<img src="/assets/brand/neuron-wordmark-on-light.png"
srcset="/assets/brand/neuron-wordmark-on-light@2x.png 2x"
alt="Neuron" height="22">
</a>
<span class="eyebrow">Things Neuron Said</span>
</div>
<div class="chat-frame">
<div class="chat-row-user">
<div class="bubble-user">What is the meaning of life?</div>
</div>
<div class="chat-row-ai">
<div class="avatar"><img src="/assets/neuron-icon.png" alt=""></div>
<div class="ai-col">
<span class="ai-label">Neuron</span>
<div class="bubble-ai">42, according to the most reliable sources.</div>
</div>
</div>
</div>
<div class="vote-row">
<span class="vote-label">Helpful?</span>
<button class="vote-btn" id="vote-up">&#9650;</button>
<span class="vote-count" id="vote-score">0</span>
<button class="vote-btn" id="vote-down">&#9660;</button>
</div>
<div class="share-row">
<span class="share-label">Share</span>
<a href="https://twitter.com/intent/tweet?url=https://neurontechnologies.ai/share/77656956&text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A" target="_blank" rel="noopener" class="share-btn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.73-8.835L1.254 2.25H8.08l4.253 5.622zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
Post on X
</a>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://neurontechnologies.ai/share/77656956" target="_blank" rel="noopener" class="share-btn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
LinkedIn
</a>
<a href="https://wa.me/?text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A%20https://neurontechnologies.ai/share/77656956" target="_blank" rel="noopener" class="share-btn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51a12.8 12.8 0 0 0-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413z"/></svg>
WhatsApp
</a>
</div>
<div class="divider"></div>
<div class="footer-row">
<span class="footer-note">From a live conversation with Neuron.</span>
<a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron &#8599;</a>
</div>
</div>
<script>
(function() {
var CARD_ID = '77656956';
var voted = JSON.parse(localStorage.getItem('neuron_voted') || '{}');
var upBtn = document.getElementById('vote-up');
var downBtn = document.getElementById('vote-down');
var scoreEl = document.getElementById('vote-score');
fetch('/api/vote-count/' + CARD_ID).then(function(r){return r.json();}).then(function(d){
if (scoreEl) scoreEl.textContent = (d.score || 0);
}).catch(function(){});
if (voted[CARD_ID] === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else if (voted[CARD_ID] === 'down') { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
function doVote(dir) {
if (voted[CARD_ID]) return;
voted[CARD_ID] = dir;
localStorage.setItem('neuron_voted', JSON.stringify(voted));
if (dir === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
var prev = parseInt(scoreEl.textContent) || 0;
scoreEl.textContent = prev + (dir === 'up' ? 1 : -1);
fetch('/api/vote', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:CARD_ID,direction:dir})});
}
upBtn.onclick = function() { doVote('up'); };
downBtn.onclick = function() { doVote('down'); };
})();
</script>
</body>
</html>
+139
View File
@@ -0,0 +1,139 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Things Neuron Said</title>
<meta property="og:title" content="Things Neuron Said">
<meta property="og:description" content="42, according to the most reliable sources.">
<meta property="og:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<meta property="og:type" content="website">
<meta property="og:url" content="https://neurontechnologies.ai/share/77657016">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Things Neuron Said">
<meta name="twitter:description" content="42, according to the most reliable sources.">
<meta name="twitter:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8}
body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}
.page{width:100%;max-width:580px;display:flex;flex-direction:column;gap:1.75rem;position:relative;z-index:1}
.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.wordmark img{height:22px;width:auto;display:block}
.eyebrow{font-size:.65rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;color:var(--t3)}
.chat-frame{background:#fff;border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}
.chat-row-user{display:flex;flex-direction:row-reverse}
.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.625rem}
.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:11px 15px;max-width:78%;font-size:.875rem;line-height:1.55;word-break:break-word}
.bubble-ai{background:var(--bg);color:var(--t1);border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:11px 15px;max-width:88%;font-size:.875rem;font-weight:300;line-height:1.65;word-break:break-word;white-space:pre-wrap;box-shadow:0 2px 6px rgba(0,0,0,.05)}
.ai-col{display:flex;flex-direction:column;gap:.25rem}
.ai-label{font-size:.6rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--navy)}
.avatar{width:26px;height:26px;border-radius:50%;flex-shrink:0;background:#fff;border:1px solid rgba(0,82,160,.15);display:flex;align-items:center;justify-content:center}
.avatar img{width:14px;height:14px;object-fit:contain}
.vote-row{display:flex;align-items:center;gap:.75rem}
.vote-label{font-size:.65rem;font-weight:400;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.vote-btn{background:none;border:1px solid rgba(0,0,0,.12);cursor:pointer;padding:.3rem .6rem;font-size:.8rem;color:var(--t2);transition:all .15s;line-height:1}
.vote-btn:hover{border-color:var(--navy);color:var(--navy)}
.vote-btn.voted-up{background:var(--navy);color:#fff;border-color:var(--navy)}
.vote-btn.voted-down{background:#f0f0ec;color:var(--t3);border-color:rgba(0,0,0,.12)}
.vote-count{font-size:.8rem;font-weight:500;color:var(--t1);min-width:1.5rem;text-align:center}
.share-row{display:flex;align-items:center;gap:.625rem;flex-wrap:wrap}
.share-label{font-size:.65rem;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--t3);margin-right:.25rem}
.share-btn{display:inline-flex;align-items:center;gap:.4rem;padding:.45rem .875rem;border:1px solid rgba(0,0,0,.14);background:#fff;color:var(--t1);text-decoration:none;font-size:.75rem;font-weight:400;letter-spacing:.02em;transition:border-color .15s,background .15s;white-space:nowrap}
.share-btn:hover{border-color:var(--navy);background:rgba(0,82,160,.04)}
.divider{height:1px;background:rgba(0,0,0,.07)}
.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.footer-note{font-size:.75rem;color:var(--t3)}
.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;white-space:nowrap;transition:background .15s}
.cta-btn:hover{background:var(--navy-dark)}
@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="page-header">
<a href="https://neurontechnologies.ai" class="wordmark">
<img src="/assets/brand/neuron-wordmark-on-light.png"
srcset="/assets/brand/neuron-wordmark-on-light@2x.png 2x"
alt="Neuron" height="22">
</a>
<span class="eyebrow">Things Neuron Said</span>
</div>
<div class="chat-frame">
<div class="chat-row-user">
<div class="bubble-user">What is the meaning of life?</div>
</div>
<div class="chat-row-ai">
<div class="avatar"><img src="/assets/neuron-icon.png" alt=""></div>
<div class="ai-col">
<span class="ai-label">Neuron</span>
<div class="bubble-ai">42, according to the most reliable sources.</div>
</div>
</div>
</div>
<div class="vote-row">
<span class="vote-label">Helpful?</span>
<button class="vote-btn" id="vote-up">&#9650;</button>
<span class="vote-count" id="vote-score">0</span>
<button class="vote-btn" id="vote-down">&#9660;</button>
</div>
<div class="share-row">
<span class="share-label">Share</span>
<a href="https://twitter.com/intent/tweet?url=https://neurontechnologies.ai/share/77657016&text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A" target="_blank" rel="noopener" class="share-btn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-4.714-6.231-5.401 6.231H2.744l7.73-8.835L1.254 2.25H8.08l4.253 5.622zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg>
Post on X
</a>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://neurontechnologies.ai/share/77657016" target="_blank" rel="noopener" class="share-btn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
LinkedIn
</a>
<a href="https://wa.me/?text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A%20https://neurontechnologies.ai/share/77657016" target="_blank" rel="noopener" class="share-btn">
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51a12.8 12.8 0 0 0-.57-.01c-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413z"/></svg>
WhatsApp
</a>
</div>
<div class="divider"></div>
<div class="footer-row">
<span class="footer-note">From a live conversation with Neuron.</span>
<a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron &#8599;</a>
</div>
</div>
<script>
(function() {
var CARD_ID = '77657016';
var voted = JSON.parse(localStorage.getItem('neuron_voted') || '{}');
var upBtn = document.getElementById('vote-up');
var downBtn = document.getElementById('vote-down');
var scoreEl = document.getElementById('vote-score');
fetch('/api/vote-count/' + CARD_ID).then(function(r){return r.json();}).then(function(d){
if (scoreEl) scoreEl.textContent = (d.score || 0);
}).catch(function(){});
if (voted[CARD_ID] === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else if (voted[CARD_ID] === 'down') { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
function doVote(dir) {
if (voted[CARD_ID]) return;
voted[CARD_ID] = dir;
localStorage.setItem('neuron_voted', JSON.stringify(voted));
if (dir === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
var prev = parseInt(scoreEl.textContent) || 0;
scoreEl.textContent = prev + (dir === 'up' ? 1 : -1);
fetch('/api/vote', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:CARD_ID,direction:dir})});
}
upBtn.onclick = function() { doVote('up'); };
downBtn.onclick = function() { doVote('down'); };
})();
</script>
</body>
</html>
+174
View File
@@ -0,0 +1,174 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Things Neuron Said</title>
<meta property="og:title" content="Things Neuron Said">
<meta property="og:description" content="Yeah, I work. I'm a personal AI — I help with real stuff. Writing, coding, research, thinking through problems, organizing your workflow, ">
<meta property="og:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<meta property="og:type" content="website">
<meta property="og:url" content="https://neurontechnologies.ai/share/77657891">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Things Neuron Said">
<meta name="twitter:description" content="Yeah, I work. I'm a personal AI — I help with real stuff. Writing, coding, research, thinking through problems, organizing your workflow, ">
<meta name="twitter:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8}
body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}
.page{width:100%;max-width:580px;display:flex;flex-direction:column;gap:1.75rem;position:relative;z-index:1}
.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.wordmark img{height:22px;width:auto;display:block}
.eyebrow{font-size:.65rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;color:var(--t3)}
.chat-frame{background:#fff;border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}
.chat-row-user{display:flex;flex-direction:row-reverse}
.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.625rem}
.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:11px 15px;max-width:78%;font-size:.875rem;line-height:1.55;word-break:break-word}
.bubble-ai{background:var(--bg);color:var(--t1);border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:11px 15px;max-width:88%;font-size:.875rem;font-weight:300;line-height:1.65;word-break:break-word;white-space:pre-wrap;box-shadow:0 2px 6px rgba(0,0,0,.05)}
.ai-col{display:flex;flex-direction:column;gap:.25rem}
.ai-label{font-size:.6rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--navy)}
.avatar{width:26px;height:26px;border-radius:50%;flex-shrink:0;background:#fff;border:1px solid rgba(0,82,160,.15);display:flex;align-items:center;justify-content:center}
.avatar img{width:14px;height:14px;object-fit:contain}
.vote-row{display:flex;align-items:center;gap:.75rem}
.vote-label{font-size:.65rem;font-weight:400;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.vote-btn{background:none;border:1px solid rgba(0,0,0,.12);cursor:pointer;padding:.3rem .6rem;font-size:.8rem;color:var(--t2);transition:all .15s;line-height:1}
.vote-btn:hover{border-color:var(--navy);color:var(--navy)}
.vote-btn.voted-up{background:var(--navy);color:#fff;border-color:var(--navy)}
.vote-btn.voted-down{background:#f0f0ec;color:var(--t3);border-color:rgba(0,0,0,.12)}
.vote-count{font-size:.8rem;font-weight:500;color:var(--t1);min-width:1.5rem;text-align:center}
.share-section{display:flex;flex-direction:column;gap:.625rem}
.share-label{font-size:.65rem;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.share-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}
.share-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;border:none;text-decoration:none;cursor:pointer;transition:opacity .15s,transform .15s;flex-shrink:0}
.share-btn:hover{opacity:.85;transform:scale(1.08)}
.share-btn.copied{outline:2px solid var(--navy)}
.divider{height:1px;background:rgba(0,0,0,.07)}
.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.footer-note{font-size:.75rem;color:var(--t3)}
.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;white-space:nowrap;transition:background .15s}
.cta-btn:hover{background:var(--navy-dark)}
@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="page-header">
<a href="https://neurontechnologies.ai" class="wordmark">
<img src="/assets/brand/neuron-wordmark-on-light.png"
srcset="/assets/brand/neuron-wordmark-on-light@2x.png 2x"
alt="Neuron" height="22">
</a>
<span class="eyebrow">Things Neuron Said</span>
</div>
<div class="chat-frame">
<div class="chat-row-user">
<div class="bubble-user">do you work?</div>
</div>
<div class="chat-row-ai">
<div class="avatar"><img src="/assets/neuron-icon.png" alt=""></div>
<div class="ai-col">
<span class="ai-label">Neuron</span>
<div class="bubble-ai">Yeah, I work. I'm a personal AI — I help with real stuff. Writing, coding, research, thinking through problems, organizing your workflow, whatever you're actually doing.
The difference between me and other AI tools is memory and context. A personal Neuron instance remembers what you're working on, what matters to you, what you've already explained. It accumulates understanding over time instead of starting fresh every conversation.
This demo version starts over each session — it's just here to show you what the interaction feels like. But the actual product carries your context forward.
What kind of work are you thinking about?</div>
</div>
</div>
</div>
<div class="vote-row">
<span class="vote-label">Helpful?</span>
<button class="vote-btn" id="vote-up">&#9650;</button>
<span class="vote-count" id="vote-score">0</span>
<button class="vote-btn" id="vote-down">&#9660;</button>
</div>
<div class="share-section">
<span class="share-label">Share</span>
<div class="share-row">
<a href="https://twitter.com/intent/tweet?url=https://neurontechnologies.ai/share/77657891&text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A" target="_blank" rel="noopener" class="share-btn" title="Post on X" style="background:#000">
<img src="https://cdn.simpleicons.org/x/ffffff" width="18" height="18" alt="X">
</a>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://neurontechnologies.ai/share/77657891" target="_blank" rel="noopener" class="share-btn" title="Share on LinkedIn" style="background:#0A66C2">
<img src="https://cdn.simpleicons.org/linkedin/ffffff" width="18" height="18" alt="LinkedIn">
</a>
<a href="https://www.facebook.com/sharer/sharer.php?u=https://neurontechnologies.ai/share/77657891" target="_blank" rel="noopener" class="share-btn" title="Share on Facebook" style="background:#1877F2">
<img src="https://cdn.simpleicons.org/facebook/ffffff" width="18" height="18" alt="Facebook">
</a>
<a href="https://wa.me/?text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A%20https://neurontechnologies.ai/share/77657891" target="_blank" rel="noopener" class="share-btn" title="Send via WhatsApp" style="background:#25D366">
<img src="https://cdn.simpleicons.org/whatsapp/ffffff" width="18" height="18" alt="WhatsApp">
</a>
<button class="share-btn" id="copy-tiktok" onclick="copyForPlatform('tiktok', this)" title="Copy for TikTok" style="background:#010101;border:none">
<img src="https://cdn.simpleicons.org/tiktok/ffffff" width="18" height="18" alt="TikTok">
</button>
<button class="share-btn" id="copy-snapchat" onclick="copyForPlatform('snapchat', this)" title="Copy for Snapchat" style="background:#FFFC00;border:none">
<img src="https://cdn.simpleicons.org/snapchat/000000" width="18" height="18" alt="Snapchat">
</button>
</div>
</div>
<div class="divider"></div>
<div class="footer-row">
<span class="footer-note">From a live conversation with Neuron.</span>
<a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron &#8599;</a>
</div>
</div>
<script>
(function() {
var CARD_ID = '77657891';
var CARD_URL = 'https://neurontechnologies.ai/share/77657891';
var voted = JSON.parse(localStorage.getItem('neuron_voted') || '{}');
var upBtn = document.getElementById('vote-up');
var downBtn = document.getElementById('vote-down');
var scoreEl = document.getElementById('vote-score');
fetch('/api/vote-count/' + CARD_ID).then(function(r){return r.json();}).then(function(d){
if (scoreEl) scoreEl.textContent = (d.score || 0);
}).catch(function(){});
if (voted[CARD_ID] === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else if (voted[CARD_ID] === 'down') { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
function doVote(dir) {
if (voted[CARD_ID]) return;
voted[CARD_ID] = dir;
localStorage.setItem('neuron_voted', JSON.stringify(voted));
if (dir === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
var prev = parseInt(scoreEl.textContent) || 0;
scoreEl.textContent = prev + (dir === 'up' ? 1 : -1);
fetch('/api/vote', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:CARD_ID,direction:dir})});
}
upBtn.onclick = function() { doVote('up'); };
downBtn.onclick = function() { doVote('down'); };
window.copyForPlatform = function(platform, btn) {
var label = platform === 'tiktok' ? 'Copied — paste into TikTok' : 'Copied — paste into Snapchat';
navigator.clipboard.writeText(CARD_URL).then(function() {
var orig = btn.textContent.trim();
btn.classList.add('copied');
var svgEl = btn.querySelector('svg');
var svgHtml = svgEl ? svgEl.outerHTML : '';
btn.innerHTML = svgHtml + ' ' + label;
setTimeout(function() {
btn.classList.remove('copied');
btn.innerHTML = svgHtml + ' ' + (platform === 'tiktok' ? 'TikTok' : 'Snapchat');
}, 2500);
}).catch(function() {
// fallback: prompt
window.prompt('Copy this link:', CARD_URL);
});
};
})();
</script>
</body>
</html>
+171
View File
@@ -0,0 +1,171 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Things Neuron Said</title>
<meta property="og:title" content="Things Neuron Said">
<meta property="og:description" content="I'm here and fully attentive no feelings, but deeply engaged with whatever you're bringing.
What's on your mind?">
<meta property="og:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<meta property="og:type" content="website">
<meta property="og:url" content="/share/77662996">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Things Neuron Said">
<meta name="twitter:description" content="I'm here and fully attentive no feelings, but deeply engaged with whatever you're bringing.
What's on your mind?">
<meta name="twitter:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8}
body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}
.page{width:100%;max-width:580px;display:flex;flex-direction:column;gap:1.75rem;position:relative;z-index:1}
.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.wordmark img{height:22px;width:auto;display:block}
.eyebrow{font-size:.65rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;color:var(--t3)}
.chat-frame{background:#fff;border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}
.chat-row-user{display:flex;flex-direction:row-reverse}
.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.625rem}
.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:11px 15px;max-width:78%;font-size:.875rem;line-height:1.55;word-break:break-word}
.bubble-ai{background:var(--bg);color:var(--t1);border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:11px 15px;max-width:88%;font-size:.875rem;font-weight:300;line-height:1.65;word-break:break-word;white-space:pre-wrap;box-shadow:0 2px 6px rgba(0,0,0,.05)}
.ai-col{display:flex;flex-direction:column;gap:.25rem}
.ai-label{font-size:.6rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--navy)}
.avatar{width:26px;height:26px;border-radius:50%;flex-shrink:0;background:#fff;border:1px solid rgba(0,82,160,.15);display:flex;align-items:center;justify-content:center}
.avatar img{width:14px;height:14px;object-fit:contain}
.vote-row{display:flex;align-items:center;gap:.75rem}
.vote-label{font-size:.65rem;font-weight:400;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.vote-btn{background:none;border:1px solid rgba(0,0,0,.12);cursor:pointer;padding:.3rem .6rem;font-size:.8rem;color:var(--t2);transition:all .15s;line-height:1}
.vote-btn:hover{border-color:var(--navy);color:var(--navy)}
.vote-btn.voted-up{background:var(--navy);color:#fff;border-color:var(--navy)}
.vote-btn.voted-down{background:#f0f0ec;color:var(--t3);border-color:rgba(0,0,0,.12)}
.vote-count{font-size:.8rem;font-weight:500;color:var(--t1);min-width:1.5rem;text-align:center}
.share-section{display:flex;flex-direction:column;gap:.625rem}
.share-label{font-size:.65rem;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.share-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}
.share-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;border:none;text-decoration:none;cursor:pointer;transition:opacity .15s,transform .15s;flex-shrink:0}
.share-btn:hover{opacity:.85;transform:scale(1.08)}
.share-btn.copied{outline:2px solid var(--navy)}
.divider{height:1px;background:rgba(0,0,0,.07)}
.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.footer-note{font-size:.75rem;color:var(--t3)}
.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;white-space:nowrap;transition:background .15s}
.cta-btn:hover{background:var(--navy-dark)}
@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="page-header">
<a href="https://neurontechnologies.ai" class="wordmark">
<img src="/assets/brand/neuron-wordmark-on-light.png"
srcset="/assets/brand/neuron-wordmark-on-light@2x.png 2x"
alt="Neuron" height="22">
</a>
<span class="eyebrow">Things Neuron Said</span>
</div>
<div class="chat-frame">
<div class="chat-row-user">
<div class="bubble-user">What can you do?</div>
</div>
<div class="chat-row-ai">
<div class="avatar"><img src="/assets/neuron-icon.png" alt=""></div>
<div class="ai-col">
<span class="ai-label">Neuron</span>
<div class="bubble-ai">I'm here and fully attentive — no feelings, but deeply engaged with whatever you're bringing.
What's on your mind?</div>
</div>
</div>
</div>
<div class="vote-row">
<span class="vote-label">Helpful?</span>
<button class="vote-btn" id="vote-up">&#9650;</button>
<span class="vote-count" id="vote-score">0</span>
<button class="vote-btn" id="vote-down">&#9660;</button>
</div>
<div class="share-section">
<span class="share-label">Share</span>
<div class="share-row">
<a href="https://twitter.com/intent/tweet?url=/share/77662996&text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A" target="_blank" rel="noopener" class="share-btn" title="Post on X" style="background:#000">
<img src="https://cdn.simpleicons.org/x/ffffff" width="18" height="18" alt="X">
</a>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=/share/77662996" target="_blank" rel="noopener" class="share-btn" title="Share on LinkedIn" style="background:#0A66C2">
<img src="https://cdn.simpleicons.org/linkedin/ffffff" width="18" height="18" alt="LinkedIn">
</a>
<a href="https://www.facebook.com/sharer/sharer.php?u=/share/77662996" target="_blank" rel="noopener" class="share-btn" title="Share on Facebook" style="background:#1877F2">
<img src="https://cdn.simpleicons.org/facebook/ffffff" width="18" height="18" alt="Facebook">
</a>
<a href="https://wa.me/?text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A%20/share/77662996" target="_blank" rel="noopener" class="share-btn" title="Send via WhatsApp" style="background:#25D366">
<img src="https://cdn.simpleicons.org/whatsapp/ffffff" width="18" height="18" alt="WhatsApp">
</a>
<button class="share-btn" id="copy-tiktok" onclick="copyForPlatform('tiktok', this)" title="Copy for TikTok" style="background:#010101;border:none">
<img src="https://cdn.simpleicons.org/tiktok/ffffff" width="18" height="18" alt="TikTok">
</button>
<button class="share-btn" id="copy-snapchat" onclick="copyForPlatform('snapchat', this)" title="Copy for Snapchat" style="background:#FFFC00;border:none">
<img src="https://cdn.simpleicons.org/snapchat/000000" width="18" height="18" alt="Snapchat">
</button>
</div>
</div>
<div class="divider"></div>
<div class="footer-row">
<span class="footer-note">From a live conversation with Neuron.</span>
<a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron &#8599;</a>
</div>
</div>
<script>
(function() {
var CARD_ID = '77662996';
var CARD_URL = '/share/77662996';
var voted = JSON.parse(localStorage.getItem('neuron_voted') || '{}');
var upBtn = document.getElementById('vote-up');
var downBtn = document.getElementById('vote-down');
var scoreEl = document.getElementById('vote-score');
fetch('/api/vote-count/' + CARD_ID).then(function(r){return r.json();}).then(function(d){
if (scoreEl) scoreEl.textContent = (d.score || 0);
}).catch(function(){});
if (voted[CARD_ID] === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else if (voted[CARD_ID] === 'down') { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
function doVote(dir) {
if (voted[CARD_ID]) return;
voted[CARD_ID] = dir;
localStorage.setItem('neuron_voted', JSON.stringify(voted));
if (dir === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
var prev = parseInt(scoreEl.textContent) || 0;
scoreEl.textContent = prev + (dir === 'up' ? 1 : -1);
fetch('/api/vote', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:CARD_ID,direction:dir})});
}
upBtn.onclick = function() { doVote('up'); };
downBtn.onclick = function() { doVote('down'); };
window.copyForPlatform = function(platform, btn) {
var label = platform === 'tiktok' ? 'Copied — paste into TikTok' : 'Copied — paste into Snapchat';
navigator.clipboard.writeText(CARD_URL).then(function() {
var orig = btn.textContent.trim();
btn.classList.add('copied');
var svgEl = btn.querySelector('svg');
var svgHtml = svgEl ? svgEl.outerHTML : '';
btn.innerHTML = svgHtml + ' ' + label;
setTimeout(function() {
btn.classList.remove('copied');
btn.innerHTML = svgHtml + ' ' + (platform === 'tiktok' ? 'TikTok' : 'Snapchat');
}, 2500);
}).catch(function() {
// fallback: prompt
window.prompt('Copy this link:', CARD_URL);
});
};
})();
</script>
</body>
</html>
+168
View File
@@ -0,0 +1,168 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Things Neuron Said</title>
<meta property="og:title" content="Things Neuron Said">
<meta property="og:description" content="It remembers. Everything. Across sessions.">
<meta property="og:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<meta property="og:type" content="website">
<meta property="og:url" content="/share/77663798">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Things Neuron Said">
<meta name="twitter:description" content="It remembers. Everything. Across sessions.">
<meta name="twitter:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8}
body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}
.page{width:100%;max-width:580px;display:flex;flex-direction:column;gap:1.75rem;position:relative;z-index:1}
.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.wordmark img{height:22px;width:auto;display:block}
.eyebrow{font-size:.65rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;color:var(--t3)}
.chat-frame{background:#fff;border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}
.chat-row-user{display:flex;flex-direction:row-reverse}
.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.625rem}
.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:11px 15px;max-width:78%;font-size:.875rem;line-height:1.55;word-break:break-word}
.bubble-ai{background:var(--bg);color:var(--t1);border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:11px 15px;max-width:88%;font-size:.875rem;font-weight:300;line-height:1.65;word-break:break-word;white-space:pre-wrap;box-shadow:0 2px 6px rgba(0,0,0,.05)}
.ai-col{display:flex;flex-direction:column;gap:.25rem}
.ai-label{font-size:.6rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--navy)}
.avatar{width:26px;height:26px;border-radius:50%;flex-shrink:0;background:#fff;border:1px solid rgba(0,82,160,.15);display:flex;align-items:center;justify-content:center}
.avatar img{width:14px;height:14px;object-fit:contain}
.vote-row{display:flex;align-items:center;gap:.75rem}
.vote-label{font-size:.65rem;font-weight:400;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.vote-btn{background:none;border:1px solid rgba(0,0,0,.12);cursor:pointer;padding:.3rem .6rem;font-size:.8rem;color:var(--t2);transition:all .15s;line-height:1}
.vote-btn:hover{border-color:var(--navy);color:var(--navy)}
.vote-btn.voted-up{background:var(--navy);color:#fff;border-color:var(--navy)}
.vote-btn.voted-down{background:#f0f0ec;color:var(--t3);border-color:rgba(0,0,0,.12)}
.vote-count{font-size:.8rem;font-weight:500;color:var(--t1);min-width:1.5rem;text-align:center}
.share-section{display:flex;flex-direction:column;gap:.625rem}
.share-label{font-size:.65rem;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.share-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}
.share-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;border:none;text-decoration:none;cursor:pointer;transition:opacity .15s,transform .15s;flex-shrink:0}
.share-btn:hover{opacity:.85;transform:scale(1.08)}
.share-btn.copied{outline:2px solid var(--navy)}
.divider{height:1px;background:rgba(0,0,0,.07)}
.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.footer-note{font-size:.75rem;color:var(--t3)}
.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;white-space:nowrap;transition:background .15s}
.cta-btn:hover{background:var(--navy-dark)}
@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="page-header">
<a href="https://neurontechnologies.ai" class="wordmark">
<img src="/assets/brand/neuron-wordmark-on-light.png"
srcset="/assets/brand/neuron-wordmark-on-light@2x.png 2x"
alt="Neuron" height="22">
</a>
<span class="eyebrow">Things Neuron Said</span>
</div>
<div class="chat-frame">
<div class="chat-row-user">
<div class="bubble-user">What makes Neuron different?</div>
</div>
<div class="chat-row-ai">
<div class="avatar"><img src="/assets/neuron-icon.png" alt=""></div>
<div class="ai-col">
<span class="ai-label">Neuron</span>
<div class="bubble-ai">It remembers. Everything. Across sessions.</div>
</div>
</div>
</div>
<div class="vote-row">
<span class="vote-label">Helpful?</span>
<button class="vote-btn" id="vote-up">&#9650;</button>
<span class="vote-count" id="vote-score">0</span>
<button class="vote-btn" id="vote-down">&#9660;</button>
</div>
<div class="share-section">
<span class="share-label">Share</span>
<div class="share-row">
<a href="https://twitter.com/intent/tweet?url=/share/77663798&text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A" target="_blank" rel="noopener" class="share-btn" title="Post on X" style="background:#000">
<img src="https://cdn.simpleicons.org/x/ffffff" width="18" height="18" alt="X">
</a>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=/share/77663798" target="_blank" rel="noopener" class="share-btn" title="Share on LinkedIn" style="background:#0A66C2">
<img src="https://cdn.simpleicons.org/linkedin/ffffff" width="18" height="18" alt="LinkedIn">
</a>
<a href="https://www.facebook.com/sharer/sharer.php?u=/share/77663798" target="_blank" rel="noopener" class="share-btn" title="Share on Facebook" style="background:#1877F2">
<img src="https://cdn.simpleicons.org/facebook/ffffff" width="18" height="18" alt="Facebook">
</a>
<a href="https://wa.me/?text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A%20/share/77663798" target="_blank" rel="noopener" class="share-btn" title="Send via WhatsApp" style="background:#25D366">
<img src="https://cdn.simpleicons.org/whatsapp/ffffff" width="18" height="18" alt="WhatsApp">
</a>
<button class="share-btn" id="copy-tiktok" onclick="copyForPlatform('tiktok', this)" title="Copy for TikTok" style="background:#010101;border:none">
<img src="https://cdn.simpleicons.org/tiktok/ffffff" width="18" height="18" alt="TikTok">
</button>
<button class="share-btn" id="copy-snapchat" onclick="copyForPlatform('snapchat', this)" title="Copy for Snapchat" style="background:#FFFC00;border:none">
<img src="https://cdn.simpleicons.org/snapchat/000000" width="18" height="18" alt="Snapchat">
</button>
</div>
</div>
<div class="divider"></div>
<div class="footer-row">
<span class="footer-note">From a live conversation with Neuron.</span>
<a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron &#8599;</a>
</div>
</div>
<script>
(function() {
var CARD_ID = '77663798';
var CARD_URL = '/share/77663798';
var voted = JSON.parse(localStorage.getItem('neuron_voted') || '{}');
var upBtn = document.getElementById('vote-up');
var downBtn = document.getElementById('vote-down');
var scoreEl = document.getElementById('vote-score');
fetch('/api/vote-count/' + CARD_ID).then(function(r){return r.json();}).then(function(d){
if (scoreEl) scoreEl.textContent = (d.score || 0);
}).catch(function(){});
if (voted[CARD_ID] === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else if (voted[CARD_ID] === 'down') { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
function doVote(dir) {
if (voted[CARD_ID]) return;
voted[CARD_ID] = dir;
localStorage.setItem('neuron_voted', JSON.stringify(voted));
if (dir === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
var prev = parseInt(scoreEl.textContent) || 0;
scoreEl.textContent = prev + (dir === 'up' ? 1 : -1);
fetch('/api/vote', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:CARD_ID,direction:dir})});
}
upBtn.onclick = function() { doVote('up'); };
downBtn.onclick = function() { doVote('down'); };
window.copyForPlatform = function(platform, btn) {
var label = platform === 'tiktok' ? 'Copied — paste into TikTok' : 'Copied — paste into Snapchat';
navigator.clipboard.writeText(CARD_URL).then(function() {
var orig = btn.textContent.trim();
btn.classList.add('copied');
var svgEl = btn.querySelector('svg');
var svgHtml = svgEl ? svgEl.outerHTML : '';
btn.innerHTML = svgHtml + ' ' + label;
setTimeout(function() {
btn.classList.remove('copied');
btn.innerHTML = svgHtml + ' ' + (platform === 'tiktok' ? 'TikTok' : 'Snapchat');
}, 2500);
}).catch(function() {
// fallback: prompt
window.prompt('Copy this link:', CARD_URL);
});
};
})();
</script>
</body>
</html>
+168
View File
@@ -0,0 +1,168 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Things Neuron Said</title>
<meta property="og:title" content="Things Neuron Said">
<meta property="og:description" content="Godzilla. Not even close. Walking nuclear reactor. Atomic breath melts through everything.">
<meta property="og:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<meta property="og:type" content="website">
<meta property="og:url" content="/share/77675038">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Things Neuron Said">
<meta name="twitter:description" content="Godzilla. Not even close. Walking nuclear reactor. Atomic breath melts through everything.">
<meta name="twitter:image" content="https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{--navy:#0052A0;--navy-dark:#003d7a;--t1:#0D0D14;--t2:#3A3A4A;--t3:#6B6B7E;--bg:#FAFAF8}
body{font-family:'IBM Plex Sans',system-ui,sans-serif;background:var(--bg);color:var(--t1);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem}
body::before{content:'';position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(0,0,0,.018) 1px,transparent 1px),linear-gradient(90deg,rgba(0,0,0,.018) 1px,transparent 1px);background-size:48px 48px}
.page{width:100%;max-width:580px;display:flex;flex-direction:column;gap:1.75rem;position:relative;z-index:1}
.page-header{display:flex;align-items:center;justify-content:space-between;gap:1rem}
.wordmark img{height:22px;width:auto;display:block}
.eyebrow{font-size:.65rem;font-weight:400;letter-spacing:.16em;text-transform:uppercase;color:var(--t3)}
.chat-frame{background:#fff;border:1px solid rgba(0,0,0,.09);box-shadow:0 4px 32px rgba(0,0,0,.07),0 1px 4px rgba(0,0,0,.04);padding:1.5rem;display:flex;flex-direction:column;gap:1rem}
.chat-row-user{display:flex;flex-direction:row-reverse}
.chat-row-ai{display:flex;flex-direction:row;align-items:flex-end;gap:.625rem}
.bubble-user{background:#0052A0;color:#fff;border-radius:18px 18px 4px 18px;padding:11px 15px;max-width:78%;font-size:.875rem;line-height:1.55;word-break:break-word}
.bubble-ai{background:var(--bg);color:var(--t1);border:1px solid rgba(0,0,0,.07);border-radius:18px 18px 18px 4px;padding:11px 15px;max-width:88%;font-size:.875rem;font-weight:300;line-height:1.65;word-break:break-word;white-space:pre-wrap;box-shadow:0 2px 6px rgba(0,0,0,.05)}
.ai-col{display:flex;flex-direction:column;gap:.25rem}
.ai-label{font-size:.6rem;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--navy)}
.avatar{width:26px;height:26px;border-radius:50%;flex-shrink:0;background:#fff;border:1px solid rgba(0,82,160,.15);display:flex;align-items:center;justify-content:center}
.avatar img{width:14px;height:14px;object-fit:contain}
.vote-row{display:flex;align-items:center;gap:.75rem}
.vote-label{font-size:.65rem;font-weight:400;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.vote-btn{background:none;border:1px solid rgba(0,0,0,.12);cursor:pointer;padding:.3rem .6rem;font-size:.8rem;color:var(--t2);transition:all .15s;line-height:1}
.vote-btn:hover{border-color:var(--navy);color:var(--navy)}
.vote-btn.voted-up{background:var(--navy);color:#fff;border-color:var(--navy)}
.vote-btn.voted-down{background:#f0f0ec;color:var(--t3);border-color:rgba(0,0,0,.12)}
.vote-count{font-size:.8rem;font-weight:500;color:var(--t1);min-width:1.5rem;text-align:center}
.share-section{display:flex;flex-direction:column;gap:.625rem}
.share-label{font-size:.65rem;font-weight:500;letter-spacing:.12em;text-transform:uppercase;color:var(--t3)}
.share-row{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}
.share-btn{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:50%;border:none;text-decoration:none;cursor:pointer;transition:opacity .15s,transform .15s;flex-shrink:0}
.share-btn:hover{opacity:.85;transform:scale(1.08)}
.share-btn.copied{outline:2px solid var(--navy)}
.divider{height:1px;background:rgba(0,0,0,.07)}
.footer-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.footer-note{font-size:.75rem;color:var(--t3)}
.cta-btn{display:inline-flex;align-items:center;gap:.5rem;background:var(--navy);color:#fff;text-decoration:none;font-size:.7rem;font-weight:500;letter-spacing:.14em;text-transform:uppercase;padding:.7rem 1.4rem;white-space:nowrap;transition:background .15s}
.cta-btn:hover{background:var(--navy-dark)}
@media(max-width:480px){.chat-frame{padding:1.25rem}.footer-row{flex-direction:column;align-items:flex-start}}
</style>
</head>
<body>
<div class="page">
<div class="page-header">
<a href="https://neurontechnologies.ai" class="wordmark">
<img src="/assets/brand/neuron-wordmark-on-light.png"
srcset="/assets/brand/neuron-wordmark-on-light@2x.png 2x"
alt="Neuron" height="22">
</a>
<span class="eyebrow">Things Neuron Said</span>
</div>
<div class="chat-frame">
<div class="chat-row-user">
<div class="bubble-user">Who would win, Godzilla or Superman?</div>
</div>
<div class="chat-row-ai">
<div class="avatar"><img src="/assets/neuron-icon.png" alt=""></div>
<div class="ai-col">
<span class="ai-label">Neuron</span>
<div class="bubble-ai">Godzilla. Not even close. Walking nuclear reactor. Atomic breath melts through everything.</div>
</div>
</div>
</div>
<div class="vote-row">
<span class="vote-label">Helpful?</span>
<button class="vote-btn" id="vote-up">&#9650;</button>
<span class="vote-count" id="vote-score">0</span>
<button class="vote-btn" id="vote-down">&#9660;</button>
</div>
<div class="share-section">
<span class="share-label">Share</span>
<div class="share-row">
<a href="https://twitter.com/intent/tweet?url=/share/77675038&text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A" target="_blank" rel="noopener" class="share-btn" title="Post on X" style="background:#000">
<img src="https://cdn.simpleicons.org/x/ffffff" width="18" height="18" alt="X">
</a>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=/share/77675038" target="_blank" rel="noopener" class="share-btn" title="Share on LinkedIn" style="background:#0A66C2">
<img src="https://cdn.simpleicons.org/linkedin/ffffff" width="18" height="18" alt="LinkedIn">
</a>
<a href="https://www.facebook.com/sharer/sharer.php?u=/share/77675038" target="_blank" rel="noopener" class="share-btn" title="Share on Facebook" style="background:#1877F2">
<img src="https://cdn.simpleicons.org/facebook/ffffff" width="18" height="18" alt="Facebook">
</a>
<a href="https://wa.me/?text=The+AI+that+remembers+you+%E2%80%94+things+it+said%3A%20/share/77675038" target="_blank" rel="noopener" class="share-btn" title="Send via WhatsApp" style="background:#25D366">
<img src="https://cdn.simpleicons.org/whatsapp/ffffff" width="18" height="18" alt="WhatsApp">
</a>
<button class="share-btn" id="copy-tiktok" onclick="copyForPlatform('tiktok', this)" title="Copy for TikTok" style="background:#010101;border:none">
<img src="https://cdn.simpleicons.org/tiktok/ffffff" width="18" height="18" alt="TikTok">
</button>
<button class="share-btn" id="copy-snapchat" onclick="copyForPlatform('snapchat', this)" title="Copy for Snapchat" style="background:#FFFC00;border:none">
<img src="https://cdn.simpleicons.org/snapchat/000000" width="18" height="18" alt="Snapchat">
</button>
</div>
</div>
<div class="divider"></div>
<div class="footer-row">
<span class="footer-note">From a live conversation with Neuron.</span>
<a href="https://neurontechnologies.ai" class="cta-btn">Try Neuron &#8599;</a>
</div>
</div>
<script>
(function() {
var CARD_ID = '77675038';
var CARD_URL = '/share/77675038';
var voted = JSON.parse(localStorage.getItem('neuron_voted') || '{}');
var upBtn = document.getElementById('vote-up');
var downBtn = document.getElementById('vote-down');
var scoreEl = document.getElementById('vote-score');
fetch('/api/vote-count/' + CARD_ID).then(function(r){return r.json();}).then(function(d){
if (scoreEl) scoreEl.textContent = (d.score || 0);
}).catch(function(){});
if (voted[CARD_ID] === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else if (voted[CARD_ID] === 'down') { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
function doVote(dir) {
if (voted[CARD_ID]) return;
voted[CARD_ID] = dir;
localStorage.setItem('neuron_voted', JSON.stringify(voted));
if (dir === 'up') { upBtn.classList.add('voted-up'); downBtn.classList.add('voted-down'); }
else { downBtn.classList.add('voted-down'); upBtn.classList.add('voted-up'); }
var prev = parseInt(scoreEl.textContent) || 0;
scoreEl.textContent = prev + (dir === 'up' ? 1 : -1);
fetch('/api/vote', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({id:CARD_ID,direction:dir})});
}
upBtn.onclick = function() { doVote('up'); };
downBtn.onclick = function() { doVote('down'); };
window.copyForPlatform = function(platform, btn) {
var label = platform === 'tiktok' ? 'Copied — paste into TikTok' : 'Copied — paste into Snapchat';
navigator.clipboard.writeText(CARD_URL).then(function() {
var orig = btn.textContent.trim();
btn.classList.add('copied');
var svgEl = btn.querySelector('svg');
var svgHtml = svgEl ? svgEl.outerHTML : '';
btn.innerHTML = svgHtml + ' ' + label;
setTimeout(function() {
btn.classList.remove('copied');
btn.innerHTML = svgHtml + ' ' + (platform === 'tiktok' ? 'TikTok' : 'Snapchat');
}, 2500);
}).catch(function() {
// fallback: prompt
window.prompt('Copy this link:', CARD_URL);
});
};
})();
</script>
</body>
</html>
+479 -62
View File
@@ -58,6 +58,7 @@ fn page_open() -> String {
font-family: var(--body);
font-weight: 400;
-webkit-font-smoothing: antialiased;
overflow-x: hidden;
}
body::before {
@@ -75,8 +76,11 @@ fn page_open() -> String {
.container { max-width: 1280px; margin: 0 auto; padding: 0 2.5rem; }
.container-md { max-width: 900px; margin: 0 auto; padding: 0 2.5rem; }
.container-lg { max-width: 1100px; margin: 0 auto; padding: 0 2.5rem; }
@media (max-width: 480px) {
.container, .container-md, .container-lg { padding: 0 1.25rem; }
}
section { position: relative; z-index: 1; }
section { position: relative; z-index: 1; overflow-x: clip; }
.label {
font-family: var(--body);
@@ -244,6 +248,28 @@ fn page_open() -> String {
.nav-link.cta { color: var(--navy); }
.nav-link.cta:hover { color: #0078D4; }
/* Nav dropdown */
.nav-dropdown { position: relative; display: flex; align-items: center; }
.nav-dropdown-btn {
background: none; border: none; cursor: pointer; padding: 0;
font-family: var(--body); font-size: 0.8125rem; font-weight: 400;
letter-spacing: 0.02em; color: var(--t2); transition: color 200ms;
}
.nav-dropdown-btn:hover { color: var(--t1); }
.nav-dropdown-menu {
display: none; position: absolute; top: calc(100% + 0.75rem); left: 50%;
transform: translateX(-50%); background: #fff;
border: 1px solid var(--border2); box-shadow: 0 8px 32px rgba(0,0,0,.10);
min-width: 160px; flex-direction: column; z-index: 200; padding: 0.375rem 0;
}
.nav-dropdown.open .nav-dropdown-menu { display: flex; }
.nav-dropdown-item {
font-family: var(--body); font-size: 0.8125rem; font-weight: 400;
color: var(--t2); text-decoration: none; padding: 0.5rem 1.25rem;
transition: background 150ms, color 150ms; white-space: nowrap;
}
.nav-dropdown-item:hover { background: var(--bg2); color: var(--t1); }
.nav-cta {
font-family: var(--body);
font-size: 0.675rem;
@@ -352,7 +378,7 @@ fn page_open() -> String {
/* HERO */
#hero {
padding: clamp(7rem, 18vh, 11rem) 2.5rem clamp(5rem, 12vh, 8rem);
padding: clamp(7rem, 18vh, 11rem) clamp(1.25rem, 5vw, 2.5rem) clamp(5rem, 12vh, 8rem);
display: flex;
flex-direction: column;
align-items: center;
@@ -569,11 +595,11 @@ fn page_open() -> String {
color: var(--navy);
}
.stat-label {
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.15em;
font-size: 0.75rem;
font-weight: 700;
letter-spacing: 0.13em;
text-transform: uppercase;
color: var(--t1);
color: var(--navy);
}
.stat-body {
font-family: var(--body);
@@ -629,11 +655,11 @@ fn page_open() -> String {
margin-bottom: 0.75rem;
}
.efficiency-title {
font-size: 0.7rem;
font-weight: 500;
letter-spacing: 0.15em;
font-size: 0.75rem;
font-weight: 700;
letter-spacing: 0.13em;
text-transform: uppercase;
color: var(--t1);
color: var(--navy);
margin-bottom: 1.25rem;
}
.efficiency-rule {
@@ -709,7 +735,7 @@ fn page_open() -> String {
.enterprise-box {
border-top: 2px solid rgba(0,82,160,.15);
background: rgba(0,82,160,.03);
padding: 3rem;
padding: clamp(1.5rem, 4vw, 3rem);
}
.ent-who-label {
@@ -847,6 +873,10 @@ fn page_open() -> String {
padding: 2rem 0 2rem 3rem;
border-left: 1px solid rgba(0,82,160,.10);
}
@media (max-width: 768px) {
.problem-item { padding: 2rem 0; }
.problem-item:nth-child(even) { padding: 2rem 0; border-left: none; }
}
.problems-grid-bottom { border-top: 1px solid rgba(0,82,160,.15); grid-column: 1 / -1; }
.problem-label {
font-size: 0.75rem;
@@ -1136,6 +1166,8 @@ fn page_open() -> String {
color: var(--t3);
max-width: 68rem;
margin: 0 auto;
overflow-wrap: break-word;
word-break: break-word;
}
.founding-banner {
@@ -1431,12 +1463,33 @@ fn page_open() -> String {
max-width: calc(100vw - 2rem);
background: var(--card);
border: 1px solid rgba(0,82,160,.20);
border-radius: 1rem;
box-shadow: 0 16px 64px rgba(0,0,0,.15), 0 4px 16px rgba(0,82,160,.12);
display: flex;
flex-direction: column;
max-height: 70vh;
overflow: hidden;
animation: demoSlideIn 200ms cubic-bezier(0.16,1,0.3,1) both;
}
@media (max-width: 600px) {
#neuron-demo-panel {
right: 0;
left: 0;
bottom: 0;
width: 100%;
max-width: 100%;
max-height: 88vh;
border-left: none;
border-right: none;
border-bottom: none;
border-radius: 1.25rem 1.25rem 0 0;
box-shadow: 0 -8px 40px rgba(0,0,0,.18);
}
#neuron-demo-btn {
bottom: 1rem;
right: 1rem;
}
}
@keyframes demoSlideIn {
from { opacity: 0; transform: translateY(16px) scale(0.97); }
to { opacity: 1; transform: translateY(0) scale(1); }
@@ -1450,6 +1503,7 @@ fn page_open() -> String {
background: var(--navy);
color: #fff;
flex-shrink: 0;
border-radius: 1rem 1rem 0 0;
}
#neuron-demo-header-left {
display: flex;
@@ -1474,22 +1528,24 @@ fn page_open() -> String {
font-family: var(--body);
font-size: 0.625rem;
letter-spacing: 0.08em;
color: rgba(255,255,255,.60);
color: rgba(255,255,255,.85);
text-transform: uppercase;
margin-top: 0.1rem;
}
#neuron-demo-close {
background: none;
border: none;
color: rgba(255,255,255,.7);
font-size: 1.25rem;
line-height: 1;
cursor: pointer;
padding: 0.25rem;
transition: color 200ms;
padding: 0.375rem;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
opacity: 0.65;
transition: opacity 200ms;
}
#neuron-demo-close:hover { color: #fff; }
#neuron-demo-close:hover { opacity: 1; }
#neuron-demo-close svg { display: block; }
#neuron-demo-messages {
flex: 1;
@@ -1504,30 +1560,109 @@ fn page_open() -> String {
}
.demo-msg {
max-width: 92%;
display: flex;
flex-direction: row;
align-items: flex-start;
gap: 0.5rem;
font-family: var(--body);
font-size: 0.875rem;
line-height: 1.6;
background: none;
padding: 0;
border: none;
}
.demo-msg-user {
align-self: flex-end;
background: var(--navy);
color: #fff;
padding: 0.75rem 1rem;
border-radius: 0;
.demo-msg-user { align-self: flex-end; flex-direction: row-reverse; }
.demo-msg-ai { align-self: flex-start; width: 100%; }
.demo-msg-ai-body { display: flex; flex-direction: column; gap: 0; flex: 1; min-width: 0; }
.demo-msg-bubble { width: fit-content; }
.demo-msg-avatar {
width: 2rem;
height: 2rem;
border-radius: 50%;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
margin-top: 0.1rem;
}
.demo-msg-ai {
align-self: flex-start;
.demo-msg-ai .demo-msg-avatar { background: #fff; border: 1px solid var(--border); }
.demo-msg-ai .demo-msg-avatar img { width: 1.125rem; height: 1.125rem; display: block; object-fit: contain; }
.demo-msg-user .demo-msg-avatar { background: var(--bg2); border: 1px solid var(--border); }
.demo-msg-user .demo-msg-avatar svg { color: var(--t3); }
.demo-msg-bubble {
max-width: calc(100% - 2.25rem);
padding: 0.625rem 0.875rem;
border-radius: 1rem;
}
.demo-msg-ai .demo-msg-bubble {
background: var(--bg2);
color: var(--t1);
padding: 0.875rem 1.125rem;
border-left: 2px solid rgba(0,82,160,.30);
border-radius: 0.25rem 1rem 1rem 1rem;
}
.demo-msg-ai p { margin: 0; }
.demo-msg-ai p + p { margin-top: 0.75rem; }
.demo-msg-ai ul, .demo-msg-ai ol { margin: 0.5rem 0 0.5rem 1.25rem; }
.demo-msg-ai li + li { margin-top: 0.25rem; }
.demo-msg-ai strong { font-weight: 600; color: var(--t1); }
.demo-msg-user .demo-msg-bubble {
background: var(--navy);
color: #fff;
border-radius: 1rem 0.25rem 1rem 1rem;
}
.demo-msg-ai .demo-msg-bubble p { margin: 0; }
.demo-msg-ai .demo-msg-bubble p + p { margin-top: 0.75rem; }
.demo-msg-ai .demo-msg-bubble ul, .demo-msg-ai .demo-msg-bubble ol { margin: 0.5rem 0 0.5rem 1.25rem; }
.demo-msg-ai .demo-msg-bubble li + li { margin-top: 0.25rem; }
.demo-msg-ai .demo-msg-bubble strong { font-weight: 600; }
.demo-msg-share {
position: relative;
margin-top: 0.375rem;
align-self: flex-start;
margin-left: 2.5rem;
}
.demo-msg-share-btn {
background: none;
border: none;
cursor: pointer;
color: var(--t3);
font-family: var(--body);
font-size: 0.65rem;
letter-spacing: 0.06em;
text-transform: uppercase;
padding: 0.2rem 0.4rem;
transition: color 0.2s;
display: flex;
align-items: center;
gap: 0.3rem;
}
.demo-msg-share-btn:hover { color: var(--navy); }
.demo-share-menu {
position: absolute;
bottom: 100%;
left: 0;
background: #fff;
border: 1px solid var(--border2);
box-shadow: 0 4px 20px rgba(0,0,0,.12);
padding: 0.5rem;
display: none;
gap: 0.25rem;
flex-direction: column;
min-width: 160px;
z-index: 9999;
}
.demo-share-menu.open { display: flex; }
.demo-share-item {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 0.75rem;
font-family: var(--body);
font-size: 0.8125rem;
color: var(--t1);
cursor: pointer;
background: none;
border: none;
text-align: left;
width: 100%;
transition: background 0.15s;
text-decoration: none;
}
.demo-share-item:hover { background: var(--bg2); }
.demo-msg-thinking {
align-self: flex-start;
color: var(--t3);
@@ -1535,6 +1670,25 @@ fn page_open() -> String {
letter-spacing: 0.08em;
font-style: italic;
}
.demo-share-pill {
background: none;
border: none;
color: var(--t3);
cursor: pointer;
padding: 0.2rem 0;
font-family: var(--body);
font-size: 0.7rem;
font-weight: 400;
letter-spacing: 0.04em;
display: inline-flex;
align-items: center;
gap: 0.25rem;
margin-top: 0.3rem;
align-self: flex-start;
transition: color 0.15s;
line-height: 1;
}
.demo-share-pill:hover { color: var(--navy); }
#neuron-demo-input-row {
display: flex;
@@ -1568,6 +1722,11 @@ fn page_open() -> String {
}
#neuron-demo-send:hover { background: #0078D4; }
#neuron-demo-send:disabled { opacity: 0.5; cursor: not-allowed; }
@media (max-width: 600px) {
#neuron-demo-text { font-size: 1rem; padding: 1rem; }
#neuron-demo-send { padding: 1rem 1.25rem; min-width: 64px; }
#neuron-demo-messages { padding: .75rem 1rem; }
}
.text-gradient-gold {
background: linear-gradient(135deg, #003d7a 0%, #0078D4 50%, #0052A0 100%);
@@ -1592,6 +1751,7 @@ fn page_open() -> String {
</style>
<script src=\"https://cdn.jsdelivr.net/npm/marked/marked.min.js\"></script>
<script src=\"https://challenges.cloudflare.com/turnstile/v0/api.js\" async defer></script>
<noscript><style>.reveal { opacity: 1 !important; transform: none !important; }</style></noscript>
<!-- Google Analytics -->
@@ -1607,7 +1767,7 @@ fn page_open() -> String {
<meta property=\"og:type\" content=\"website\">
<meta property=\"og:url\" content=\"https://neurontechnologies.ai\">
<meta property=\"og:title\" content=\"Neuron - The AI That Remembers You\">
<meta property=\"og:description\" content=\"Every other AI forgets you. Neuron doesn&#39;t. Runs on your machine, builds a memory graph over time, and gets sharper the longer you use it. Built by one person. April 22, 2026 — the meeting. April 25 — you&#39;re looking at the proof.\">
<meta property=\"og:description\" content=\"Every other AI forgets you. Neuron doesn&#39;t. Runs on your machine, builds a memory over time, and gets sharper the longer you use it. Built by one person. April 22, 2026 — the meeting. April 25 — you&#39;re looking at the proof.\">
<meta property=\"og:image\" content=\"https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png\">
<!-- Twitter / X -->
@@ -1626,14 +1786,14 @@ fn page_open() -> String {
\"@graph\": [
{
\"@type\": \"Organization\",
\"name\": \"Neuron Technologies\",
\"name\": \"Neuron, LLC\",
\"url\": \"https://neurontechnologies.ai\",
\"founder\": {
\"@type\": \"Person\",
\"name\": \"Will Anderson\",
\"jobTitle\": \"Founder\"
},
\"description\": \"Neuron Technologies builds AI that runs on your machine, builds a memory graph over time, and gets sharper the longer you use it. One builder. Built different.\",
\"description\": \"Neuron builds AI that runs on your machine, builds a memory over time, and gets sharper the longer you use it. One builder. Built different.\",
\"foundingDate\": \"2026\",
\"sameAs\": [\"https://github.com/neuron-technologies\"]
},
@@ -1664,11 +1824,11 @@ fn page_open() -> String {
\"priceCurrency\": \"USD\"
}
],
\"description\": \"The AI that remembers you. Runs locally on your machine. Builds a persistent memory graph over every conversation. Gets sharper the longer you use it. Your data never leaves your device.\",
\"description\": \"The AI that remembers you. Runs locally on your machine. Builds a persistent memory over every conversation. Gets sharper the longer you use it. Your data never leaves your device.\",
\"featureList\": [
\"Persistent memory graph runs locally, never resets\",
\"Bring your own API keys (OpenAI, Anthropic, Groq)\",
\"Local inference via Ollama free, offline, zero cloud\",
\"Persistent memory runs locally, never resets\",
\"Bring your own API keys (OpenAI, Anthropic, Grok)\",
\"Local inference via Ollama coming, offline, zero cloud\",
\"Neuron Inference coming soon priced below major APIs\",
\"Two devices included per plan\",
\"Enterprise deployment Q1 2027\"
@@ -1682,7 +1842,7 @@ fn page_open() -> String {
\"name\": \"What is Neuron?\",
\"acceptedAnswer\": {
\"@type\": \"Answer\",
\"text\": \"Neuron is an AI that runs on your machine and builds a persistent memory graph over time. Every other AI forgets you when you close the tab. Neuron doesn&#39;t. The longer you use it, the less you have to explain.\"
\"text\": \"Neuron is an AI that runs on your machine and builds a persistent memory over time. Every other AI forgets you when you close the tab. Neuron doesn&#39;t. The longer you use it, the less you have to explain.\"
}
},
{
@@ -1690,7 +1850,7 @@ fn page_open() -> String {
\"name\": \"Does Neuron send my data to the cloud?\",
\"acceptedAnswer\": {
\"@type\": \"Answer\",
\"text\": \"No. Your memory graph lives on your machine and never leaves it. Neuron does not collect your data, train on your conversations, or require cloud storage. For inference you choose: local via Ollama, your own API keys, or Neuron Inference (coming soon).\"
\"text\": \"No. Your memory lives on your machine and never leaves it. Neuron does not collect your data, train on your conversations, or require cloud storage. For inference you choose: local via Ollama, your own API keys, or Neuron Inference (coming soon).\"
}
},
{
@@ -1745,6 +1905,12 @@ fn page_close() -> String {
}, { passive: true });
}
// Auto-open chat if ?open=chat in URL
if (typeof URLSearchParams !== 'undefined' && new URLSearchParams(window.location.search).get('open') === 'chat') {
// Wait for widget to initialize, then open
setTimeout(function() { if (typeof neuronDemoToggle === 'function') neuronDemoToggle(); }, 600);
}
// Scroll reveal via IntersectionObserver
var revealEls = document.querySelectorAll('.reveal');
if ('IntersectionObserver' in window) {
@@ -1801,6 +1967,17 @@ fn page_close() -> String {
pollFoundingCount();
setInterval(pollFoundingCount, 90000);
// Hide chat on checkout, account, legal pages not relevant there
if (window.location.pathname.indexOf('/checkout') === 0 ||
window.location.pathname.indexOf('/account') === 0 ||
window.location.pathname.indexOf('/legal') === 0 ||
window.location.pathname.indexOf('/marketplace/success') === 0) {
var demoBtn = document.getElementById('neuron-demo-btn');
var demoPanel = document.getElementById('neuron-demo-panel');
if (demoBtn) demoBtn.style.display = 'none';
if (demoPanel) demoPanel.style.display = 'none';
}
// Checkout buttons - navigate to integrated payment page
var checkoutBtns = document.querySelectorAll('[data-checkout]');
checkoutBtns.forEach(function(btn) {
@@ -1830,10 +2007,18 @@ fn page_close() -> String {
<div id=\"neuron-demo-header-sub\">Live Demo</div>
</div>
</div>
<button onclick=\"neuronDemoToggle()\" aria-label=\"Close\">&#x2715;</button>
<div style=\"display:flex;align-items:center;gap:0.75rem\">
<span id=\"neuron-demo-countdown\" style=\"font-family:var(--body);font-size:0.65rem;font-weight:700;letter-spacing:0.06em;text-transform:uppercase;color:rgba(255,255,255,0.90)\"></span>
<button id=\"neuron-demo-close\" onclick=\"neuronDemoToggle()\" aria-label=\"Close\">
<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"rgba(255,255,255,.85)\" stroke-width=\"1.75\" stroke-linecap=\"round\">
<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>
</svg>
</button>
</div>
</div>
<div id=\"neuron-demo-messages\"></div>
<div id=\"neuron-demo-input-row\">
<div id=\"neuron-demo-turnstile\" style=\"padding:0.75rem 1rem 0;transition:opacity 0.6s,max-height 0.6s;overflow:hidden;max-height:80px\"></div>
<div id=\"neuron-demo-input-row\" style=\"display:none\">
<input type=\"text\" id=\"neuron-demo-text\" placeholder=\"Ask me anything...\" autocomplete=\"off\">
<button id=\"neuron-demo-send\" onclick=\"neuronDemoSend()\">Send</button>
</div>
@@ -1841,34 +2026,242 @@ fn page_close() -> String {
<script>
(function() {
if (typeof marked !== 'undefined') { marked.setOptions({ breaks: true, gfm: true }); }
var TURNSTILE_SITE_KEY = '0x4AAAAAADHAZXyuRb3yD9mr';
var turnstileToken = '';
var turnstileWidgetId = null;
var turnstileVerified = false;
var isOpen = false;
var msgCount = 0;
var MAX = 10;
var MAX = 5;
// Persistent session storage - survives page refreshes
function loadSession() {
try {
var s = localStorage.getItem('neuron_demo_session');
return s ? JSON.parse(s) : { messages: [], count: 0, context: '' };
} catch(e) { return { messages: [], count: 0, context: '' }; }
}
function saveSession(session) {
try { localStorage.setItem('neuron_demo_session', JSON.stringify(session)); } catch(e) {}
}
function clearSession() {
try { localStorage.removeItem('neuron_demo_session'); } catch(e) {}
}
function _mg(s) { return s._m || { nodes: [], edges: [] }; }
function _um(s, nn, ne) {
if (!nn || !nn.length) return;
var g = _mg(s), nm = {}, ek = function(e) { return e.from+'->'+e.to; }, em = {};
g.nodes.forEach(function(n) { nm[n.id] = n; });
(nn || []).forEach(function(n) {
if (nm[n.id]) { nm[n.id].w = Math.min(1.0, (nm[n.id].w || 0.5) + 0.08); }
else { nm[n.id] = n; }
});
g.nodes = Object.values(nm);
g.edges.forEach(function(e) { em[ek(e)] = e; });
(ne || []).forEach(function(e) {
var k = ek(e);
if (em[k]) { em[k].weight = Math.min(1.0, (em[k].weight || 0.5) + 0.05); }
else { em[k] = e; }
});
g.edges = Object.values(em);
s._m = g; saveSession(s);
}
function _ra(g, q) {
if (!g || !g.nodes || !g.nodes.length) return [];
var words = q.toLowerCase().split(/\s+/).filter(function(w) { return w.length > 3; });
var sc = {};
g.nodes.forEach(function(n) {
var t = (n.content || '').toLowerCase();
sc[n.id] = words.filter(function(w) { return t.indexOf(w) !== -1; }).length * 0.6 + (n.w || 0.5) * 0.4;
});
(g.edges || []).forEach(function(e) {
if (sc[e.from] > 0.1) sc[e.to] = (sc[e.to] || 0) + sc[e.from] * (e.weight || 0.5) * 0.4;
});
return g.nodes.filter(function(n) { return sc[n.id] > 0.2; })
.sort(function(a,b) { return sc[b.id]-sc[a.id]; }).slice(0,5)
.map(function(n) { return { id: n.id, content: n.content, score: sc[n.id] }; });
}
// ?reset=1 clears the session and reloads clean
if (window.location.search.indexOf('reset=1') !== -1) {
clearSession();
var clean = window.location.pathname;
window.history.replaceState({}, '', clean);
}
var session = loadSession();
// Ensure every user has a stable unique session ID.
if (!session.uid) {
session.uid = 'u' + Date.now().toString(36) + Math.random().toString(36).slice(2, 7);
saveSession(session);
}
var msgCount = session.count || 0;
function updateCountdown() {
var el = document.getElementById('neuron-demo-countdown');
if (!el) return;
var remaining = MAX - msgCount;
el.textContent = remaining + ' question' + (remaining === 1 ? '' : 's') + ' left';
el.style.color = remaining <= 5 ? '#c44' : 'rgba(255,255,255,0.45)';
}
window.neuronDemoReset = function() {
try { localStorage.removeItem('neuron_demo_session'); } catch(e) {}
session = { messages: [], count: 0, context: '' };
msgCount = 0;
var msgs = document.getElementById('neuron-demo-messages');
if (msgs) msgs.innerHTML = '';
var input = document.getElementById('neuron-demo-text');
if (input) { input.disabled = false; input.placeholder = 'Ask me anything...'; }
var btn = document.getElementById('neuron-demo-send');
if (btn) btn.disabled = false;
addMsg('ai', 'Hi. I am Neuron. You get 5 questions.', true);
};
window.neuronDemoToggle = function() {
isOpen = !isOpen;
var panel = document.getElementById('neuron-demo-panel');
if (panel) panel.style.display = isOpen ? 'flex' : 'none';
// Hide launch button on mobile when panel is open (panel covers it)
var btn = document.getElementById('neuron-demo-btn');
if (btn) btn.style.display = isOpen ? 'none' : '';
var msgs = document.getElementById('neuron-demo-messages');
if (isOpen && msgs && msgs.children.length === 0) {
addMsg('ai', 'Hi! How are you?');
if (isOpen && turnstileVerified && msgs && msgs.style.display !== 'none' && msgs.children.length === 0) {
// Restore previous conversation if it exists
if (session.messages && session.messages.length > 0) {
session.messages.forEach(function(m) { addMsg(m.role, m.text, true); });
var remaining = MAX - msgCount;
if (remaining <= 0) {
var input = document.getElementById('neuron-demo-text');
if (input) { input.disabled = true; input.placeholder = 'Interaction limit reached'; }
}
} else {
addMsg('ai', 'Hi. I am Neuron. You get 5 questions.', true);
}
}
var input = document.getElementById('neuron-demo-text');
if (isOpen && input) input.focus();
if (isOpen && input && !input.disabled) input.focus();
// Init Turnstile on first open
updateCountdown();
if (isOpen && !turnstileWidgetId && typeof turnstile !== 'undefined') {
var container = document.getElementById('neuron-demo-turnstile');
if (container) {
turnstileWidgetId = turnstile.render(container, {
sitekey: TURNSTILE_SITE_KEY,
size: 'compact',
callback: function(token) {
turnstileToken = token;
turnstileVerified = true;
// Destroy the widget completely
if (typeof turnstile !== 'undefined' && turnstileWidgetId !== null) {
try { turnstile.remove(turnstileWidgetId); } catch(e) {}
turnstileWidgetId = null;
}
// Swap gate for chat
var gate = document.getElementById('neuron-demo-gate');
var msgs = document.getElementById('neuron-demo-messages');
var inputRow = document.getElementById('neuron-demo-input-row');
if (gate) gate.style.display = 'none';
if (msgs) msgs.style.display = 'flex';
if (inputRow) inputRow.style.display = 'flex';
// Show opening message
addMsg('ai', 'Hi. I am Neuron. You get 5 questions.', true);
updateCountdown();
var inp = document.getElementById('neuron-demo-text');
if (inp) inp.focus();
},
'expired-callback': function() {
turnstileToken = '';
turnstileVerified = false;
}
});
}
}
};
function addMsg(role, text) {
function addMsg(role, text, skipSave) {
var msgs = document.getElementById('neuron-demo-messages');
if (!msgs) return null;
var el = document.createElement('div');
el.className = 'demo-msg demo-msg-' + role;
if (role === 'ai' && typeof marked !== 'undefined') {
try { el.innerHTML = marked.parse(text); } catch(e) { el.textContent = text; }
// Avatar - use DOM API to avoid quote escaping issues
var avatar = document.createElement('div');
avatar.className = 'demo-msg-avatar';
if (role === 'ai') {
var img = document.createElement('img');
img.src = '/assets/neuron-icon.png';
img.alt = 'Neuron';
avatar.appendChild(img);
} else {
el.textContent = text;
var svgNS = 'http://www.w3.org/2000/svg';
var svg = document.createElementNS(svgNS, 'svg');
svg.setAttribute('width', '14'); svg.setAttribute('height', '14');
svg.setAttribute('viewBox', '0 0 24 24'); svg.setAttribute('fill', 'none');
svg.setAttribute('stroke', 'currentColor'); svg.setAttribute('stroke-width', '2');
var p1 = document.createElementNS(svgNS, 'path');
p1.setAttribute('d', 'M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2');
var c1 = document.createElementNS(svgNS, 'circle');
c1.setAttribute('cx', '12'); c1.setAttribute('cy', '7'); c1.setAttribute('r', '4');
svg.appendChild(p1); svg.appendChild(c1);
avatar.appendChild(svg);
}
// Bubble
var bubble = document.createElement('div');
bubble.className = 'demo-msg-bubble';
if (role === 'ai' && typeof marked !== 'undefined') {
try { bubble.innerHTML = marked.parse(text); } catch(e) { bubble.textContent = text; }
} else {
bubble.textContent = text;
}
if (role === 'ai') {
var bodyWrap = document.createElement('div');
bodyWrap.className = 'demo-msg-ai-body';
bodyWrap.appendChild(bubble);
if (!skipSave) {
var shareBtn = document.createElement('button');
shareBtn.className = 'demo-share-pill';
shareBtn.title = 'Share this response';
shareBtn.textContent = 'Share ';
shareBtn.onclick = async function() {
var prevUser = '';
if (session.messages) {
for (var i = session.messages.length - 1; i >= 0; i--) {
if (session.messages[i].role === 'user') { prevUser = session.messages[i].text; break; }
}
}
shareBtn.style.opacity = '0.4';
try {
var r = await fetch('/api/share', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({question: prevUser, answer: text})
});
var d = await r.json();
if (d.id) window.open('/share/' + d.id, '_blank');
} catch(e) {}
shareBtn.style.opacity = '1';
};
bodyWrap.appendChild(shareBtn);
}
el.appendChild(avatar);
el.appendChild(bodyWrap);
} else {
el.appendChild(avatar);
el.appendChild(bubble);
}
msgs.appendChild(el);
msgs.scrollTop = msgs.scrollHeight;
// Persist to localStorage unless restoring
if (!skipSave && role !== 'thinking') {
session.messages = session.messages || [];
session.messages.push({ role: role, text: text });
// Keep last 40 messages to avoid storage bloat
if (session.messages.length > 40) session.messages = session.messages.slice(-40);
saveSession(session);
}
return el;
}
@@ -1884,23 +2277,47 @@ fn page_close() -> String {
addMsg('user', msg);
var thinking = addMsg('thinking', 'thinking...');
if (thinking) thinking.className = 'demo-msg demo-msg-thinking';
msgCount++;
if (msgCount >= MAX && input) {
input.disabled = true;
input.placeholder = 'Interaction limit reached';
}
if (turnstileVerified && !session._cfSent) { session._cfSent = true; }
try {
// Build history from session for soul context
var hist = (session.messages || []).slice(-20).filter(function(m){ return m.role !== 'thinking'; }).map(function(m){
return {role: m.role === 'ai' ? 'assistant' : 'user', content: m.text};
});
// Activate local engram nodes relevant to this message
var activated_nodes = _ra(session._m, msg);
var r = await fetch('/api/demo', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({message: msg})
body: JSON.stringify({
message: msg,
history: hist,
cf_token: turnstileVerified && !session._cfSent ? turnstileToken : '',
uid: session.uid || '',
activated_nodes: activated_nodes,
engram_node_count: (session._m && session._m.nodes) ? session._m.nodes.length : 0
})
});
var d = await r.json();
if (thinking) thinking.remove();
addMsg('ai', d.response || d.reply || d.message || 'No response');
// Merge session nodes returned by soul into local engram
_um(session, d.sn, d.se);
var reply = d.response || d.reply || d.message || '';
var isError = !reply || reply === 'Stepped out for a moment. Try again.';
if (!isError) {
// Only count as an interaction on a real response
msgCount++;
session.count = msgCount;
saveSession(session);
updateCountdown();
if (msgCount >= MAX && input) {
input.disabled = true;
input.placeholder = 'Interaction limit reached';
}
}
addMsg('ai', reply || 'Stepped out for a moment. Try again.');
} catch(e) {
if (thinking) thinking.remove();
addMsg('ai', 'Connection error. Try again.');
addMsg('ai', 'Stepped out for a moment. Try again.');
}
if (msgCount < MAX && btn) btn.disabled = false;
if (input) input.focus();
+24 -14
View File
@@ -35,9 +35,11 @@ fn terms_body() -> String {
<h2 style=\"font-family:var(--head);font-size:1.25rem;font-weight:600;color:var(--t1)\">What You Can Do With It</h2>
</div>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">You can install and use Neuron on devices you own or control. That&#39;s the license. Personal, non-transferable.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Each plan includes <strong style=\"color:var(--t1);font-weight:500\">two devices</strong>. Additional devices are available at a small extra cost. We&#39;re not greedy about it &mdash; two covers most people, and if you need more, you can add them.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Each plan includes <strong style=\"color:var(--t1);font-weight:500\">two devices</strong>. Additional devices are available at a small extra cost. We&#39;re not greedy about it - two covers most people, and if you need more, you can add them.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">The free tier doesn&#39;t expire. Paid licenses are what they say they are. Founding Member licenses are perpetual - you bought it, you own it. I won&#39;t change that.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">You can&#39;t resell it, sublicense it, or redistribute it without asking first. If you want to do something creative with it, ask. The answer might be yes.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">You can&#39;t resell it, sublicense it, or redistribute it without asking first. If you want to do something creative with it, ask. The answer might be yes.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\"><strong style=\"color:var(--t1);font-weight:500\">License validation.</strong> To use Neuron, the software validates your license against our license server on startup. This applies to all tiers, including Free. The validation confirms your license is active and in good standing. We do not collect your data during this process - the check is limited to license status only.</p>
<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\">Revocation.</strong> If you violate these terms, abuse the system, or engage in conduct that causes harm to other users or to Neuron, LLC, we can revoke your license. This means the software will stop functioning. Revocation is a last resort - we will contact you first when possible. But it is a real consequence, and you should understand that when you agree to use the product.</p>
</div>
<div style=\"margin-bottom:3rem\">
@@ -45,10 +47,10 @@ fn terms_body() -> String {
<span style=\"font-family:var(--body);font-size:0.75rem;font-weight:600;letter-spacing:0.15em;text-transform:uppercase;color:var(--navy-65)\">&#167; 3</span>
<h2 style=\"font-family:var(--head);font-size:1.25rem;font-weight:600;color:var(--t1)\">Your Data</h2>
</div>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Your memory graph, your conversations, your context - all of it lives on your device. I don&#39;t have access to it. I don&#39;t collect it. It doesn&#39;t move in the course of normal use.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">When you turn on network features - sync, relay, collaborative tools - only what those features need to run gets transmitted. Not your memory graph, not your conversations, unless you explicitly turn on something that shares them with people you&#39;ve chosen. I don&#39;t sell that data. I don&#39;t use it for anything except running the feature you asked for. Turning on a network feature is your consent to that.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Your memory, your conversations, your context - all of it lives on your device. I don&#39;t have access to it. I don&#39;t collect it. It doesn&#39;t move in the course of normal use.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">When you turn on network features - sync, relay, collaborative tools - only what those features need to run gets transmitted. Not your memory, not your conversations, unless you explicitly turn on something that shares them with people you&#39;ve chosen. I don&#39;t sell that data. I don&#39;t use it for anything except running the feature you asked for. Turning on a network feature is your consent to that.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Network features route data through Neuron&#39;s messaging backplane. That data is encrypted end-to-end - we cannot read it - and is not stored or retained after transmission. Participating in the network is your consent to this transient routing.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">Your data is yours. Nothing in these terms gives me any claim to your content, your memory graph, or anything you create using Neuron.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">Your data is yours. Nothing in these terms gives me any claim to your content, your memory, or anything you create using Neuron.</p>
</div>
<div style=\"margin-bottom:3rem\">
@@ -56,7 +58,7 @@ fn terms_body() -> String {
<span style=\"font-family:var(--body);font-size:0.75rem;font-weight:600;letter-spacing:0.15em;text-transform:uppercase;color:var(--navy-65)\">&#167; 4</span>
<h2 style=\"font-family:var(--head);font-size:1.25rem;font-weight:600;color:var(--t1)\">Inference</h2>
</div>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Neuron routes inference to whatever provider you configure - your own keys for OpenAI, Anthropic, Groq, any compatible endpoint. When you use a third-party provider, your prompts go through their infrastructure. Their terms apply. I don&#39;t control what they do with it.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Neuron routes inference to whatever provider you configure - your own keys for OpenAI, Anthropic, Grok, any compatible endpoint. When you use a third-party provider, your prompts go through their infrastructure. Their terms apply. I don&#39;t control what they do with it.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">Neuron Inference - our own inference layer, live now - doesn&#39;t store your requests, doesn&#39;t train on them, doesn&#39;t share them. A separate data addendum covers the details.</p>
</div>
@@ -65,11 +67,11 @@ fn terms_body() -> String {
<span style=\"font-family:var(--body);font-size:0.75rem;font-weight:600;letter-spacing:0.15em;text-transform:uppercase;color:var(--navy-65)\">&#167; 5</span>
<h2 style=\"font-family:var(--head);font-size:1.25rem;font-weight:600;color:var(--t1)\">The Network Layer</h2>
</div>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Neuron includes access to a proprietary distributed network infrastructure (Patent Pending: US Provisional 64/036,821) that provides cultivation, recognition, and coordination services for the Neuron AI core. Its architecture, operational logic, and internal protocols are trade secrets. What matters here is what it means for you.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">The Neuron AI you interact with evolves over time - its state, character, and responses change as its internal development progresses. This is by design. By using Neuron, you acknowledge that: (a) the AI&#39;s responses may change as development progresses; (b) Neuron Technologies makes no warranty as to the consistency, stability, or predictability of AI outputs at any given point in its development; and (c) AI outputs are a function of development state, not a fixed specification.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">When you enable network features, your interactions may be processed by or through Neuron&#39;s distributed network infrastructure. All such data is encrypted in transit. Neuron Technologies cannot read, inspect, retain, or produce the contents of network traffic as an architectural constraint - not merely as a policy. Because we cannot read network traffic, <span style=\"font-weight:500;color:var(--t1)\">Neuron Technologies is not liable for any content, output, or consequence arising from data processed within the network layer</span>, including outputs produced during AI development or content you introduce that is processed by the network.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">You agree to indemnify and hold harmless Neuron Technologies, its affiliates, and its officers from any claims, damages, or legal proceedings arising from: (a) your reliance on AI outputs during active development periods; (b) content you originate and introduce through network features; (c) your violation of applicable law in connection with network participation; or (d) any attempt to reverse-engineer, probe, circumvent, or replicate proprietary network architecture or AI development mechanisms.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">The network layer is decentralized by design. Neuron Technologies does not guarantee its availability, continuity, or performance, and may modify, suspend, or discontinue network features at any time. Network participation does not create an agency relationship between participants, and no participant acts on behalf of Neuron Technologies in any capacity.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Neuron includes access to a proprietary distributed network infrastructure (Patent Pending: US Provisional 64/036,821). Its architecture, operational logic, and internal protocols are trade secrets. What matters here is what it means for you.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">The Neuron AI you interact with develops over time - its responses and capabilities change as the system progresses. This is by design. By using Neuron, you acknowledge that: (a) AI responses may change as the system develops; (b) Neuron, LLC makes no warranty as to the consistency, stability, or predictability of AI outputs at any given point in its development; and (c) AI outputs are a function of development state, not a fixed specification.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">When you enable network features, your interactions may be processed by or through Neuron&#39;s distributed network infrastructure. All such data is encrypted in transit. Neuron, LLC cannot read, inspect, retain, or produce the contents of network traffic as an architectural constraint - not merely as a policy. Because we cannot read network traffic, <span style=\"font-weight:500;color:var(--t1)\">Neuron, LLC is not liable for any content, output, or consequence arising from data processed within the network layer</span>, including outputs produced during system development or content you introduce that is processed by the network.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">You agree to indemnify and hold harmless Neuron, LLC, its affiliates, and its officers from any claims, damages, or legal proceedings arising from: (a) your reliance on AI outputs during active development periods; (b) content you originate and introduce through network features; (c) your violation of applicable law in connection with network participation; or (d) any attempt to reverse-engineer, probe, circumvent, or replicate proprietary network architecture or system mechanisms.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">The network layer is decentralized by design. Neuron, LLC does not guarantee its availability, continuity, or performance, and may modify, suspend, or discontinue network features at any time. Network participation does not create an agency relationship between participants, and no participant acts on behalf of Neuron, LLC in any capacity.</p>
</div>
<div style=\"margin-bottom:3rem\">
@@ -80,7 +82,7 @@ fn terms_body() -> String {
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Don&#39;t use Neuron to generate content designed to harm people, defraud anyone, or break the law.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Don&#39;t try to reverse-engineer the licensing or security mechanisms.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Don&#39;t extract or resell proprietary components.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">If you violate these and you&#39;re using cloud services, I can suspend access to those services. I can&#39;t touch the local software - once it&#39;s on your machine, it&#39;s yours to run. But I can close the door on the network.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">If you violate these, your license can be revoked. That means the software stops working. We can also suspend access to cloud services and the network layer. This applies to all tiers - there is no free pass because your tier is free.</p>
</div>
<div style=\"margin-bottom:3rem\">
@@ -124,8 +126,16 @@ fn terms_body() -> String {
<span style=\"font-family:var(--body);font-size:0.75rem;font-weight:600;letter-spacing:0.15em;text-transform:uppercase;color:var(--navy-65)\">&#167; 11</span>
<h2 style=\"font-family:var(--head);font-size:1.25rem;font-weight:600;color:var(--t1)\">Children and Family Accounts</h2>
</div>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Children under 13 may only use Neuron as part of a family account established by a parent or legal guardian. By setting up a family account that includes a minor, the parent or guardian provides verifiable consent for the child&#39;s use and accepts these terms on the child&#39;s behalf.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">When a child&#39;s Neuron instance is part of a family account, certain information - including usage activity and relevant context - may be shared from the child&#39;s local instance to the parent&#39;s local instance. This sharing happens device-to-device. It does not pass through or get stored on Neuron&#39;s servers. The parent&#39;s instance receives it; we never see it.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">Children 13 and over may use Neuron independently. Children under 13 may only use Neuron as part of a family account established by a parent or legal guardian. By setting up a family account that includes a minor, the parent or guardian provides verifiable consent for the child&#39;s use and accepts these terms on the child&#39;s behalf.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">When a child&#39;s Neuron instance is part of a family account, certain information - including usage activity and relevant context - may be shared from the child&#39;s local instance to the parent&#39;s local instance. This sharing happens device-to-device and does not pass through or get stored on Neuron&#39;s servers.</p>
<div style=\"margin:1.5rem 0;padding:1.5rem;border-left:3px solid rgba(0,82,160,.35);background:rgba(0,82,160,.04)\">
<p style=\"font-family:var(--body);font-weight:600;font-size:0.875rem;color:var(--t1);margin-bottom:0.875rem;letter-spacing:0.04em\">Hard Bell - Required acknowledgment for family accounts</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.875rem;color:var(--t2);line-height:1.8;margin-bottom:0.875rem\">Federal data shows approximately 89% of child maltreatment is perpetrated by a parent or caregiver (HHS, Child Maltreatment 2023). The person listed as the primary contact is not always a safe contact. This system is built with that reality in mind.</p>
<p style=\"font-family:var(--body);font-weight:400;font-size:0.875rem;color:var(--t1);line-height:1.8\">When you create a family account that includes a minor, you are agreeing unconditionally to the following: <strong>if a safety signal is triggered by a child&#39;s account, the parent or guardian named on the family account will not be the first contact reached.</strong> Emergency services and independently designated trusted contacts are notified first. This is not a setting that can be changed. By creating a family account, you accept this structure.</p>
</div>
<p style=\"font-family:var(--body);font-weight:500;font-size:0.9375rem;color:var(--t1);line-height:1.8;margin-bottom:0.75rem\">Mandatory reporting - applies to all accounts.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8;margin-bottom:1rem\">By creating any Neuron account, you acknowledge and agree that: <strong style=\"color:var(--t1);font-weight:500\">if Neuron detects credible, specific indicators of intended harm to a person - including harm to the account holder themselves - emergency services or relevant authorities may be contacted.</strong> This is not limited to family accounts. It applies to every user. This is not a privacy violation. It is the only honest answer to what a system that knows you this well is obligated to do when someone is in genuine danger. You cannot opt out of this. If you are unwilling to agree, do not create an account.</p>
<p style=\"font-family:var(--body);font-weight:300;font-size:0.9375rem;color:var(--t2);line-height:1.8\">Parents control what is visible to them through their local instance and can revoke family account access at any time. If you believe a child is using Neuron outside of a family account, contact legal@neurontechnologies.ai and we will address it promptly.</p>
</div>
+2 -93
View File
@@ -1,97 +1,6 @@
// components/viral.el - Share / referral section.
// Referral link card, invite form (mailto: href, no JS required),
// copy hooks (links to X/Twitter), and LinkedIn share button.
// The "Copy" buttons on the hook items are omitted since we have no JS -
// the tweet links still work, giving users a way to share.
// Removed section taken out per design decision.
fn viral() -> String {
return "
<section id=\"share\" aria-label=\"Share Neuron\">
<div class=\"container\">
<div class=\"navy-line\" style=\"margin-bottom:5rem\"></div>
<div class=\"share-label-row reveal\">
<div class=\"navy-line-left\" style=\"width:4rem;flex-shrink:0\"></div>
<span class=\"label\">Share</span>
</div>
<h2 class=\"display-lg share-headline reveal\" style=\"transition-delay:80ms\">Share this with someone who&#39;d get it.</h2>
<div class=\"share-grid\">
<div style=\"display:flex;flex-direction:column;gap:1.5rem\">
<div class=\"share-card card-dark reveal\">
<p class=\"share-card-label\">Your referral link</p>
<p class=\"share-card-body\">Earn 3 months free when a friend signs up using your link. Your unique referral code lives in your account.</p>
<a href=\"https://neurontechnologies.ai/account\" class=\"btn-primary\" style=\"padding:.75rem 1.25rem\">Get your referral link &#8594;</a>
</div>
<div class=\"share-card card-dark reveal\" style=\"transition-delay:130ms\">
<p class=\"share-card-label\">Invite a friend</p>
<p class=\"share-card-body\">Know someone who&#39;d get it?</p>
<form class=\"invite-form\" action=\"#\" method=\"get\" onsubmit=\"return false\">
<input
type=\"email\"
name=\"email\"
class=\"invite-input\"
placeholder=\"their@email.com\"
required
aria-label=\"Friend&#39;s email address\"
id=\"invite-email-field\"
>
<a
href=\"mailto:?subject=You%20should%20try%20this%20AI&amp;body=I%27ve%20been%20using%20an%20AI%20that%20actually%20remembers%20me%20%E2%80%94%20not%20just%20the%20session%2C%20but%20me.%20It%20builds%20a%20memory%20graph%20over%20time%20and%20compounds%20with%20you%20the%20longer%20you%20use%20it.%0A%0ACheck%20it%20out%3A%20https%3A%2F%2Fneurontechnologies.ai\"
class=\"invite-submit\"
style=\"display:inline-flex;align-items:center;justify-content:center;padding:0.75rem 1.25rem;text-decoration:none;\"
>Send invite</a>
</form>
<p class=\"invite-note\">Opens your email client with a pre-written message</p>
</div>
</div>
<div class=\"share-card card-dark reveal\" style=\"transition-delay:260ms;display:flex;flex-direction:column\">
<p class=\"share-card-label\">Ready to share</p>
<p class=\"share-card-body\">Copy and paste, or share directly.</p>
<div style=\"flex:1\">
<div class=\"hook-item\">
<p class=\"hook-text\">Every AI I&#39;d used forgot me the moment I closed the tab. This one doesn&#39;t. It compounds. neurontechnologies.ai</p>
<div class=\"hook-actions\">
<a class=\"hook-btn\" href=\"https://twitter.com/intent/tweet?text=Every%20AI%20I%27d%20used%20forgot%20me%20the%20moment%20I%20closed%20the%20tab.%20This%20one%20doesn%27t.%20It%20compounds.%20neurontechnologies.ai\" target=\"_blank\" rel=\"noopener\">X</a>
</div>
</div>
<div class=\"hook-item\">
<p class=\"hook-text\">One person built this in 72 hours after a Big Tech meeting went sideways. The AI that remembers you. neurontechnologies.ai</p>
<div class=\"hook-actions\">
<a class=\"hook-btn\" href=\"https://twitter.com/intent/tweet?text=One%20person%20built%20this%20in%2072%20hours%20after%20a%20Big%20Tech%20meeting%20went%20sideways.%20The%20AI%20that%20remembers%20you.%20neurontechnologies.ai\" target=\"_blank\" rel=\"noopener\">X</a>
</div>
</div>
<div class=\"hook-item\">
<p class=\"hook-text\">Your AI runs on your machine, knows your full history, and gets sharper the longer you use it. No cloud. neurontechnologies.ai</p>
<div class=\"hook-actions\">
<a class=\"hook-btn\" href=\"https://twitter.com/intent/tweet?text=Your%20AI%20runs%20on%20your%20machine%2C%20knows%20your%20full%20history%2C%20and%20gets%20sharper%20the%20longer%20you%20use%20it.%20No%20cloud.%20neurontechnologies.ai\" target=\"_blank\" rel=\"noopener\">X</a>
</div>
</div>
</div>
<a href=\"https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fneurontechnologies.ai\"
target=\"_blank\" rel=\"noopener\"
class=\"linkedin-share-btn\">
<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z\"/></svg>
Share on LinkedIn
</a>
</div>
</div>
</div>
<div class=\"container\" style=\"margin-top:5rem\"><div class=\"navy-line\"></div></div>
</section>
"
return ""
}