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


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="drozdzynski" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/drozdzynski/120/7035_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  drozdzynski
                    <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>Version <code>0.2.4</code> released</p>
<p>Changelog:</p>
<ul>
<li>Fix root state update</li>
<li>Remove <code>optional</code> from <code>jason</code> dependency</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="270834" 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/storex-frontend-store-with-the-state-on-the-backend/22145/12">Post #11</a>
	                </div>
	            </div>
              <div id="likers-container-270834" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="270834"
                     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="323385" data-post-id="323385">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="drozdzynski" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/drozdzynski/120/7035_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  drozdzynski
                    <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>Version <code>0.2.5</code> released</p>
<p>Changelog:</p>
<ul>
<li>Fix diff of <code>Date</code> struct</li>
<li>Rewrite tests from <code>Hound</code> to <code>Wallaby</code></li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="323385" 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/storex-frontend-store-with-the-state-on-the-backend/22145/13">Post #12</a>
	                </div>
	            </div>
              <div id="likers-container-323385" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="323385"
                     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="324252" data-post-id="324252">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="drozdzynski" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/drozdzynski/120/7035_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  drozdzynski
                    <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>Version <code>0.3.0</code></p>
<p>Changelog:</p>
<ul>
<li><strong>[BREAKING]</strong> Rename Cowbow handler module from <code>Storex.Socket.Handler</code> to <code>Storex.Handler.Cowboy</code></li>
<li>Add support for Plug based apps <code>plug Storex.Plug</code></li>
<li>Update Storex application supervisor children spec</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="324252" 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/storex-frontend-store-with-the-state-on-the-backend/22145/14">Post #13</a>
	                </div>
	            </div>
              <div id="likers-container-324252" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="324252"
                     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="325213" data-post-id="325213">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Bumped my examples repo.</p>
<p><a href="https://github.com/georgfaust/storex_example_app" class="onebox" target="_blank" rel="noopener nofollow ugc">https://github.com/georgfaust/storex_example_app</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="325213" 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/storex-frontend-store-with-the-state-on-the-backend/22145/15">Post #14</a>
	                </div>
	            </div>
              <div id="likers-container-325213" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="325213"
                     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="327256" data-post-id="327256">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="drozdzynski" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/drozdzynski/120/7035_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  drozdzynski
                    <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>Version <code>0.4.0</code></p>
<ul>
<li><strong>[BREAKING]</strong> <code>Storex.mutate/3</code> is no longer based on <code>session_id</code></li>
<li><strong>[BREAKING]</strong> <code>Store.init/2</code> callback now need to return <code>{:ok, state} | {:ok, state, key} | {:error, reason}</code></li>
<li><strong>[BREAKING]</strong> Remove custom <code>Registry</code> logic</li>
<li><strong>[BREAKING]</strong> Remove <code>connection</code> callback from javascript client</li>
<li>New registry mechanism provides distributed mutations across the cluster</li>
<li>Fix <code>terminate</code> callback in <code>Storex.Handler.Plug</code></li>
<li>Added three callbacks to frontend client <code>onConnected</code>, <code>onError</code> and <code>onDisconnected</code></li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="327256" 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/storex-frontend-store-with-the-state-on-the-backend/22145/16">Post #15</a>
	                </div>
	            </div>
              <div id="likers-container-327256" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="327256"
                     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 #15"></div>
  </section>
</div>
    <div class="postbit" id="337659" data-post-id="337659">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="drozdzynski" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/drozdzynski/120/7035_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  drozdzynski
                    <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>Version <code>0.5.0</code></p>
<ul>
<li><strong>[BREAKING]</strong> Frontend client fully rewritten</li>
<li><strong>[BREAKING]</strong> Updated the minimum required version of Elixir to <code>1.10</code></li>
<li>Added support for non browser environment</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="337659" 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/storex-frontend-store-with-the-state-on-the-backend/22145/17">Post #16</a>
	                </div>
	            </div>
              <div id="likers-container-337659" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="337659"
                     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 #16"></div>
  </section>
</div>
    <div class="postbit" id="344591" data-post-id="344591">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="drozdzynski" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/drozdzynski/120/7035_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  drozdzynski
                    <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>Version <code>0.5.1</code></p>
