The Paradox of Choice
Starting a new React project in 2026 means answering at least a dozen questions before you write a single line of business logic:
- State management: Redux? Zustand? Jotai? Recoil? MobX? Valtio? Signals?
- Routing: React Router? TanStack Router? Next.js App Router?
- Forms: React Hook Form? Formik? Final Form? TanStack Form?
- Styling: Tailwind? Styled Components? Emotion? CSS Modules? Vanilla Extract?
- Data fetching: TanStack Query? SWR? RTK Query? Apollo Client?
- Animation: Framer Motion? GSAP? React Spring? Motion One?
That is six categories with over thirty competing options, and we have not even touched testing, build tools, or deployment. Every choice introduces compatibility risks, learning curves, and maintenance burden. Every combination is a unique snowflake that no one else has tested in production.
This is not developer experience. This is decision paralysis dressed up as "ecosystem richness."
What forge/client Actually Provides
forge/client is a single module that ships everything you need to build production frontend applications. No assembly required. No compatibility matrix to worry about. Here is what is included:
| Capability | React Ecosystem | forge/client |
|---|---|---|
| Reactive state | Redux + middleware (~45KB) | Built-in signals |
| Routing | React Router (~28KB) | Built-in virtual router |
| Forms | React Hook Form (~25KB) | Built-in form system |
| CSS-in-JS | Emotion (~11KB) | Built-in styled() |
| Data fetching | TanStack Query (~39KB) | Built-in fetch hooks |
| SSR | Next.js (framework lock-in) | Built-in renderToString |
| Animations | Framer Motion (~32KB) | forge/animate integration |
Signals: State Management That Makes Sense
React's state model is fundamentally broken. Every state change re-renders the entire component tree (unless you manually optimize with memo, useMemo, and useCallback). This is why the React ecosystem spawned dozens of state management libraries, each trying to work around the same core limitation.
forge/client uses fine-grained signals inspired by Solid.js and the TC39 signals proposal. When a signal changes, only the specific DOM nodes that depend on that signal update. No virtual DOM diffing. No re-renders. No memoization ceremonies.
No useCallback. No useMemo. No React.memo(). No stale closure bugs. Signals track their dependencies automatically and update surgically. This is not a marginal improvement — it is a fundamentally different (and better) reactivity model.
Routing Without the Plugin
In React, routing is always a third-party concern. React Router has gone through five major versions, each with breaking API changes. TanStack Router is excellent but adds another 30KB and another API surface to learn. Next.js solves routing but locks you into a framework with its own opinions about everything.
forge/client includes a virtual router that integrates directly with the signal system:
Route parameters are signals. Navigation does not re-mount the entire component tree. Middleware runs before route transitions. Code splitting is built-in. This is what routing looks like when it is designed alongside the state system instead of being bolted on after the fact.
Forms That Do Not Need a Library
React Hook Form exists because React's state model makes controlled forms painfully slow. Every keystroke triggers a re-render. RHF works around this with uncontrolled inputs and refs. It is a clever hack, but it is still a hack.
With signals, controlled forms are fast by default. When a signal updates, only the specific input value changes — not the entire form component. forge/client's form system builds on this:
Notice how the schema from forge/schema plugs directly into the form system. The same validation runs on the client and the server. No separate validation layer. No Zod-to-RHF adapter. Everything is one system.
CSS-in-JS Without the Runtime Cost
The CSS-in-JS debate has raged for years. Runtime solutions like Styled Components and Emotion add parsing overhead on every render. Zero-runtime solutions like Vanilla Extract require build tooling. Tailwind side-steps the issue but produces unreadable markup.
forge/client provides a styled() API that generates class names at component creation time, not at render time. Styles are injected once and cached. Dynamic values use CSS custom properties, avoiding re-injection:
The Integration Advantage
The real power of forge/client is not any individual feature — it is how everything works together. The router knows about signals. The form system knows about the schema validator. The styled system knows about the component lifecycle. SSR knows about all of them.
When you assemble a React stack from independent libraries, you are the integration layer. You write the glue code. You debug the edge cases where Library A's lifecycle does not quite align with Library B's update timing. You maintain the compatibility matrix.
With forge/client, we are the integration layer. We test every combination. We ensure every API works seamlessly with every other API. You write business logic, not glue code.
"The best stack is the one where you never have to think about the stack."
What About the React Ecosystem?
React's ecosystem is genuinely impressive. There are packages for everything. But breadth is not the same as coherence. Having 30 options for state management is not a feature — it is a symptom of a core framework that left too many problems unsolved.
forge/client takes the opposite approach: solve the common problems once, solve them well, and make them work together perfectly. If you need something forge/client does not provide, you can still use any npm package alongside it. But we think you will find that you rarely need to.
End the Decision Fatigue
One module. Signals, routing, forms, CSS-in-JS, SSR, and data fetching. All integrated. All tested. All coherent.
Read the Docs Request Early AccessHBForge is currently available exclusively for enterprise clients. Opening to the Developer Community on June 25, 2026. Contact kr@hyperbridge.in for early access.