Roadmap
Development Plan
The development of Hologram is organized into short-term and medium-term goals.
Short-Term Goals
Listed in the planned order of implementation:
VS Code Extension - Develop a VS Code extension for
.holo syntax highlighting to improve the developer experience.
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 - Add cookie support for persistent user preferences and application state.
Sessions - Add comprehensive session management capabilities to maintain state across requests.
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.
Robust Live Reload - Create a bullet-proof implementation of live reload with asset watching to provide a seamless development experience without breakages.
"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.
Non-Command Action Triggers - Enable triggering actions from server code outside of commands.
Medium-Term Goals
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.
- 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.
- Computed Variables - Implement a reactivity system with computed variables that automatically update when dependencies change.
- Dynamic Components - Support for dynamically loading and rendering components.
- Navigate Between Pages from Commands - Enable navigation to another page from within a command.
- Prop Watchers - Add the ability to react to prop changes with state updates.
- Props Validation - Add a system for validating component props.
- Reduce Option in Comprehensions - Implement the
:reduceoption in comprehensions. - Regular Expressions - Add support for regular expressions and the
=~operator. - Secrets Protection - Prevent sensitive information from leaking to the client side.
- 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.
Long-Term Goals
Listed alphabetically:
- Client Processes - Implement a client-side version of Elixir's process model for concurrent programming patterns.
- Cross-Platform Development - Enable building applications for web, mobile, and desktop platforms from a single codebase.
- Local-First Support - Implement local-first architecture with offline-capable local databases, data synchronization, and conflict resolution for resilient applications.
- PWA Support - Add Progressive Web App capabilities including service workers, offline functionality, and native app-like installation experience.
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 | done |
| Session | done |
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 | done |
| Pointer Cancel | done |
| Pointer Down | done |
| Pointer Move | done |
| Pointer Up | done |
| Resize | todo |
| Scroll | todo |
| Select | done |
| 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 |
Previous