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


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jallum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jallum/120/38850_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jallum
                    <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>TIL: Erlang’s :dets is written entirely in Erlang. For whatever reason, I thought it was going to be written in native code. Nope. <img src="https://forum.elixirforum.com/images/emoji/apple/thinking.png?v=15" title=":thinking:" class="emoji" alt=":thinking:" 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="374075" 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/bedrock-a-scaleable-distributed-key-value-database-with-better-than-acid-guarantees/72038/62">Post #61</a>
	                </div>
	            </div>
              <div id="likers-container-374075" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="374075"
                     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 #61"></div>
  </section>
</div>
    <div class="postbit" id="374089" data-post-id="374089">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="garrison" data-post="56" data-topic="72038">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>I have begun to doubt my own argument in favor of <code>transact()</code> here I think. Gonna have to spend more time on this one.</p>
</blockquote>
</aside>
<p>I spent more time on it and I have changed my mind.</p>
<p>The underlying cause of the double <code>{:ok, {:error, "foo"}}</code> situation is the coercion of <code>throw/catch</code>-style control flow back into <code>case</code>-style control flow. The reason for this is that RDBMS generally trigger a rollback on constraint violations by default so Ecto has to exist within that abstraction. This is the cause of all sorts of weird edge cases I had never thought deeply about. E.g. what if you catch a constraint with a Changeset? The transaction is still aborted but can continue by ignoring further operations. If you think about it this behavior is actually insane.</p>
<p>Where it gets interesting is with nested transactions. It turns out that <code>throw/catch</code>-style control flow is very useful here because if a constraint is violated you want to pop <em>all</em> the way out of the stack. Retrying only the nested part of a nested transaction makes no semantic sense because transactions are run on a snapshot which will simply violate the constraint again. So you need to retry from the beginning (at a new snapshot).</p>
<p>So why not “use the platform”? I don’t need a <code>rollback()</code> function if I can just <code>raise</code>. Then I can write my own retry loop around <code>transaction()</code> with a <code>try/rescue</code>. In order to write a unified retry loop this implies that the KV layer needs to raise on commit failures as well.</p>
<p>Putting it all together, I am now favoring a stripped-down <code>transaction!()</code> API which spits out its return value verbatim and raises on failure.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">Repo.transaction!(fn -&gt;
  Repo.put("foo", "bar")
  "foo"
end)
|&gt; case do
  "foo" -&gt; :ok
end
</code></pre>
<p>There could then be a <code>transaction()</code> which has the old (tuple wrapping) behavior but the raising version would be strongly favored for retry loops. I also considered whether the retry loop behavior belongs in the KV layer but, at least in my case, I don’t think so. How to retry is going to be intimately married to how constraints are implemented which is behavior that belongs in higher layers. In my case I intend to work with layers myself so I can always move the abstractions around if I turn out to be wrong about this. But I think of the KV layer as a “pro tool”.</p>
<p>For Bedrock maybe you are interested in exposing a more friendly API to users, in which case perhaps you would want to provide a retry loop out of the box.</p>
<p>Either way, I retract my argument in favor of <code>transact()</code>. My instinct was that lessons from Ecto apply here but I no longer believe that’s the case. The concept of “rollbacks” can be thrown away entirely.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="374089" 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/bedrock-a-scaleable-distributed-key-value-database-with-better-than-acid-guarantees/72038/63">Post #62</a>
	                </div>
	            </div>
              <div id="likers-container-374089" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="374089"
                     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 #62"></div>
  </section>
</div>
    <div class="postbit" id="374102" data-post-id="374102">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="garrison" data-post="63" data-topic="72038">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>considered whether the retry loop behavior belongs in the KV layer but, at least in my case, I don’t think so. How to retry is going to be intimately married to how constraints are implemented which is behavior that belongs in higher layers</p>
</blockquote>
</aside>
<p>I agree that the retry should be client side, at the layer if you will. But for what it’s worth, in the rare occasion I’ve needed a change in retry semantics at a higher level layer, I’ve made sure my invariant is represented by a set of keys in the DB and relied upon key conflict errors to drive my retries, adding explicit conflicts if necessary, but usually not.</p>
<p>In other words I’ve never personally found myself wanting a retry aside from the behavior that’s recommended for FDB clients by FDB API itself. Maybe there are other cases though. Just adding my experiences.</p>
<p>Regarding rollback, thank you for sharing your thoughts. I’ve never been able to apply rollback to my mental model of FDB style transactions, and appreciate you putting words to my intuition.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="374102" 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/bedrock-a-scaleable-distributed-key-value-database-with-better-than-acid-guarantees/72038/64">Post #63</a>
	                </div>
	            </div>
              <div id="likers-container-374102" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="374102"
                     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 #63"></div>
  </section>
