<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="370062" data-post-id="370062">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="absowoot" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/absowoot/120/27268_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  absowoot
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Maybe it’s just me but I also needed to add <code>"app"</code> to <code>elixirc_paths()</code> in <code>mix.exs</code> otherwise visiting localhost shows the generic phoenix homepage.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defp elixirc_paths(:test), do: ["app", "lib", "test/support"]
defp elixirc_paths(_), do: ["app", "lib"]
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370062" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/23">Post #22</a>
	                </div>
	            </div>
              <div id="likers-container-370062" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370062"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #22"></div>
  </section>
</div>
    <div class="postbit" id="370067" data-post-id="370067">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bartblast" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/120/17647_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bartblast
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Hologram</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="garrison" data-post="10" data-topic="71830">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>I disagree with this. The goal should be something like JSX where there is no template syntax at all and the templates are actually constructed with JS (with the syntax extended to make it look nicer). The <code>:if</code>/<code>:for</code> syntax, which afaik was a hack to make slots work, was a huge step backwards in this respect for Phoenix. The original eex/heex “templates” are actually full Elixir with text/html interspersed and thus far more powerful.</p>
<p>Templating languages are always degenerate. As a simple example, why is there no <code>:case</code> attribute? The case construct spans (possible) elements, so it doesn’t even make sense as an attribute. The control flow is a higher level construct than an individual element and can’t be constrained to one. It’s a mistake to go down this path at all.</p>
<p>It’s unfortunate because <code>case</code> is one of Elixir’s best features and I strongly favor it over <code>if</code>, even in heex.</p>
<p>With that said, it seems like Hologram’s templates are in fact actually templates rather than code, so that’s not any better if so.</p>
<p>(Incredible work on the release BTW, that’s a lot of commits!)</p>
</blockquote>
</aside>
<p>Thanks for sharing your perspective <a class="mention" href="/u/garrison" rel="nofollow">@garrison</a>!</p>
<p>I actually considered the JSX-like path when I started working on Hologram, but ultimately decided to go with a template system because I felt JSX mixes concerns in ways I wanted to avoid. In my ideal world, I’d like to colocate component logic and presentation while still maintaining separation – moving computations like mapping, filtering, etc. into actions, computed properties, effects, and other dedicated areas outside the template itself.</p>
<p>I find this approach more maintainable and the presentation layer more readable. For example, I personally find:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">{Enum.map(@items, fn item -&gt; &lt;div key={item.id}&gt;{item.name}&lt;/div&gt; end)}
</code></pre>
<p>less readable than:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">{%for item &lt;- @items}
  &lt;div key={item.id}&gt;{item.name}&lt;/div&gt;
{/for}
</code></pre>
<p>Templates naturally enforce this separation of concerns, which aligns with my vision for the framework.</p>
<p>That said, choosing templates over a JSX-like system was honestly a close call, and I recognize I might be wrong on this one. The success of this approach really depends on whether I can deliver on the final vision I have in mind – particularly around computed properties, effects, and other reactive patterns.</p>
<p>One thing that gives me confidence in this direction is that HOLO templates compile directly to Elixir AST. For instance, syntax like <code>{%for n &lt;- 0..5, rem(n, 3) == 0}</code> compiles to a plain Elixir comprehension underneath. This means that if my bet on templates proves wrong, something similar to JSX could potentially be introduced in the future without breaking backward compatibility.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370067" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/24">Post #23</a>
	                </div>
	            </div>
              <div id="likers-container-370067" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370067"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #23"></div>
  </section>
</div>
    <div class="postbit" id="370068" data-post-id="370068">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bartblast" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/120/17647_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bartblast
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Hologram</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>That’s interesting! Have you done anything in this regard already?</p>
<p>I can understand why Ash would need to compile regexes to PostgreSQL for database queries, but I’m curious - why to JavaScript?</p>
<p>This could definitely be useful for Hologram when I implement the <code>=~</code> operator.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370068" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/25">Post #24</a>
	                </div>
	            </div>
              <div id="likers-container-370068" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370068"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #24"></div>
  </section>
</div>
    <div class="postbit" id="370069" data-post-id="370069">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="zachdaniel" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/zachdaniel/120/31980_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  zachdaniel
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Ash</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>The js bit will become a bit more clear in the near future, an announcement will be made <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"> (not making something competitive with hologram.)</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370069" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/26">Post #25</a>
	                </div>
	            </div>
              <div id="likers-container-370069" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370069"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #25"></div>
  </section>
