.vsk components
Single-file component with markup, logic, <style> and islands. Statement or expression mode — same IR.
· product · features
Vesk is not a UI kit. It's a compiler, a reactivity runtime, a router, a data layer, and a native emitter — integrated so you don't glue them together. Choose the primitives you need; the compiler tree-shakes the rest.
Single-file component with markup, logic, <style> and islands. Statement or expression mode — same IR.
&[count]=track(0) → auto get/set, derived, effect. No useState/useEffect ceremony.
Zero-JS by default. Add client only where you need it — {.client} blocks are compile-time.
app/ conventions plus createRouter(defineRoute) — groups, [slug], [...rest], hash, offline.
Streaming SSR, claim walkers, 4 hydrate strategies (full/viewport/idle/interaction).
useFetch + Resource, staleTime, dedupe, into cells, HttpError. SSR handoff included.
Form, Field, defineAction with Zod, CSRF, optimistic mutate.
.vsk superset — every TS feature survives codegen and vsk typecheck.
@vesk/plugin-tailwind, same utilities on web and Kotlin.
Same IR → Kotlin + Compose Material 3. No WebView.
Sub-second, surgical. Only affected route islands re-execute.
create-vesk, vesk build, ISR, typed errors, diagnostics.
| Pillar | Vesk | Next.js 15 | SvelteKit / Astro |
|---|---|---|---|
| Runtime shipped | ~2 kB router + per-cell updates; static = 0 B | React + RSC runtime ~80-120 kB | Svelte runtime ~8-15 kB; Astro partial 0 B but islands are React/Svelte |
| Reactivity | Fine-grained cells — O(1) DOM write per change | VDOM diff — O(n) re-render | Svelte fine-grained; Astro none (static) |
| SSR model | String push + claim markers; fully static = no hydrate | renderToString + hydrateRoot full replay | Svelte: similar; Qwik: resumable |
| Routing | File + manual (defineRoute, hash, offline) | File only, extra config for hash | File only |
| Native | Kotlin IR output — no bridge | None (Expo separate) | None |
| DX | One model .vsk, HMR ~90 ms, vesk typecheck | Next HMR, but client/server split | Good DX, per-framework |
Numbers are order-of-magnitude; measure your bundle. Vesk's win is architectural: less to ship because the compiler proves what can be static.
npx create-vesk
, move
app/
, replace
useState
with
&[x]=track
, delete
useEffect
boilerplate. Most pages become static.
Familiar fine-grained feel, but stereo: web and Kotlin from one IR, file + manual routes, and
useFetch
with SSR handoff.
Keep the islands idea, gain a real app framework: routing, data, forms, and native — not just content.
Routing docs →