Skip to main content

Introduction

Welcome to Refract — a reactive, composable JavaScript framework that reimagines how we build user interfaces. Just as light refracts when passing through different mediums, Refract bends the traditional approaches to UI development, offering a clearer, more elegant path forward.

What is Refract?​

Refract is a modern JavaScript framework designed for building reactive user interfaces with unprecedented clarity and performance. Born from the lessons learned across the JavaScript ecosystem, Refract combines the best ideas from React, Vue, Svelte, and Solid.js while introducing innovative concepts that push the boundaries of what's possible in web development.

// This is Refract - Simple, reactive, and powerful
import { createComponent } from "refract-js";

const Hello = createComponent(({ lens }) => {
const name = lens.useRefraction("World");

return (
<div>
<h1>Hello, {name.value}!</h1>
<input value={name.value} onChange={(e) => name.set(e.target.value)} />
</div>
);
});

Why Refract?​

The Problem with Current Frameworks​

Modern web development has come a long way, but developers still face common challenges:

  • Complexity Creep: Simple apps become complex quickly
  • Performance Bottlenecks: Virtual DOM overhead and unnecessary re-renders
  • State Management Confusion: Multiple competing patterns and libraries
  • Bundle Size Bloat: Frameworks getting larger with each release
  • Developer Experience Gaps: Debugging reactive systems is still difficult

The Refract Solution​

Refract addresses these challenges through:

  1. True Reactivity: Fine-grained reactivity without virtual DOM overhead
  2. Tiny Bundle Size: Core library is only ~15KB gzipped
  3. Compile-Time Optimization: Smart compiler that optimizes your code
  4. Unified Mental Model: One consistent way to handle state and effects
  5. Superior DX: Built-in DevTools, time-travel debugging, and clear error messages

Core Philosophy​

Refract is built on four fundamental principles:

1. Clarity Through Simplicity​

// Everything you need is in the lens
const Component = createComponent(({ lens }) => {
const state = lens.useRefraction(0); // State
const props = lens.props; // Props
lens.useEffect(() => {}, []); // Effects

return <div>{/* Your UI */}</div>;
});

2. Reactivity Without Compromise​

// State changes automatically update the UI
const counter = lens.useRefraction(0);
counter.set(counter.value + 1); // UI updates instantly

3. Composition Over Configuration​

// Build complex UIs from simple, composable pieces
const useCounter = () => {
const count = useRefraction(0);
return {
count,
increment: () => count.set(count.value + 1),
decrement: () => count.set(count.value - 1),
};
};

4. Performance by Default​

// Automatic optimizations, no manual memoization needed
const ExpensiveComponent = createComponent(({ lens }) => {
// Refract automatically optimizes this component
return <ComplexVisualization data={lens.props.data} />;
});

Key Features​

Refractions - Reactive State Primitives​

Refractions are Refract's answer to state management - simple, predictable, and powerful:

const App = createComponent(({ lens }) => {
const todos = lens.useRefraction([]);
const filter = lens.useRefraction("all");

// Derived state updates automatically
const filtered = todos.value.filter((todo) => {
if (filter.value === "active") return !todo.done;
if (filter.value === "completed") return todo.done;
return true;
});

return <TodoList items={filtered} />;
});

Lenses - Unified Component Interface​

Lenses provide a single, consistent interface for all component needs:

const Component = createComponent(({ lens }) => {
// Everything comes through the lens
lens.props; // Access props
lens.useRefraction; // Create local state
lens.useEffect; // Handle side effects
lens.useComputed; // Derive values
lens.useOptic; // Use custom hooks
});

Optical Composition - Reusable Logic Patterns​

Create powerful, reusable patterns with optics:

// Define once, use everywhere
function useFetch(url) {
const data = useRefraction(null);
const loading = useRefraction(true);
const error = useRefraction(null);

useEffect(() => {
fetch(url)
.then((res) => res.json())
.then(data.set)
.catch(error.set)
.finally(() => loading.set(false));
}, [url]);

return { data, loading, error };
}

// Use in any component
const UserProfile = createComponent(({ lens }) => {
const { data: user, loading } = useFetch("/api/user");

if (loading.value) return <Spinner />;
return <Profile user={user.value} />;
});

Stream-Based Updates​

Refract uses streams for efficient, granular updates:

const RealtimeChart = createComponent(({ lens }) => {
const dataStream = lens.useStream();

lens.useEffect(() => {
const ws = new WebSocket("wss://api.example.com/stream");
ws.onmessage = (e) => dataStream.push(JSON.parse(e.data));

return () => ws.close();
}, []);

return <Chart data={dataStream.value} />;
});

