Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 33 additions & 11 deletions www/SITE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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`.
Expand Down
45 changes: 44 additions & 1 deletion www/scripts/verify-docs-pages.mjs
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -35,6 +37,7 @@ try {

const {
docsHubCatalog,
footerBlurb,
footerLinkGroups,
homePage,
installCta,
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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");
}
Expand Down Expand Up @@ -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",
Expand Down
4 changes: 3 additions & 1 deletion www/scripts/verify-prose.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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) {
Expand Down
3 changes: 3 additions & 0 deletions www/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ export function HomePage() {
<p className="mt-7 max-w-xl text-pretty text-lg leading-8 text-slate-600 sm:text-xl sm:leading-8">
{homePage.lead}
</p>
<p className="mt-5 max-w-xl text-pretty text-base leading-7 text-slate-500 sm:text-lg sm:leading-8">
{homePage.status}
</p>
<div className="mt-9 flex flex-wrap items-center gap-3">
<CtaLink to="/docs">Documents</CtaLink>
<CtaLink to="/try" variant="secondary">
Expand Down
11 changes: 11 additions & 0 deletions www/src/docs/site.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export type DocsCatalogGroup = {
export type HomePageContent = {
definition: string;
lead: string;
status: string;
sampleCaption: string;
sample: string;
links: SiteLink[];
Expand Down Expand Up @@ -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.",
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -526,6 +536,7 @@ export function renderStaticHomeAndHub(): string {
`<main>`,
`<h1>${escapeHtml(homePage.definition)}</h1>`,
`<p>${escapeHtml(homePage.lead)}</p>`,
`<p>${escapeHtml(homePage.status)}</p>`,
`<pre>${escapeHtml(homePage.sample)}</pre>`,
`<nav aria-label="Language surfaces"><ul>${surfaceLinks}</ul></nav>`,
catalog,
Expand Down
6 changes: 2 additions & 4 deletions www/src/router.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import {
type DocsTextPart,
} from "./docs/content";
import {
footerBlurb,
footerLinkGroups,
installCta,
primaryNav,
Expand Down Expand Up @@ -325,10 +326,7 @@ function SiteFooter() {
<div className="mx-auto grid w-full max-w-7xl gap-14 lg:grid-cols-[minmax(0,360px)_1fr]">
<section>
<p className="max-w-sm text-xl font-semibold leading-8 text-slate-950">Echo</p>
<p className="mt-5 max-w-sm text-sm leading-6 text-slate-500">
A compiled language with statement leaders. The xo CLI checks programs and emits native
binaries.
</p>
<p className="mt-5 max-w-sm text-sm leading-6 text-slate-500">{footerBlurb}</p>
<p className="mt-10 text-sm text-slate-400">© 2026 Modoterra Corporation</p>
</section>

Expand Down
Loading