Hello HN,
I've been working on Eleva.js, a minimalist frontend framework that just hit v1.0.0.
What it is: A 2.3KB (gzipped) vanilla JavaScript framework with signal-based reactivity and direct DOM patching.
Why I built it: I wanted something between writing raw DOM manipulation and using React/Vue. No JSX, no compiler, no virtual DOM — just native template literals and a simple reactivity primitive.
The mental model is intentionally small:
const app = new Eleva("App");
app.component("Counter", {
setup({ signal }) {
const count = signal(0);
return { count, inc: () => count.value++ };
},
template: (ctx) => `
<p>${ctx.count.value}</p>
<button @click="inc">+</button>
`
});
app.mount(document.body, "Counter");
Technical choices:
- Signals for reactivity (similar to Solid/Preact signals)
- Direct DOM diffing instead of virtual DOM
- Render batching via queueMicrotask
- No build step required — works with native ES modules
- ~0.5KB/row memory overhead in Chrome benchmarks
Trade-offs:
- No SSR yet (client-side only)
- Template strings aren't as composable as JSX
- Smaller ecosystem than established frameworks
Links:
- Docs: https://elevajs.com
- GitHub: https://github.com/TarekRaafat/eleva
- npm: npm install eleva
Happy to answer questions about the implementation or design decisions.
I've been working on Eleva.js, a minimalist frontend framework that just hit v1.0.0.
What it is: A 2.3KB (gzipped) vanilla JavaScript framework with signal-based reactivity and direct DOM patching.
Why I built it: I wanted something between writing raw DOM manipulation and using React/Vue. No JSX, no compiler, no virtual DOM — just native template literals and a simple reactivity primitive.
The mental model is intentionally small:
Technical choices:- Signals for reactivity (similar to Solid/Preact signals) - Direct DOM diffing instead of virtual DOM - Render batching via queueMicrotask - No build step required — works with native ES modules - ~0.5KB/row memory overhead in Chrome benchmarks
Trade-offs:
- No SSR yet (client-side only) - Template strings aren't as composable as JSX - Smaller ecosystem than established frameworks
Links:
- Docs: https://elevajs.com - GitHub: https://github.com/TarekRaafat/eleva - npm: npm install eleva
Happy to answer questions about the implementation or design decisions.