diff --git a/www/SITE.md b/www/SITE.md index acae8611..b9a8cde4 100644 --- a/www/SITE.md +++ b/www/SITE.md @@ -124,9 +124,29 @@ xo build emits a native executable from that same pipeline. an ordinary expression. `xo` checks a program and emits a native binary from the same LLVM pipeline. +**Status:** Echo 2026 is the public edition. A Rust toolchain ships as +prerelease tags on GitHub. The repository is MIT licensed. + Keep product claims factual. Do not invent APIs, partner logos, or unearned maturity. +## Public facts + +Public chrome (homepage, footer, install) states what this repository is: + +- Compiled language +- MIT license +- Implemented in Rust +- LLVM pipeline +- CLI is `xo` +- Current edition is Echo 2026 +- GitHub releases are prerelease tags + +Do not call the language production-ready. Do not imply a crates.io package. +Name a host OS only when that platform has an asset on the current release +(v0.0.1-alpha.9 ships `linux-x86_64` and `macos-arm64`). Do not list Discord +while there is no live invite. Public project mail stays on `@modoterra.xyz`. + ## Pillars 1. **Leaders** — `$` `~` `?` `*` `^` (and the rest of the glyph set) mark statement roles @@ -157,19 +177,21 @@ add a second rail or nested train. ## Homepage sections The home page is a language-docs front door. Copy and links live in -`src/docs/site.ts` (`homePage`, `primaryNav`, `docsHubCatalog`). +`src/docs/site.ts` (`homePage`, `primaryNav`, `docsHubCatalog`, `footerLinkGroups`). 1. Language definition (`Echo is a compiled language`) plus the lead -2. Representative sample that shows statement leaders and binds -3. First-class links: Documents (`/docs`), Packages (`/docs/std`), Spec (`/e26`) -4. Footer +2. Status line: Echo 2026, Rust, prerelease tags, MIT +3. Representative sample that shows statement leaders and binds +4. First-class links: Documents (`/docs`), Packages (`/docs/std`), Spec (`/e26`) +5. Footer (compiled language, `xo`, LLVM, Echo 2026, prerelease, MIT) Each of those links, plus Install, First program, Book, Try, Privacy, Terms, and Security, is a real page (`path/index.html`) with that page title and body. A destination without a document is removed from the catalog or footer. -Homepage trust stays factual. Rust, LLVM, the public edition, and the -machine-checked suite are implementation facts. +Homepage trust stays factual. Rust, LLVM, the public edition, MIT, prerelease +tags, and the machine-checked suite are implementation facts. The footer lists +GitHub. It does not list Discord. ## Security @@ -222,11 +244,11 @@ Compile and native run stay on `xo` (LLVM). Learn, Community, and About. Copy lives in `src/docs/site.ts` (`footerLinkGroups`). -| Group | Links | -| --------- | --------------------------------------------------------------------------------------------------- | -| Learn | Install, Try Echo, First program, Documents, Book, Echo 2026 | -| Community | GitHub. Omit Discord until a public invite URL exists. | -| About | Modoterra (`https://modoterra.xyz`), Privacy (`/privacy`), Terms (`/terms`), Security (`/security`) | +| Group | Links | +| --------- | ---------------------------------------------------------------------------------------------------------------- | +| Learn | Install, Try Echo, First program, Documents, Book, Echo 2026 | +| Community | GitHub. Omit Discord until a public invite URL exists. | +| About | Modoterra (`https://modoterra.xyz`), Privacy (`/privacy`), Terms (`/terms`), Security (`/security`), MIT License | Public project mail on the site is `@modoterra.xyz` only (`hello@`, `security@`, `oss@`). Do not publish `@modoterra.com`. diff --git a/www/scripts/verify-docs-pages.mjs b/www/scripts/verify-docs-pages.mjs index a28e5a1a..f632ffbc 100644 --- a/www/scripts/verify-docs-pages.mjs +++ b/www/scripts/verify-docs-pages.mjs @@ -1,8 +1,10 @@ /** * Verifies the shipped docs-first site model: * - homepage definition, leader-bearing sample, docs/std/spec links + * - public facts: compiled language, MIT, Rust, LLVM, xo, Echo 2026, prerelease + * - no production-ready, crates.io, Windows, or Discord claims * - primary nav labels and paths - * - footer About links Privacy and Terms; Discord stays hidden + * - footer About links Privacy, Terms, and MIT; Discord stays hidden * - legal pages use @modoterra.xyz mail only * - Documents hub catalog groups * - security mailbox, SECURITY.md, and footer /security pointer @@ -35,6 +37,7 @@ try { const { docsHubCatalog, + footerBlurb, footerLinkGroups, homePage, installCta, @@ -66,6 +69,35 @@ try { fail("homePage.sample must show $ and ~ statement leaders"); } + const publicChrome = [homePage.definition, homePage.lead, homePage.status, footerBlurb].join( + "\n", + ); + const requiredFacts = [ + "compiled language", + "MIT", + "Rust", + "LLVM", + "xo", + "Echo 2026", + "prerelease", + ]; + for (const needle of requiredFacts) { + if (!new RegExp(needle, "i").test(publicChrome)) { + fail(`public chrome must mention ${needle}`); + } + } + for (const banned of [ + "production-ready", + "production ready", + "crates.io", + "Windows", + "Discord", + ]) { + if (publicChrome.toLowerCase().includes(banned.toLowerCase())) { + fail(`public chrome must not mention ${banned}`); + } + } + const homeTargets = new Set(homePage.links.map((link) => link.to)); for (const required of ["/docs", "/docs/std", "/e26"]) { if (!homeTargets.has(required)) { @@ -103,6 +135,9 @@ try { if (footerByLabel.get("Modoterra") !== "https://modoterra.xyz") { fail("footer About must keep the Modoterra company link"); } + if (footerByLabel.get("MIT License") !== "https://github.com/modoterra/echo/blob/main/LICENSE") { + fail("footer About must link the MIT License"); + } if (footerByLabel.has("Discord") || footerLinks.some((link) => /discord/i.test(link.label))) { fail("footer must hide Discord until there is a public invite"); } @@ -298,8 +333,16 @@ try { if (snapshot.includes("modoterra.github.io")) { fail("static homepage must not point at modoterra.github.io"); } + const siteMd = readFileSync(path.join(root, "SITE.md"), "utf8"); + for (const needle of ["Public facts", "prerelease tags", "MIT license", "v0.0.1-alpha.9"]) { + if (!siteMd.includes(needle)) { + fail(`SITE.md missing public-fact marker: ${needle}`); + } + } + for (const needle of [ homePage.definition, + homePage.status, homePage.sample.trim().split("\n")[0], "/docs", "/docs/std", diff --git a/www/scripts/verify-prose.mjs b/www/scripts/verify-prose.mjs index 2e57acf9..7e2221df 100644 --- a/www/scripts/verify-prose.mjs +++ b/www/scripts/verify-prose.mjs @@ -128,7 +128,7 @@ try { const { docsPages, docsPageByPath } = content; const { stdModules } = ref; - const { homePage, docsHubCatalog, legalPages, tryPage } = site; + const { homePage, docsHubCatalog, footerBlurb, legalPages, tryPage } = site; const install = await server.ssrLoadModule("/src/docs/install-content.ts"); const { installPage, inlineText } = install; @@ -152,6 +152,8 @@ try { prose.push({ where: "home definition", text: homePage.definition }); prose.push({ where: "home lead", text: homePage.lead }); + prose.push({ where: "home status", text: homePage.status }); + prose.push({ where: "footer blurb", text: footerBlurb }); prose.push({ where: "try lead", text: tryPage.lead }); prose.push({ where: "install lead", text: inlineText(installPage.lead) }); for (const section of installPage.sections) { diff --git a/www/src/app.tsx b/www/src/app.tsx index ef89da78..6d0b7e91 100644 --- a/www/src/app.tsx +++ b/www/src/app.tsx @@ -14,6 +14,9 @@ export function HomePage() {

