{
  "id": 4709824,
  "title": "A reactive JS framework for server-rendered apps — no Virtual DOM, no eval(), no build step required. Looking for critical feedback.",
  "url": "https://urgent.news/2026/08/31/a-reactive-js-framework-for-server-rendered-apps-no-virtual-dom-no",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-31T20:01:48.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/kwy404/built-voodoojs-an-html-first-javascript-framework-with-reactivity-http-forms-and-no-virtual-249d"
  },
  "original_language": "en",
  "account": "I've developed a JavaScript framework called Voodoo.js, and I'm seeking critical feedback on it. My goal was to discover how much JavaScript is necessary for building interactive interfaces. After some thought, I realized that many apps don't require building a component tree, configuring a bundler, installing multiple libraries, managing state in a separate place, and wiring it all back into HTML. Sometimes, I simply want to write HTML.\n\nA simple example of Voodoo.js is a reactive counter:\n\n```html\n<div v-data=\"{ count: 0 }\">\n<button @click=\"count--\">-</button>\n<strong>{ count }</strong>\n<button @click=\"count++\">+</button>\n</div>\n```\n\nThere's no need for `querySelector`, `addEventListener`, `innerHTML`, or a Virtual DOM. Voodoo.js observes the real DOM and connects HTML directives to a fine-grained reactive system built on Proxy.\n\nVoodoo.js isn't trying to replace React, Vue, or Svelte. Its target is different, focusing on projects where the server already renders the HTML. Popular backends include Laravel, Django, Rails, PHP, ASP.NET, Node, and Go templates. Voodoo.js aims to work alongside these backends, providing a reactive interface without requiring a full SPA.\n\nOne of the key features of Voodoo.js is its declarative HTTP capabilities. Instead of manually wiring up event listeners, you can declare the intent directly in the HTML. For example:\n\n```html\n<button v-delete=\"/api/users/42\" v-confirm=\"Delete this user?\" v-toast-success=\"User deleted\">Delete</button>\n```\n\nSimilarly, for forms, Voodoo.js offers a declarative approach:\n\n```html\n<form v-submit=\"/api/users\" v-validate v-toast-success=\"User saved\">\n<input name=\"email\" type=\"email\" required />\n<button type=\"submit\">Save</button>\n</form>\n```\n\nThe reactive layer of Voodoo.js utilizes Proxy to track dependencies per object and per property. This fine-grained reactivity system updates only the necessary parts of the real DOM when the state changes, without the need for a Virtual DOM diff. The framework provides familiar reactive APIs such as `reactive()`, `ref()`, `computed()`, `watch()`, `watchEffect()`, `effectScope()`, `toRaw()`, and `markRaw()`.\n\nVoodoo.js is designed to work with or without a build step. You can simply include it via a script tag, or import it as an ES module. The framework is meant to be progressive, allowing developers to use only the features they need without being restricted by a large set of features.\n\nHowever, Voodoo.js has grown into a large framework with many features, and the current focus is on stability, security hardening, parser edge cases, test coverage, API stability, bundle modularity, performance benchmarks, documentation, and quality package releases. If you're interested in the internal workings of JavaScript frameworks, there are plenty of areas to contribute, including parsers, reactivity, testing, browser compatibility, TypeScript, performance, security, docs, and components.",
  "summary": "I've been building a JavaScript framework called Voodoo.js , and I'd rather get torn apart in the comments than hear that it looks cool. It started with one question: How much JavaScript do we actually need to write for everyday interactive interfaces? For a lot of apps I don't want to build a component tree, configure a bundler, install five libraries, wrap the API, manage state somewhere else,…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}