<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="372814" data-post-id="372814">
  <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
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="plcholder" data-post="68" data-topic="70887">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/plcholder/48/38919_2.png" class="avatar"> plcholder:</div>
<blockquote>
<p>1k writes a second “limit” seems quite low actually</p>
</blockquote>
</aside>
<p>On a per-tenant basis, this limit seems pretty generous, no? Except if the tenant represents an organization with multiple users. And even then, for frequent writes it makes more sense to handle this with Mnesia and periodically dump to disk for persistence. Or (neater), have a separate repo backed by an SQLite db to which you periodically dump from Mnesia. Perhaps even empty Mnesia when you dump, and then write a module that fetches from “hot” (Mnesia) for recent events, or “cold” (for older events), or both, if the query spans both.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="372814" 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/northwind-elixir-traders-pragprog/70887/72">Post #71</a>
	                </div>
	            </div>
              <div id="likers-container-372814" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="372814"
                     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 #71"></div>
  </section>
</div>
    <div class="postbit" id="372816" data-post-id="372816">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I wasnt thinking of it as a per tenant basis when I wrote the statement, but you are right 1k per-t is generous and also didnt think of using mnesia</p>
<p>something like a reddit clone could be trivially made, tie a sub reddit to a tenant + mnesia. The beam is really powerful, feels like cheating…..</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="372816" 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/northwind-elixir-traders-pragprog/70887/73">Post #72</a>
	                </div>
	            </div>
              <div id="likers-container-372816" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="372816"
                     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 #72"></div>
  </section>
</div>
    <div class="postbit" id="383971" data-post-id="383971">
  <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
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p></p><div class="lightbox-wrapper"><a class="lightbox" href="https://forum.elixirforum.com/uploads/default/original/3X/f/d/fd26b8e59dbb5fff34d23f7e61ea11708d6bf512.jpeg" data-download-href="https://forum.elixirforum.com/uploads/default/fd26b8e59dbb5fff34d23f7e61ea11708d6bf512" title="image" rel="nofollow"><img src="https://forum.elixirforum.com/uploads/default/original/3X/f/d/fd26b8e59dbb5fff34d23f7e61ea11708d6bf512.jpeg" alt="image" data-base62-sha1="A7tLfouwYVXfbjYkyheiOMeDrDc" width="526" height="522"><div class="meta"><svg class="fa d-icon d-icon-far-image svg-icon" aria-hidden="true"><use href="#far-image"></use></svg><span class="filename">image</span><span class="informations">526×522 37.9 KB</span><svg class="fa d-icon d-icon-discourse-expand svg-icon" aria-hidden="true"><use href="#discourse-expand"></use></svg></div></a></div><p></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="383971" data-batch-url="/posts/batch_likers">
                        8
                      </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/northwind-elixir-traders-pragprog/70887/74">Post #73</a>
	                </div>
	            </div>
              <div id="likers-container-383971" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="383971"
                     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 #73"></div>
  </section>