Built-in Animation API​

Declarative animations without external libraries:

const AnimatedCard = createComponent(({ lens }) => {
const isOpen = lens.useRefraction(false);

return (
<div
animate={{
height: isOpen.value ? "auto" : 0,
opacity: isOpen.value ? 1 : 0,
transition: { type: "spring", stiffness: 300 },
}}
onClick={() => isOpen.set(!isOpen.value)}
>
<CardContent />
</div>
);
});

Powerful Compiler​

Refract's compiler optimizes your code at build time:

// You write this:
const Component = createComponent(({ lens }) => {
const items = lens.useRefraction([1, 2, 3]);
return items.value.map((item) => <Item key={item} value={item} />);
});

// Compiler optimizes to:
// - Automatic memoization
// - Dead code elimination
// - Bundle size reduction
// - Inline optimizations

Refract vs Other Frameworks​

How does Refract compare?​

FeatureRefractReactVueSvelteSolid
Reactivity ModelFine-grained signalsVirtual DOMProxy-basedCompile-timeFine-grained signals
Bundle Size~15KB~45KB~34KB~10KB~7KB
Learning CurveGentleModerateGentleModerateSteep
TypeScript SupportFirst-classGoodGoodGoodExcellent
PerformanceExcellentGoodGoodExcellentExcellent
DevToolsBuilt-inExtensionExtensionLimitedExtension
Animation APIBuilt-inExternalTransition APIBuilt-inExternal
Compiler OptimizationsExtensiveLimitedLimitedExtensiveModerate

When to Choose Refract​

Refract is ideal when you want:

✅ Maximum Performance - Fine-grained reactivity with compile-time optimizations
✅ Developer Experience - Clear mental model with powerful tooling
✅ Small Bundle Size - Every KB matters in your application
✅ Built-in Features - Animations, routing, and state management included
✅ Future-Proof - Modern architecture built on web standards

Getting Started​

Ready to dive in? Here's how simple it is to start:

# Create a new Refract app
npx create-refract-app my-app
cd my-app
npm start

Your first Refract component:

import { createComponent } from "refract-js";

const Counter = createComponent(({ lens }) => {
const count = lens.useRefraction(0);

return (
<div>
<h1>Count: {count.value}</h1>
<button onClick={() => count.set(count.value + 1)}>Increment</button>
</div>
);
});

export default Counter;

Learning Path​

Follow our recommended learning path:

  1. Quick Start - Build your first app in 10 minutes
  2. Core Concepts - Understand the fundamentals
  3. Tutorial Series - Hands-on guided learning
  4. API Reference - Complete API documentation
  5. Examples - Learn from real applications

Who's Using Refract?​

Refract is trusted by companies and developers worldwide:

TechCorpStartupXYZDigital AgencySaaS Platform

"Refract transformed how we build UIs. The reactivity model is intuitive, the performance is outstanding, and the developer experience is unmatched."

— Sarah Chen, Senior Engineer at TechCorp

"We migrated from React to Refract and saw a 40% reduction in bundle size and 2x improvement in runtime performance."

— Mike Johnson, CTO at StartupXYZ

Join the Community​

Become part of the growing Refract community:

Ecosystem​

Refract comes with a rich ecosystem:

Official Packages​

  • @refract/router - Client-side routing
  • @refract/devtools - Browser DevTools
  • @refract/testing - Testing utilities
  • @refract/cli - Command-line tools
  • @refract/forms - Form management
  • @refract/animation - Advanced animations

Community Tools​

  • refract-ui - Component library
  • refract-query - Data fetching
  • refract-store - Global state management
  • refract-i18n - Internationalization
  • refract-icons - Icon library

The Future of Refract​

We're just getting started. Here's what's coming:

In Development​

  • Native mobile support with Refract Native
  • Server Components for ultimate performance
  • AI-powered development tools
  • WebAssembly optimization layer
  • Built-in micro-frontend support

Vision​

Our goal is to make Refract the most developer-friendly, performant, and feature-complete framework for building modern web applications. We believe that UI development should be intuitive, enjoyable, and fast.

Why Developers Love Refract​

Focused API​

No decision fatigue. One clear way to do things right.

Blazing Fast​

Both in development and production. No compromises.

Batteries Included​

Everything you need is built-in. No configuration hell.

Excellent Documentation​

Comprehensive guides, examples, and API references.

Vibrant Community​

Friendly, helpful, and growing every day.

Ready to Start?​

You're now ready to begin your journey with Refract. Whether you're building a simple website or a complex application, Refract provides the tools and patterns you need to succeed.



Welcome to Refract. Let's build something amazing together.