<ul>
<li>Fix frontend client type for <code>commit</code></li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="344591" 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/storex-frontend-store-with-the-state-on-the-backend/22145/18">Post #17</a>
	                </div>
	            </div>
              <div id="likers-container-344591" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="344591"
                     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 #17"></div>
  </section>
</div>
    <div class="postbit" id="346389" data-post-id="346389">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="drozdzynski" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/drozdzynski/120/7035_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  drozdzynski
                    <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>Version <code>0.6.0</code></p>
<ul>
<li><strong>[BREAKING]</strong> Keys of params in Store are now type <code>binary</code> instead of <code>atom</code></li>
<li>Added message validation with structured casting</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="346389" 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/storex-frontend-store-with-the-state-on-the-backend/22145/19">Post #18</a>
	                </div>
	            </div>
              <div id="likers-container-346389" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="346389"
                     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 #18"></div>
  </section>
</div>
    <div class="postbit" id="346483" data-post-id="346483">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="drozdzynski" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/drozdzynski/120/7035_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  drozdzynski
                    <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>Version <code>0.6.1</code></p>
<ul>
<li>Add missing <code>cast</code> to <code>Storex.Message</code></li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="346483" 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/storex-frontend-store-with-the-state-on-the-backend/22145/20">Post #19</a>
	                </div>
	            </div>
              <div id="likers-container-346483" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="346483"
                     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 #19"></div>
  </section>
</div>
    <div class="postbit" id="394650" data-post-id="394650">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="drozdzynski" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/drozdzynski/120/7035_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  drozdzynski
                    <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>Version <code>0.7.0</code></p>