</div>
    <div class="postbit" id="387936" data-post-id="387936">
  <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
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hello everyone. I was checking in after a long time to write a status update for Phoenix Product Codex, and thought I’d share some things I did over the past 4 months while porting <a href="https://breek.gr/en" rel="noopener nofollow ugc">Breek.gr</a> to Elixir and Phoenix / Phoenix LiveView (not yet done, but well underway, which is why I’ve had to set book-writing aside for a while).</p>
<p>So, long story short:</p>
<p>Breek.gr is implemented in PHP for the backend, with Wordpress and the ACF plugin as a headless CMS, with a MySQL database, as one does with Wordpress. The frontend is in NextJS and TypeScript. When I was delivered v1.0 by the external developers 2 years ago, it was in NextJS and mostly TypeScript with the typical “any” garbage.  All was well for the first year of operations though. Things were passably fast.</p>
<p>I spent 7 months cleaning up the mess that contract developers typically deliver, primarily insane code duplication on both the frontend and the backend, which meant that fixing a bug here needed fixing in 5 or 10 other places. I reached v2.0 with passably cleaned-up codebases and kept developing point releases, burning down technical debt and features that initially the external contracts would have implemented, had they not bumped their hourly rate by ~40% overnight – which is why I took it upon myself.</p>
<p>Things were still good in the rest of 2024 and the first half of 2025, and then we got an influx of interested users in mid-2025 as the market matured. Things were still good in terms of performance in Q3 of 2025. And then we got a lot of new records.</p>
<p>And the wp_users and wp_posts grew and grew. But most importantly: the wp_postmeta table exploded. The table’s EAV approach led to long table scans, plus the fact that the business domain shows a lot of interconnected records’s data (especially in list views) meant that the original sin of N+1 queries caught up with us.</p>
<p>Additionally, I got sick and tired of having to duplicate parts of the business logic on the frontend and the backend, and of the JSON ping-pong between PHP and NextJS.</p>
<p>So I thought… what if I could read the MySQL database from Elixir?</p>
<p>Obviously possible. Set up an Ecto repo with the MyXQL adapter and it’s possible.</p>
<p>And then I thought… how can I load a WP_Post’s data and all its associated ACF fields’ data into Elixir, as proper structs?</p>
<p>So I wrote an Elixir module that parses the JSON that ACF generates with its configuration for post types and fields and field types etc., and a GenServer that periodically fetches and caches that JSON payload from the PHP REST API.</p>
<p>And then I wrote code to parse all those special ACF fields (datetime, date, etc.) into proper Elixir data types, and took all this and shoved it into an <code>:acf</code> text field, JSON-encoded, of two new structs:</p>
<ol>
<li><code>%MigratedPost{}</code> on the <code>migrated_posts</code> table.</li>
<li><code>%MigratedUser{}</code> on the <code>migrated_users</code> table.</li>
</ol>
<p>Those are in an ephemeral SQLite database. The WP_User/WP_Post key data (user_email, user_login, ID, post_type, post_modified, etc.) are proper fields/columns, but all the ACF fields are under <code>%{data: %{acf: acf}}</code>, and with custom Ecto types and the ACF field parsing are shown as proper Elixir data when any of those records are loaded.</p>
<p>Then I thought… let’s connect to the Redis instance (that I used for caching DTOs from PHP to get around the increasingly slow data-fetching) on the VPS running Wordpress and do this:</p>
<ul>
<li>When a WP_User or WP_Post is inserted or updated (or any of its fields are modified), we use Wordpress hooks to publish an event to topics/channels that the Elixir app subscribes to.</li>
<li>The Elixir app picks those up and uses Oban workers to enqueue upserts to the appropriate table. This gets around the write contention issue of SQLite.</li>
</ul>
<p>With this done, and a GenServer periodically running <code>OnDemandMigrator.sync/0</code> to make sure that nothing is missing, what we end up with is a <em>very</em> fast “document store” on which I then run various Ecto queries with <code>fragment()</code> and using SQLite’s <code>JSON_EXTRACT</code> and other JSON-related functions to perform proper JOINs.</p>
<p>With proper Ecto queries, was then able to start implementing a “sister backend” with Phoenix 1.8. Properly implemented <code>%Scope{}</code> mechanism, used a plug to re-use the JWT that the PHP backend issues.</p>
<p>Queries were so fast that I was able to generate a “fat scope” containing the <code>:id</code> values of records of different entity tupes that a user has access to within <strong>70 ms</strong>.</p>
<p>Then it was time for the list views, and getting rid of the N+1 query problem. Eventually I landed on using the <em>registry pattern</em> and writing Elixir modules to selectively preload only parts of the <code>:acf</code> map, for those cases when I don’t need all data from a WP_Post (now a <code>%MigratedPost{}</code>) or from a WP_User (now a <code>%MigratedUser{}</code>).</p>
<p>Indicative example for one of the heaviest list views that pulls in tons of associated records’ data: it went from 18 (!) seconds for a certain number of items shown, down to around 500 ms (!). If you’re wondering about the 18 seconds? Abysmal, but probably a combination of the PHP code being wasteful with <code>get_post()</code> and <code>get_field()</code>, and of the <code>wp_postmeta</code> table having grown to 700’000 rows by then.</p>
<p>The Phoenix LiveDashboard was instrumental in profiling how my attempts at bringing down these timings went.</p>
<p>We’ve been live for 3-4 months now with this setup, and it’s been amazing. All new features are implemented in Elixir and Phoenix, still serving the NextJS app alongside the (increasingly) legacy PHP backend, that now serves most writes.</p>
<p>I say “most writes” and not “all writes”, because I took it one step further: with <code>POST</code>/<code>PATCH</code>/<code>DELETE</code> route handlers (accessible only by the Elixir app with proper authentication) on the PHP side, and with Ecto embedded schemas on the Elixir side, plus with a “facade”  <code>WpBreexRepo</code> that is a fake repo with a similar API to an <code>Ecto.Repo</code>, I now increasingly write to MySQL via HTTP calls, <em>after</em> passing e.g. a <code>%Property{}</code> Ecto schema through its scoped <code>changeset</code> function, which gives me typical Elixir/Ecto developer ergonomics, without worrying about how the writes happen. The PHP route handlers perform all the Wordpress/ACF-specific stuff using the proper way; otherwise, I’d need to write Elixir code that writes to MySQL’s tables in a way that satisfies both Wordpress and ACF. And since I’m going to ditch everything for Elixir, Phoenix and Phoenix LiveView eventually, that would be a waste of time.</p>
<p>So, here we are now. Strangler fig pattern, more-than-decently-fast loading times on the frontend thanks to the SQLite “document store” that is always updated via PubSub events triggering Oban workers performing upserts.</p>
<p>It works well, and SQLite saved the day.</p>
<p>Does it mean that this would not have been possible with PostgreSQL or MySQL and Elixir? Clearly, no. But there’s something nice about being able to podman-containerize the entire app, and have it initialize its own ephemeral SQLite database, without network roundtrips to a database server (other than the initial sync from MySQL to SQLite).</p>
<p>There’s another upside: it’s possible to scale this horizontally. <code>caddy</code> round-robin load-balancing across two or more instances of the Elixir/Phoenix app, each with its own SQLite database that gets updated through the same PubSub/Oban/upsert path.</p>
<p>It hasn’t been needed so far, and for sure by the time such horizontal scaling will be needed I will have already ported everything to Elixir, including the web app, and gotten rid of:</p>
<p>Wordpress as a headless CMS: decent choice for an MVP or v1.0 or until you reach PMF, but awful after that. And if you’re going to manage non-EAV non-Wordpress tables, what’s the point of running the backend in PHP?</p>
<p>ACF PRO as an annual $49 subscription: decent choice and cheap too. Very nice admin and development ergonomics, huge flexibility while the business domain and the feature set evolves. However, the more you buy into ACF PRO’s features (e.g., repeater fields), the more you stray away from the inflection point when the business domain modeling is solid enough that you could implement a proper database ERD with Ecto and your choice of database. That’s the next step for us, and already underway, with time split between developing and proofing new customer-led features, and gradually building a proper database schema in Elixir with Ecto and PostgreSQL–something that’s possible in parallel to the rest of the SQLite/Oban/etc. state, because adding another Ecto repo with PSQL and periodically building out the Ecto schemas and gradually migrating data is super simple with Elixir and Ecto.</p>
<p>NextJS and TypeScript: I kinda like those, and don’t get why many people complain that much. We run this on a VPS with PM2, no Vercel dependency at all. It runs well. Downside: breakage with every major version, because Vercel is moving the chairs around. And I certainly won’t miss having to define interfaces and types everywhere, even though this made a huge improvement to the quality of the web app between v1.0 and v2.0. Biggest downside though: <code>next dev</code> is <em>awfully</em>, terribly slow as the app grows. The comparison to the DX of writing Phoenix LiveViews is night and day.</p>
<p>JSON ping-pong and a crappy REST API: I’m tired of the frontend-backend split. Tired of not having plugs and pipelines, tired of duplicating large parts of the business logic between frontend forms and the backend route handlers, tired of the asynchronous nature of it all, of <code>useSWR</code> and checking whether what we received conforms to the “contract” of the interface, tired of synchronizing interfaces with what the growing backend delivers.</p>
<p>Two codebases: I’m also tired of having a Codium window open for the NextJS codebase (and the periodic crashes of <code>next dev</code> after long coding sessions), one window for the PHP codebase with a terminal that periodically <code>rsync</code>s the custom plugin’s code tree to the dev VM, and one Bruno window for testing the PHP rest API. Tired of not having IEx available to try things out on the fly, of waiting things to sync or recompile, or of the frontend periodically hitting the backend to see if e.g. there are new notifications available. All those things are a child’s play with Phoenix PubSub, LiveViews and LiveComponents. Coming back to the PHP and NextJS codebases after writing Elixir feels like I’m time-traveling to the past.</p>
<p>When this rewrite finishes, we will end up with a single codebase, written in a single language, easier to maintain, easier to debug, easier to monitor (thanks, LiveDashboard and <code>Telemetry</code>!), easier to test emails with Swoosh (though Mailpit, which I’m self-hosting is awesome), faster to build, more responsive to user clicks, easier to update the UI with notifications and toasts… I can keep going on.</p>
<p>And by that time, we won’t be using SQLite anymore. But hey–it really saves our bacon right now, right when we have started reaching PMF / market traction.</p>
<p>Thanks to everyone working on Elixir, Ecto, Phoenix, Req, and all the other parts of this amazing ecosystem! Getting into Elixir back in 2022 is one of the best decisions I’ve ever made; a seminal moment equal in importance to getting into Linux in 1997 and into self-hosting in 2001. One of the best investments of time ever made. For me, at least.</p>
<p>(And yeah, writing Northwind Elixir Traders was instrumental in this journey!)</p>
<p>Edit: before anyone asks “why Wordpress? If PHP, why not Laravel? Why NextJS/React? Why not Elixir from the start?”… the simple answer is: because we operate in the Greek market and wanted to keep development here to make communications smoother, and the Greek market is chock-full of PHP (mostly Wordpress, for e-shops etc.) and JavaScript programmers. Hindsight is 20/20, and in retrospect the decision was perhaps short-sighted. Then again, the flexibility that Wordpress and ACF afforded was immense, while we were learning about the business domain. The supposed speed-up of development by decoupling the backend from the frontend never materialized though. It all turned into transaction costs and into a frontend tightly coupled to the backend. Whereas now, with a proper Elixir/Phoenix app and context modules that are used for both a REST API and the Phoenix LiveViews, we get a proper REST API that can be opened to “enterprise” customers, and as little code duplication as possible.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="387936" 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/northwind-elixir-traders-pragprog/70887/75">Post #74</a>
	                </div>
	            </div>
              <div id="likers-container-387936" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="387936"
                     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 #74"></div>
  </section>
