Volt vs React vs WordPress
The same three tasks in each — a counter, a per-user CRUD list, and login. Different tools for different jobs; this just makes the trade-off concrete.
A counter
The “hello world” of reactivity.
Voltno build
import { signal, html, mount } from "/volt.js";
const n = signal(0);
mount("#app",
html`<button onclick=${() => n(n() + 1)}>${n}</button>`);
// no build — save and it hot-reloadsReact stackneeds bundler
import { useState } from "react";
export default function Counter() {
const [n, setN] = useState(0);
return <button onClick={() => setN(n + 1)}>{n}</button>;
}
// + Vite/Next, npm install, a build stepWordPressplugin + DB
// no native counter — functions.php:
add_shortcode('counter', fn() =>
'<button onclick="this.textContent=
+this.textContent+1">0</button>');
// then type [counter] into a postA per-user CRUD list
Create/read/delete, scoped to the logged-in user.
Voltno build
// server.js — auth add-on already on
const todos = store.collection("todos");
const guard = requireAuth(store);
app.get("/api/todos", guard, async (req, res) =>
res.json({ todos: await todos.find({ owner: req.user.email }) }));
app.post("/api/todos", guard, async (req, res) => {
await todos.put(id(), { owner: req.user.email, text: req.body.text });
res.json({ ok: true });
});
// + a ~10-line Volt list. That's it.React stackneeds bundler
function Todos() {
const [items, set] = useState([]);
useEffect(() => {
fetch("/api/todos").then(r => r.json()).then(set);
}, []);
// ...and you still build the API,
// the auth, and the database yourself
}WordPressplugin + DB
// a custom post type or a CRUD plugin
register_post_type('todo', [ /* ... */ ]);
// data lives in wp_posts + wp_postmeta,
// edited through /wp-admin; per-user
// scoping needs a plugin or custom
// meta_query in PHPLogin
Authenticated sessions for real users.
Voltno build
# enable the auth add-on — no code:
npm run dev -- --edit # tick "auth"
# magic-link login + sessions are wired.
# guard any route:
app.get("/me", requireAuth(store),
(req, res) => res.json(req.user));React stackneeds bundler
// choose a library, then configure it
import NextAuth from "next-auth";
export default NextAuth({
providers: [ /* ... */ ],
// + a session store, callbacks,
// env secrets, route handlers
});WordPressplugin + DB
// built-in users at /wp-admin/, or for
// front-end login install a membership
// plugin, then configure roles + pages
// in the dashboard (often a paid add-on)Where each one wins
| Volt | React stack | WordPress | |
|---|---|---|---|
| Build step | none | bundler / transpile | none (PHP) |
| Auth | toggle an add-on | wire a library | built-in / plugin |
| Data | store.collection(...) | your own DB layer | wp_posts + plugins |
| Where you edit | your files | your files | /wp-admin + DB |
| Best for | small–medium apps, dashboards | large apps, scale, hiring | content, editors, plugins |
This isn't “WordPress bad” — it's the best tool in the world when content and nontechnical editors are the point. The comparison is about code-owned apps, where Volt's smallness and no-build feedback loop win, versus React, where you trade setup for a vast ecosystem.
npm create volt@latest my-app