v2.0.0
15.5kb gzipped
No compiler
Any backend

The Reactive Web Runtime

PawaJS extends the browser instead of replacing it. Fine-grained reactivity in 15.5kb.

Different by design

Every other framework treats the browser as a problem to solve around. PawaJS treats it as a platform to build on.

โšก
Continuity Rendering Model
Selective re-execution โ€” not full hydration

The server encodes state directly into HTML as a protocol. Static components never re-execute. Dynamic components re-execute once โ€” only to wire reactivity, never to rebuild the DOM.

๐ŸŒ
Any Backend
Node, PHP, Python, Go, Rust โ€” all supported

The CRM protocol is encoded in plain HTML attributes. Any language that generates HTML can implement it. The client runtime is a single CDN script โ€” no Node.js server required.

โš™
Real DOM โ€” No Virtual Layer
Fine-grained updates on existing nodes

Reactive effects wire directly onto real DOM nodes. No diffing, no reconciler, no virtual tree. Only the exact nodes that depend on changed state update.

TS
TypeScript โ€” No Ceremony
Just TypeScript functions

No defineComponent, no decorators, no compiler transforms. Components are typed TypeScript functions. setContext<T> and $state<T> are plain generics.

Quick Start

A reactive counter in under 15 lines. No build config, no boilerplate.

counter.ts
TypeScript
ts

                 
import { $state, useInsert, html, RegisterComponent } from 'pawajs'

export const Counter = () => {
    const count = $state<number>(0)
    const increment = () => count.value++
    const decrement = () => count.value--

    useInsert({ count, increment, decrement })

    return html`
        <div class="flex items-center gap-4">
            <button on-click="decrement()">โˆ’</button>
            <span>@{count.value}</span>
            <button on-click="increment()">+</button>
        </div>
    `
}

RegisterComponent(Counter)
                    </number> 

        

$state creates reactive state. useInsert exposes it to the template. on-click wires the event โ€” with full modifier support like on-click.prevent.debounce.

A complete ecosystem

PawaJS ships with everything you need โ€” no third-party dependencies required for a production app.

How PawaJS compares

Feature React Vue Svelte PawaJS
Compiler required โœ… JSX โœ… Template โœ… Yes โŒ None
SSR model Hydration Hydration Hydration CRM Protocol
DOM model Virtual Virtual Compiled Real + Augmented
TypeScript Ceremony Ceremony Limited Native
Custom event modifiers โŒ โŒ โŒ โœ…
Runtime lazy loading โŒ โŒ โŒ โœ…
Any backend SSR โŒ โŒ โŒ โœ…
Branch pre-loading โŒ โŒ โŒ โœ… p:store