</div>
    <div class="postbit" id="374103" data-post-id="374103">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="jstimps" data-post="64" data-topic="72038">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jstimps/48/41062_2.png" class="avatar"> jstimps:</div>
<blockquote>
<p>In other words I’ve never personally found myself wanting a retry aside from the behavior that’s recommended for FDB clients by FDB API itself.</p>
</blockquote>
</aside>
<p>The salient point here is that retries are something which are inherently tied to higher-level behavior. Some constraints might be retryable, like taking a lock, and some might not, like reserving a username, which is likely to remain reserved even if you retry. You might think of that latter case as having its retry loop in the human layer <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p>
<p>I think by using exceptions I can then funnel all of the different failure cases (network failure, key conflict, constraint failure, arbitrary application failure) through the same code path. The loop can decide which errors should be retried and which should not. I think this may end up being semantic at the <em>application</em> level. Therefore I don’t think the KV layer is the best place to worry about such things. It can just <code>raise</code>. Like I said, “pro tool”.</p>
<aside class="quote no-group" data-username="jstimps" data-post="64" data-topic="72038">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jstimps/48/41062_2.png" class="avatar"> jstimps:</div>
<blockquote>
<p>I’ve made sure my invariant is represented by a set of keys in the DB and relied upon key conflict errors to drive my retries, adding explicit conflicts if necessary, but usually not.</p>
</blockquote>
</aside>
<p>I’m not sure if I understand what you mean here (an example might help).</p>
<p>But have you considered that you are allowing your application code to be shoved into an FDB-shaped (key conflict) hole when really the control should run the other way?</p>
<aside class="quote no-group" data-username="jstimps" data-post="64" data-topic="72038">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jstimps/48/41062_2.png" class="avatar"> jstimps:</div>
<blockquote>
<p>I’ve never been able to apply rollback to my mental model of FDB style transactions</p>
</blockquote>
</aside>
<p>I don’t even think it’s the write buffering that’s the problem. Rolling back a transaction on constraint failure just doesn’t even make sense. What if I <em>don’t want</em> to roll back? Am I supposed to read the row first and emulate the constraint myself? Constraints literally exist so I don’t have to do that! Because it doesn’t even work under READ COMMITTED! I suppose this is just how 50+ years of accumulated mistakes shape up.</p>
<p>BTW, buffering writes as FDB does is an old technique. In Andy Pavlo’s courses I recall the term “private workspace” being used (though that could also be on a server). I’m pretty sure Spanner used this approach as well (with a thick client). And many more throughout history I assume.</p>
<p>IIRC one of the Spanner papers specifically mentions they don’t have RYW. As if it’s a good thing, too, which I find quite funny.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="374103" 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/bedrock-a-scaleable-distributed-key-value-database-with-better-than-acid-guarantees/72038/65">Post #64</a>
	                </div>
	            </div>
              <div id="likers-container-374103" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="374103"
                     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 #64"></div>
  </section>
</div>
    <div class="postbit" id="374171" data-post-id="374171">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jallum" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jallum/120/38850_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jallum
                    <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">
								<aside class="quote no-group" data-username="garrison" data-post="63" data-topic="72038" data-full="true">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>Putting it all together, I am now favoring a stripped-down <code>transaction!()</code> API which spits out its return value verbatim and raises on failure.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">  Repo.transaction!(fn -&gt;
    Repo.put("foo", "bar")
    "foo"
  end)
  |&gt; case do
    "foo" -&gt; :ok
  end
</code></pre>
</blockquote>
</aside>
<p>This is essentially the conclusion I’d come to and represents the semantics I’d presented originally.</p>
<aside class="quote no-group" data-username="garrison" data-post="63" data-topic="72038" data-full="true">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>For Bedrock maybe you are interested in exposing a more friendly API to users, in which case perhaps you would want to provide a retry loop out of the box.</p>
</blockquote>
</aside>
<p>Such a retry-loop exists, currently. There are a class of errors from the storage servers (temporarily unavailable, aborts, etc.) that are automatically retried (with an optional limit) with backoff + jitter.</p>
<aside class="quote no-group" data-username="garrison" data-post="63" data-topic="72038" data-full="true">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/letter_avatar_proxy/v4/letter/g/3bc359/48.png" class="avatar"> garrison:</div>
<blockquote>
<p>Either way, I retract my argument in favor of <code>transact()</code>. My instinct was that lessons from Ecto apply here but I no longer believe that’s the case. The concept of “rollbacks” can be thrown away entirely.</p>
</blockquote>
</aside>
<p>I can see a case for <code>transact</code> / <code>rollback</code>, but it’s a convenience. In ecto, <code>rollback(reason)</code> does two things: 1. it uses an exception under the hood to bubble up from deep nesting, turning <code>reason</code> into <code>{:error, reason}</code> and 2. it wraps up some try-catch boilerplate that you’d need to have in place otherwise, everywhere. The way they’ve done it – it’s entirely opt-in, so if a user doesn’t like the idea of <code>rollback/1</code>, they don’t have to use it.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="374171" 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/bedrock-a-scaleable-distributed-key-value-database-with-better-than-acid-guarantees/72038/66">Post #65</a>
	                </div>
	            </div>
              <div id="likers-container-374171" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="374171"
                     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 #65"></div>
  </section>
