Surgical Updates
State changes morph only the DOM nodes that differ. No virtual DOM, no full re-paint — keyed rows are reconciled per row, and unchanged rows are reused byte-for-byte.
Keep your HTML, keep your backend. PulsePoint adds fine-grained reactivity with a single minified runtime — no build step, no virtual DOM, no separate frontend project.
import { ComponentInit as PP } from "/js/pp-reactive-v2.min.js"; PP.bootstrap();
This todo list is running live on this page with the same runtime you would
ship. The markup on the left is the complete component — plain HTML, one
<script>, zero build tooling.
TodoApp.html
source<div class="todo-app">
<h2>Todos ({todos.length})</h2>
<form onsubmit="addTodo(event)">
<input name="title" placeholder="What needs doing?" />
<button type="submit">Add</button>
</form>
<ul>
<template pp-for="todo in todos">
<li key="{todo.id}">
{todo.title}
<button onclick="remove(todo.id)">x</button>
</li>
</template>
</ul>
<script>
const [todos, setTodos] = pp.state([
{ id: 1, title: "Ship PulsePoint v2" },
]);
const addTodo = (event) => {
event.preventDefault();
const form = event.currentTarget;
const title = new FormData(form).get("title").trim();
if (!title) return;
setTodos([...todos, { id: Date.now(), title }]);
form.reset();
};
const remove = (id) =>
setTodos(todos.filter((t) => t.id !== id));
</script>
</div>
Live result
runningAll clear — add your first todo above.
PulsePoint v2 is a complete reactive runtime in one file — state, effects, components, lists, portals, RPC and SPA navigation.
State changes morph only the DOM nodes that differ. No virtual DOM, no full re-paint — keyed rows are reconciled per row, and unchanged rows are reused byte-for-byte.
PHP, Python, Go, Node, .NET, Rust — any server that can print HTML can host PulsePoint. The runtime speaks plain HTTP and JSON.
Interpolation with {expression}, native on* event attributes, hidden="{!cond}" conditionals and <template pp-for> lists. Valid HTML before and after compiling.
A pp-component boundary owns its markup and its <script>. Hooks like pp.state and pp.effect live per instance, exactly like a React function component — without JSX.
pp.rpc() calls your server with a declared wire contract — JSON or multipart, CSRF, SSE streaming — and pp.socket() opens named bidirectional WebSocket channels through one shared endpoint.
pp.portal() escapes clipping ancestors, context providers flow values down the tree, and props cross component boundaries as plain HTML attributes.
v2 caches loop rows, elides mounted child boundaries from parent renders, and dedupes scope merges — measured on 100-child shells, not microbenchmarks.
One minified file, zero dependencies, auto-mounts on DOM ready. Add a script tag to a legacy app and start with a single component.
Plain HTML plus native JavaScript is the language AI already speaks. A single llms.md file teaches any agent to implement PulsePoint in your stack.
AI-native by design
PulsePoint templates are plain HTML and its component scripts are native JavaScript — the two languages AI models know best. There is no JSX dialect, no compiler magic and no proprietary DSL for an agent to hallucinate around.
One context file, llms.md,
contains the complete directive surface, the
pp.* API and the
backend wire contract. Drop it into any AI coding assistant and it can
implement PulsePoint in your stack — whatever that stack is.
prompt.txt
> Read llms.md, then add PulsePoint to my Express app: a searchable product table with server-side filtering.
Reading llms.md… PulsePoint v2 detected.
1. Serving pp-reactive-v2.min.js from /js/
2. Adding a pp-component boundary to products.html
3. Wiring pp.rpc("searchProducts") to POST /products
4. Handling X-PP-Function header in Express middleware… done.
PulsePoint is open source and the browser contract is fully documented. Your backend stays the single source of truth — logic, data and templates in one place, reactivity handled for you.
Ready-to-use integrations
Static files or any web server — start with one script tag.
Echo templates from PHP; PulsePoint's original home.
FastAPI, Django, Flask or Caspian — render with Jinja and friends.
Express, Fastify or raw http — same language on both sides.
html/template plus one RPC handler.
ASP.NET Core minimal APIs or Razor.
Axum or Actix with Tera templates.
If it can print HTML and read JSON, it can host PulsePoint.
PulsePoint was born from an ambitious experiment: Prisma PHP. The goal was simple yet challenging — to bring the modern, reactive experience of React and Next.js directly into the PHP environment.
Jefferson Abraham realized the potential to go even further: converting standard HTML into a complete, reactive programming language. What started as a PHP enhancement evolved into PulsePoint — a standalone, backend-agnostic engine.
Today, maintained by The Steel Ninja Code Team, PulsePoint is fully open source. It empowers developers to implement a JSX-like experience in any backend, proving that high-performance reactivity doesn't require a complex build step.