
Security News
CVE Volume Surges Past 48,000 in 2025 as WordPress Plugin Ecosystem Drives Growth
CVE disclosures hit a record 48,185 in 2025, driven largely by vulnerabilities in third-party WordPress plugins.
isomorphic µhtml
Tiny wrapper that imports uhtml in the browser and uhtml/ssr in Node.js/Bun
for quick & easy client and server-side rendering (SSR/SSG). With a few extra
niceties.
All credits to Andrea Giammarchi for creating this mighty lib.
Example project using isum: ANSI.tools
render and html to render template literalsisum/reactive and @preact/signals-coreUse the provided document of isum and Vite (or something else that
builds/bundles) and get SSG for free.
This runs in both browsers and runtimes like Node.js:
import { document, html, render } from 'isum';
export class App {
constructor() {
this.render();
}
handleClick(event) {
console.log(event);
}
render() {
const view = html`<button @click=${this.handleClick}>Hello!</button>`;
render(document.getElementById('app'), view);
}
}
Please refer to the µhtml docs for details.
Introduced in v1.1.0
Import the same from isum/reactive and get @preact/signals-core's
fine-grained reactivity for free:
import { document, reactive } from 'isum/preactive';
const count = signal(0);
export function renderApp() {
const render = reactive(effect); // must not call at root module level
render(
document.body,
() =>
// second argument must be a function
html`<button onclick=${() => count.value++}>
Clicks: ${count.value}
</button>`
);
}
This will render the initial values during SSG.
Please refer to the the µhtml docs for details.
Bootstrap in index.js:
import { App } from './app.ts';
new App();
Initial template/container index.html:
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="styles.css" />
</head>
<body>
<main id="app"></main>
<script type="module" src="index.js"></script>
</body>
</html>
Read template, render application, write result:
import { readFileSync, writeFileSync } from 'node:fs';
import initSSR from 'isum'; // must import same as in rest of app (e.g. 'isum/preactive')
import { renderApp } from './app.js';
const pages = {
'index.html': () => renderApp()
};
for (const [filePath, render] of Object.entries(pages)) {
const template = readFileSync(filePath, 'utf-8');
const { document } = init(template);
render();
writeFileSync(filePath, document.toString());
}
This renders the <button> inside <main>.
This should scale well due to ESM live bindings. Here's an example build script.
Run the app in the browser without a build step:
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="styles.css" />
<script type="importmap">
{
"imports": {
"isum": "https://unpkg.com/isum@1.0.0/browser.js",
"udomdiff": "https://unpkg.com/udomdiff@1.1.2/min.js",
"uhtml": "https://unpkg.com/uhtml@4.7.1/keyed.js"
}
}
</script>
</head>
<body>
<main id="app"></main>
<script type="module" src="index.js"></script>
</body>
</html>
Ignore any CSS imports in JS modules:
node --import isum/no-css build.js
Useful when using e.g. Vite. isum pairs great with Vite.
FAQs
isomorphic uhtml
We found that isum demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
CVE disclosures hit a record 48,185 in 2025, driven largely by vulnerabilities in third-party WordPress plugins.

Security News
Socket CEO Feross Aboukhadijeh joins Insecure Agents to discuss CVE remediation and why supply chain attacks require a different security approach.

Security News
Tailwind Labs laid off 75% of its engineering team after revenue dropped 80%, as LLMs redirect traffic away from documentation where developers discover paid products.