Skip to content

Blog cluster: WebJs identity and the borrow-then-diverge philosophy #1056

Description

@vivek7405

Problem

WebJs has a clear identity that the blog does not yet state head-on: it is a web-standards, no-build framework built for excellent DX for BOTH humans AND AI agents. It uses patterns developers already know from the modern web (file-based routing, web-component APIs, Turbo-style client navigation), so someone productive in another modern framework is productive in WebJs from day one, and an AI agent writes correct WebJs code with little framework-specific training data. Where WebJs makes its own choices (reactive props through the WebComponent({...}) factory, no RSC server/client split, the .server boundary, light-DOM by default), those choices follow from the web platform, and WebJs ships clear guidance so they are easy to learn. That is the identity, familiar where it helps and deliberate where it matters, and it is under-told.

This is a planned content cluster, not a bug. It should be written through the webjs-blog-write skill (house voice, SEO-first, dedupe check, dogfood every factual claim).

Design / approach

Two proposed posts. Titles are starting points, the writer should sharpen for real search demand. (An earlier draft of this cluster had a third post focused on the client router; it was dropped because blog/client-router-turbo-drive-style.md already owns that topic and a second post would cannibalize it. Any material about how the client router works can appear inside post 2 as a worked example instead.)

While touching that existing post, also clean up its title: rename blog/client-router-turbo-drive-style.md from Client-Side Routing Without the Full-Page Reload (or: Goodbye, White Flash) to Client-Side Routing Without the Full-Page Reload (drop the parenthetical). Front-matter title: line only, keep the slug and content.

  1. CSP nonce that survives SPA navigation (fresh, high value). Angle: strict Content-Security-Policy with a per-request nonce is famously broken by client-side routers (the Turbo Drive nonce mismatch). Explain how WebJs solves it: header-enforced CSP, <meta name=csp-nonce> as a client carrier, and the client router keeping the original document nonce across soft navs (fix: view-transition soft-nav meta leak and stuck Suspense skeleton #1049/fix: preserve csp-nonce on mergeHead, warn on dropped streamed resolve #1052/Document the CSP nonce model across client-router soft navigations #1054). Natural sibling to the existing csrf-protection-without-tokens.md. SEO around "CSP nonce SPA / soft navigation / Turbo nonce mismatch / strict CSP client router".

  2. WebJs's identity: familiar on purpose, its own where it counts (fresh, the headline). Make the confident, positive case that a framework does not need to reinvent everything to have a strong identity. WebJs's identity IS its DX for humans and agents and its web-standards foundation: familiarity is a deliberate strength (instant productivity, a smaller learning curve, and reliable AI-agent output in the AI era), and its own choices (the reactive-props factory, no RSC split, the .server boundary, light-DOM by default) are made because they fit the platform, each one documented so it is easy to pick up (.agents/skills/webjs/references/muscle-memory-gotchas.md). If the provocative hook "Does WebJs even have its own identity?" is used as the title, the post must ANSWER it firmly and in WebJs's favor, never leave it hanging. SEO around "AI-first web framework / web components framework / no-build framework".

Implementation notes (for the implementing agent)

  • Write via the webjs-blog-write skill. Posts live in the repo-root blog/<slug>.md; the website publishes them. Match the existing front-matter shape of a current post (open any blog/*.md).
  • Dedupe against the EXISTING corpus before writing (the skill requires this). Directly related existing posts: client-router-turbo-drive-style.md (why the standalone client-router post was dropped), csrf-protection-without-tokens.md (post 1's sibling), ai-first-is-plumbing.md, building-on-javascript-not-around-it.md, betting-on-lits-mental-model.md, stop-ai-agents-breaking-your-code.md, the-naming-saga.md (all touch the philosophy, so post 2 must add a NEW thesis, not restate them). An article owns the general term, a post owns the WebJs-specific angle (no two pages chase the same exact keyword).
  • Ground every factual claim in the code / shipped behavior and dogfood it (the skill mandates this): the CSP model (fix: view-transition soft-nav meta leak and stuck Suspense skeleton #1049/fix: preserve csp-nonce on mergeHead, warn on dropped streamed resolve #1052/Document the CSP nonce model across client-router soft navigations #1054, packages/server/src/csp.js, getCspNonce() in router-client.js); the gotcha docs (.agents/skills/webjs/references/muscle-memory-gotchas.md); reactive props factory (invariant 10); no-RSC (server-actions-without-react-server-components.md already covers part of this, dedupe).
  • TONE (critical for post 2): keep it confident and positive, never self-deprecating and never defensive. Be generous and respectful about the frameworks WebJs shares ideas with, so the piece reads as a considered point of view rather than a swipe that invites a framework-war pile-on. Do NOT frame a WebJs capability as "another tool's feature, but native", and do NOT undermine WebJs's originality or maturity. Sell each capability on its own terms.
  • Prose rules: no internal PR/issue numbers in the published post, no process tells, invariant 11 (no em-dashes, no pause hyphen/semicolon, WebJs brand casing). The blog-write skill enforces the voice.
  • No code change, no test layer. Docs/marketing content only.

Acceptance criteria

  • Post 1 (CSP nonce + soft nav) drafted, deduped against csrf-protection-without-tokens.md, every claim dogfood-verified
  • Post 2 (WebJs identity) drafted with a genuinely new, confident thesis, not a restatement of the existing philosophy posts, using the client router only as an in-post example (no standalone client-router post)
  • Both posts pass the webjs-blog-write voice + SEO + no-process-tells checks
  • Existing blog/client-router-turbo-drive-style.md title renamed to Client-Side Routing Without the Full-Page Reload (parenthetical dropped)
  • Each post added under blog/ with correct front-matter and renders on the website

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Type

No type

Projects

Status
Todo

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions