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:

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:

CapabilityReact Ecosystemforge/client
Reactive stateRedux + middleware (~45KB)Built-in signals
RoutingReact Router (~28KB)Built-in virtual router
FormsReact Hook Form (~25KB)Built-in form system
CSS-in-JSEmotion (~11KB)Built-in styled()
Data fetchingTanStack Query (~39KB)Built-in fetch hooks
SSRNext.js (framework lock-in)Built-in renderToString
AnimationsFramer 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.

import { signal, computed, effect } from 'hbforge/client'; // Create a signal const count = signal(0); const doubled = computed(() => count.value * 2); // React: re-renders entire component tree // forge/client: updates only the text node "0" -> "1" count.value++; // Side effects that auto-track dependencies effect(() => { console.log(`Count is ${count.value}, doubled is ${doubled.value}`); });

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:

import { Router, Route, Link } from 'hbforge/client'; const app = new Router({ routes: [ { path: '/', component: Home }, { path: '/users/:id', component: UserProfile }, { path: '/settings/**', component: Settings }, ], middleware: [authGuard, analyticsTracker], }); // Route params are signals — components react to URL changes // without re-mounting. History, hash, and memory modes built-in.

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:

import { createForm } from 'hbforge/client'; import { z } from 'hbforge/schema'; const form = createForm({ schema: z.object({ email: z.string().email({ tldCheck: true }), password: z.string().min(8), role: z.enum(['admin', 'user', 'viewer']), }), onSubmit: async (values) => { await api.createUser(values); }, }); // form.fields.email.value — signal, updates on input // form.fields.email.error — signal, updates on validation // form.isValid — computed signal // form.isSubmitting — signal, true during async submit

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:

import { styled } from 'hbforge/client'; const Button = styled('button', { base: { padding: '12px 24px', borderRadius: '8px', fontWeight: 600, transition: 'all 0.2s', }, variants: { intent: { primary: { background: 'var(--acc)', color: '#fff' }, danger: { background: '#ef4444', color: '#fff' }, }, size: { sm: { padding: '8px 16px', fontSize: '13px' }, lg: { padding: '16px 32px', fontSize: '17px' }, }, }, }); // <Button intent="primary" size="lg">Save</Button>

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 Access

HBForge is currently available exclusively for enterprise clients. Opening to the Developer Community on June 25, 2026. Contact kr@hyperbridge.in for early access.