Svelte 36,701 (github.com/sveltejs/svelte (https://github.com/sveltejs/svelte 88,211 )), created by Rich Harris and released as 1.0 in November 2016, is a compiler rather than a runtime library. Svelte 5 (October 2024) introduced runes ($state, $derived, $effect) that mark reactive values explicitly and compile to signals.
<script>
let todos = $state([]);
let text = $state('');
function add() { todos.push(text); text = ''; }
</script>
<input bind:value={text}>
<button onclick={add}>Add #{todos.length + 1}</button>
<ul>{#each todos as t}<li>{t}</li>{/each}</ul>There is no hook and no .value: the compiler rewrites text = '' into a signal write, and $state wraps arrays in a proxy so push() works. The output clones the markup from an HTML template string and attaches one small effect to the button label; the build is 15 KB gzipped. SvelteKit 36,701 adds routing and server rendering (npx sv create my-app).
Lit 310,034 (github.com/lit/lit (https://github.com/lit/lit 21,842 )) is maintained by a team at Google and builds standard web components (HTML DOM APIs). A class extending LitElement returns an ` html... tagged template, and Lit updates only the ${} holes. The result is a real <todo-app>` element that works inside any framework or plain HTML; our component was under 6 KB.
Qwik 453,955 (github.com/QwikDev/qwik (https://github.com/QwikDev/qwik 22,067 )) targets start-up time. Instead of hydration (re-running every component in the browser to attach listeners to server-rendered HTML), Qwik serializes state into the HTML and resumes: a click downloads only that handler's code. Qwik 2 is in beta.
Astro 17,728 (github.com/withastro/astro (https://github.com/withastro/astro 62,856 )) builds content sites such as blogs and documentation. It renders components to HTML and ships no JavaScript by default; interactive islands are opted into per component, so <TodoApp client:visible /> hydrates a React 7,897 , Vue 5,482 , Svelte or Solid 269,718 component only when it scrolls into view. Astro 7 shipped in June 2026.