Write JavaScript.
Get reactivity for free.

A compile-time UI framework that turns ordinary classes and functions into surgical DOM updates. No virtual DOM. No hooks. No signals. Just your code — made reactive at build time.

The fastest compiled UI framework — ahead of Solid, Svelte, Vue, and React.

GET STARTED VIEW ON GITHUB
~13 kb
Gzipped (with router)
0
Runtime Deps
1.03
Benchmark Score
Philosophy

JavaScript is enough

No new primitives to learn. Stores are classes. Components are classes or functions. Computed values are getters. The compiler does the rest.

🌱

Zero Concepts

No signals, hooks, dependency arrays, or compiler directives. You already know the entire API — it's just JavaScript classes and functions.

Compile-Time Reactivity

The Vite plugin analyzes your JSX at build time, figures out which DOM nodes depend on which state, and wires up surgical patches — invisibly.

🎯

No Virtual DOM

Updates go straight to the elements that changed. No diffing, no reconciliation, no overhead. Just direct DOM mutations, generated at compile time.

🧬

Proxy-Based Stores

State lives in ordinary classes wrapped by a deep Proxy. Mutate properties directly — array methods, nested objects, everything just works.

📦

Batteries Included

State management and routing are built in — ~13 kb gzipped with the router, ~10 kb without. Zero runtime dependencies. No extra packages to choose between.

🛠️

Full Toolkit

Built-in client-side router, 35+ accessible UI components, mobile primitives, VS Code extension, and a project scaffolder. Everything you need, nothing you don't.

Code

This is all you write

Stores are classes with state and methods. Components return JSX. The compiler makes it reactive.

import { Store } from '@geajs/core'

class CounterStore extends Store {
  count = 0

  increment() { this.count++ }
  decrement() { this.count-- }
}

export default new CounterStore()
import { Component } from '@geajs/core'
import store from './store'

export default class Counter extends Component {
  template() {
    return (
      <div class="counter">
        <span>{store.count}</span>
        <button click={store.increment}>+</button>
        <button click={store.decrement}>-</button>
      </div>
    )
  }
}
import Counter from './Counter'

const app = new Counter()
app.render(document.getElementById('app'))
Performance

The fastest compiled UI framework

Faster than Solid. Faster than Svelte. Benchmarked with js-framework-benchmark — the standard stress test for UI frameworks.

vanillajs
1.00
Gea 1.0
1.03
Solid 1.9
1.10
Svelte 5
1.12
Vue 3.6
1.27
React 19.2
1.48

Lower is better (1.00 = fastest). Weighted geometric mean from js-framework-benchmark.

Features

Everything you need, nothing you don't

A complete toolkit for building modern web applications, from single components to full SPAs.

Class Components

Extend Component, add local reactive state, implement template(). OOP the way it was meant to be.

Function Components

Export a function that returns JSX. Converted to a class component at build time — zero overhead.

Client-Side Router

Built-in RouterView, Link, route params, wildcards, and programmatic navigation. No extra packages.

Event Delegation

All event handlers compile to a single delegated listener per event type. Efficient by default.

Fine-Grained Arrays

Array methods like push, splice, sort produce granular change events — append, reorder, swap — not full rerenders.

Gea UI

35+ accessible components built on Zag.js — dialogs, menus, selects, tabs, tooltips, accordions, comboboxes, and more. Ready to style.

Gea Mobile

ViewManager, sidebar, tab views, pull-to-refresh, infinite scroll, swipe gestures — all iOS-style smooth.

HMR Support

The Vite plugin provides hot module replacement. Edit a store or component and see it update instantly.

VS Code Extension SOON

Component completion, prop inference, event attribute hints, hover details, and unknown component warnings.

Two-Way Props

Props follow JavaScript semantics. Objects and arrays are passed by reference — the child mutates them, both sides update. No emit, no v-model, no callback wiring. It's just how the language works.

Computed Getters

Derived state is a standard get accessor on your store. No useMemo, no computed() wrapper. The compiler detects dependencies and subscribes automatically.

AI-Ready

Ships with agent skills that teach Cursor, Codex, and other AI assistants the full Gea API. Scaffold and iterate on Gea apps with complete AI assistance out of the box.

Quick Start

Up and running in seconds

One command scaffolds a Vite project with TypeScript, stores, components, and the plugin pre-configured.

$npm create gea@latest my-app

Click to copy

Join the next generation

The fastest compiled UI framework is MIT licensed and open source. Jump in and build something extraordinary.

STAR ON GITHUB VIEW ON NPM