seo: full audit fixes — meta, og, schema, canonical, sitemap, headings, alts
Dev — Build & local smoke test / build-smoke (pull_request) Successful in 1m57s
Dev — Build & local smoke test / build-smoke (pull_request) Successful in 1m57s
- Per-page title/description/canonical/OG tags: about, checkout (per-plan), terms, enterprise-terms, success all get unique SEO blocks - Homepage title updated to em-dash form; meta description adds CTA - og:site_name added to all pages - noindex/nofollow on checkout, success, account pages - Sitemap (/sitemap.xml) with all public pages; robots.txt updated with Sitemap directive and Disallow for private paths - Schema: WebSite type added, Organization gains logo ImageObject, SoftwareApplication gains url field, billingIncrement corrected to billingPeriod (ISO 8601 P1M), sameAs gains x.com/neurontechai alongside GitHub - marked.min.js given defer attribute (was render-blocking) - page_head refactored into page_head_base + page_seo_block + page_open_seo for clean inner-page overrides without duplicating the CSS/script block
This commit is contained in:
Vendored
+16
-3
@@ -10,9 +10,18 @@ el_val_t page_schema(void) {
|
||||
" \"@context\": \"https://schema.org\",\n"
|
||||
" \"@graph\": [\n"
|
||||
" {\n"
|
||||
" \"@type\": \"WebSite\",\n"
|
||||
" \"name\": \"Neuron\",\n"
|
||||
" \"url\": \"https://neurontechnologies.ai\"\n"
|
||||
" },\n"
|
||||
" {\n"
|
||||
" \"@type\": \"Organization\",\n"
|
||||
" \"name\": \"Neuron, LLC\",\n"
|
||||
" \"url\": \"https://neurontechnologies.ai\",\n"
|
||||
" \"logo\": {\n"
|
||||
" \"@type\": \"ImageObject\",\n"
|
||||
" \"url\": \"https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png\"\n"
|
||||
" },\n"
|
||||
" \"founder\": {\n"
|
||||
" \"@type\": \"Person\",\n"
|
||||
" \"name\": \"Will Anderson\",\n"
|
||||
@@ -20,11 +29,15 @@ el_val_t page_schema(void) {
|
||||
" },\n"
|
||||
" \"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.\",\n"
|
||||
" \"foundingDate\": \"2026\",\n"
|
||||
" \"sameAs\": [\"https://github.com/neuron-technologies\"]\n"
|
||||
" \"sameAs\": [\n"
|
||||
" \"https://github.com/neuron-technologies\",\n"
|
||||
" \"https://x.com/neurontechai\"\n"
|
||||
" ]\n"
|
||||
" },\n"
|
||||
" {\n"
|
||||
" \"@type\": \"SoftwareApplication\",\n"
|
||||
" \"name\": \"Neuron\",\n"
|
||||
" \"url\": \"https://neurontechnologies.ai\",\n"
|
||||
" \"applicationCategory\": \"AIApplication\",\n"
|
||||
" \"operatingSystem\": \"macOS, Windows, Linux\",\n"
|
||||
" \"offers\": [\n"
|
||||
@@ -39,7 +52,7 @@ el_val_t page_schema(void) {
|
||||
" \"name\": \"Professional\",\n"
|
||||
" \"price\": \"19\",\n"
|
||||
" \"priceCurrency\": \"USD\",\n"
|
||||
" \"billingIncrement\": \"monthly\"\n"
|
||||
" \"billingPeriod\": \"P1M\"\n"
|
||||
" },\n"
|
||||
" {\n"
|
||||
" \"@type\": \"Offer\",\n"
|
||||
@@ -67,7 +80,7 @@ el_val_t page_schema(void) {
|
||||
" \"name\": \"What is Neuron?\",\n"
|
||||
" \"acceptedAnswer\": {\n"
|
||||
" \"@type\": \"Answer\",\n"
|
||||
" \"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't. The longer you use it, the less you have to explain.\"\n"
|
||||
" \"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't. The longer you use it, the less you have to explain.\"\n"
|
||||
" }\n"
|
||||
" },\n"
|
||||
" {\n"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// components/enterprise_terms.el - Enterprise Agreement page.
|
||||
// Returns complete HTML using the shared page shell from styles.el.
|
||||
|
||||
from styles import { page_open, page_close }
|
||||
from styles import { page_open_seo, page_close }
|
||||
from nav import { nav }
|
||||
|
||||
extern fn el_div(attrs: String, children: String) -> String
|
||||
@@ -15,7 +15,13 @@ extern fn el_li(attrs: String, children: String) -> String
|
||||
extern fn el_em(children: String) -> String
|
||||
|
||||
fn enterprise_terms_page() -> String {
|
||||
page_open() + enterprise_terms_body() + page_close()
|
||||
page_open_seo(
|
||||
"Enterprise Agreement — Neuron",
|
||||
"The Neuron Enterprise Agreement governs enterprise deployments of Neuron software. Review licensing terms, data handling, and compliance provisions.",
|
||||
"/legal/enterprise-terms",
|
||||
"The Neuron Enterprise Agreement — governing enterprise deployments, licensing, data handling, and compliance.",
|
||||
"false"
|
||||
) + enterprise_terms_body() + page_close()
|
||||
}
|
||||
|
||||
fn et_section(num: String, title: String, body: String) -> String {
|
||||
|
||||
+56
-12
@@ -30,36 +30,80 @@ extern fn el_script_src(src: String, defer_load: Bool) -> String
|
||||
extern fn el_script_inline(js: String) -> String
|
||||
extern fn el_title(text: String) -> String
|
||||
|
||||
fn page_head() -> String {
|
||||
// ── Shared head infrastructure ────────────────────────────────────────────────
|
||||
// page_head_base() emits charset, viewport, favicons, fonts, CSS, scripts.
|
||||
// page_seo_block() emits the SEO/OG/canonical block for a given page.
|
||||
// page_head() assembles both for the homepage.
|
||||
// page_open_seo() is the variant used by inner pages with custom meta.
|
||||
|
||||
fn page_head_base() -> String {
|
||||
return el_meta_charset("UTF-8")
|
||||
+ el_meta("viewport", "width=device-width, initial-scale=1.0")
|
||||
+ el_title("Neuron - The AI That Remembers You")
|
||||
+ el_meta("description", "Every AI resets when you close the tab. Neuron doesn't. Runs on your machine. Remembers everything. Cheaper than ChatGPT on day one.")
|
||||
+ "<link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/assets/favicon-16.png\">"
|
||||
+ "<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>"
|
||||
+ el_link_stylesheet("https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,600;1,400;1,500&family=IBM+Plex+Sans:wght@300;400;500;600&display=swap")
|
||||
+ page_css()
|
||||
+ "<script src=\"https://cdn.jsdelivr.net/npm/marked/marked.min.js\" integrity=\"sha384-948ahk4ZmxYVYOc+rxN1H2gM1EJ2Duhp7uHtZ4WSLkV4Vtx5MUqnV+l7u9B+jFv+\" crossorigin=\"anonymous\"></script>"
|
||||
+ "<script src=\"https://cdn.jsdelivr.net/npm/marked/marked.min.js\" integrity=\"sha384-948ahk4ZmxYVYOc+rxN1H2gM1EJ2Duhp7uHtZ4WSLkV4Vtx5MUqnV+l7u9B+jFv+\" crossorigin=\"anonymous\" defer></script>"
|
||||
+ "<script src=\"https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2\" defer></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>"
|
||||
+ "<script async src=\"https://www.googletagmanager.com/gtag/js?id=G-Y1EE43X9RN\"></script>"
|
||||
+ page_ga_script()
|
||||
}
|
||||
|
||||
// page_seo_block — emits title, description, canonical, OG, and Twitter Card
|
||||
// for a given page. Pass the production canonical path (e.g. "/" or "/about").
|
||||
fn page_seo_block(title: String, description: String, canonical_path: String, og_description: String) -> String {
|
||||
let base: String = "https://neurontechnologies.ai"
|
||||
let canonical: String = base + canonical_path
|
||||
let og_image: String = base + "/assets/brand/neuron-wordmark-on-light@2x.png"
|
||||
return el_title(title)
|
||||
+ el_meta("description", description)
|
||||
+ "<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'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 \xe2\x80\x94 the meeting. April 25 \xe2\x80\x94 you're looking at the proof.\">"
|
||||
+ "<meta property=\"og:image\" content=\"https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png\">"
|
||||
+ "<meta property=\"og:url\" content=\"" + canonical + "\">"
|
||||
+ "<meta property=\"og:title\" content=\"" + title + "\">"
|
||||
+ "<meta property=\"og:description\" content=\"" + og_description + "\">"
|
||||
+ "<meta property=\"og:image\" content=\"" + og_image + "\">"
|
||||
+ "<meta property=\"og:site_name\" content=\"Neuron\">"
|
||||
+ "<meta name=\"twitter:card\" content=\"summary_large_image\">"
|
||||
+ "<meta name=\"twitter:title\" content=\"Neuron - The AI That Remembers You\">"
|
||||
+ "<meta name=\"twitter:description\" content=\"Every other AI forgets you. Neuron doesn't. Runs on your machine. Remembers everything. $19/mo or $199 founding member (first 1,000).\">"
|
||||
+ "<meta name=\"twitter:image\" content=\"https://neurontechnologies.ai/assets/brand/neuron-wordmark-on-light@2x.png\">"
|
||||
+ "<link rel=\"canonical\" href=\"https://neurontechnologies.ai\">"
|
||||
+ "<meta name=\"twitter:title\" content=\"" + title + "\">"
|
||||
+ "<meta name=\"twitter:description\" content=\"" + og_description + "\">"
|
||||
+ "<meta name=\"twitter:image\" content=\"" + og_image + "\">"
|
||||
+ "<link rel=\"canonical\" href=\"" + canonical + "\">"
|
||||
}
|
||||
|
||||
fn page_head() -> String {
|
||||
return page_head_base()
|
||||
+ page_seo_block(
|
||||
"Neuron — The AI That Remembers You",
|
||||
"Every AI resets when you close the tab. Neuron doesn't. Runs on your machine. Remembers everything. Start free — no credit card required.",
|
||||
"/",
|
||||
"Every other AI forgets you. Neuron doesn't. Runs on your machine, builds a persistent memory over time, and gets sharper the longer you use it. Free tier available."
|
||||
)
|
||||
+ page_schema()
|
||||
}
|
||||
|
||||
fn page_open() -> String {
|
||||
return "<!DOCTYPE html><html lang=\"en\"><head>" + page_head() + "</head><body>"
|
||||
}
|
||||
|
||||
// page_open_seo — page shell for inner pages with unique per-page SEO.
|
||||
// title: full <title> tag text
|
||||
// description: meta description (120–160 chars)
|
||||
// canonical_path: path component, e.g. "/about" or "/checkout"
|
||||
// og_description: OG/Twitter description (can differ from meta description)
|
||||
// noindex: pass "true" to add noindex for non-public pages (e.g. checkout)
|
||||
fn page_open_seo(title: String, description: String, canonical_path: String, og_description: String, noindex: String) -> String {
|
||||
let robots_tag: String = if str_eq(noindex, "true") {
|
||||
"<meta name=\"robots\" content=\"noindex, nofollow\">"
|
||||
} else {
|
||||
""
|
||||
}
|
||||
return "<!DOCTYPE html><html lang=\"en\"><head>"
|
||||
+ page_head_base()
|
||||
+ page_seo_block(title, description, canonical_path, og_description)
|
||||
+ robots_tag
|
||||
+ "</head><body>"
|
||||
}
|
||||
|
||||
+8
-2
@@ -1,7 +1,7 @@
|
||||
// components/terms.el - Consumer Terms of Service page.
|
||||
// Returns complete HTML using the shared page shell from styles.el.
|
||||
|
||||
from styles import { page_open, page_close }
|
||||
from styles import { page_open_seo, page_close }
|
||||
from nav import { nav }
|
||||
|
||||
extern fn el_div(attrs: String, children: String) -> String
|
||||
@@ -13,7 +13,13 @@ extern fn el_a(href: String, attrs: String, children: String) -> String
|
||||
extern fn el_strong(children: String) -> String
|
||||
|
||||
fn terms_page() -> String {
|
||||
page_open() + nav() + terms_body() + page_close()
|
||||
page_open_seo(
|
||||
"Terms of Service — Neuron",
|
||||
"Read the Neuron Terms of Service. Governs your use of Neuron software and services provided by Neuron, LLC.",
|
||||
"/legal/terms",
|
||||
"The Neuron Terms of Service — governing your use of Neuron software and services provided by Neuron, LLC.",
|
||||
"false"
|
||||
) + nav() + terms_body() + page_close()
|
||||
}
|
||||
|
||||
fn terms_section_head(num: String, title: String) -> String {
|
||||
|
||||
Reference in New Issue
Block a user