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


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mcass19" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mcass19/120/28689_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mcass19
                    <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>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hello again everyone!</p>
<p>Made a little write up about where we stand: <a href="https://mcass19.dev/posts/2026-06-15-tuis-everywhere" class="inline-onebox" rel="noopener nofollow ugc">TUIs everywhere | mcass19</a> + announcing my talk at <a href="https://codebeameurope.com/talks/tuis-everywhere/" class="inline-onebox" rel="noopener nofollow ugc">Code BEAM Europe</a> <img src="https://forum.elixirforum.com/images/emoji/apple/partying_face.png?v=15" title=":partying_face:" class="emoji" alt=":partying_face:" 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="390225" 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/exratatui-elixir-bindings-for-the-rust-ratatui-terminal-ui-library/74403/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-390225" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390225"
                     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 #11"></div>
  </section>
</div>
    <div class="postbit" id="390479" data-post-id="390479">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hey,</p>
<p>I copy pasted the code in your OP into iex and I counted 30 up arrow presses, but got only 25 in the counter. It seems to be dropping some events from the poll… I also created a standalone app, where I can reproduce the issue: if I type hello world I might get “helo wld” echoed dropping a few chars.</p>
<p>I’m pretty sure I’m missing something obvious.</p>
<aside class="onebox githubgist" data-onebox-src="https://gist.github.com/shashi/8ac12e1bab63c3cf2baa77d4c9ea682f">
  <header class="source">

      <a href="https://gist.github.com/shashi/8ac12e1bab63c3cf2baa77d4c9ea682f" target="_blank" rel="noopener nofollow ugc">gist.github.com</a>
  </header>

  <article class="onebox-body">
    <h4><a href="https://gist.github.com/shashi/8ac12e1bab63c3cf2baa77d4c9ea682f" target="_blank" rel="noopener nofollow ugc">https://gist.github.com/shashi/8ac12e1bab63c3cf2baa77d4c9ea682f</a></h4>

  <h5>echo_chat.exs</h5>
  <pre><code class="Elixir">
Mix.install([{:ex_ratatui, "~&gt; 0.11"}])

defmodule EchoChat do
  alias ExRatatui.Layout
  alias ExRatatui.Layout.Rect
  alias ExRatatui.Style
  alias ExRatatui.Widgets.{Block, Paragraph}
  alias ExRatatui.Event.{Key, Paste, Resize}
</code></pre>
   This file has been truncated. <a href="https://gist.github.com/shashi/8ac12e1bab63c3cf2baa77d4c9ea682f" target="_blank" rel="noopener nofollow ugc">show original</a>


  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>

<p>Shashi</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="390479" 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/exratatui-elixir-bindings-for-the-rust-ratatui-terminal-ui-library/74403/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-390479" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390479"
                     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 #12"></div>
  </section>
</div>
    <div class="postbit" id="390501" data-post-id="390501">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mcass19" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mcass19/120/28689_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mcass19
                    <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>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hi <a class="mention" href="/u/shashi" rel="nofollow">@shashi</a> , thanks for trying out the library!</p>
<p>And thanks for the clean repro. This isn’t poll_event losing events, it’s two readers competing for the same stdin.</p>
<p>When you run inside iex, the BEAM’s own terminal driver (the iex shell’s line reader) reads stdin continuously, even while our loop is running. ex_ratatui’s poll path (crossterm) reads the same file descriptor directly. In raw mode each keystroke byte goes to whichever read() grabs it first, so under fast input some bytes get swallowed by the shell reader and never reach the TUI. You can usually even see those swallowed keystrokes land at the iex prompt once you quit the TUI.</p>
<p>Try to run it outside the interactive shell with e.g.: <code>elixir echo_chat.exs</code>, and verify if you keep seeing chars being dropped.</p>
<p>This is a structural iex BEAM-TUI gotcha rather than an issue in the polling code, but it clearly needs documenting up front. So thanks a ton for this. For anything beyond a quick local iex the library is built to run as a proper process. Under a supervisor, as a release/escript, or served remotely over SSH or Erlang distribution. None of those share stdin with an interactive shell, so the race simply can’t happen.</p>
<p>Please let me know if anything’s unclear or you have any other questions. Thank you a lot again!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="390501" 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/exratatui-elixir-bindings-for-the-rust-ratatui-terminal-ui-library/74403/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-390501" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390501"
                     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 #13"></div>
  </section>
</div>
    <div class="postbit" id="390579" data-post-id="390579">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mcass19" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mcass19/120/28689_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mcass19
                    <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>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><strong>Update</strong>: fixed in <a href="https://github.com/mcass19/ex_ratatui/releases/tag/v0.11.1" rel="noopener nofollow ugc">0.11.1</a>!</p>
<p>The cause was a race over stdin: when running locally (iex but also just elixir or mix run), the BEAM’s own tty reader and crossterm were both pulling from the terminal, so some keys went to the BEAM and never reached the poll loop, causing the dropped arrows/characters.</p>
<p>We now hand the local tty off to crossterm so there’s a single reader. It only kicks in automatically on the :local backend, so no code changes are needed and it doesn’t affect any other transport.</p>
<p>Let me know if you still see drops after upgrading, or if you have any other questions or feedback. Thank you again <a class="mention" href="/u/shashi" rel="nofollow">@shashi</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="390579" data-batch-url="/posts/batch_likers">
                        3
                      </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/exratatui-elixir-bindings-for-the-rust-ratatui-terminal-ui-library/74403/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-390579" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390579"
                     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 #14"></div>
  </section>
</div>
    <div class="postbit" id="392760" data-post-id="392760">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mcass19" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mcass19/120/28689_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mcass19
                    <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>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hello everyone!</p>
<p><strong><a href="https://github.com/mcass19/ex_ratatui/releases/tag/v0.12.0" rel="noopener nofollow ugc">0.12</a></strong> is out. Headline: the precompiled linux musl NIFs are now truly self-contained. They used to depend on <code>libgcc_s</code>, which stock musl systems (Alpine containers, embedded rootfs…) don’t have, so the NIF failed to load right where you’d most want a precompiled binary. Verified on actual hardware! Details in the changelog. Plus some smaller fixes and improvements.</p>
<p><strong><a href="https://github.com/mcass19/ex_ratatui/releases/tag/v0.13.0" rel="noopener nofollow ugc">0.13</a></strong> brings Burrito support! Run <code>mix ex_ratatui.gen.burrito</code> and your TUI builds as a single self-contained executable for linux, macOS and windows. End users download one file and run it, no Elixir install needed. There’s a new packaging guide, a reference demo in the repo, and <code>--ci github</code> scaffolds a workflow that publishes the binaries to GitHub Releases on every tag. So really: one mix task away from handing out your TUI as an executable.</p>
<p>As always, if you give something a try and issues/feedback/ideas appears, please let me know!</p>
<p>Meanwhile… I slowly started building a demo or two for the Code BEAM Europe talk. Looking good <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="392760" 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/exratatui-elixir-bindings-for-the-rust-ratatui-terminal-ui-library/74403/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-392760" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="392760"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>