The porting initiative delivers massive Erlang function coverage, bringing browser-side Elixir capabilities to near-completion with 150 new ports and 700+ commits.
The Hologram team has delivered a major milestone with version 0.7.0, achieving 96% coverage of Phase 1 Erlang functions needed for browser-side Elixir applications. This release represents nearly three months of focused work, with 150 newly ported functions across 19 modules pushing the project from 34% to 96% coverage.

The numbers tell the story: 700+ commits, 49 contributors, and a jump from 92 to 228 ported functions. The Elixir standard library readiness has grown from 74% to 87%, meaning the vast majority of functions needed for full-stack web and basic local-first apps now work in the browser.
What Got Ported
The porting work touched critical modules across the Erlang ecosystem:
- :erlang - 57 functions including core operations
- :lists - 19 functions for collection manipulation
- :binary - 13 functions for binary and bitstring operations
- :sets - 13 functions enabling full MapSet support
- :math - 5 functions including Float.ceil/1, Float.floor/1, power, logarithm, and exponent
- :filename - 10 functions for path manipulation
- :unicode - 5 functions for normalization and grapheme segmentation
Plus 13 other modules contributing essential functionality.
What This Unlocks
With these ports in place, developers can now use previously unavailable functionality client-side:
String processing - String.split/3, String.replace/4, String.length/1, String.jaro_distance/2, and titlecase operations
Collections - Full Enum and List functionality backed by ported :lists functions (sorting, filtering, folding, key-based operations on keyword lists)
Sets - Complete MapSet support via ported :sets functions - create, filter, intersect, union, and membership checking
Binary & bitstring operations - Pattern matching, splitting, replacing, and searching within binaries
Unicode - NFC, NFD, NFKC, and NFKD normalization, plus grapheme cluster segmentation
Math - Float.ceil/1, Float.floor/1, power, logarithm, and exponent functions
Time operations - Monotonic time, system time, time unit conversion, and time offsets
File paths - Path.join/2, Path.basename/1, Path.dirname/1, Path.extname/1 for client-side path manipulation
Performance and Compatibility Improvements
Beyond the porting work, this release includes several key enhancements:
Faster compilation - Compiler mutations are now asynchronous via Agent.cast/2, resulting in measurable compile speed improvement
Cross-platform setup - Added a setup task for Hologram contributors that works on macOS, Linux, and Windows
NixOS compatibility - Automatic fallback to system-installed Biome when the dynamically-linked Biome dependency binary can't run
Enhanced float formatting - :erlang.float_to_binary/2 now supports :decimals, :compact, and :scientific formatting options
Raw HTML blocks - :raw blocks are now emitted from the Parser, enabling more accurate source reconstruction
Bug Fixes That Matter
Several critical issues were resolved in this release:
Quota management - Fixed DOMException: The quota has been exceeded by implementing hybrid storage strategy with OPFS
Map immutability - :maps.remove/2 and :maps.put/3 no longer mutate the original map, preserving Erlang's immutability semantics
Template interpolation - Templates now use the String.Chars protocol for interpolation, matching how Elixir string interpolation works
Pattern matching - Patterns like :top = _position now work correctly in transpiled code
Form events - Fixed form-level change event detection and submit event form data collection
URL parameter encoding - page_path/2 now properly encodes URL parameters, and query params are correctly decoded on navigation
Infrastructure for the Future
Under the hood, this release lays groundwork for upcoming features:
Client-side ERTS - New runtime system class with node table, sequence generators, binary pattern registry, and UTF-8 decoder
Reference type overhaul - Redesigned internal format and serialization of reference terms to better mirror Erlang behavior
ETS infrastructure - Foundational support for ETS, including state preservation when navigating away from the app
Page snapshot improvements - Three-tier storage strategy: in-memory caching for fast access, async OPFS persistence, and session storage as fallback
The Human Side
This release represents the work of 49 contributors, with special recognition for:
- @mward-sudo (Michael Ward) - Single-handedly ported several modules with complex code
- @tenkiller (Brett Fincher) - Contributed multiple ports
- @Sorc96 - Contributed multiple ports
- @Lucassifoni (Lucas Sifoni) - Contributed multiple ports and fixed map immutability
- @ideaMarcos (Marcos) - Contributed multiple ports and float formatting options
- @Petarj123 (Petar Jankovic) - Contributed multiple ports
What's Next
With 96% of Erlang functions needed for client-side web apps already ported, Hologram is steps away from having a reliable and comprehensive Elixir runtime in the browser. The team plans more granular and frequent minor releases as they finish the last few pieces of the puzzle and shift focus to polish and stability.
To upgrade: Update the Hologram dependency in your mix.exs to {:hologram, "~> 0.7.0"} and run mix deps.update hologram

The porting initiative has transformed Hologram from a promising experiment to a production-ready platform for building full-stack Elixir applications that run seamlessly in the browser. With Phase 1 nearing completion, the focus now shifts to refining the developer experience and preparing for the more complex process-related functionality planned for Phase 2.

Comments
Please log in or register to join the discussion