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


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="waseigo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/waseigo/120/34129_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  waseigo
                    <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>There’s another read who mentioned similar issues with the EU VIES service. Given that I cannot reproduce them (it still works fine here), I’ll modify this part of the book.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="374659" 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/phoenix-product-codex-develop-and-deploy-a-rest-api-for-product-data-management-with-elixir-and-phoenix-self-published-leanpub/70643/32">Post #31</a>
	                </div>
	            </div>
              <div id="likers-container-374659" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="374659"
                     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>
    <div class="postbit" id="379376" data-post-id="379376">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Seems to have not been updated since September <img src="https://forum.elixirforum.com/images/emoji/apple/frowning.png?v=15" title=":frowning:" class="emoji" alt=":frowning:" 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="379376" 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/phoenix-product-codex-develop-and-deploy-a-rest-api-for-product-data-management-with-elixir-and-phoenix-self-published-leanpub/70643/33">Post #32</a>
	                </div>
	            </div>
              <div id="likers-container-379376" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="379376"
                     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 #32"></div>
  </section>
</div>
    <div class="postbit" id="379884" data-post-id="379884">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="waseigo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/waseigo/120/34129_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  waseigo
                    <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>Yeah… sorry about that. Work’s been crazy for the past 6 months, so I haven’t been able to match the schedule I had somewhat established with Northwind Elixir Traders.</p>
<p>I will be able to publish the next chapter in the last week of December though. Thank your for your patience, and for the message!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="379884" 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/phoenix-product-codex-develop-and-deploy-a-rest-api-for-product-data-management-with-elixir-and-phoenix-self-published-leanpub/70643/34">Post #33</a>
	                </div>
	            </div>
              <div id="likers-container-379884" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="379884"
                     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 #33"></div>
  </section>
</div>
    <div class="postbit" id="380651" data-post-id="380651">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380651" 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/phoenix-product-codex-develop-and-deploy-a-rest-api-for-product-data-management-with-elixir-and-phoenix-self-published-leanpub/70643/35">Post #34</a>
	                </div>
	            </div>
              <div id="likers-container-380651" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380651"
                     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 #34"></div>
  </section>
</div>
    <div class="postbit" id="380939" data-post-id="380939">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="waseigo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/waseigo/120/34129_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  waseigo
                    <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, and thank you in advance for your patience!</p>
<p><em>Two</em> new chapters and 53 new pages of <strong>Phoenix Product Codex</strong> are now live on Leanpub.</p>
<p>In Chapters 9 and 10 we take a break from API design and focus on a domain-specific challenge: generating unique codes for variants of a product family, especially in a way that mistake-proofs them against typos. These chapters build on the earlier modeling work (e.g., suppliers, brands, categories, families) and introduce some fun algorithmic problem-solving in Elixir.</p>
<ul>
<li>
<p><strong>Chapter 9: Issuing random variant codes</strong> explores automating code assignment to avoid manual pitfalls like sequential or keyboard-adjacent errors that could mess up offers, invoicing, or orders. We start with criteria for uniqueness and typo-resistance, implement queries in a new <code>VariantCodes</code> module, and try out a brute-force approach of randomly “rolling the dice”. Performance is abysmal, and so we set the stage for a more sophisticated approach, with more constraints.</p>
</li>
<li>
<p><strong>Chapter 10: Generating unique variant codes with a Markov Chain</strong> pivots to using a Markov Chain for probabilistically selecting sequences of transitions between the character of the code using weighted sampling. We incorporate more penalties, including one that uses a new <code>Keyboard</code> module to penalize transitions that include characters that are keyboard-adjacent. This helps reduce the likelihood of “fat-fingering” a code. We also build in a feature that weakens the penalties based on the “degree of depletion” of the pool of available codes for a product family. This means that code generation becomes less and less picky as the pool is gradually depleted over days or months (or years) of creating new variants. Here, we optimize queries, handle edge cases, integrate the result into <code>Variant.changeset/2</code> so that a <code>:code</code> value is automatically generated if not manually provided. Finally, we run a few benchmarks and look at the pretty good (to excellent) performance of this approach, while also noting some of its shortcomings.</p>
</li>
</ul>
<p><strong>Chapter 11</strong> is already in the works, and brings us back into API design. We’ll get into the new <strong>Content</strong> domain, in which we use use tables for storing metadata for different entity types, such as multilingual marketing and invoice descriptions, variant availability and status. In the <strong>Taxonomy</strong> domain, we’ll make it possible to tag records so that API consumers can filter collections by attributes, such as showing all families or variants that comply with ATEX regulations, variants in stainless steel, etc. This will become important for enabling facet search.</p>
<p>I wish you all a great start to 2026!</p>
<p>Cheers from Athens, Greece,<br>
Isaak Tsalicoglou</p>
<aside class="onebox allowlistedgeneric" data-onebox-src="https://overbring.com/">
  <header class="source">

      <a href="https://overbring.com/" target="_blank" rel="noopener nofollow ugc">overbring.com</a>
  </header>

  <article class="onebox-body">
    <div class="aspect-image" style="--aspect-ratio:690/361;"><img src="https://overbring.com/images/ogbanner.png" class="thumbnail" alt="" width="690" height="362"></div>

<h3><a href="https://overbring.com/" target="_blank" rel="noopener nofollow ugc">OVERBRING Labs</a></h3>

  <p>An engineer's adventures in business, product development, Elixir, and writing books</p>


  </article>

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

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

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="380939" 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/phoenix-product-codex-develop-and-deploy-a-rest-api-for-product-data-management-with-elixir-and-phoenix-self-published-leanpub/70643/36">Post #35</a>
	                </div>
	            </div>
              <div id="likers-container-380939" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="380939"
                     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 #35"></div>
  </section>
</div>
    <div class="postbit" id="387732" data-post-id="387732">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>When will next update be? <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="387732" 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/phoenix-product-codex-develop-and-deploy-a-rest-api-for-product-data-management-with-elixir-and-phoenix-self-published-leanpub/70643/37">Post #36</a>
	                </div>
	            </div>
              <div id="likers-container-387732" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="387732"
                     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 #36"></div>
  </section>
</div>
    <div class="postbit" id="387932" data-post-id="387932">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="waseigo" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/waseigo/120/34129_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  waseigo
                    <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>I’m really sorry, I know I’ve lapsed with my schedule. Work has been crazy, as I’ve been porting <a href="https://breek.gr/en" rel="noopener nofollow ugc">Breek.gr</a> from PHP and NextJS to Elixir and Phoenix / Phoenix LiveView. And it’s been going great, but with many long days and nights.</p>
<p>We have an exhibition mid-May, and after that things get easier again, so I can have an update by end of May.</p>
<p>Again, apologies for the slow updates… the work on Northwind Elixir Traders brought Elixir work, and Elixir work displaced a lot of previously-free time I had to devote to regular updates to writing exploratory-learning Elixir books.</p>
<p>The upside is that I’ve written a lot of Phoenix code over the past 6 months, and so a lot of the work that would have taken me a long time to discover from scratch for Phoenix Product Codex is now already done.</p>
<p>One thing I can say is that I guarantee that the book will be completed. I never leave things unfinished, but I do want to deliver a solid product. Plus, summer is approaching, and that’s when I have a lot of free time that I will be devoting to PPC and to a couple of other books that I haven’t announced widely yet!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="387932" 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/phoenix-product-codex-develop-and-deploy-a-rest-api-for-product-data-management-with-elixir-and-phoenix-self-published-leanpub/70643/38">Post #37</a>
	                </div>
	            </div>
              <div id="likers-container-387932" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="387932"
                     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>