JSX gives you components with props, composition, and type checking. But server rendering with JSX usually means running Node.js on the server.

BarefootJS compiles JSX at build time into your backend's native template format. Go renders .tmpl with html/template; Perl renders .html.ep with Mojolicious; Hono renders the generated .tsx. For non-Node backends, no Node.js runs at serving time. The compiler produces a backend-agnostic IR, then an adapter converts it:

JSX → IR (backend-agnostic) → Adapter → Template
Language Adapter Notes
TypeScript HonoAdapter Hono / JSX-based TS servers
TypeScript TestAdapter IR-based component testing
Go GoTemplateAdapter html/template
Perl MojoliciousAdapter Mojolicious EP templates

#Planned

Language Adapter
Rust (TBD)
Python Jinja2Adapter
Ruby ERBAdapter

The IR contract is stable. You can write a custom adapter for any backend.