bartblast
Hey! For those following Hologram’s progress… I’m excited to share that I’ve just published the official roadmap for Hologram. You can check it out at: https://hologram.page/docs/roadmap
The roadmap page provides a comprehensive overview of:
-
Development Plan: Featuring both immediate priorities (before ElixirConf 2025) and medium-term goals (after ElixirConf), with features listed in planned order of implementation
-
Feature Status: Detailed breakdown of what’s already implemented and what’s coming next
My immediate focus is on key improvements like optimizing client bitstring performance, implementing component-level rerendering, completing DOM events support, and adding cookies and sessions functionality.
The page also includes detailed status tables for various framework components, including the template engine, framework runtime, and Elixir client runtime features.
I hope this transparency helps the community understand where Hologram is headed and what to expect in the coming months. I welcome your feedback and contributions!
What features are you most excited about? Let me know in the comments!
Trending in News & Updates
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #blog-post
- #ai
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
D4no0
Congrats! Very nice progress!
Eiji
I guess it’s rather obvious that rest of the
documentationpages are also high priority:I guess something like Non-Command Command Triggers - Enable triggering command from server code outside of commands would be done within
Component Subscription DSL, right?I would like to use both:
Svelte-like blocks for conditionally adding many elementsVue-like directives for a single element especially if it’s shortFor example:
See also
forexample:This adds 4 extra LOC and 2 extra levels of indentation, so what’s “clear” depends on context. Block conditions are much more helpful to work with multiple elements, but they are too much for a single element.
Creating a module for just one function is overcomplicated.
Phoenixsupports bothlive_component/1and functions components, and they are used in completely different cases (short template vs standalone process with it’s own event handling).Simply think that some library have tons of components and want to support both
HologramandPhoenix. In fact you require to split 1 or few modules into tens of modules, so each even smallest element like button have it’s own module and the developer have to scroll the documentation to skip tens of entries in the sidebar. This way folks would start to askex_docteam to add another tab likeMIX TASKS, but forHologramtemplates.Also think about
phx_newas right now we need a 1:1 copy with just a bit different template syntax. Does it make sense to copy-paste all of the logic of each generator published onhex? Of course we can ask maintainers to do that for us, but I’m not sure if all of them would agree to double overall template if they even reply.Just think that every project and every library on hex that uses
Phoenixtemplates needs to be rewritten to supportHologramnot because the logic changes, but because it uses different syntax or something only differentsigil. It’s likeLinuxvsWindows- sure,Linuxhave many native games, but it’s still better to optionally supportWindows, right?I believe that such thing would definitely speed up
Hologramadoption. Just think that all defaultPhoenixtemplates and generators would be supported out-of-the-box byHologram. For sure it’s not #1 must have, but something I would definitely like to see before1.0.0release.Configuration to
minifyHTML. The extra spaces may impact on element styles and some selectors to fail:If remember correctly you have also mentioned some client-side database and sync. I guess it’s a very long term thing, but I would definitely wait for it. It would be nice to add a simple
Save cachefunction and in a simple action tellHologramto cache templates and sync database, so the client can work offline.What’s the use-case for it? Can’t we just call
put_somethingfunction callput_stateand do something extra?Unfortunately for my use cases I would need to wait few months for some changes, but the priority list is clear and looks very interesting.
jam
Looking good! Thanks for sharing.
Curious what this might look like.
This definitely caught my attention. Would be interested to learn more.
fwiw, I agree. I also think that supporting both would be more confusing.
Eiji
I don’t think so as long as they would be well documented as an alternatives to each other. They are indeed much more readable, but with a good syntax highlight it’s not really a big deal. However they took extra lines and indentation levels which makes them verbose.
On one side
Vue-like attributes are better for single elements, but adding same attribute to many elements is bad as same as wrapping elements with this attribute in one parent container.. However in oppositeSvelte-like blocks are much better for multiple elements, but they are a bit annoying to use on single elements.For example imagine that you create a menu and every even element have an if (so you cannot group them in one block - again for example). This gives us 2 LOC * number of even elements. In
Vue-like syntax I focus on the elements and inSvelte-like syntax I focus on the blocks and both would be fine if they would be used for their purposes.How does it look
comparing to:
bartblast
Looping everyone in: @Eiji quotes fragments of a discussion we had in a GitHub issue: Missing or undocumented features when adding Hologram support to existing LiveView app · Issue #181 · bartblast/hologram · GitHub
Correct.
These are two separate things - in some scenarios we may need to just trigger an action for a single connection (window tab) without having to define a subscription in a component. The DSL would be for channel-like scenarios where we want to send to specific topics (e.g. chat scenario). What are your thoughts in this regard?
I agree with @jam - this would be confusing if we supported both.
I don’t reject the idea of introducing some simple syntax for partials eventually, but not in the medium-term.
Can you elaborate on that?
Browsers collapse sequences of whitespace into a single space when rendering text content. For block elements, whitespace at the beginning and end of content is ignored entirely. In normal text flow, no matter how many spaces, tabs, or line breaks you have between words, they’ll render as a single space. There are specific exceptions to this, but in such rare cases (like
<pre>elements) you can just write the if block without surrounding whitespaces.Minifying whitespace text nodes makes sense, though, in my opinion.
At the moment there is no way to react to prop changes. The only things that can change the state are actions that react to DOM events, other actions, or commands.
Example use case is described here: How to modify component state in reaction to a prop change? · Issue #161 · bartblast/hologram · GitHub
bartblast
Regarding Phoenix template support - I understand that compatibility with Phoenix templates would certainly ease adoption and reduce the migration burden for developers looking to try Hologram. It’s a thoughtful suggestion that I’ve considered carefully.
However, after weighing the tradeoffs, I’ve decided not to pursue Phoenix template compatibility for several important reasons:
Divergent Design Philosophies: Hologram and Phoenix have fundamentally different approaches to UI rendering. Hologram is designed for client-side rendering with Elixir-to-JavaScript transpilation, while Phoenix templates are server-rendered. Supporting both could create conceptual inconsistencies and may confuse developers (point 3).
Maintenance Burden: Supporting two template syntaxes means maintaining two parallel systems, doubling the work for every feature, bug fix, and optimization. This could significantly slow down Hologram’s development.
Confusing Developer Experience: Offering two ways to do the same thing can create decision fatigue and confusion for developers. New users might struggle to understand which approach to use when.
Diluted Innovation: By trying to maintain compatibility with Phoenix templates, we might constrain Hologram’s ability to innovate in ways that are optimized for client-side rendering patterns.
Optimization Challenges: Hologram’s template system is optimized for its specific transpilation approach (and will be optimized even more). Phoenix templates might not transpile as efficiently to JavaScript, potentially leading to performance issues.
Documentation Complexity: Having to document two parallel systems would make the documentation more complex and potentially harder to navigate.
Testing Overhead: We’d need to test all features across both template systems, increasing the testing burden.
Divergent Evolution: As Phoenix continues to evolve its template system, maintaining compatibility would become increasingly difficult over time.
Mixed Paradigms: Phoenix templates are designed with server-side rendering in mind, while Hologram templates are designed for client-side rendering. These different paradigms might lead to subtle bugs or unexpected behaviors when mixing approaches.
Clear Differentiation: Having a distinct template syntax helps clearly position Hologram as a different approach to UI development in Elixir, rather than just an alternative to Phoenix LiveView.
Focus on Core Strengths: By focusing exclusively on own template system, we can ensure it’s the best it can be, rather than dividing resources between two systems.
Migration Path vs. Compatibility: Instead of supporting Phoenix templates directly, we could focus on providing clear migration paths and tools to help developers transition from Phoenix to Hologram.
I believe that maintaining a focused, single-template approach will ultimately lead to a better developer experience and a stronger framework in the long run. That said, I’m committed to providing clear migration paths and documentation to help Phoenix developers transition to Hologram as smoothly as possible.
bartblast
Regarding the syntax discussion (Svelte vs Vue style), I appreciate your thoughts on this, @Eiji. While Vue’s attribute-based syntax is indeed concise, I believe we should prioritize maintainability and readability over brevity.
Code is written once but read many times by different developers. When quickly scanning through a component to understand its structure and logic, block-style syntax provides clearer visual cues about the control flow:
This approach makes it immediately obvious where loops and conditionals begin and end, especially in complex nested structures. Compare this to the attribute-based approach:
You’re right that Vue-like attributes can be more elegant for single elements, while Svelte-like blocks work better for wrapping multiple elements. However, for Hologram specifically, there are several reasons why a Svelte-inspired block syntax makes more sense in my opinion:
Complex component logic: As Hologram components grow to handle more complex UI logic, the block syntax scales better visually, making the relationship between nested conditions and loops more explicit.
Debugging and maintenance: When troubleshooting components, having explicit opening and closing tags for control structures makes it easier to identify where issues might be occurring.
Learning curve: For developers new to Hologram, block syntax provides clearer visual indicators of the component’s structure, making it easier to understand how the UI is being constructed.
Separation of concerns: Block syntax creates a clearer separation between structural elements and control flow logic, which can lead to more organized and readable components.
Consistency: Supporting both syntaxes simultaneously would likely confuse users and create inconsistency across codebases. Having a single, well-defined approach makes the framework more approachable and reduces cognitive load when switching between projects.
While I acknowledge your point about good syntax highlighting mitigating some readability concerns, the fundamental structure still matters when reviewing code across different environments or when dealing with increasingly complex components.
The block-style approach aligns with Hologram’s goal of creating maintainable, readable UIs that can scale with application complexity while remaining approachable for developers at all experience levels.
bartblast
Thanks @jam! At this stage, I don’t have detailed specifications for the JS Interop and Component Subscription DSL features - just some initial ideas I’m exploring. Once I get closer to implementing these specific features, I’ll likely open dedicated discussions to gather community input and share my thoughts in more detail.
I appreciate your feedback on the template syntax approach too! Looking forward to sharing more as the project progresses.
Eiji
Yes, they are different. That’s why I used your naming to name call it
Non-Command Command Triggersinstead ofNon-Command Action Triggers.Wait, so
Phoenixsyntax inheexis confusing too?I’ve used both really often and never found them confusing …
Oh, no need if you don’t plan to support
Phoenixtemplates.I’m aware that they are seen as single space. I wanted to say that there should be no space at all due to how
CSSworks. Element with “just one space” is not considered empty.There are just many cases where we don’t want extra space (no matter how much) - not even mentioning that templates would be a bit smaller.
Exactly, so if everything happens in action/command then we can do it without any extra API:
Did I missed something? I do not see special watcher for
optionsreally necessary if we can just use such a simple function …Oh, I expected it as simple as:
Does it cause a lot of problem for you?
Oh, not really if you use
IO.warn/1to let user know that templates are converted to rawHTMLand to use allHologramfeature developer have to rewrite it later i.e. when there would be a need for it.Look at example above. It’s not about supporting all of the
livestuff - just render template with it’sassignsasrawHTML.Maybe I’m wrong with something, but supporting only template (without all
livestuff) would be easy to test, no? It’s just about ifassignsare part of therawHTML or not. Again, maybe I see it too plain …No for a backwards-compatibility i.e. until
2.0.0version they should not change theRenderedstruct.Yes and that’s what you should let developer know in
IO.warn/1call. The raw HTML would be like a string value added to state.Oh, I really appreciate your decision, but just sometimes I feel like I’m from another world. People say it’s confusing and I used that in
Phoenixand never considered it like you. I just understand all other points except said confusion. If I would say what’s more confusing from my perspective is to not support a short syntax since a mature framework likePhoenixsupports both, but maybe it’s just me …Hmm … For me a good practice is to use
:ifand:forat the end of the element and if the element is too long then each attribute is on it’s own line. Maybe that’s why I never saw it confusing …I guess you address something like:
I would say it’s rather something that a
formattershould worry about, no? Or have I missed something else?Just for sure - I’m not commenting your decision - I replied only to the confusion part. I clearly don’t see something you do, sorry …
KP123
Would a syntax like Temple be possible for what you have in mind?