Skip to content

Commit 1e873eb

Browse files
committed
hero: the locked FR-042 pitch — model-first H1, two verbs
The H1 was "Make schema drift a compile-time error", which misstated where the check runs (`meta verify` is a CI-time gate, not a compiler diagnostic) and led with a failure mode, which sells insurance rather than a way of building. Model-first now, per the maintainer's ruling: one typed model, your agent writes it, your code is generated from it, your build is checked against it. The lede opens on the wedge — context is advisory; a gate is not — because the reader arrives already sold on context and has no reason to think anything checks it. Two verbs replace the eyebrow's inventory line: Generate and Verify, with Verify's scope stated in full, including the clause nothing else in the market matches — a feature someone marked done that has nothing implementing it. No test can fail on that, because a test exercises code that exists. The honesty line moves into the hero (single-language, no LLM calls? an ORM is probably enough) rather than waiting for the comparison section, and the scope clause sits next to the gate claim. The gate-first line is kept, but it leads the drift section instead of the hero: above the `meta gen` recording it read as that video's caption, which pairs a drift claim with a codegen demo — the one thing the positioning research says never to do. It moves back to the hero when the rename → red → regen → green recording replaces the video. The primary CTA points at that section for the same reason; there is no two-minute-demo page to link yet. Also: "Five pillars. All shipping." over a section where the fifth ships test scaffolding in one port, and "enforced as compile-time errors" in the AI section. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011cQxyVuTkdPmAduLiedNEg
1 parent 6eec346 commit 1e873eb

2 files changed

Lines changed: 50 additions & 14 deletions

File tree

www/index.html

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,23 @@
4343
<main>
4444
<!-- Hero -->
4545
<section class="hero">
46-
<p class="hero-eyebrow">Cross-language metadata standard · Apache 2.0 · Installable in 5 languages</p>
47-
<h1>Make schema drift a compile-time error.</h1>
46+
<p class="hero-eyebrow">Apache 2.0 · TypeScript · Java · Kotlin · C# · Python</p>
47+
<h1>One typed model of your app. Your agent writes it, your code is generated from it, your build is checked against it.</h1>
4848
<p class="hero-lede">
49-
AI coding agents regenerate thousands of lines a day. Without a shared spine they produce inconsistent boilerplate at every prompt — and the drift surfaces as a production incident, not a compile error. MetaObjects is the spine: define typed entities once, generate idiomatic code across <strong>TypeScript, Java, Kotlin, C#.NET, and Python</strong>, and every generated stack breaks the type checker the moment the metadata moves underneath it.
49+
Coding agents get context — rules files, memories, MCP servers — and context is <strong>advisory</strong>: nothing fails when the code stops matching it. MetaObjects gives your agent one typed model of your application — data, API, UI, prompt payloads, and what the software is supposed to do — generates each layer's code from it with no proprietary runtime in the output, and fails your build when generated code, a prompt, or a claimed capability drifts from that model.
50+
</p>
51+
<p class="hero-verbs">
52+
<strong>Generate.</strong> The boring parts are derived from the model, in five languages — at build time as code you own, or at runtime from the live model.
53+
<br>
54+
<strong>Verify.</strong> The build fails when generated code drifts from the model, when a prompt's payload no longer matches what it's told, and when a feature someone marked done has nothing implementing it.
55+
</p>
56+
<p class="hero-scope">
57+
It protects what the model declares; your hand-written logic is still yours. And if your app is single-language with no LLM calls, a good ORM is probably enough — <a href="#compare">the honest comparison</a> says so first.
5058
</p>
5159
<div class="hero-ctas">
52-
<a href="/getting-started.html" class="btn btn-primary">Get started →</a>
60+
<a href="#drift" class="btn btn-primary">See what breaks the build</a>
5361
<a href="#assess" class="btn btn-secondary">Assess your repo — no install</a>
54-
<a href="https://github.com/metaobjectsdev/metaobjects/tree/main/spec" class="btn btn-secondary">Read the spec</a>
62+
<a href="/getting-started.html" class="btn btn-secondary">Get started →</a>
5563
<a href="https://github.com/metaobjectsdev/metaobjects" class="btn btn-secondary">GitHub</a>
5664
</div>
5765
<figure class="hero-demo">
@@ -140,7 +148,7 @@ <h2 class="section-label">Watch the introduction</h2>
140148

141149
<!-- Five pillars — all shipping -->
142150
<section class="pillars">
143-
<h2 class="section-label">Five pillars. All shipping.</h2>
151+
<h2 class="section-label">What is underneath the two verbs.</h2>
144152
<div class="pillars-grid">
145153
<article class="pillar">
146154
<h3>Codegen</h3>
@@ -171,9 +179,10 @@ <h3>Requirements and testing</h3>
171179
</div>
172180
</section>
173181