</div>
    <div class="postbit" id="370073" data-post-id="370073">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bartblast" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/120/17647_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bartblast
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Hologram</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Lucassifoni" data-post="18" data-topic="71830" data-full="true">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/lucassifoni/48/39057_2.png" class="avatar"> Lucassifoni:</div>
<blockquote>
<p>Hello and congratulations for this release ! I did not have the time yet to actually use Hologram, but I’m fully positive about your direction and vision.</p>
<p>Do you see anything that would block hot-loading Hologram modules at runtime in prod ?</p>
<p>From the docs, I don’t see things that would prevent that.<br>
I see that the generated JS goes to priv/static/hologram, but this can happen at runtime too.</p>
</blockquote>
</aside>
<p>Thanks so much Lucas! There’s nothing that prevents hot code reloading in Hologram. In fact, the client-side runtime was specifically architected with hot-loading support in mind for future implementation.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370073" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/27">Post #26</a>
	                </div>
	            </div>
              <div id="likers-container-370073" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370073"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #26"></div>
  </section>
</div>
    <div class="postbit" id="370109" data-post-id="370109">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bartblast" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/120/17647_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bartblast
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Hologram</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Eiji" data-post="19" data-topic="71830">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/eiji/48/36743_2.png" class="avatar"> Eiji:</div>
<blockquote>
<p>I’m not sure if I can recommend <code>Hologram</code> for <code>prod</code>. It’s definitely an amazing project with a brilliant future, but comparing to other solutions it lacks too many features and you would end up with a project that you can’t fix unless you wait for a next release. I would suggest to study docs and if you think that your project would need at least one missing feature then don’t rush into it too soon.</p>
</blockquote>
</aside>
<p>While you’re definitely right that Hologram isn’t production-ready yet, I think you’re painting a bit too dramatic a picture here <img src="https://forum.elixirforum.com/images/emoji/apple/wink.png?v=15" title=":wink:" class="emoji" alt=":wink:" loading="lazy" width="20" height="20"> Yes, there are missing features, but what’s left is straightforward. The complex architectural work is done: the runtime, component system, and core primitives are solid.</p>
<p>My focus now is on creating escape hatches so developers don’t get stuck waiting for releases. I’ll prioritize features that users can’t implement themselves:</p>
<ul>
<li><strong>JS Interop</strong> - for when you need to interface with existing JavaScript</li>
<li><strong>Essential DOM events</strong> - including window-level and keyboard events</li>
<li><strong>Error handling</strong> - can’t really work around this yourself</li>
<li><strong>Server-to-client events</strong> - including PubSub abstraction for real-time features</li>
<li><strong>Action timing/delays</strong> - enables things like tick events for games (since we don’t have client processes yet)</li>
<li><strong>Command failure handling</strong> - proper error states and recovery</li>
<li><strong>Action scheduling from within init/3</strong> - scheduling actions from init/3 functions in pages/components</li>
</ul>
<p>Everything else can be easily worked around (provided the features listed above are implemented). Missing an Erlang function? Just use a server command - you’ll get the same performance characteristics as LiveView.</p>
<p>To put this in perspective: these features in total are less complexity than I put into just the bitstring rewrite in v0.5.0 (<a href="https://github.com/bartblast/hologram/blob/master/assets/js/bitstring.mjs" rel="noopener nofollow ugc">implementation</a> | <a href="https://github.com/bartblast/hologram/blob/master/test/javascript/bitstring_test.mjs" rel="noopener nofollow ugc">tests</a>). The foundation is solid; now it’s about filling in the practical gaps.</p>
<p>I think we’re closer to real usability than it might seem - worth starting to experiment now with migration in mind! <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370109" data-batch-url="/posts/batch_likers">
                        7
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/28">Post #27</a>
	                </div>
	            </div>
              <div id="likers-container-370109" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370109"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #27"></div>
  </section>
