You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Port the refreshed Claude Design landing:
- new hero copy (the two convictions), philosophy reworked into 'Expressive
to read. Robust to run.' with three filled principle cards
- new 'In the age of AI' section (why fail-fast + expressiveness matter when
an agent writes the code)
- new 'Inspirations' section (zod / prisma / tRPC / oRPC)
- project cards restructured (56px mark + stars on top, tag below) and demesne
copy refreshed (Injection tag, new points, 'pnpm add demesne unthrown')
- nav adds 'Why now'; npm link omitted (the ~btravers namespace is empty —
each package publishes under its own name)
Also fixes the website build: @btravstack/theme's Layout imports 'vue', which
the workspace build couldn't resolve — add vue as a devDependency of the theme
package and noExternal it in the website's Vite config.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: apps/website/.vitepress/theme/Landing.vue
+88-38Lines changed: 88 additions & 38 deletions
Original file line number
Diff line number
Diff line change
@@ -10,9 +10,22 @@ function toggleAppearance() {
10
10
}
11
11
12
12
const principles = [
13
-
{ num: "01", title: "Contracts, not guesswork", body: "Declare your interface once. Types, autocompletion and validation flow to every call site — publisher, consumer, worker and client." },
14
-
{ num: "02", title: "Errors as values", body: "Model failure in the type system. Anticipated errors are returned, not thrown — only a true defect ever escapes up the stack." },
15
-
{ num: "03", title: "Validated at the edges", body: "Standard-Schema validation runs at every network boundary, so malformed data never makes it past the door of your service." },
13
+
{ num: "01", title: "The signature is the doc", body: "A contract or a function signature should be enough to understand a system. Declare the interface once and read everything from it — no digging into implementations." },
14
+
{ num: "02", title: "Fail fast, everywhere", body: "The sooner the error, the better the code. Anticipated failures are values in the type, malformed data stops at the boundary, missing wiring is a compile error." },
15
+
{ num: "03", title: "Coherence at a high level", body: "Contracts pin down how the pieces fit — publisher and consumer, workflow and client, module and dependency can't drift apart while implementations change underneath." },
16
+
];
17
+
18
+
const aiCards = [
19
+
{ title: "The tightest feedback loop", body: "An agent is only as good as the signal it gets back. Fail-fast code turns a wrong guess into a precise error in seconds — and fast errors are what make iteration converge." },
20
+
{ title: "A deterministic metric", body: "Typechecking has no opinions. The contract holds or it doesn't — a reproducible, binary measure of generated code, before a single test runs." },
21
+
{ title: "Review at the contract level", body: "Expressive contracts carry the intent. You review interfaces while the AI churns through implementations — the types guarantee the whole still fits together." },
22
+
];
23
+
24
+
const inspirations = [
25
+
{ name: "zod", href: "https://zod.dev", body: "The schema as a single source of truth — write it once, infer the types." },
26
+
{ name: "prisma", href: "https://www.prisma.io", body: "One declaration, a fully typed client — the whole database readable from its types." },
27
+
{ name: "tRPC", href: "https://trpc.io", body: "End-to-end type safety across a network boundary, with no codegen step." },
28
+
{ name: "oRPC", href: "https://orpc.unnoq.com", body: "Contract-first RPC — the contract is an artifact you define, share and implement against." },
blurb: "Type-safe dependency injection. A container holds your services' domain and provides it — with requirements and construction errors tracked in the type system.",
61
-
points: ["Missing wiring is a compile error", "Construction errors in the result type", "No decorators, no reflect-metadata"],
blurb: "Type-safe dependency injection. Requirements and construction errors live in the type system — you cannot build until every dependency is wired.",
74
+
points: ["Missing wiring is a compile error", "Failures as one static union", "Scoped resources, LIFO release"],
<buttontype="button"class="btv-toggle":title="isDark ? 'Switch to light' : 'Switch to dark'":aria-label="isDark ? 'Switch to light theme' : 'Switch to dark theme'":aria-pressed="isDark"@click="toggleAppearance">
<pclass="btv-sub">A small set of type-safe building blocks for Node. Describe your messaging, workflows and errors once — and let the types flow to every call site.</p>
141
+
<pclass="btv-sub">A small stack of type-safe building blocks for Node, built on two convictions: a signature should be enough to understand a system, and the fastest error is the best one. Declare the contract once — types, validation and feedback flow everywhere.</p>
128
142
<divclass="btv-cta-row">
129
143
<ahref="#projects"class="cta-primary btv-primary-btn">Explore the packages</a>
<h2class="btv-h2 btv-h2-wide">The compiler should catch what tests can't.</h2>
144
-
<pclass="btv-section-lead">Each package is small, focused and does one thing well — but they share a worldview: your interfaces are contracts, failure is part of the type, and bad data stops at the door.</p>
157
+
<h2class="btv-h2 btv-h2-wide">Expressive to read. Robust to run.</h2>
158
+
<pclass="btv-section-lead">Each package is small, focused and does one thing well — but they share a worldview: expressive code you can understand from its signature alone, and robust code that fails fast enough to learn from.</p>
145
159
<divclass="btv-prin">
146
-
<divv-for="pr in principles":key="pr.num"class="btv-prin-item">
<h2class="btv-h2 btv-ai-h2">Written with AI. Judged by the compiler.</h2>
172
+
<pclass="btv-section-lead">None of this was invented for AI — AI just raised the stakes. When an agent writes the code, expressiveness and fail-fast stop being a matter of taste and become infrastructure.</p>
173
+
<divclass="btv-ai-grid">
174
+
<divv-for="c in aiCards":key="c.title"class="btv-ai-card">
175
+
<h3>{{ c.title }}</h3>
176
+
<p>{{ c.body }}</p>
177
+
</div>
178
+
</div>
179
+
</div>
180
+
</section>
181
+
182
+
<sectionclass="btv-section btv-insp">
183
+
<pclass="btv-eyebrow">Inspirations</p>
184
+
<h2class="btv-h2 btv-insp-h2">Standing on good shoulders.</h2>
185
+
<pclass="btv-section-lead">btravstack borrows its instincts from the libraries that made TypeScript feel this way in the first place.</p>
186
+
<divclass="btv-insp-grid">
187
+
<av-for="i in inspirations":key="i.name":href="i.href"target="_blank"rel="noopener"class="pcard btv-insp-card">
188
+
<spanclass="btv-insp-name">{{ i.name }}</span>
189
+
<pclass="btv-insp-body">{{ i.body }}</p>
190
+
</a>
191
+
</div>
192
+
</section>
193
+
154
194
<sectionid="projects"class="btv-section">
155
195
<pclass="btv-eyebrow">The packages</p>
156
196
<h2class="btv-h2"style="margin-bottom:30px">Four libraries, one stack.</h2>
157
197
<divclass="grid-3 btv-projects">
158
198
<divv-for="p in projects":key="p.name"class="pcard btv-pcard">
0 commit comments