Other frameworks give you rendering. You still need to npm install a router, a state manager, an HTTP client, i18n, mocking, PWA tooling...
Aura.js ships all 20 — with zero dependencies and zero build step.
React needs react-router + zustand + axios + react-intl + MSW to match this. Aura ships it all.
SPA routing with dynamic params, wildcards, groups, named routes, middlewares, guards, and full browser history support.
16 featuresReactive state with subscriptions, computed properties, batch updates, actions, persistence, and the selector pattern.
13 featuresPub/sub with wildcard namespaces, priority ordering, batch operations, and auto-unsubscribe returns.
10 featuresHandlebars-style templating with #if/#each/#unless, partials, auto-escaping, caching, and i18n integration.
12 featuresFull HTTP client with interceptors, timeout, retry with backoff, abort support, file upload with progress tracking.
14 featuresFull internationalization with pluralization, fallback languages, Intl formatting, RTL detection, and DOM translation.
14 featuresIntercept fetch with zero dependencies. Register routes with inline JSON or local files, persist to localStorage, share between devs.
New 12 featuresPromise-based IndexedDB wrapper. Stores, indexes, cursors, queries — all the power without the ugly callback API.
New 11 featuresStructured logging with levels, tagged loggers, custom transports, history, and auto-emit to the Events system.
New 10 featuresComposable hooks like React — useState, useEvent, useFetch, useStorage, useComputed — wired into Aura's core.
New 9 hooksKill try/catch boilerplate. Wrap any sync or async operation and get a clean [error, result] tuple back.
New Zero overheadRegister SW, handle install prompts, cache strategies (cache-first, network-first, stale-while-revalidate), offline support.
New Offline readyRouter, state manager, HTTP client, i18n, API mocking, IndexedDB, PWA, hooks, logging, error handling — other frameworks need a dozen packages for this. Aura ships it all in 11KB gzipped. No Node. No build step. No config.
Add one script tag
<script src="aura.js">
Register routes & state
Aura.route('/', handler)
Call init. You're done.
Aura.init()
React = 46KB for rendering. Add react-router (16KB), zustand (3KB), axios (14KB), react-intl (40KB), MSW (36KB)... or just use Aura at 11KB total.
Bundle size (min+gzip) — remember, Aura includes router, state, hooks, i18n, PWA, mocking, IndexedDB...
| Feature | Aura.js | React | Vue 3 | Svelte |
|---|---|---|---|---|
| No Build Step Required | ✓ | ✗ | CDN only | ✗ |
| No Node.js Required | ✓ | ✗ | CDN only | ✗ |
| Built-in Router | ✓ | ✗ | ✗ | ✗ |
| Built-in State Management | ✓ | ✗ | ✓ | ✓ |
| Built-in HTTP Client | ✓ | ✗ | ✗ | ✗ |
| Built-in i18n | ✓ | ✗ | ✗ | ✗ |
| Built-in Templating | ✓ | JSX | ✓ | ✓ |
| Device Detection | ✓ | ✗ | ✗ | ✗ |
| Geolocation | ✓ | ✗ | ✗ | ✗ |
| Performance Monitoring | ✓ | DevTools | DevTools | ✗ |
| Built-in API Mocking | ✓ | MSW (36KB) | ✗ | ✗ |
| Built-in IndexedDB | ✓ | ✗ | ✗ | ✗ |
| Composable Hooks | ✓ | ✓ | Composition API | ✗ |
| PWA + Service Worker | ✓ | ✗ | ✗ | ✗ |
| Zero Dependencies | ✓ | ✗ | ✓ | ✓ |
| Bundle Size (min+gzip) | ~11KB | ~46KB | ~44KB | ~4KB* |
| Real cost for equivalent features | 11KB (done) | ~155KB** | ~90KB** | ~80KB** |
| npm packages needed | 0 | 6+ | 5+ | 5+ |
| Setup Time | 10 seconds | ~5 minutes | ~5 minutes | ~5 minutes |
*Svelte compiles away, but requires a build step and Node.js
**React + react-router + zustand + axios + react-intl + MSW. Vue + vue-router + pinia + vue-i18n. Svelte + svelte-routing + svelte-i18n.
React-router, zustand, axios, react-intl — all replaced. See the APIs.
Register routes with dynamic segments, group them under prefixes, add global middleware, and navigate seamlessly — all without page reloads.
// Register routes with dynamic params Aura.route('/', (ctx) => { Aura.template.renderTo('home'); }); Aura.route('/users/:id', (ctx) => { console.log(ctx.params.id); // "42" }); // Group routes under a prefix Aura.group('/admin', (r) => { r.route('/dashboard', handler); r.route('/settings', handler); }); // Global auth middleware Aura.middleware((ctx) => { return isLoggedIn(); }); // Catch-all wildcard route Aura.route('/files/*', (ctx) => { console.log(ctx.params.wildcard); });
Initialize, read, and update state with automatic change notifications. Use computed properties, batch updates, and persist to localStorage.
// Initialize with defaults Aura.state.init({ count: 0, user: null }); // Reactive subscriptions Aura.state.subscribe('count', (val) => { document.querySelector('#count') .textContent = val; }); // Computed properties Aura.state.computed('doubled', (s) => s.count * 2); // Batch multiple updates (single emit) Aura.state.batch(() => { Aura.state.set('count', 10); Aura.state.set('user', { name: 'Alex' }); }); // Persist to localStorage Aura.state.persist();
A batteries-included HTTP client with named interceptors, automatic retry, timeout, abort controller, and file upload with progress tracking.
// Configure base URL & defaults Aura.api.configure({ baseURL: 'https://api.example.com', timeout: 5000, retry: 3, }); // Named auth interceptor Aura.api.addInterceptor('auth', (cfg) => { cfg.headers['Authorization'] = `Bearer ${token}`; return cfg; }); // Fetch with abort support const ctrl = Aura.api.createAbortController(); const users = await Aura.api.get('/users', { signal: ctrl.signal, params: { page: 1 } }); // Upload with progress await Aura.api.upload('/files', formData, { onProgress: (pct) => console.log(`${pct}%`) });
Handlebars-inspired syntax with conditionals, loops, partials, and automatic HTML escaping. Templates are fetched, cached, and translated.
<!-- template: user-card.html --> <div> {{#if premium}} <span>⭐ {{name}}</span> {{else}} <span>{{name}}</span> {{/if}} {{#each skills}} <span class="tag">{{.}}</span> {{/each}} </div> // Render with data Aura.template.renderString(tpl, { name: 'Alex', premium: true, skills: ['JS', 'TS', 'Rust'] });
Load language files on demand, translate with dot-notation keys and placeholders, handle pluralization, format numbers and dates with Intl.
await Aura.i18n.load('en'); // Dot-notation keys Aura.i18n.t('hero.title'); // => "Build Beautiful Apps" // Placeholders Aura.i18n.t('greeting', { name: 'Alex' }); // => "Hello, Alex" // Pluralization Aura.i18n.plural('items', 0); // "No items" Aura.i18n.plural('items', 1); // "1 item" Aura.i18n.plural('items', 42); // "42 items" // Intl formatting Aura.i18n.formatNumber(1234567.89); // => "1,234,567.89" Aura.i18n.formatDate(new Date()); // => "3/17/2026" Aura.i18n.formatRelative(Date.now() - 3600000); // => "1 hour ago"
A lightweight pub/sub system with wildcard namespaces, priority ordering, and auto-unsubscribe returns. The backbone of the framework.
// Subscribe — returns unsubscribe function const unsub = Aura.on('user:login', (user) => { console.log('Welcome', user.name); }); // Wildcard — catches all user:* events Aura.on('user:*', (data) => { analytics(data); }); // Priority — higher runs first Aura.on('order:placed', validate, 10); Aura.on('order:placed', sendEmail, 5); // One-time listener Aura.once('app:ready', () => bootstrap()); // Emit Aura.emit('user:login', { name: 'Alex' }); // Clean up later unsub();
Frontend doesn't wait for backend. Mock any route, from inline data or local JSON files. Already inside Aura — no extra install.
Intercept fetch() globally. Register mock routes with method + URL pattern matching, simulated delays, custom status codes. Persist mocks in localStorage, export/import between devs.
// Inline mock Aura.mock.register('GET', '/api/users', { body: [{ id: 1, name: 'Alex' }], delay: 300 }); // Or point to a local JSON file Aura.mock.register('GET', '/api/products', '/mocks/products.json' ); // Bulk load — mix inline + files Aura.mock.load({ 'GET /api/users/:id': { body: { id: 1, name: 'Alex' } }, 'POST /api/users': { status: 201, body: { id: 2 } }, 'DELETE /api/users/:id': { status: 204 }, }); // Enable — intercepts window.fetch Aura.mock.enable(); // Now any fetch() hits the mock const res = await fetch('/api/users'); // => [{ id: 1, name: 'Alex' }] // Persist for next page load Aura.mock.save(); // Share with teammates const json = Aura.mock.export();
Features that would add 50KB+ of npm packages to a React app — Aura includes them at zero extra cost.
Composable, React-inspired hooks that wire directly into Aura's state, events, API, and storage. Use built-in hooks or register your own.
// Reactive state — returns [getter, setter] const [count, setCount] = Aura.hooks.useState('count', 0); setCount(5); console.log(count()); // 5 // Auto-fetch with loading state const { data, loading, error, refetch } = Aura.hooks.useFetch('/api/users'); // localStorage-backed state const [theme, setTheme] = Aura.hooks.useStorage( 'theme', 'dark' ); // Setup with auto-cleanup const teardown = Aura.hooks.useSetup(() => { Aura.hooks.useEvent('resize', handler); Aura.hooks.useWatch('user', updateUI); }); teardown(); // cleans up all listeners
Kill try/catch boilerplate forever. Wrap any sync or async operation and get a clean [error, result] tuple. Works with functions, promises, and async functions.
// Sync — no more try/catch const [err, data] = Aura.tryThis( () => JSON.parse(rawInput) ); if (err) Aura.log.error('Bad JSON', err); // Async — just add await const [err, users] = await Aura.tryThis( () => Aura.api.get('/users') ); // Direct promise const [err, res] = await Aura.tryThis( fetch('/api/health') ); // Chain with Logger if (err) Aura.log.error('Failed', err); else Aura.log.info('OK', res);
Structured logging with debug/info/warn/error levels, tagged loggers for namespacing, custom transports, history export, and auto-emit through Aura Events.
Aura.log.info('App started'); Aura.log.warn('Slow query', { ms: 1200 }); Aura.log.error('Failed', err); // Tagged loggers for namespacing const auth = Aura.log.tag('Auth'); auth.info('User logged in'); // => [INFO][Auth] User logged in // Custom transport (e.g. send to server) Aura.log.addTransport((entry) => { if (entry.level === 'error') sendToServer(entry); }); // Listen via Events system Aura.on('log:error', showToast); // Export history as JSON const json = Aura.log.export('error');
Promise-based wrapper around the browser's IndexedDB. Define stores with indexes, then get/set/query/iterate with clean async APIs. Perfect for offline data.
// Open DB with stores await Aura.idb.open('myApp', 1, [{ name: 'users', keyPath: 'id', indexes: [ { name: 'email', keyPath: 'email', unique: true } ] }]); // CRUD await Aura.idb.set('users', { id: 1, name: 'Alex', email: 'a@b.com' }); const user = await Aura.idb.get('users', 1); const all = await Aura.idb.getAll('users'); // Query by index const found = await Aura.idb.query('users', 'email', 'a@b.com' );
Turn any Aura app into a PWA. Register a service worker, handle install prompts, define caching strategies, precache assets, and go offline — all from JavaScript.
// Register service worker await Aura.pwa.register('/aura-sw.js'); // Cache images aggressively Aura.pwa.addStrategy({ name: 'images', strategy: 'cache-first', match: /\.(png|jpg|svg)$/, maxAge: 7 * 24 * 3600000 }); // API calls — network first, cache fallback Aura.pwa.addStrategy({ name: 'api', strategy: 'network-first', match: '/api/' }); // Precache critical assets Aura.pwa.precache([ '/', '/app.js', '/styles.css' ]); // Handle install prompt Aura.pwa.onInstallPrompt(() => { showInstallBanner(); });
Every demo below is running real Aura.js code — right here in your browser.
Real-time device, browser, network, and capability detection.
Browser GPS with IP fallback, Haversine distance calculation, live position watching, and permission-aware detection.
const loc = await Aura.geo.detect(); // { latitude, longitude, source } const km = Aura.geo.distance( 40.7, -74.0, 51.5, -0.1 ); // => 5570
Measure any sync/async operation, set threshold filters, auto-report via events, and access memory heap info.
Aura.perf.start('api-call'); await fetchData(); Aura.perf.end('api-call'); // Or measure async directly await Aura.perf.measure('task', async () => heavyWork() );
Efficient container-based event delegation with CSS selectors. Works with dynamically added elements.
// Delegate on the app container Aura.delegate.on('click', '.btn-delete', (e, el) => remove(el.dataset.id) ); // One-time delegation Aura.delegate.once('click', '.onboard-btn', handler );