</div>
    <div class="postbit" id="391169" data-post-id="391169">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/waseigo" rel="nofollow">@waseigo</a> Hi, I bought the book from PragProg today but it didn’t have a proper TOC.</p>
<p>So, I made the TOC clickable. The only downside is that it’s clickable in the sidebar but not in the TOC pages.</p>
<p>I already sent an email with an updated book to you.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="391169" 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/northwind-elixir-traders-pragprog/70887/76">Post #75</a>
	                </div>
	            </div>
              <div id="likers-container-391169" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="391169"
                     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 #75"></div>
  </section>
</div>
    <div class="postbit" id="391177" data-post-id="391177">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I look forward to reading this one in the near future.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="391177" 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/northwind-elixir-traders-pragprog/70887/77">Post #76</a>
	                </div>
	            </div>
              <div id="likers-container-391177" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="391177"
                     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 #76"></div>
  </section>
</div>
    <div class="postbit" id="391825" data-post-id="391825">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hi all, I recently published an early release of bindings to <a href="https://github.com/tursodatabase/turso" rel="noopener nofollow ugc">Turso</a>, a modern re-implementation of SQLite in Rust (see my <a href="https://forum.elixirforum.com/t/turxo-bindings-to-the-turso-database/76080" rel="nofollow">post</a> for more details.) I’d love any feedback that you may have.</p>
