NOTICE: I've summarized the perspectives of Octane's and Solid's creators here, for anyone short on time: https://gist.github.com/aleclarson/829c10aa7d287944ef75e1c2a90bef06
I'm a React/Preact/Astro developer with an interest in other renderers. The two that have most caught my eye recently are Octane (from Dominic Gannaway of React Hooks / Svelte / Inferno fame) and Solid 2.
I asked ChatGPT to compare them with its own "Renderer DX Pillars", which I've shared below. This is its gut instinct, with very little hedging:
| Pillar | Winner | Why |
|---|---|---|
| State architecture freedom | Solid 2 | Reactivity is independent of components. Much less component gravity. |
| Reactive reasoning | Solid 2 | The dependency graph is explicit and causal. Easier to answer “why did this update?” |
| Derived state & synchronization | Solid 2 | Fine-grained derivation is the native model; less need to coordinate state manually. |
| Async/data flow | Solid 2 | This is basically Solid 2's flagship idea. Async being part of reactivity feels deeper than improving Suspense/hooks ergonomics. |
| Component authoring | Octane | Normal values, normal functions, familiar TSX, fewer Solid-specific semantic gotchas. |
| Escape hatches | Solid 2, narrowly | Solid's primitives compose very directly with imperative JS without pretending everything is a component concern. |
| Ecosystem interoperability | Octane | If its React-ecosystem compatibility ambitions work, this could be a huge advantage. |
| Tooling & debuggability | Solid 2 today | More mature and battle-tested. Octane's compiler creates more invisible machinery that tooling has to explain well. |
| Architectural scaling | Solid 2 | Its reactive model naturally lets domain/application architecture exist independently of rendering. |
So my gut scoreboard is:
Solid 2: 7 Octane: 2
But the two Octane wins are meaningful ones.
Its pitch seems particularly strong around:
“I want React's authoring experience without React's runtime/design baggage.”
You get something like:
function Counter() {
const [count, setCount] = useState(0);
const doubled = count * 2;
return <button onClick={() => setCount(count + 1)}>
{doubled}
</button>;
}That's extremely approachable.
Solid asks you to internalize:
const [count, setCount] = createSignal(0);
const doubled = () => count() * 2;which isn't hard, but it is a different programming model.
So for day-one DX, I wouldn't be surprised if Octane feels better.
Solid's advantages seem to accumulate as the application becomes less like:
some components with state
and more like:
a complex reactive application that happens to have a UI.
That's where signals outside components, ownership, fine-grained derivation, async graph semantics, stores, and independent domain state all start reinforcing each other.
My gut says the trajectory looks something like:
small app
Octane ██████████
Solid █████████
↓ complexity
large/stateful app
Octane ████████
Solid ████████████
Not because Octane necessarily scales poorly, but because Solid's abstraction seems closer to the actual problem being modeled once state relationships get complicated.
Escape hatches.
Octane could easily end up winning there if its compiler makes effects, refs, subscriptions and integration code extraordinarily pleasant.
And ecosystem interoperability could become an overwhelming Octane win if their compatibility layer is genuinely broad and reliable rather than “we have adapters for the popular demos.”
If I had to assign confidence rather than points:
- Solid strongly wins: state architecture, derived state, async, architectural scaling.
- Solid probably wins: reactive reasoning, escape hatches.
- Octane strongly wins: initial component authoring.
- Octane probably wins: ecosystem interoperability.
- Solid wins for now: tooling/maturity.
The biggest question I'd personally want answered before choosing between them is therefore not performance.
It's:
Does Octane's compiler actually eliminate the architectural drawbacks of component-centric reactivity, or does it mostly make that model much nicer to write?
If it's the latter, I'd expect Solid 2 to remain the stronger foundation for complex applications.
Thanks for taking the time to write this up. I think it identifies the philosophical difference well, but I disagree with the 7–2 score and especially the small-app/large-app chart.
The main issue is that several pillars double-count the same preference: state architecture, reactive reasoning, derived state, and architectural scaling are largely different views of Solid's native reactive graph. Solid clearly wins if the criterion is “does the framework make a fine-grained graph the application's fundamental architecture?” It also has a real conceptual advantage in allowing async to compose through that graph.
But that does not establish an architectural-scaling win. React's component/hook model has already been proven at enormous scale. Octane deliberately preserves that programming model while removing dependency-array bookkeeping, call-order restrictions, virtual-DOM overhead, common stale-closure workarounds, and React-style async waterfalls. A large Octane application is also not required to put its domain state in components:
useSyncExternalStoreis a first-class, tearing-tested boundary, and there are Octane bindings for Zustand, Jotai, Redux, MobX, Valtio, TanStack Store, Alien Signals, and others. Domain state can live in an independent store or signal graph, with components acting as selected subscription/render boundaries.So the answer to the final question is: the compiler mostly makes the component model substantially nicer and cheaper; it does not secretly turn hooks into a global Solid-style graph. But that is not a concession on scaling, because the underlying model already scales, and external stores remove “component gravity” where an application actually needs to.
A few other qualifications:
const doubled = count * 2are often simpler, and Octane automatically caches eligible derived declarations and render regions.use()are compiler-memoized; independent reads are stratified and batched into one suspension; and descendant fetch trees are warmed while an ancestor is suspended. Solid's async graph is deeper, but Octane is not merely React Suspense with nicer hook ergonomics: https://github.com/octanejs/octane/blob/main/docs/suspense-parallel-use-plan.mdoctane/reacthosts compiled Octane islands inside React. The growing binding catalog is here: https://github.com/octanejs/octane/blob/main/docs/bindings-status.mdMy rough assessment would therefore be:
The central comparison is valuable; I just don't think “signals are closer to the problem” is evidence that component-oriented applications become architecturally weaker as they grow. React's history points strongly in the opposite direction.