v0.2.0 — Built with VirexJS

Ship HTML,
not JavaScript.

A full-stack web framework built on Bun. Zero client JS by default, islands architecture, and built-in everything — with zero external dependencies.

DocumentationGitHub
1098
Tests Passing
0
Dependencies
27ms
Server Startup
75+
API Exports

Interactive Islands

This page is server-rendered HTML. Only these interactive parts ship JavaScript.

Independent StateuseIslandState

Each counter has its own state — clicking one doesn't affect the other.

Counter A0
Counter B0

Cross-Island SyncuseSharedStore

3 separate islands sharing state. Click a button — badge and list update.

0 items
Cart empty — click buttons above

Simple by Design

Pages, islands, shared state, and API routes — all in a few lines.

// src/pages/index.tsx
import { useHead } from "virexjs";

export async function loader() {
  return { posts: await db.findMany() };
}

export default function Home(props) {
  const head = useHead({ title: "Home" });
  return (
    <>
      {head}
      <h1>Welcome</h1>
      {props.data.posts.map(p =>
        <a href={`/blog/${p.slug}`}>{p.title}</a>
      )}
    </>
  );
}

Everything Built-in

No npm install for common features. Zero external dependencies.

Zero Client JS

Pages ship pure server-rendered HTML. No React runtime, no hydration overhead.

🏝️

Islands Architecture

Only interactive components ship JS. Independent or shared state between islands.

🌊

Async Streaming

Suspense-like: loading shell first, data swap when ready. No client JS needed.

🔒

Built-in Auth

JWT (HS256), cookie sessions, route guards, CSRF protection. No packages.

🗃️

SQLite Database

Typed CRUD with defineTable(), migrations, query builder. bun:sqlite.

🎨

Tailwind CSS

First-class integration. Auto-config, HMR hot swap, content-hashed builds.

🖼️

Image Optimization

Sharp resize, WebP/AVIF conversion, blur placeholders. Native lazy loading.

🔗

File-Based Routing

[slug] params, [...rest] catch-all, nested layouts, per-route middleware.

🚀

Compression + ETag

Gzip middleware, automatic 304 Not Modified. Maximum bandwidth savings.

VirexJS vs Next.js

Different philosophy, different trade-offs.

FeatureNext.jsVirexJS
Client JavaScript~85 KB React runtime0 KB by default
Dependencies400+ packages0 packages
RuntimeNode.jsBun (3-5x faster)
DatabaseExternal packageBuilt-in SQLite ORM
AuthenticationExternal packageBuilt-in JWT + sessions
Island CommunicationReact Context (85KB)useSharedStore (0KB)
Dev Server Startup~2 seconds~27 milliseconds
Test CoverageFramework-level1098 tests

Ready to ship HTML?

Install VirexJS and build something fast.

Get Started