</div>
    <div class="postbit" id="370117" data-post-id="370117">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="garrison" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  garrison
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="bartblast" data-post="24" data-topic="71830">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/48/17647_2.png" class="avatar"> bartblast:</div>
<blockquote>
<p>but ultimately decided to go with a template system because I felt JSX mixes concerns in ways I wanted to avoid</p>
</blockquote>
</aside>
<p>My intention with that reply was primarily to argue <em>against</em> a <code>:for</code>/<code>:if</code> syntax as was proposed above. But still, I do think something like JSX would be ideal, so I’m happy to argue in favor of that as well <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p>
<p>I find your example rather unconvincing. Yes the <code>Enum.map</code> syntax is not great, but Elixir <em>has for comprehensions!</em></p>
<pre data-code-wrap="elixir"><code class="lang-elixir">{for item &lt;- @items do
  &lt;div key={item.id}&gt;{item.name}&lt;/div&gt;
end}
</code></pre>
<p>From a readability perspective this example is literally a handful of characters away from being your template syntax. But it’s enormously more powerful because, like JSX, the syntax here is a <em>superset</em> of Elixir rather than a <em>subset</em>. Who says I can’t do this?</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">{case @item do
  %Foo{} = foo -&gt; &lt;div class="foo"&gt;{foo.name}&lt;/div&gt;
  %Bar{} = bar -&gt; &lt;div class="bar"&gt;{bar.name}&lt;/div&gt;
end}
</code></pre>
<p>Or even…</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">{with {:ok, foo} &lt;- make_foo(@item), {:ok, bar} &lt;- make_bar(@item)
do
  &lt;div class="foobar"&gt;{foo.name}, {bar.name}&lt;/div&gt;
else
  _ -&gt; &lt;div class="error"&gt;Not so fast!&lt;/div&gt;
end}
</code></pre>
<p>I will admit that last one is pretty cursed but surely you see my point. By putting HTML in Elixir rather than the other way around you gain enormous power. This is why JSX is so good.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370117" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/29">Post #28</a>
	                </div>
	            </div>
              <div id="likers-container-370117" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370117"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #28"></div>
  </section>
</div>
    <div class="postbit" id="370124" data-post-id="370124">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Eiji" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Eiji/120/36743_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Eiji
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="bartblast" data-post="28" data-topic="71830">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/48/17647_2.png" class="avatar"> bartblast:</div>
<blockquote>
<p>Yes, there are missing features, but what’s left is straightforward. The complex architectural work is done: the runtime, component system, and core primitives are solid.</p>
</blockquote>
</aside>
<p>I did not try to dramatise. I only mentioned in which cases it shouldn’t be considered for <code>prod</code> and there was no reason to say about pros. You see … when I write long messages people says they are too long, but when I stick to topic and don’t say things like that then replies like yours appear. <img src="https://forum.elixirforum.com/images/emoji/apple/sweat_smile.png?v=15" title=":sweat_smile:" class="emoji" alt=":sweat_smile:" loading="lazy" width="20" height="20"></p>
<p>If I think that project which interest me is unstable I create an issue/PR like I already did for <code>hologram</code> for some cases (like migrating <code>Phoenix</code> default layout template for example). I have created many issues/PRs for credo for false positive results too.</p>
<aside class="quote no-group" data-username="bartblast" data-post="28" data-topic="71830">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/48/17647_2.png" class="avatar"> bartblast:</div>
<blockquote>
<p>My focus now is on creating escape hatches so developers don’t get stuck waiting for releases.</p>
</blockquote>
</aside>
<p><img src="https://forum.elixirforum.com/images/emoji/apple/+1.png?v=15" title=":+1:" class="emoji only-emoji" alt=":+1:" loading="lazy" width="20" height="20"> <img src="https://forum.elixirforum.com/images/emoji/apple/rocket.png?v=15" title=":rocket:" class="emoji only-emoji" alt=":rocket:" loading="lazy" width="20" height="20"> <img src="https://forum.elixirforum.com/images/emoji/apple/heart.png?v=15" title=":heart:" class="emoji only-emoji" alt=":heart:" loading="lazy" width="20" height="20"></p>
<aside class="quote no-group" data-username="bartblast" data-post="28" data-topic="71830">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/48/17647_2.png" class="avatar"> bartblast:</div>
<blockquote>
<p><strong>Essential DOM events</strong> - including window-level and keyboard events</p>
</blockquote>
</aside>
<p>Hope you count also missing <code>mouse</code> event(s) here as many features requires events like <code>Click Away</code>.</p>
<aside class="quote no-group" data-username="bartblast" data-post="28" data-topic="71830">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/48/17647_2.png" class="avatar"> bartblast:</div>
<blockquote>
<p>I think we’re closer to real usability than it might seem - worth starting to experiment now with migration in mind! <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p>
</blockquote>
</aside>
<p>I plan to work on something like <code>phx</code> generator tasks, but with <code>Ecto.Repo.stream/2</code> instead of list/pagination (load on scroll + notifications support out-of-the-box). However for this to work I need to asynchronously communicate on the server side (for this I need Component Subscription DSL).</p>
<p>My previously mentioned package called <code>dev_joy</code> also waits for an update with <code>hologram</code> support for the very similar reason. It’s not about considering migration, but a real migration, so as said <strong>depending on the case</strong> it’s <strong>unfortunately</strong> <code>not yet</code> production ready.</p>
<p>That’s why instead of just saying <code>no</code> I recommended to look on the <code>Roadmap</code> for the missing features a specific project would need. <img src="https://forum.elixirforum.com/images/emoji/apple/light_bulb.png?v=15" title=":light_bulb:" class="emoji" alt=":light_bulb:" loading="lazy" width="20" height="20"></p>
<p>btw. if you would have even a draft of the plan for the <code>Component Subscription DSL</code> feature then you can send me a pm. I would be definitely interested to comment if it would fit many use cases for background/timer tasks. <img src="https://forum.elixirforum.com/images/emoji/apple/+1.png?v=15" title=":+1:" class="emoji" alt=":+1:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370124" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/30">Post #29</a>
	                </div>
	            </div>
              <div id="likers-container-370124" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370124"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #29"></div>
  </section>