{homePage.lead}

+

+ {homePage.status} +

Documents diff --git a/www/src/docs/site.ts b/www/src/docs/site.ts index 23e86419..8bebc3c2 100644 --- a/www/src/docs/site.ts +++ b/www/src/docs/site.ts @@ -36,6 +36,7 @@ export type DocsCatalogGroup = { export type HomePageContent = { definition: string; lead: string; + status: string; sampleCaption: string; sample: string; links: SiteLink[]; @@ -113,10 +114,17 @@ export const footerLinkGroups: FooterLinkGroup[] = [ { label: "Privacy", href: "/privacy" }, { label: "Terms", href: "/terms" }, { label: "Security", href: securityContact.path }, + { + label: "MIT License", + href: "https://github.com/modoterra/echo/blob/main/LICENSE", + }, ], }, ]; +export const footerBlurb = + "Echo is a compiled language. xo checks a program and emits a native binary from the same LLVM pipeline. Echo 2026 is the current edition, published as prerelease tags and licensed under MIT."; + export const tryPage = { title: "Try Echo", lead: "This page checks with the shared compiler frontend. A playground run then executes the checked program and captures io.print. Filesystem, net, process, and tasks stay unavailable here. Install xo to compile through LLVM.", @@ -291,6 +299,8 @@ export function primaryNavItemIsActive(to: string, pathname: string): boolean { export const homePage: HomePageContent = { definition: "Echo is a compiled language.", lead: "Statement leaders mark control and binding. The rest of each line is an ordinary expression. xo checks a program and emits a native binary from the same LLVM pipeline.", + status: + "Echo 2026 is the public edition. A Rust toolchain ships as prerelease tags on GitHub. The repository is MIT licensed.", sampleCaption: "sum.echo", sample: `/ std/io @@ -526,6 +536,7 @@ export function renderStaticHomeAndHub(): string { `
`, `

${escapeHtml(homePage.definition)}

`, `

${escapeHtml(homePage.lead)}

`, + `

${escapeHtml(homePage.status)}

`, `
${escapeHtml(homePage.sample)}
`, ``, catalog, diff --git a/www/src/router.tsx b/www/src/router.tsx index 87b47524..9c8be008 100644 --- a/www/src/router.tsx +++ b/www/src/router.tsx @@ -41,6 +41,7 @@ import { type DocsTextPart, } from "./docs/content"; import { + footerBlurb, footerLinkGroups, installCta, primaryNav, @@ -325,10 +326,7 @@ function SiteFooter() {

Echo

-

- A compiled language with statement leaders. The xo CLI checks programs and emits native - binaries. -

+

{footerBlurb}

© 2026 Modoterra Corporation