<aside class="onebox allowlistedgeneric" data-onebox-src="https://hex.pm/packages/turxo">
  <header class="source">
      <img src="https://hex.pm/images/hex-full-a8183c4f9adac71516516d107d402b18.svg?vsn=d" class="site-icon" alt="" width="136" height="120">

      <a href="https://hex.pm/packages/turxo" target="_blank" rel="noopener nofollow">Hex</a>
  </header>

  <article class="onebox-body">
    <img width="160" height="160" src="https://hex.pm/images/favicon-160-3770bc59f1f8ba7656b4db5a1eacd8e3.png?vsn=d" class="thumbnail onebox-avatar" alt="">

<h3><a href="https://hex.pm/packages/turxo" target="_blank" rel="noopener nofollow">turxo</a></h3>

  <p>Elixir driver for the Turso database</p>


  </article>

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

  <div style="clear: both"></div>
</aside>
<aside class="onebox githubrepo" data-onebox-src="https://github.com/Benjamin-Philip/turxo">
  <header class="source">

      <a href="https://github.com/Benjamin-Philip/turxo" target="_blank" rel="noopener nofollow ugc">github.com</a>
  </header>

  <article class="onebox-body">
    <div class="github-row" data-github-private-repo="false">
  <img width="690" height="344" src="https://opengraph.githubassets.com/ff77456b8f77260a0d220d271b1b58ab/Benjamin-Philip/turxo" class="thumbnail">

  <h3><a href="https://github.com/Benjamin-Philip/turxo" target="_blank" rel="noopener nofollow ugc">GitHub - Benjamin-Philip/turxo: Elixir driver for the Turso database</a></h3>

    <p><span class="github-repo-description">Elixir driver for the Turso database</span></p>
</div>

  </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="391825" 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/northwind-elixir-traders-pragprog/70887/78">Post #77</a>
	                </div>
	            </div>
              <div id="likers-container-391825" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="391825"
                     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>