</div>
    <div class="postbit" id="370147" data-post-id="370147">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bartblast" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/120/17647_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bartblast
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Hologram</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="absowoot" data-post="23" data-topic="71830" data-full="true">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/absowoot/48/27268_2.png" class="avatar"> absowoot:</div>
<blockquote>
<p>Maybe it’s just me but I also needed to add <code>"app"</code> to <code>elixirc_paths()</code> in <code>mix.exs</code> otherwise visiting localhost shows the generic phoenix homepage.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defp elixirc_paths(:test), do: ["app", "lib", "test/support"]
defp elixirc_paths(_), do: ["app", "lib"]
</code></pre>
</blockquote>
</aside>
<p>Thanks for bringing this up. This happens because you placed your Hologram code in the <code>app</code> directory, and <code>elixirc_paths/1</code> defines where the Elixir compiler looks for source files. By default, it only includes <code>lib,</code> so adding <code>app</code> tells the compiler to also look there.</p>
<p>This step isn’t strictly necessary if you keep your code in the standard <code>lib</code> directory, but I’ve noticed many people (myself included! <img src="https://forum.elixirforum.com/images/emoji/apple/sweat_smile.png?v=15" title=":sweat_smile:" class="emoji" alt=":sweat_smile:" loading="lazy" width="20" height="20">) prefer organizing Hologram pages/components in a separate app directory. Since this pattern is fairly common, I added it as an optional step in the <a href="https://hologram.page/docs/installation" rel="noopener nofollow ugc">Installation Guide</a>.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370147" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/31">Post #30</a>
	                </div>
	            </div>
              <div id="likers-container-370147" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370147"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #30"></div>
  </section>
</div>
    <div class="postbit" id="370182" data-post-id="370182">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="bartblast" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/bartblast/120/17647_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  bartblast
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Hologram</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks <a href="https://forum.elixirforum.com/u/garrison" rel="nofollow">@garrison</a>, I do see your point about the power that comes with JSX-like syntax - the examples you provided definitely showcase that flexibility.</p>
<p>My main concern, though, is that when developers are given complete freedom (especially those who are unsure about code organization - where to put what), they tend to do some really funky stuff. The example code you showed is actually half the problem - I’ve seen much worse in practice! <img src="https://forum.elixirforum.com/images/emoji/apple/sweat_smile.png?v=15" title=":sweat_smile:" class="emoji" alt=":sweat_smile:" loading="lazy" width="20" height="20"></p>
<p>The template system is my attempt to provide gentle guardrails that nudge developers toward better separation of concerns, even if it means sacrificing some of that raw power you’re advocating for. Once I have reactive primitives like computed properties and effects in place, developers will have proper designated areas for complex logic while keeping templates focused on presentation.</p>
<p>That said, you make compelling arguments and I’m definitely not set in stone on this. If the template approach proves too limiting in practice, the fact that HOLO templates compile to Elixir AST gives me a potential migration path to something more JSX-like down the road.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="370182" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/hologram-v0-5-0-released/71830/32">Post #31</a>
	                </div>
	            </div>
              <div id="likers-container-370182" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="370182"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #31"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/71830/load_more?page=4">Load more posts (4 remaining)</a>
</div></template></turbo-stream>