<ul>
<li><strong>[BREAKING]</strong> Updated the minimum required version of Elixir to <code>1.16</code></li>
<li>Fix type warnings emitted by <code>use Storex.Store</code> on Elixir 1.18 and newer</li>
<li><strong>[BREAKING]</strong> A <code>FunctionClauseError</code> raised inside a mutation that <em>did</em> match is no longer reported to the client as <code>No mutation matching ...</code>. Only the store’s own <code>mutation/5</code> failing to match produces that error; anything else propagates with its original stacktrace, which stops the store process and the socket with it</li>
<li><code>terminate/3</code> is no longer skipped when the store module happens not to be loaded yet. <code>Storex.Store.__terminate__/4</code> gated the call on <code>function_exported?/3</code>, which answers <code>false</code> for an unloaded module, so whether the callback ran depended on the code server rather than on the store</li>
<li>Housekeeping: dropped the unused <code>import Supervisor.Spec, warn: false</code> from <code>Storex.start/2</code> (deprecated since Elixir 1.5, and the <code>warn: false</code> was hiding it) and the <code>registry: Storex.Registry.ETS</code> key from <code>config/config.exs</code> (that module was removed in 0.4.0 and nothing read the key). The project is now formatted, and CI checks it</li>
<li><code>Storex.Registry</code> reads (<code>get_store/2</code>, <code>get_store_pid/2</code>, <code>get_store_instances/1</code>, <code>session_stores/1</code>) now run in the calling process against the <code>:protected</code> ETS table instead of a <code>GenServer.call</code>. The registry process was a global serialisation point — every mutation performs at least one lookup — and the cost grew with the number of connections. Measured at 500 lookups per reader: 98.3ms against 16.2ms with 64 concurrent readers, 335.8ms against 56.2ms with 256. Writes and the <code>:DOWN</code> cleanup still go through the process</li>
<li><strong>[BREAKING]</strong> <code>Storex.mutate/3</code> and <code>Storex.mutate/4</code> return <code>:ok</code>. They used to return whatever the comprehension in <code>Storex.PG.broadcast/1</code> produced, which was the internal broadcast envelope repeated once per node (<code>[broadcast: {:mutate, "Store", "reload", []}]</code>)</li>
<li>Removed the unreachable <code>{:error, _}</code> branch in <code>Storex.PG.broadcast/1</code>. <code>:pg.get_members/2</code> always returns a list; the error tuple was <code>:pg2</code>’s contract, and <code>:pg2</code> support went away in this release</li>
<li>The state a store reports on join is now read by asking the store process (<code>handle_call(:get_state, ...)</code> on the generated <code>Server</code>) instead of <code>:sys.get_state/1</code>, a debug function that was reaching into the process’s internal state shape from the outside on every join. If the process is gone by the time the join reads it, the client now gets an error frame instead of the connection exiting</li>
<li>A client could kill its connection process with a well-formed <code>error</code> frame: <code>Storex.Message.cast/1</code> accepted the shape but <code>Storex.Socket.message_handle/2</code> had no clause for it. <code>error</code> frames only travel server to client, so the shape is no longer accepted and the frame is refused with <code>1007</code> like any other unknown type</li>
<li><code>Storex.Handler.Plug</code> closed a malformed payload with a bare <code>1007</code>, passing the reason as the process exit reason instead of the close payload. It now sends <code>1007</code> with the reason, matching <code>Storex.Handler.Cowboy</code></li>
<li>Removed dead code: <code>Storex.Registry.session_pid/1</code> (no callers, and its <code>:ets.match/2</code> pattern was a 4-tuple against 5-tuple records, so it never matched anything) and <code>Storex.Handler.Cowboy.websocket_init/3</code> (a cowboy 1.x callback, unreachable on cowboy 2.x)</li>
<li><strong>[SECURITY]</strong> The SSR/HTTP path now runs the same store-name checks as the WebSocket path. <code>Storex.HTTP</code> carried its own copy of the resolution logic with only <code>Module.safe_concat/1</code>, missing <code>Code.ensure_compiled/1</code> and the <code>Storex.Store</code> behaviour check, so <code>GET /storex?store=Any.Module&amp;params=%7B%7D</code> called <code>init/2</code> on any loaded module whose name resolved and serialised the result back to the caller. Both transports now share <code>Storex.Store.resolve/1</code></li>
<li><strong>[BREAKING]</strong> <strong>[SECURITY]</strong> <code>Storex.Handler.Cowboy</code> no longer accepts <code>:binary</code> frames. It decoded them with <code>:erlang.binary_to_term/1</code>, which creates atoms out of bytes the client controls — a single 25-byte frame is enough — and passed the resulting term straight to <code>Storex.Socket.message_handle/2</code>, bypassing the <code>Storex.Message.cast/1</code> allowlist every other entry point goes through. Binary frames are now closed with <code>1003</code></li>
<li><code>Storex.Handler.Plug</code> had no clause for <code>:binary</code> frames at all, so one raised <code>FunctionClauseError</code> and closed the connection with <code>1011</code>. It now closes with <code>1003</code> like the cowboy handler</li>
<li><strong>[SECURITY]</strong> A <code>mutation</code> frame is now resolved against the session the server assigned to the connection, not the <code>session</code> field carried by the frame. Any client could previously mutate — and read the resulting diff of — any other session’s store by naming its session id. Mutating other sessions on purpose is what <code>Storex.mutate/3</code> and <code>Storex.mutate/4</code> are for</li>
<li>A <code>mutation</code> for a store the session has not joined now returns an error to the client instead of exiting the connection process</li>
<li>Store processes are now registered through a <code>Registry</code> keyed by <code>{session, store}</code> instead of being named <code>:"#{session}_#{store}"</code>. Session ids are unique per connection, so the old naming created one permanent atom per session-store pair and could exhaust the atom table on a long-running node</li>
<li>Removed the <code>:pg2</code> fallback, unreachable since OTP 24</li>
<li>Updated dependencies</li>
<li>Added <code>Storex.Test</code>, a supported way to drive a store from a test with no socket and no browser. <code>start_store/2</code>, <code>state/1</code>, <code>commit/3</code>, <code>broadcast/4</code> and <code>stop/1</code> cover starting a store (including a store whose <code>init/2</code> refuses), reading its state, running a mutation and getting back the state, the diff and any reply, running a <code>Storex.mutate/3</code> fan-out and applying it, and stopping the store synchronously so a test can assert on what <code>terminate/3</code> did. Until now this meant going through <code>Storex.Supervisor</code> and <code>Storex.Registry</code>, both <code>@moduledoc false</code>, or driving a real browser through Wallaby. The diff is the reason it exists: it is the contract with the frontend and there was no other way to assert on it. A store started this way registers the calling process as its session and is stopped when the test ends</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="394650" 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/storex-frontend-store-with-the-state-on-the-backend/22145/21">Post #20</a>
	                </div>
	            </div>
              <div id="likers-container-394650" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="394650"
                     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>