174-
<!-- Drift table — the #1 AI-era reason to adopt -->
175-
<section class="drift">
176-
<h2 class="section-label">The #1 reason in the AI era: drift breaks the build.</h2>
182+
<!-- Drift table — what Verify actually catches -->
183+
<section class="drift" id="drift">
184+
<h2 class="section-label">Context is advisory. This is not: drift breaks the build.</h2>
185+
<p class="hero-gateline" style="text-align:left;margin:0 0 1rem;">When AI-written code drifts from your typed model, the build fails.</p>
177186
<p class="drift-intro">
178187
AI coding agents regenerate thousands of lines a day. A field rename in one file misses three others — types compile, runtime breaks at the boundary, hours to chase. A required field added to an entity is forgotten in the migration, the validator, the form. A prompt template references <code>{{userName}}</code> while the payload type carries <code>user.name</code>. Without a shared spine, every prompt accelerates the entropy. MetaObjects inverts the source of truth: generated code is owned by the codegen, not by humans or agents.
179188
</p>
@@ -462,7 +471,7 @@ <h2 class="section-label section-label-on-dark">Built so AI agents work at the m
462471
<li><a href="https://github.com/metaobjectsdev/metaobjects/blob/main/CLAUDE.md"><code>CLAUDE.md</code> in the repo</a> — agent instructions for working in the metaobjects codebase itself</li>
463472
</ul>
464473
<p class="ai-future">
465-
<strong>Why Claude Code in particular.</strong> Anthropic's official CLI was the day-zero driver for the standard's design choices. The metamodel vocabulary is small enough to fit in a context window; the conformance contract is enforced as compile-time errors rather than runtime drift; and the generated code is the same idiomatic per-language output a senior engineer would write by hand, so an agent's review pass converges fast. A first-party MCP server exposing the spec, conformance fixtures, and codegen tools as agent-callable functions is on the <a href="https://github.com/metaobjectsdev/metaobjects/blob/main/spec/roadmap.md">roadmap</a>.
474+
<strong>Why Claude Code in particular.</strong> Anthropic's official CLI was the day-zero driver for the standard's design choices. The metamodel vocabulary is small enough to fit in a context window; the conformance contract is enforced by a build gate rather than discovered as runtime drift; and the generated code is the same idiomatic per-language output a senior engineer would write by hand, so an agent's review pass converges fast. A first-party MCP server exposing the spec, conformance fixtures, and codegen tools as agent-callable functions is on the <a href="https://github.com/metaobjectsdev/metaobjects/blob/main/spec/roadmap.md">roadmap</a>.
466475
</p>
467476
</div>
468477
</section>

www/styles.css

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,20 +138,46 @@ h1, h2, h3 {
138138
margin: 0 0 1.5rem;
139139
}
140140
.hero h1 {
141-
font-size: 2.75rem;
141+
/* Three clauses, so a notch smaller than a slogan headline and given room to breathe. */
142+
font-size: 2.4rem;
142143
font-weight: 700;
143-
line-height: 1.1;
144+
line-height: 1.15;
144145
letter-spacing: -0.025em;
145146
margin: 0 0 1.5rem;
146-
max-width: 820px;
147+
max-width: 900px;
147148
}
148149
.hero-lede {
149150
font-size: 1.15rem;
150151
line-height: 1.55;
151152
color: var(--dark-gray);
152153
max-width: 720px;
154+
margin: 0 0 1.5rem;
155+
}
156+
.hero-verbs {
157+
font-size: 1.05rem;
158+
line-height: 1.6;
159+
color: var(--dark-gray);
160+
max-width: 720px;
161+
margin: 0 0 1.25rem;
162+
padding-left: 1rem;
163+
border-left: 3px solid var(--accent-gold);
164+
}
165+
.hero-verbs strong { color: var(--primary-blue); }
166+
.hero-scope {
167+
font-size: 0.98rem;
168+
line-height: 1.55;
169+
color: var(--dark-gray);
170+
max-width: 720px;
153171
margin: 0 0 2rem;
154172
}
173+
.hero-gateline {
174+
font-size: 1.05rem;
175+
font-weight: 600;
176+
color: var(--primary-blue);
177+
text-align: center;
178+
max-width: 860px;
179+
margin: 2.5rem auto 0;
180+
}
155181
.hero-ctas { display: flex; gap: 0.875rem; flex-wrap: wrap; }
156182

157183
.btn {
@@ -188,8 +214,9 @@ h1, h2, h3 {
188214
}
189215

190216
@media (max-width: 700px) {
191-
.hero h1 { font-size: 2rem; }
217+
.hero h1 { font-size: 1.8rem; }
192218
.hero-lede { font-size: 1.05rem; }
219+
.hero-verbs, .hero-gateline { font-size: 0.98rem; }
193220
}
194221

195222
/* ============================================================ Pillars */

0 commit comments

Comments
 (0)