Roadmap
Development Plan
The development of Hologram is organized into short-term and medium-term goals, with a significant milestone being ElixirConf 2025 in May.
Now (Before ElixirConf 2025)
Deadline: May 14, 2025
These features are prioritized for implementation before the ElixirConf presentation, listed in planned order of implementation:
- Improve Client Bitstring Performance - Optimize the client-side bitstring implementation which is currently the main bottleneck affecting page rendering performance.
- Component-Level Rerendering - Implement selective rerendering of only changed components instead of entire pages, significantly improving action execution speed and overall responsiveness.
- DOM Events Support - Complete implementation of remaining DOM events, particularly those requiring high-performance rerendering like mouse move, scroll, and touch events.
- Cookies - Implement cookie handling for storing user preferences and session information.
- Sessions - Add comprehensive session management capabilities to maintain state across requests.
- Robust Live Reload - Create a bullet-proof implementation of live reload with asset watching to provide a seamless development experience without breakages.
- Compilation Speed-Up - Address significant performance optimization opportunities in the compilation process.
- Incremental Compilation - Implement incremental compilation to avoid recompiling unchanged code, further improving development workflow.
- "with" Expression - Complete the implementation of Elixir's
with
expression. - Exponentiation Operator - Add support for the
**
operator for mathematical operations. - Client Error Handling - Implement support for Elixir's error handling features (try/catch/rescue, etc.) on the client side.
- Client Error Stacktraces - Ensure error messages and stacktraces on the client match those on the server for easier debugging.
- Template Engine Error Reporting - Improve error reporting in the template engine to make debugging template issues more straightforward.
- Setup Lifecycle Hook - Implement the setup (pre-init) lifecycle hook for components and pages.
- JS Interop - Create a clean interface for JavaScript interoperability to leverage existing JavaScript libraries.
- Prop Watchers - Add the ability to react to prop changes with state updates.
- Non-Command Action Triggers - Enable triggering actions from server code outside of commands.
- Computed Variables - Implement a reactivity system with computed variables that automatically update when dependencies change.
- Secrets Protection - Prevent sensitive information from leaking to the client side.
- VS Code Extension - Develop a VS Code extension for
.holo
syntax highlighting to improve the developer experience.
Later (After ElixirConf)
Post May 2025
These features are planned for implementation after ElixirConf, listed alphabetically:
- Action Triggers in Init Functions - Enable triggering actions from component/page init functions.
- Advanced Bitstring Pattern Matching - Support for bitstring modifiers and more complex pattern matching.
- Bitstring Generators in Comprehensions - Enable the use of bitstring generators in comprehensions.
- Bitstring UTF16 and UTF32 Encoding - Add support for additional Unicode encodings in bitstrings.
- Bitwise Module Operators - Implement operators from the Bitwise module.
- Client MFAs Whitelisting - Create a mechanism to explicitly whitelist Module-Function-Arity combinations that should be transpiled for client-side execution when not automatically detected by the compiler.
- Client Processes - Implement a client-side version of Elixir's process model.
- Command Failure Handling Control - Add more granular control over how command failures are handled.
- Component Subscription DSL - Create a DSL for integrating with Phoenix PubSub for real-time updates.
- Dynamic Components - Support for dynamically loading and rendering components.
- Navigate Between Pages from Commands - Enable navigation to another page from within a command.
- Props Validation - Add a system for validating component props.
- Reduce Option in Comprehensions - Implement the
:reduce
option in comprehensions. - Regular Expressions - Add support for regular expressions and the
=~
operator. - Shorthand Prop Assignment Syntax - Create an optional, more concise syntax for assigning props while maintaining support for the standard syntax.
- Time Travel Debugger - Develop a debugging tool that allows stepping backward through state changes.
Feature Status
Template Engine
UI
Feature | Status |
---|---|
Components | done |
Context | done |
Layouts | done |
Navigation | done |
Pages | done |
Routing | done |
Template Colocation | done |
Markup
Markup | Status |
---|---|
Component (node) | done |
Element (node) | done |
Interpolation | done |
For Block (iteration) | done |
If Block (conditional) | done |
Public Comment | done |
Raw Block (markup disabling) | done |
Text (node) | done |
Framework Runtime
Client
Feature | Status |
---|---|
Actions | done |
JS Interop | todo |
Server
Feature | Status |
---|---|
Commands | done |
Cookies | todo |
Session | todo |
Events
Event | Status |
---|---|
Blur | done |
Change | done |
Click | done |
Click Away | todo |
Focus | done |
Key Down | todo |
Key Press | todo |
Key Up | todo |
Mouse Move | todo |
Pointer Down | done |
Pointer Up | done |
Resize | todo |
Scroll | todo |
Select | todo |
Submit | done |
Tap | todo |
Touch Cancel | todo |
Touch End | todo |
Touch Move | todo |
Touch Start | todo |
Transition Cancel | done |
Transition End | done |
Transition Run | done |
Transition Start | done |
Elixir Client Runtime
Data Types
Type | Status |
---|---|
Atom | done |
Bitstring | done |
Float | done |
Function | done |
Integer | done |
List | done |
Map | done |
PID | done |
Tuple | done |
Control Flow
Expression | Status |
---|---|
Case | done |
Cond | done |
If | done |
Function | done |
Unless | done |
With | todo |
Function Calls
Function Type | Status |
---|---|
Anonymous Function | done |
Function Capture | done |
Local Function | done |
Remote Function | done |
Operators
Overridable General Operators
Operator | Status |
---|---|
unary + | done |
unary - | done |
+ | done |
- | done |
* | done |
/ | done |
++ | done |
-- | done |
and | done |
&& | done |
or | done |
|| | done |
not | done |
! | done |
in | done |
not in | done |
@ | done |
.. | done |
..// | done |
<> | done |
|> | done |
=~ | todo |
** | todo |
Special Form Operators
Operator | Status |
---|---|
^ | done |
. | done |
= | done |
& | done |
:: | done |
Comparison Operators
Operator | Status |
---|---|
== | done |
=== | done |
!= | done |
!== | done |
< | done |
> | done |
<= | done |
>= | done |
Custom and Overriden Operators
Operator | Status |
---|---|
custom | done |
overriden | done |
Guards
Construct | Status |
---|---|
Anonymous Function | done |
Case Expression | done |
Comprehension Generator | done |
Private Function | done |
Public Function | done |
Comprehensions
Feature | Status |
---|---|
Bitstring Generator | todo |
Enumerable Generator | done |
Filter | done |
:into Option | done |
:reduce Option | todo |
:uniq Option | done |
Other
Feature | Status |
---|---|
Behaviours | done |
Bitwise Module Operators | todo |
Error Handling | todo |
Processes | todo |
Protocols | done |
Regular Expressions | todo |