Documentation
Signal-driven frontend framework for TypeScript — fine-grained reactivity, class components, and a complete first-party ecosystem.
PraxisJS
PraxisJS is a signal-driven frontend framework for TypeScript. You build with class components and decorators — fine-grained DOM updates with no virtual DOM, no re-renders, and no hooks.
The reactive model follows one rule: render() runs once on mount. Arrow functions in JSX create live subscriptions; plain reads are static snapshots.
@Component()
class Counter extends StatefulComponent {
@State() count = 0;
render() {
return (
<div>
<p>{() => this.count}</p> {/* reactive — updates in place */}
<p>{this.count}</p> {/* static — snapshot at mount */}
<button onClick={() => this.count++}>+</button>
</div>
);
}
}New here? Read the Introduction then follow the Quick Start — you'll have a running component in under five minutes.
Learn
Introduction
What PraxisJS is, how signals replace the virtual DOM, and the three rules that explain everything
Quick Start
Scaffold a project with create-praxisjs or set up manually — running in under five minutes
Essentials
Components
StatefulComponent for logic-heavy components, StatelessComponent for pure presentational ones
Reactivity & Signals
How @State, @Computed, and arrow-function JSX work together — and how to read without subscribing
JSX Syntax
Reactive templates, event bindings, fragments, conditional rendering, and list mapping
Lifecycle Hooks
onBeforeMount, onMount, onUnmount, and onError — available on every component type
Reference
Decorators
@State, @Watch, @Emit, @Debounce, @Lazy, @Resource, and 20+ more — organized by category
Composables
Reactive DOM and browser utilities via @Compose — WindowSize, Mouse, Clipboard, Pagination, VirtualList
Packages
Router, Store, DI, Motion, FSM, content collections, head management, and async concurrency — install only what you need
Tooling
Vite plugin, in-app DevTools overlay, Storybook adapter, and MCP server for AI assistants