fix(website): rework the landing grid, drop the intro video and the AI-first lede - #1467
Merged
Conversation
The landing page no longer carries the intro video. The bytes stay in the R2 bucket, so restoring the section later is an editorial call rather than a re-upload. "AI-first" comes out of the one-line definition on the landing page, /why-webjs and /what-is-webjs. It leads with what WebJs is instead. The sentence is duplicated across the visible lede, the meta description and the OG-image generator on each page, so all three move together and the cards are regenerated to match. The positioning is not retired: the /what-is-webjs FAQ entry and capability card that explain it stay. /why-webjs also gains "web components" in its category line, which is the one differentiator the shortest version of the sentence was dropping.
Two of the six cards in "The browser is the framework" were the two things a reader already assumes a full-stack framework has. File routing and typed server actions are table stakes, so neither card was doing work in a grid whose job is to answer "is this complete, and what does it give me that the browser does not". The write path with scripting off, and a mutation that rolls itself back, are the two that are genuinely ours, so they take those slots. The progressive-enhancement card is deliberately aimed at forms rather than at the first paint, which "The first paint is the whole page" already owns above it, and the comment above the grid now records that.
The two slots freed up on "The browser is the framework" now carry the architecture and design-system claims that /why-webjs argues at length. This grid exists to answer "is this complete", and what a reader gets without having to ask for it is the strongest answer to that. The architecture inset also puts the route tree back on the page, which the routing card had been carrying, and adds the .server boundary to it.
Type safety end to end is what a reader evaluating a full-stack framework weighs, and it is the third claim /why-webjs makes that this grid was not carrying. Elision gives up the slot for it. The claim itself is not gone from the page: the chips under "The first paint is the whole page" still say display components ship 0 KB. What is gone is the only place the page explained it, which the comment over the grid now records so it can be brought back if a slot frees up.
"Where the decisions are still open" and "Where they are already made" made the reader hold the section's argument in their head to work out which panel was which. "Other frameworks" and "WebJs" say it outright, and the prose above the panels still makes the open-decision point. The SSR test sliced the left panel at the old heading text. A renamed boundary returns -1 there, which quietly widens the slice to the rest of the document and leaves every assertion on it passing vacuously, so it now slices on the aria-labels and asserts each boundary exists first.
The sentence before it already says types run the whole way through with no code generation in between, so naming the escape hatch an agent then does not need was arguing a point the reader had already been given. Cut on both surfaces that carry the claim, the landing grid and the /why-webjs card, so the two keep saying the same thing.
Streaming gives up the slot. A display-only component that ships zero bytes is the one claim on this grid no other framework can make, and the chips above it assert that without ever explaining it, so the card is the only explanation the page has. The two comments over the grid enumerated a card set that four commits of swapping had left behind, so both are corrected to the current six, and the note now records what the trade cost: streaming is down to a word in the scaffold inventory and the client router is claimed nowhere on this page at all.
Six token names in two columns read as a list of strings, which is the opposite of the point the window is making. Three tokens with a swatch each reads as a palette: a ground, an ink, and an accent. The swatches are decorative, so they carry aria-hidden and the token names stay the accessible content.
/why-webjs spends a whole page on it and the landing page never stated it, which left the strongest reason to try this framework off the page a reader actually lands on. The card is written as a claim about location rather than volume: the source is in the working directory the agent is already in, at the version installed, so a model reads the router it is calling instead of recalling an API. Elision gives up the slot, and the comment over the grid records that it, streaming, and the client router are now the three claims the page no longer explains.
It is the reason to try this framework at all, and the other five cards are what a reader finds once they have. Reading it fourth put the answer after the questions it exists to make worth asking. Pure move, no copy change. The comment over the grid records why it leads so a later reorder does not undo the reason.
The middle line was the only one of the three not following the path to what it produces, and "the writes" was doing that job in prose while the lines above and below it used an arrow. It now reads as mutations, which is the word the docs use.
The section's stage is a real custom element with its own source beside it, and the heading over it was arguing the first paint instead. It now names what the demo shows, and the lede pays the DX half in nouns a reader can check in that stage rather than as a comparison the page cannot make honestly. Progressive enhancement and elision stay. Both are consequences of the component model rather than a separate topic, so they move from the lede into the chips, where the P.S. dare below still invites the reader to verify the first one. Two assertions pin them, because a chip going missing in a later copy pass would take the only statement of either claim off the page with it.
"Nothing is compiled away" described the absence. The section's own first sentence already made the positive claim, that the file in your editor and the file in the network tab are the same file, so the heading now says that and matches the wording /why-webjs uses for the same reason. The lede is unchanged and did not need to be. The new heading is the stronger sentence though, so the comment above it records the two carve-outs the lede is already quietly handling: a server action never reaches the browser at all, and an elided component is never served. A later edit widening this to "every file you write is served" would be refuted by both.
vivek7405
marked this pull request as ready for review
September 8, 2026 04:22
"Templates are lit's" reads as a dependency to anyone who does not already know the API is a parity target, and tells the ones who do nothing they need. "Markup is a tagged template literal" says what the reader will see in the stage directly below it. The familiarity comment further down still records the lit relationship, which is where that belongs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #1466
Summary
A pass over the landing page,
/why-webjsand/what-is-webjs, mostly reworking what the landing page's six-card grid argues.The intro video is gone. The bytes stay in the R2 bucket
webjs-videos, so bringing the section back later is an editorial decision rather than a re-upload. The six assertions describing the player are replaced by one counterfactual: the landing page must render no<video>, no<iframe>, and no reference to the video host, so an embed cannot land there again without failing a test."AI-first" comes out of the one-line definition on three pages. Each of those sentences is duplicated across the visible lede, a meta description, and an OG-image generator, so all three copies move together and the cards are regenerated.
/why-webjsalso gains "web components" in its category line, which is the one differentiator the shortest spelling of the sentence was dropping. The positioning is not retired: the/what-is-webjsFAQ entry that answers "What makes WebJs AI-first?", its capability card, the docs pages,/uiandllms.txtall keep it. What changes is that the definition of WebJs leads with what it is.The six-card grid now opens with the four claims
/why-webjsargues at length, in this order: model-agnosticism, architecture, design system, type safety, then the two it already had, auth and the unglamorous half. Model-agnosticism leads because it is the reason to try this framework at all and the rest of the grid is what you find once you have. File routing, typed server actions, streaming and elision gave up their slots; the architecture inset keeps the route tree and adds the.serverboundary so the routing claim survives in a concrete form.The comment over the grid records what the page no longer explains anywhere, ranked, so the next slot that frees up has an answer: elision first (the chips still assert "Display components ship 0 KB" and nothing explains it, and it is the one claim there no other framework can make), then streaming, then the client router.
Two sections are renamed to say what they argue. "The first paint is the whole page" becomes "Native web components the browser already understands, with better DX", which is what its live
<like-button>stage actually shows; the lede is rewritten to pay the DX half in nouns a reader can check in that stage rather than as a comparison the page cannot make honestly, and progressive enhancement plus elision move from the lede into the chips, where the P.S. dare still invites the reader to verify the first. "Nothing is compiled away" becomes "What you write is what runs", naming the claim its own first sentence already made, in the same words/why-webjsuses for it.The two prompt panels on
/why-webjsare relabelled from "Where the decisions are still open" and "Where they are already made" to "Other frameworks" and "WebJs". The old labels made the reader hold the section's argument in their head to work out which panel was which.Smaller: the design-system window shows three tokens with a colour swatch each instead of six names in two columns; the architecture inset's actions line reads
→ mutations; the "an agent has no reason to reach for any" line is cut from the type-safety claim on both pages that carry it.Test plan
websitenode + browser suites green, 478 node tests and 88 browser testswebsite/test/ssr/landing-copy-ssr.test.tsfails if a video or embed returns, pins the hero wording, pins the DX claim being paid in checkable nouns, and pins the progressive-enhancement and elision chips (a copy pass dropping one would take the page's only statement of either claim with it)why-webjs-ssr.test.tscategory assertion updated, and its panel slice re-anchored: it sliced on the old column heading, where a missing boundary returns -1, silently widening the slice to the rest of the document and leaving every assertion on it passing vacuously. It now slices on the aria-labels and asserts each boundary exists first.( cd website && npx webjs check )cleannpx webjs doctorclean, 2 pre-existing warnings unchanged by this PRog.png,og-what.png,og-why.pngregenerated and checked for overflowSurfaces