// the find
bartblast/hologram
Full stack Elixir web framework that intelligently compiles Elixir client-side code to JavaScript
Hologram lets you write both server and client-side UI logic in Elixir, compiling the client half to JavaScript via its own interpreter rather than a thin transpiler. It's aimed at Elixir/Phoenix teams who want interactivity (think LiveView, but running actual logic in the browser) without writing or maintaining a separate JS/TS codebase.
The JS runtime isn't a shallow syntax translator — it reimplements real BEAM semantics client-side (pattern matching, bitstrings, its own regex engine, unicode handling, exception/stacktrace machinery), which is a much harder and more honest approach than most 'write X, get JS' frameworks attempt. It vendors snabbdom for the VDOM diff instead of rolling its own, a sensible reuse of a proven library rather than NIH. The benchmark suite is unusually granular for a project this size — nearly every compiler internal function has its own benchmarks/README pair, which suggests the maintainer actually tracks compile-time regressions rather than just shipping features. CI includes credo, sobelow, and doc-coverage checks (.doctor.exs), so the tooling hygiene is ahead of where most single-maintainer frameworks are at 1.5k stars.
Reimplementing Erlang/Elixir stdlib semantics in JS (regex, unicode, bitstrings, etc.) is an enormous ongoing surface area to keep correct — every BEAM edge case you didn't port becomes a runtime bug someone hits in production. It's effectively a single-maintainer project (sponsorship page lists one core author); that's a real bus-factor risk if you're betting a production app's frontend on it. Nothing in the README addresses client bundle size or interpreter overhead, which is the first question anyone should ask about a 'ship a mini-BEAM to the browser' architecture. And there's no visible test directory in the repo tree despite the CI wiring, so it's unclear how much of that hand-rolled interpreter is actually covered by tests versus just linted.