with Pulse YOU CAN'T A BAD PAGE.
ONE SPEC. ONE WAY TO BUILD.
A server-first Node.js framework. Streaming SSR, security headers, and production caching are enforced by the architecture, not left to configuration.
So constrained that doing it wrong isn't an option. Whether you write it or an AI does.
The spec is the page
Everything a page needs lives in one plain JS object: server data, client state, mutations, and view. One format. No split files. No hidden conventions.
The schema is the contract
Every spec is validated at startup. Either it's correct or it's rejected. No ambiguity, no misconfiguration that surfaces later in production.
The framework is the guarantee
Streaming SSR, security headers, and production caching come from the architecture. You write the product logic. The framework ships the quality.
Everything a page needs.
Nothing it doesn't.
Server fetchers, client state, mutations, and view. All co-located in one object. The spec is the page.
export default {
route: '/dashboard',
meta: {
title: 'Dashboard — My App',
styles: ['/app.css'],
},
server: {
data: async (ctx) => {
const user = await db.users.find(ctx.cookies.userId)
return { user, stats: await db.stats.forUser(user.id) }
},
},
state: { filter: 'all' },
mutations: {
setFilter: (state, event) => ({ filter: event.target.value }),
},
view: (state, server) => `
<main id="main-content">
<h1>Hello, ${server.data.user.name}</h1>
<select data-event="change:setFilter">
<option value="all">All time</option>
<option value="week">This week</option>
</select>
<p>${server.data.stats[state.filter].total} requests</p>
</main>
`,
}
Constrained enough
to be trusted.
Free enough
to be creative.
The spec format tells an agent exactly how to wire up data, state, and behaviour. What it doesn't do is dictate the design. Layout, typography, CSS — those are still real decisions. The agent makes them. Pulse just makes sure the page it builds actually works.
- One spec format. No ambiguity about how a page should be built
- Schema validation at startup. Bad output is rejected before it ships
- Security, SSR, and caching are part of the architecture. Not optional
- Consistent, reviewable output across every agent and every session
- The view is a plain JS function. The agent writes whatever HTML it wants
- CSS, layout, and typography are entirely up to the agent
- A component library is there when needed. Custom HTML when it isn't
- The result looks considered because the agent had room to make it so
Constraints enforced.
Not recommended.
| PULSE | Next.js / Remix | SvelteKit | |
|---|---|---|---|
| Ways to write a page | One: the spec schema | App Router, Pages Router, RSC, client components, loaders… | +page.svelte, +page.server.js, load(), form actions… |
| Agent-readable structure | One JS object per page | Files, folders, magic exports spread across dirs | Files, folders, Svelte syntax |
| SSR out of the box | Streaming SSR, zero config | Yes, but client hydration adds JS on every page | Yes, but requires an adapter and client runtime on every page |
| Client JS shipped | ~4 kB brotli on first visit; 0 kB on static pages | 50–200 kB+ depending on features used | ~15 kB brotli |
| Security headers | On every response, built in | Manual middleware or plugin | Manual hooks setup |
| Runtime dependencies | Zero. Pure Node.js HTTP | React, 50+ transitive packages | Svelte runtime + adapters |
| Production build step | Server needs none. node server.js is production |
Required: next build |
Required: vite build |
Performance by design
The shell streams to the browser instantly. Deferred segments arrive as data resolves. ~4 kB of JS on first visit. Zero CLS. Immutable bundle caching on deploy. Not configured. Structural.
Safe by design
Security headers on every response, including 404 and 500. Declarative constraints enforce state bounds after every mutation. Guard runs before any server fetcher. Not a plugin. Part of the pipeline.
Nothing to configure
No bundler config. No runtime dependencies to install, audit, or upgrade. node server.js is production. No breaking upgrades. Page files have no framework imports to version.
Performance you can measure.
Report generated 18 Jul 2026, 20:52 · measured from a real Pulse build
Your first page
in under
2 minutes.
One spec object. Server data, client state, mutations, and view. In one place. Streaming SSR, security headers, and 100 Lighthouse scores come with it. Nothing to configure.
Pulse is in early access. The goal is not to compete on features. It is to eliminate the class of problems that come from having too many of them.