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.
-