I spent more time fighting React than shipping features, so I stitched together a tiny 350-line thing I call "pfusch".
pfusch [pfʊʃ] is Austrian slang word refering to work that is done carelessly, unprofessionally, or without proper skill, resulting in poor quality or subpar results. And my god, was it done carelessly.
But: No build step, no Vite/Nextjs/WASM/webpack/insert-the-one-millionst-way-to-open-a-website matryoshka, just pfusch('my-widget', {}, () => [html.div('hi')]); and it works. Tests look like pfuschTest('my-widget').flush(). no virtual DOM sermon, no hooks brain gymnastics.
Features:
- Declarative components without JSX or a babel pipeline or anything but a browser.
- Tiny API surface: pfusch(name, state, renderFn) and a little test helper.
- DOM-first, uses modern browser features instead of reinventing them.
- Runs in 2025 browsers with zero deps. Because browsers are really huge, let's stop downloading more, shall we?
If you’re happy with your 800KB bundle and dependency roulette, keep scrolling. If you want to build a widget in the time it takes React to finish npm install, kick the tires and tell me what breaks.
I spent more time fighting React than shipping features, so I stitched together a tiny 350-line thing I call "pfusch".
pfusch [pfʊʃ] is Austrian slang word refering to work that is done carelessly, unprofessionally, or without proper skill, resulting in poor quality or subpar results. And my god, was it done carelessly.
But: No build step, no Vite/Nextjs/WASM/webpack/insert-the-one-millionst-way-to-open-a-website matryoshka, just pfusch('my-widget', {}, () => [html.div('hi')]); and it works. Tests look like pfuschTest('my-widget').flush(). no virtual DOM sermon, no hooks brain gymnastics.
Features:
- Declarative components without JSX or a babel pipeline or anything but a browser. - Tiny API surface: pfusch(name, state, renderFn) and a little test helper. - DOM-first, uses modern browser features instead of reinventing them. - Runs in 2025 browsers with zero deps. Because browsers are really huge, let's stop downloading more, shall we?
Code is here: https://github.com/MatthiasKainer/pfusch/
If you’re happy with your 800KB bundle and dependency roulette, keep scrolling. If you want to build a widget in the time it takes React to finish npm install, kick the tires and tell me what breaks.