</div>
    <div class="postbit" id="374175" data-post-id="374175">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="jallum" data-post="66" data-topic="72038">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jallum/48/38850_2.png" class="avatar"> jallum:</div>
<blockquote>
<p>This is essentially the conclusion I’d come to and represents the semantics I’d presented originally.</p>
</blockquote>
</aside>
<p>There is no failure handling in the livebook (that I saw) so I think when I read the code I simply assumed it worked like <code>Ecto.transaction()</code> and wrapped the result outside of the call. I did not read carefully enough to track the return types.</p>
<p>But yeah, you were right IMO, particularly here:</p>
<aside class="quote no-group" data-username="jallum" data-post="46" data-topic="72038">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jallum/48/38850_2.png" class="avatar"> jallum:</div>
<blockquote>
<p>but I came to think that trying to divine the will of the caller by picking apart the result is just kind of <em>dicey</em></p>
</blockquote>
</aside>
<p>If the app really wants a “rollback” they can just raise themselves. To be clear, I still think most transactions should avoid this exception-style error handling. The prevalence of rollbacks within Ecto seems to come straight from mistakes made by RDBMS, which I did not fully appreciate before.</p>
<aside class="quote no-group" data-username="jallum" data-post="66" data-topic="72038">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jallum/48/38850_2.png" class="avatar"> jallum:</div>
<blockquote>
<p>The way they’ve done it – it’s entirely opt-in, so if a user doesn’t like the idea of <code>rollback/1</code>, they don’t have to use it.</p>
</blockquote>
</aside>
<p>The <code>rollback()</code> is intimately linked with the <code>{:ok, {:ok, value}}</code> error coercion. You could have the former without the latter, but then what is the point? It’s just a useless wrapper around <code>raise</code>.</p>
<p>I’m not sure I’d be comfortable forcing application devs to wrap all of their transactions in a <code>try</code> block, but I <em>do</em> feel comfortable forcing layer developers to do it (sorry <a class="mention" href="/u/jstimps" rel="nofollow">@jstimps</a>) because they have a better idea of what retry abstraction to use.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="374175" 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/bedrock-a-scaleable-distributed-key-value-database-with-better-than-acid-guarantees/72038/67">Post #66</a>
	                </div>
	            </div>
              <div id="likers-container-374175" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="374175"
                     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 #66"></div>
  </section>
</div>
    <div class="postbit" id="374571" data-post-id="374571">
  <section>
    <div class="post-wrap">


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

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Arguably off-topic but I randomly saw this post on Bluesky and I just had to post it here <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>
<aside class="onebox allowlistedgeneric" data-onebox-src="https://bsky.app/profile/0mn1core.bsky.social/post/3lzpc5tltjs2l">
  <header class="source">
      <img src="https://web-cdn.bsky.app/static/favicon-32x32.png" class="site-icon" alt="" width="32" height="32">

      <a href="https://bsky.app/profile/0mn1core.bsky.social/post/3lzpc5tltjs2l" target="_blank" rel="noopener nofollow ugc" title="01:16AM - 26 September 2025">Bluesky Social – 26 Sep 25</a>
  </header>

  <article class="onebox-body">
    <img width="128" height="128" src="https://cdn.bsky.app/img/avatar_thumbnail/plain/did:plc:sk4mhx3t4b6uuvsbqnbr5dws/bafkreich54jzfuj4rtywi63r5rccssutxd34bbjl6wvnf5q3wvjnjyzyta" class="thumbnail onebox-avatar" alt="">

<h3><a href="https://bsky.app/profile/0mn1core.bsky.social/post/3lzpc5tltjs2l" target="_blank" rel="noopener nofollow ugc">0mn1core (@0mn1core.bsky.social)</a></h3>

  <p>If you fork off or build off something, you gotta go with a cheeky name based on it. If it's based on foundation, call it Bedrock or something like that</p>


  </article>

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

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

<p>Also, it sounds like Bluesky is going to be using FDB! Great for us as they’re very developer-facing and it will help raise awareness about the architecture.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="374571" 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/bedrock-a-scaleable-distributed-key-value-database-with-better-than-acid-guarantees/72038/69">Post #68</a>
	                </div>
	            </div>
              <div id="likers-container-374571" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="374571"
                     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>