<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Herve Family</title>
	<atom:link href="https://herve.bzh/feed/" rel="self" type="application/rss+xml" />
	<link>https://herve.bzh</link>
	<description>Our family’s website // Le site de notre petite famille // Kis családunk honlapja // Lec’hienn hor familh</description>
	<lastBuildDate>Thu, 13 Aug 2026 21:25:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://herve.bzh/wp-content/uploads/2024/06/cropped-herve-logo-1-32x32.png</url>
	<title>Herve Family</title>
	<link>https://herve.bzh</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">241031857</site>	<item>
		<title>AI is removing the middle class of software engineering</title>
		<link>https://herve.bzh/ai-is-removing-the-middle-class-of-software-engineering/</link>
					<comments>https://herve.bzh/ai-is-removing-the-middle-class-of-software-engineering/#respond</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Thu, 13 Aug 2026 21:25:18 +0000</pubDate>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=578956</guid>

					<description><![CDATA[Today, implementation is cheap. You are paid to make good decisions. To build software that will scale while managing complexity. [&#8230;] You need to contribute beyond what everyone already gets by giving an agent a prompt. AI is removing the middle class of software engineering]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Today, implementation is cheap. You are paid to make good decisions. To build software that will scale while managing complexity.</p>



<p class="wp-block-paragraph">[&#8230;]</p>



<p class="wp-block-paragraph">You need to contribute beyond what everyone already gets by giving an agent a prompt.</p>
<cite><a href="https://blog.florianherrengt.com/ai-removing-middle-class-software-engineering.html">AI is removing the middle class of software engineering</a></cite></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/ai-is-removing-the-middle-class-of-software-engineering/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">578956</post-id>	</item>
		<item>
		<title>Neuromancer TV series</title>
		<link>https://herve.bzh/neuromancer-tv-series/</link>
					<comments>https://herve.bzh/neuromancer-tv-series/#respond</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Mon, 27 Jul 2026 15:17:04 +0000</pubDate>
				<category><![CDATA[TV]]></category>
		<category><![CDATA[Neuromancer]]></category>
		<category><![CDATA[TV Series]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=559137</guid>

					<description><![CDATA[One of my favorite books is coming to TV in January 2027! We are in the age of AI after all, seems like the perfect time to revisit a classic story about AI and technology. I&#8217;m really curious how they&#8217;ll manage to stay true to the book&#8217;s feel, but I must say that so far, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">One of my favorite books is coming to TV in January 2027!</p>



<figure class="wp-block-embed alignwide is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Neuromancer — Official Teaser | Apple TV" width="500" height="281" src="https://www.youtube.com/embed/g79GPZSQHBk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">We are in the age of AI after all, seems like the perfect time to revisit a classic story about AI and technology. I&#8217;m really curious how they&#8217;ll manage to stay true to the book&#8217;s feel, but I must say that so far, their casting really matches what I remember from Case, Molly, and Armitage! I think I see Riviera for a couple of seconds but I&#8217;m not sure who that is; I&#8217;m really curious who will be the crazy person they&#8217;ll pick for the role <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">I&#8217;m really looking forward to it!</p>



<p class="wp-block-paragraph">It helps that I&#8217;ve been happy with most Apple TV productions in the past few years, so maybe they can pull this off! They have done well with Sci-Fi especially, so I think I can be optimistic.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/neuromancer-tv-series/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">559137</post-id>	</item>
		<item>
		<title>Is my ATProto app actually decentralized?</title>
		<link>https://herve.bzh/is-my-atproto-app-decentralized/</link>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Mon, 13 Jul 2026 22:23:45 +0000</pubDate>
				<category><![CDATA[Geek Inside]]></category>
		<category><![CDATA[ATProto]]></category>
		<category><![CDATA[BoardGames]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[rolld]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=539949</guid>

					<description><![CDATA[A few days ago I wrote about rolld, the little board game tracker I built on the AT Protocol. As I mentioned then, this is very much a learning experiment for me, a way to play with ATProto and learn about it. In this post, I'd like to come back to a few of my struggles and the things I learned while designing it.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">A few days ago I <a href="https://herve.bzh/rolld-board-game-logs-at-protocol/">wrote about rolld</a>, the little board game tracker I built on the AT Protocol. As I mentioned then, this is very much a learning experiment for me, a way to play with ATProto and learn about it. In this post, I&#8217;d like to come back to a few of my struggles and the things I learned while designing it.</p>



<span id="more-539949"></span>



<p class="wp-block-paragraph">ATProto is supposed to be about decentralization. But the app I was sketching out didn&#8217;t feel decentralized at all:</p>



<ol class="wp-block-list">
<li>Every record that gets posted on a user&#8217;s PDS means nothing without the central record in my app, and ultimately without BoardGameGeek, since rolld&#8217;s game pages are powered by cached data from BGG.</li>



<li>How do I save board games themselves? A single board game can&#8217;t be something each user creates on their own PDS, because then you get a duplicate &#8220;Wingspan&#8221; for every person who&#8217;s ever played it. But it also can&#8217;t be a record that lives on a single PDS (say mine), because then it&#8217;s centralized all over again.</li>
</ol>



<p class="wp-block-paragraph">So a &#8220;game&#8221; either gets duplicated across everyone&#8217;s PDS, or it lives in one central place and re-centralizes the whole thing. Both felt wrong, so I had to take a step back.</p>



<h2 class="wp-block-heading">It turned out to be a false dilemma</h2>



<p class="wp-block-paragraph">What I&#8217;d missed is that there was a third option.</p>



<p class="wp-block-paragraph">The way out was to stop trying to model &#8220;the game&#8221; as a record at all. What if there&#8217;s no central &#8220;Wingspan&#8221; record anywhere? What if there are only per-user <strong>activity</strong> records, one for each thing you&#8217;ve played, and each one carries a small snapshot of the catalog facts it needs (the game title, the year it was published in) right inside your own record?</p>



<p class="wp-block-paragraph">So the answer to &#8220;duplicated or centralized?&#8221; was: neither. There&#8217;s no shared record for the thing. There are only activity records that point at the thing by a shared identifier, and carry whatever snapshot they need to stand on their own.</p>



<p class="wp-block-paragraph">My mistake was assuming a &#8220;game&#8221; had to be a record somewhere. It doesn&#8217;t. The game is just an ID everyone agrees on.</p>



<h2 class="wp-block-heading">The three layers</h2>



<p class="wp-block-paragraph">Once I clearly separated the 3 layers of my app, most of my &#8220;wait, is this decentralized?&#8221; worry got sorted out.</p>



<p class="wp-block-paragraph"><strong>Layer 1: shared identity.</strong> Everyone refers to a game by its BoardGameGeek ID. This feels like centralization, but mostly it isn&#8217;t. Agreeing on an identifier is not the same as depending on a server. &#8220;BGG ID 266192&#8221; is just a string, a name, like an ISBN for books. Libraries shelve books by ISBN and nobody calls libraries centralized. A shared namespace is the coordination point that lets different people&#8217;s records be talked about together. The ID remains unique and keeps working even if BGG vanished tomorrow.</p>



<p class="wp-block-paragraph"><strong>Layer 2: swappable metadata.</strong> The name, the cover art, the complexity rating, and the community rating all come from BGG metadata right now. That said, I only view that information as a way to improve the display of a game. It&#8217;s not the source of truth about anything that matters in my app. Whether a cover loads from BGG, from Wikidata, or not at all, my record of having played that game with my friends on Tuesday is unchanged and remains mine. In practice, metadata gets hydrated at read time through a small <code>resolveGame()</code> function. All of BGG&#8217;s centralization lives in this layer. Tomorrow, I could swap BGG by another provider in that function, and I would be good to go. On top of that, and since BGG is the main source of information about board games today, I can almost guarantee that another provider would carry the BGG ID along with the rest of the metadata, making it easier to match metadata and games.</p>



<p class="wp-block-paragraph"><strong>Layer 3: owned activity.</strong> your play logs and your ratings. These live signed on your own PDS, portable, readable by any AppView. This is the layer I really want to be decentralized.</p>



<p class="wp-block-paragraph">The reason the app felt non-decentralized is that I was judging it by Layer 1 and Layer 2, the layers that I think are supposed to be shared and external, instead of Layer 3, which is the layer decentralization is actually about.</p>



<h2 class="wp-block-heading">Reframing the core principles of my app</h2>



<p class="wp-block-paragraph">After switching my view to those 3 layers, I took another look at how my app should be designed.</p>



<p class="wp-block-paragraph"><strong>My app is just a lens, not a source of truth.</strong> I&#8217;d told myself the records mean nothing without the central record in my app. But that&#8217;s not what the AppView is. If rolld disappeared tomorrow, every play record still exists on every user&#8217;s PDS, still says &#8220;I played this game with these people on this date,&#8221; still readable by any other app that understands the format. What rolld provides is aggregation and display: the web page, the &#8220;who else played this&#8221; view. That&#8217;s the AppView&#8217;s job everywhere in ATProto. rolld being needed for the nice view doesn&#8217;t mean rolld is needed for the data to exist or to mean anything.</p>



<p class="wp-block-paragraph"><strong>Can my app be replaced? I figured this was a good way to test the actual decentralization of my app.</strong> Since my app is just a lens, any other app could come along and use the existing data saved on everyone&#8217;s PDS. That seems decentralized enough to me. It&#8217;s not really about my app&#8217;s external dependencies; I don&#8217;t think we can reasonably expect a social app like rolld to work without any external data points. </p>



<p class="wp-block-paragraph"><strong>&#8220;BGG-dependent&#8221; versus &#8220;BGG-enriched.&#8221;</strong> Instead of asking myself &#8220;do you depend on BGG?&#8221;, I choose to ask myself &#8220;if BGG vanished, is anything users own lost?&#8221; The answer is no. All users would lose is live cover art and other metadata, until someone pointed the resolver at another catalog. People would lose nothing from their records.</p>



<p class="wp-block-paragraph">In practice, it did force me to review and change my data model a bit. To make the records readable on their own, I decided to store a minimal name snapshot in each record: <code>{ id, name }</code> (plus an optional year) rather than just <code>{ id }</code>.</p>



<ul class="wp-block-list">
<li>The ID is the unique reference (matching BGG game ID), building links and linking everything together.</li>



<li>The name snapshot is so it still reads as something a human logged. It&#8217;s &#8220;what I called the game when I logged it,&#8221; captured at write time, so the record stays readable even if BGG dies, if rolld is down, or some future AppView comes along that has never heard of BGG.</li>
</ul>



<p class="wp-block-paragraph">Live hydration (game covers, complexity, number of players, time, community rating) is just pure enrichment on top of a record that already means something on its own.</p>



<p class="wp-block-paragraph">I purposefully stored very little, because I didn&#8217;t want to save everything and end up with:</p>



<ol class="wp-block-list">
<li>outdated data in PDS records</li>



<li>basically rebuilding BGG&#8217;s index inside everyone&#8217;s PDS; that&#8217;s not the point.</li>



<li></li>
</ol>



<h2 class="wp-block-heading">What I&#8217;d tell someone else</h2>



<p class="wp-block-paragraph">If you&#8217;re new to ATProto and you hit this same wall, here are 2 things I wish I&#8217;d known going in.</p>



<ol class="wp-block-list">
<li>The first is that &#8220;decentralized&#8221; is a property of the data layer, not of the whole app. I was applying the word to rolld as one big monolith, when it really belongs to Layer 3, the owned records. Shared vocabulary and external metadata being a bit centralized is fine and expected i think. Once you know which layer to point the word at, most of the panic goes away.</li>



<li>The second is to watch for false dilemmas shaped like &#8220;duplicated or centralized.&#8221; I was stuck with this because I started with a bad premise: &#8220;a game must be a record somewhere.&#8221; Once I took a step back and reframed things a bit, it became easier to design the app.</li>
</ol>



<h2 class="wp-block-heading">It&#8217;s not perfect</h2>



<p class="wp-block-paragraph">It&#8217;s not a perfect solution though; BGG-enriched is still a dependency for nice display. If BGG went down tomorrow, rolld&#8217;s game pages would look pretty bare until I pointed the resolver somewhere else, and I haven&#8217;t built that fallback yet. The catalog metadata is still someone else&#8217;s, and I&#8217;m still leaning on it. But I think it&#8217;s important that I moved it out of the layer that matters.</p>



<p class="wp-block-paragraph">If you&#8217;ve hit this same wall building on ATProto, I&#8217;d love to hear how you thought your way out of it. And if you missed the first post, you should probably <a href="https://rolld.at/">go check rolld.at</a>!</p>
]]></content:encoded>
					
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">539949</post-id>	</item>
		<item>
		<title>Drone show</title>
		<link>https://herve.bzh/drone-show/</link>
					<comments>https://herve.bzh/drone-show/#comments</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Sat, 11 Jul 2026 23:36:32 +0000</pubDate>
				<category><![CDATA[Photos]]></category>
		<category><![CDATA[Beach]]></category>
		<category><![CDATA[Drone]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=542069</guid>

					<description><![CDATA[We went to see a drone show tonight. It was nicely done but somehow the fireworks that came right after were still the highlight of the show.]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img fetchpriority="high" decoding="async" width="769" height="1024" data-attachment-id="542065" data-permalink="https://herve.bzh/pxl_20260711_2107138992-27344932675385909666/" data-orig-file="https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666.jpg" data-orig-size="1502,2000" data-comments-opened="1" data-image-title="pxl_20260711_210713899~2-27344932675385909666." data-image-description="" data-image-caption="" data-large-file="https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-769x1024.jpg" src="https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-769x1024.jpg" alt="A group of drones flying above a beach at night, forming the shape of a butterfly " class="wp-image-542065" srcset="https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-769x1024.jpg 769w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-225x300.jpg 225w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-768x1023.jpg 768w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-1154x1536.jpg 1154w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-900x1200.jpg?crop=1 900w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-600x800.jpg?crop=1 600w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-450x600.jpg?crop=1 450w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-300x400.jpg?crop=1 300w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-150x200.jpg?crop=1 150w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666-1200x1598.jpg 1200w, https://herve.bzh/wp-content/uploads/2026/07/pxl_20260711_2107138992-27344932675385909666.jpg 1502w" sizes="(max-width: 769px) 100vw, 769px" /></figure>



<p class="wp-block-paragraph">We went to see a drone show tonight. It was nicely done but somehow the fireworks that came right after were still the highlight of the show. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/drone-show/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">542069</post-id>	</item>
		<item>
		<title>rolld: I put my board game logs on AT Protocol</title>
		<link>https://herve.bzh/rolld-board-game-logs-at-protocol/</link>
					<comments>https://herve.bzh/rolld-board-game-logs-at-protocol/#comments</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Wed, 08 Jul 2026 20:06:41 +0000</pubDate>
				<category><![CDATA[Geek Inside]]></category>
		<category><![CDATA[ATProto]]></category>
		<category><![CDATA[BoardGames]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=538509</guid>

					<description><![CDATA[For years my board game log lived in a little WordPress plugin I wrote. rolld is my next small experiment: the same log, rebuilt on the AT Protocol, where each play is a record on your own PDS. Give it a try!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">My wife and I play board games. For a few years now, I&#8217;ve kept a log of what we played: the date, whether it was any good, who won. I like to quantify things, and it always feels good to be able to answer &#8220;What game did we play the most this year&#8221; and similar questions.</p>



<p class="wp-block-paragraph">Up until now, that log lived in a quiet corner of this very blog. I&#8217;ve written myself a small WordPress plugin that adds a custom post type for board game plays, and I&#8217;ve been slowly filling it up ever since. You&#8217;ll find games displayed in some of the pages on this blog via <a href="https://make.wordpress.org/core/2024/06/08/proposal-bits-as-dynamic-tokens/">bits</a>. It works fine, and maybe most importantly the data is all mine.</p>



<p class="wp-block-paragraph">So this isn&#8217;t a story about escaping a silo. If you&#8217;ve read my blog in the past few months, you&#8217;ll know I&#8217;ve been experimenting with ATProto with different projects (<a href="https://herve.bzh/wordpress-block-editor-at-protocol/">SkyPress</a>, <a href="https://herve.bzh/comments-on-atproto/">comments on atproto</a>, <a href="https://wordpress.org/plugins/atmosphere/">ATmosphere</a>, and most recently <a href="https://herve.bzh/at-mot-i-rebuilt-wordle-on-the-at-protocol/">AT Mot</a>. Each one has been me taking something I actually use and rebuilding it on the AT Protocol, just to find out what the protocol feels like behind the scenes. rolld is that, pointed at my board game shelf.</p>



<p class="wp-block-paragraph">You can have a look right now at <a href="https://rolld.at">rolld.at</a>.</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="496" height="1024" data-attachment-id="538811" data-permalink="https://herve.bzh/rolld-board-game-logs-at-protocol/screenshot_20260708-215204/" data-orig-file="https://herve.bzh/wp-content/uploads/2026/07/Screenshot_20260708-215204.png" data-orig-size="1080,2229" data-comments-opened="1" data-image-title="rolld.at" data-image-description="" data-image-caption="" data-large-file="https://herve.bzh/wp-content/uploads/2026/07/Screenshot_20260708-215204-496x1024.png" src="https://herve.bzh/wp-content/uploads/2026/07/Screenshot_20260708-215204-496x1024.png" alt="Screenshot of the app on mobile, with the option to log a play opened." class="wp-image-538811" srcset="https://herve.bzh/wp-content/uploads/2026/07/Screenshot_20260708-215204-496x1024.png 496w, https://herve.bzh/wp-content/uploads/2026/07/Screenshot_20260708-215204-145x300.png 145w, https://herve.bzh/wp-content/uploads/2026/07/Screenshot_20260708-215204-768x1585.png 768w, https://herve.bzh/wp-content/uploads/2026/07/Screenshot_20260708-215204-744x1536.png 744w, https://herve.bzh/wp-content/uploads/2026/07/Screenshot_20260708-215204-992x2048.png 992w, https://herve.bzh/wp-content/uploads/2026/07/Screenshot_20260708-215204.png 1080w" sizes="(max-width: 496px) 100vw, 496px" /></figure>



<p class="wp-block-paragraph">Its name reads as &#8220;roll&#8217;d&#8221;, as in rolling dice, and it happens to end in <code>.at</code> because ATproto. Knowing me, you won&#8217;t be surprised that I&#8217;m still not great at naming things. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">What it does</h2>



<p class="wp-block-paragraph">The loop is deliberately small, and built for a phone, because you log a game at the table right after you finish, not sitting at a desk an hour later.</p>



<ul class="wp-block-list">
<li><strong>Log a play.</strong> Search the game, set the date, submit. If you want you can add more details, like who played with you, the scores, a winner, how long it ran, a photo of the board, or a note on how it went.</li>



<li><strong>Rate a game.</strong></li>



<li><strong>See what people you follow are playing</strong>, if they&#8217;re on rolld too.</li>



<li>Check your history, your most-played games, your top-rated ones, what you&#8217;ve played this year.</li>



<li><strong>Share a play to Bluesky</strong>, if you feel like it.</li>
</ul>



<figure class="wp-block-image alignwide size-large"><a href="https://rolld.at/@jeremy.herve.bzh" target="_blank" rel="me noopener"><img loading="lazy" decoding="async" width="1024" height="886" data-attachment-id="538795" data-permalink="https://herve.bzh/rolld-board-game-logs-at-protocol/image-17/" data-orig-file="https://herve.bzh/wp-content/uploads/2026/07/image.png" data-orig-size="1364,1180" data-comments-opened="1" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://herve.bzh/wp-content/uploads/2026/07/image-1024x886.png" src="https://herve.bzh/wp-content/uploads/2026/07/image-1024x886.png" alt="Screenshot of rolld.at's profile page" class="wp-image-538795" srcset="https://herve.bzh/wp-content/uploads/2026/07/image-1024x886.png 1024w, https://herve.bzh/wp-content/uploads/2026/07/image-300x260.png 300w, https://herve.bzh/wp-content/uploads/2026/07/image-768x664.png 768w, https://herve.bzh/wp-content/uploads/2026/07/image-1200x1038.png 1200w, https://herve.bzh/wp-content/uploads/2026/07/image.png 1364w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">Every game gets its own page as well, bringing a bit of community feeling to the tool. You get to see who&#8217;s played it, and what the people you actually know thought about it. My goal wasn&#8217;t to out-do BoardGameGeek, obviously, so it pulls data from BGG and uses its API behind the scenes.</p>



<h2 class="wp-block-heading">Where the plays actually live</h2>



<p class="wp-block-paragraph">Here&#8217;s the part that&#8217;s different from my old WordPress version. rolld doesn&#8217;t have a database of your games. Each play and each rating is written as a record to your own PDS, signed by you. rolld is just a lens sitting on top, reading those records back and turning them into pages. If rolld disappeared tomorrow, your history wouldn&#8217;t; it&#8217;d still be on your PDS, still yours, still readable by any other app that understands the format.</p>



<p class="wp-block-paragraph">And, same as with AT Mot, there&#8217;s very little behind rolld. It&#8217;s a folder of static files and a handful of public services I don&#8217;t run:</p>



<ul class="wp-block-list">
<li><strong><a href="https://constellation.microcosm.blue">Constellation</a></strong>, the backlink index I leaned on for AT Mot&#8217;s leaderboard, does the aggregate reads here too: who else has played a game, how it&#8217;s been rated across the people you follow.</li>



<li><strong><a href="https://slingshot.microcosm.blue/">Slingshot</a></strong> handles record and identity reads, turning a handle into the right PDS to read from.</li>



<li><strong><a href="https://spacedust.microcosm.blue/#GET/subscribe">Spac</a>edust</strong> is the live firehose, so a friend&#8217;s play can turn up in your feed without a refresh.</li>
</ul>



<p class="wp-block-paragraph">All three come from <a href="https://microcosm.blue">microcosm.blue</a>, run on community goodwill, and here I am leaning on that goodwill again. I&#8217;m very grateful it exists.</p>



<p class="wp-block-paragraph">The one piece I do run is a small Cloudflare Worker. Board game metadata, the covers and weights and the catalog all come from BoardGameGeek. The Worker fronts BGG and caches it; the browser never talks to BGG directly. That&#8217;s the whole server. My data on my PDS, a few public indexes I don&#8217;t own doing the social heavy lifting, and one small Worker handling the AppView.</p>



<p class="wp-block-paragraph">Building rolld also meant accepting some bottlenecks and limitations:</p>



<ul class="wp-block-list">
<li>The metadata is all BGG&#8217;s, and that&#8217;s a dependency. I looked at other options out there, but BGG really is the best there is. I did, however, try to keep it as an enrichment dependency, not an ownership one. Your records name the game themselves, so if BGG ever went away you&#8217;d lose the cover art, not the memory of the game you played.</li>



<li>The social half leans on those public microcosm services. It&#8217;s the same independence tension I keep bumping into with ATproto: trying to be fully independent somehow keeps adding services to run. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>



<li>A record on your PDS is portable, but it doesn&#8217;t have a web page until an app makes one. rolld is that app. The raw, portable version of your data is always yours; the pretty, shareable version needs rolld, or something like it, to keep existing.</li>
</ul>



<h2 class="wp-block-heading">Give it a try!</h2>



<p class="wp-block-paragraph">Go and log a play at <a href="https://rolld.at">rolld.at</a>. You can browse the public pages without an account; to keep your own log, sign in with your Bluesky / Blacksky / Eurosky / ATProto handle and your games will follow you around wherever you go.</p>



<p class="wp-block-paragraph">The code is open, dual-licensed MIT / Apache-2.0 like ATproto itself, over on Tangled at <a href="https://tangled.org/jeremy.herve.bzh/rolld">tangled.org/jeremy.herve.bzh/rolld</a>.</p>



<p class="wp-block-paragraph">Let me know what you&#8217;ve been playing, and what you think of the tool! I&#8217;ll keep poking at it and making improvements to the interface in the next few days.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/rolld-board-game-logs-at-protocol/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">538509</post-id>	</item>
		<item>
		<title>Microblogging sucks</title>
		<link>https://herve.bzh/microblogging-sucks/</link>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Fri, 26 Jun 2026 21:08:23 +0000</pubDate>
				<category><![CDATA[Geek Inside]]></category>
		<category><![CDATA[blogging]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=525443</guid>

					<description><![CDATA[Somehow @bunniesin.space managed to perfectly summarize why microblogging isn't for me, and why I think it does more bad than good overall.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I started copying the parts I liked about this post to quote them here, but there are just too many. It wouldn&#8217;t fit in less than 300 characters. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">Somehow <a href="https://bsky.app/profile/bunniesin.space">@bunniesin.space </a>managed to perfectly summarize why microblogging isn&#8217;t for me, and why I think it does more bad than good overall.</p>



<p class="wp-block-paragraph">You should just go read the whole post <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Microblogging sucks</p>
<cite><a href="https://amybunny.offprint.app/a/3moef5ysngd23-making-applications-is-surprisingly-easy-if-you-build-on-atproto">Making applications is surprisingly easy (if you build on atproto)</a> &#8212; <a class="atmosphere-mention" href="https://bsky.app/profile/bunniesin.space">@bunniesin.space</a></cite></blockquote>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">525443</post-id>	</item>
		<item>
		<title>AT Mot: I rebuilt Wordle on the AT Protocol</title>
		<link>https://herve.bzh/at-mot-i-rebuilt-wordle-on-the-at-protocol/</link>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Wed, 24 Jun 2026 23:15:17 +0000</pubDate>
				<category><![CDATA[Geek Inside]]></category>
		<category><![CDATA[AT Mot]]></category>
		<category><![CDATA[ATProto]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Wordle]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=523083</guid>

					<description><![CDATA[Introducing AT Mot, a small ATProto experiment, and a daily word game. Give it a try!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I play <a href="https://www.nytimes.com/games/wordle/index.html">Wordle</a> every day. It&#8217;s probably the most boring possible daily habit, and it&#8217;s a very simple game, but I like the habit, and from time to time I even learn new words!</p>



<p class="wp-block-paragraph">So when I went looking for my next small experiment on the AT Protocol, I didn&#8217;t want to build something clever. I wanted to rebuild something I already use, and find out what the protocol feels like underneath a thing I actually open every day.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="934" height="1024" data-attachment-id="523092" data-permalink="https://herve.bzh/at-mot-i-rebuilt-wordle-on-the-at-protocol/atmot/" data-orig-file="https://herve.bzh/wp-content/uploads/2026/06/atmot.png" data-orig-size="2189,2400" data-comments-opened="1" data-image-title="AT Mot" data-image-description="" data-image-caption="" data-large-file="https://herve.bzh/wp-content/uploads/2026/06/atmot-934x1024.png" src="https://herve.bzh/wp-content/uploads/2026/06/atmot-934x1024.png" alt="Screenshots of my little AT Mot app" class="wp-image-523092" srcset="https://herve.bzh/wp-content/uploads/2026/06/atmot-934x1024.png 934w, https://herve.bzh/wp-content/uploads/2026/06/atmot-274x300.png 274w, https://herve.bzh/wp-content/uploads/2026/06/atmot-768x842.png 768w, https://herve.bzh/wp-content/uploads/2026/06/atmot-1401x1536.png 1401w, https://herve.bzh/wp-content/uploads/2026/06/atmot-1868x2048.png 1868w, https://herve.bzh/wp-content/uploads/2026/06/atmot-1200x1316.png 1200w" sizes="auto, (max-width: 934px) 100vw, 934px" /></figure>



<p class="wp-block-paragraph">That&#8217;s AT Mot. &#8220;mot&#8221; is French for &#8220;word,&#8221; and a little play on ATproto. (I&#8217;m not great at naming things). It&#8217;s a bilingual daily word game, English and French, each its own series, and <strong>you can play it right now at <a href="https://atmot.herve.bzh">atmot.herve.bzh</a></strong>.</p>



<h2 class="wp-block-heading">Playing with Constellation</h2>



<p class="wp-block-paragraph">In my <a href="https://herve.bzh/comments-on-atproto/">last post about comments on atproto</a>, I was wondering about a limitation: there&#8217;s no way to ask the network &#8220;give me every record that references this post.&#8221;  <a class="atmosphere-mention" href="https://bsky.app/profile/pevohr.bsky.social">@pevohr.bsky.social</a> chimed in to point me to <a href="https://constellation.microcosm.blue">Constellation</a>, a backlink index for ATproto, and I said I&#8217;d read up on it over the weekend.</p>



<p class="wp-block-paragraph">Here we are <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">AT Mot relies on Constellation. When you finish the day&#8217;s puzzle, the result is written as a record to your own PDS (well just the tile colours, never the answer or your guesses). Each result links to a canonical per-day permalink, and the leaderboard is built by asking Constellation for every record that links back to that permalink, then adding it all up in your browser.</p>



<p class="wp-block-paragraph">So the &#8220;leaderboard&#8221; isn&#8217;t something I host. It&#8217;s a question I ask a public index, computed fresh on your machine every time you look at it.</p>



<p class="wp-block-paragraph">I was originally thinking about looking to host my own Constellation, but that&#8217;s not really realistic for now, so I rely on the goodwill of the community!</p>



<h2 class="wp-block-heading">No server, on purpose</h2>



<p class="wp-block-paragraph">There&#8217;s not much behind AT Mot. In my <a href="https://herve.bzh/wordpress-block-editor-at-protocol/">SkyPress post</a> I admitted I wasn&#8217;t quite sold on ATproto; the PDS-and-AppView split felt like a lot of moving parts for someone who&#8217;s owned his own blog for twenty years. AT Mot was partly me asking the opposite question: how little can an atproto app be? The answer turned out to be a folder of static files and a couple of public services I don&#8217;t run. That nudged me a bit.</p>



<h2 class="wp-block-heading">It&#8217;s not perfect</h2>



<p class="wp-block-paragraph">A few caveats, because there always are.</p>



<p class="wp-block-paragraph">The leaderboard reads from the public Constellation instance, so I&#8217;m leaning on someone else&#8217;s service for the social half of the game. That&#8217;s the same independence tension I keep bumping into; being fully independent on ATproto somehow keeps adding services to run. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">Have a go</h2>



<p class="wp-block-paragraph">Go play: <a href="https://atmot.herve.bzh">atmot.herve.bzh</a>. If you&#8217;re on ATproto, sign in and your results follow you around. If you&#8217;re not, you can still play, and it&#8217;ll record the game the moment you do sign in. Either way the word resets at midnight UTC. I&#8217;ll be doing the 2 words of the day tomorrow morning!</p>



<p class="wp-block-paragraph">The code is open, dual-licensed MIT / Apache-2.0 like atproto itself. I should probably mention that although I took inspiration from Wordle, it&#8217;s not a copy. It shares some of the format, but not the words or design. The lists are self-curated from permissively-licensed dictionaries.</p>



<p class="wp-block-paragraph">Let me know what you think, and start your own streak <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">523083</post-id>	</item>
		<item>
		<title>Dungeon Crawler Carl TV show greenlit</title>
		<link>https://herve.bzh/dungeon-crawler-carl-tv-show-greenlit/</link>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Fri, 19 Jun 2026 07:08:08 +0000</pubDate>
				<category><![CDATA[Bouquins / Books]]></category>
		<category><![CDATA[TV]]></category>
		<category><![CDATA[Dungeon Crawler Carl]]></category>
		<category><![CDATA[TV Series]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=516031</guid>

					<description><![CDATA[As a Dungeon Crawler Carl fan, I&#8217;ve wondered if the success of the book series in the past couple of years meant that we would see the story come to other media. This is now happening! The Dungeon Crawler Carl television series has been officially greenlit at Peacock. Looking at the folks involved (Seth MacFarlane [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">As a Dungeon Crawler Carl fan, I&#8217;ve wondered if the success of the book series in the past couple of years meant that we would see the story come to other media. This is now happening!</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="1024" data-attachment-id="516038" data-permalink="https://herve.bzh/dungeon-crawler-carl-tv-show-greenlit/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1/" data-orig-file="https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1.jpeg" data-orig-size="1080,1080" data-comments-opened="1" data-image-title="Announcement for the upcoming Dungeon Crawler Carl TV series" data-image-description="" data-image-caption="" data-large-file="https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-1024x1024.jpeg" src="https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-1024x1024.jpeg" alt="Announcement: &quot;Surprise, bitches! It's official. The apocalypse will be televised. Coming to Peacock." class="wp-image-516038" srcset="https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-1024x1024.jpeg 1024w, https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-300x300.jpeg 300w, https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-150x150.jpeg?crop=1 150w, https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-768x768.jpeg 768w, https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-800x800.jpeg?crop=1 800w, https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-600x600.jpeg?crop=1 600w, https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-400x400.jpeg?crop=1 400w, https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1-200x200.jpeg?crop=1 200w, https://herve.bzh/wp-content/uploads/2026/06/here-we-go-folks-the-dungeon-crawler-carl-television-series-v0-nnqtu5iu658h1.jpeg 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="has-text-align-left wp-block-paragraph"><a href="https://www.reddit.com/r/DungeonCrawlerCarl/comments/1u9ozi9/here_we_go_folks_the_dungeon_crawler_carl/"><strong>The Dungeon Crawler Carl television series has been officially greenlit at Peacock.</strong></a></p>



<p class="wp-block-paragraph">Looking at the folks involved (Seth MacFarlane from Family Guy and American Dad, Christopher Yost from Thor: Ragnarok and Cowboy Bebop), I&#8217;m assuming it will be an adult animation series? It would make sense, I don&#8217;t see how they could turn the book series into a TV series without a really big budget. I&#8217;m really curious about what&#8217;s going to come out of this.</p>
]]></content:encoded>
					
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">516031</post-id>	</item>
		<item>
		<title>Comments are a basic web feature. So why aren&#8217;t they solved on ATProto yet?</title>
		<link>https://herve.bzh/comments-on-atproto/</link>
					<comments>https://herve.bzh/comments-on-atproto/#comments</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Wed, 17 Jun 2026 18:41:59 +0000</pubDate>
				<category><![CDATA[Geek Inside]]></category>
		<category><![CDATA[ATProto]]></category>
		<category><![CDATA[comments]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=513738</guid>

					<description><![CDATA[Comments are about as old and basic as the social web gets, so I assumed ATProto would have them figured out. It doesn't, not yet. Here is my take on why standard.site deferred comments on purpose, the handful of work-arounds people built, and what it says about how young the protocol still is.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I published my first post on this blog almost 20 years ago. I wasn&#8217;t always very active on this blog, but one of the things that kept me going was the interactions I got to have with readers. In fact, in the first few years I was part of a small group of people who often commented on each other&#8217;s posts one of us would publish. The comments were my community.</p>



<p class="wp-block-paragraph">I mention this because comments are about as old and as basic as the social web gets. So when I started poking at the AT Protocol, building <a href="https://herve.bzh/wordpress-block-editor-at-protocol/">SkyPress</a> and reading up on <a href="https://standard.site/">standard.site</a>, I assumed comments would be a solved problem. A protocol built for social, in 2025, surely has commenting figured out. It turns out it doesn&#8217;t, and as I&#8217;m digging into the standard some more, I&#8217;m really curious about its status and its next steps.</p>



<h2 class="wp-block-heading">standard.site left them out on purpose</h2>



<p class="wp-block-paragraph">The standard.site lexicon is documented <a href="https://standard.site/docs/introduction/#core-lexicons">here</a>. Here is what&#8217;s currently supported:</p>



<ul class="wp-block-list">
<li>Publications: a collection of documents. Let&#8217;s call that a blog <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>



<li>Documents: a single document, part of a publication. Let&#8217;s call that a blog post.</li>



<li>Subscriptions: used to track users following a publication.</li>



<li>Recommends: used to, well, recommend documents. I think of it as likes for documents.</li>
</ul>



<p class="wp-block-paragraph">Comments are not of there. I went looking for discussions around why those were missing, and got some answers on the <a href="https://atproto.com/off-protocol/do-this-together-standard-site" target="_blank" rel="noopener">Off Protocol podcast</a>, hosted by Jim Ray (<a href="https://bsky.app/profile/jimray.bsky.team">@jimray.bsky.team</a>). Their rule of thumb, as Jared (<a href="https://bsky.app/profile/did:plc:ukp7pzzht32uigg6bg4vxr5t">@awarm.space</a>) from Leaflet put it, is that &#8220;the amount of existing implementations we want should be proportional to the complexity of the new lexicon.&#8221; Comments are complicated, and nobody is happy with what exists yet:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">For something like comments, that&#8217;s actually pretty complicated and has a lot of implications for content and various moderation things and all these kinds of stuff. Leaflet has a comment lexicon, but we&#8217;re not like super happy with it or anything like that.</p>
<cite><a href="https://bsky.app/profile/did:plc:ukp7pzzht32uigg6bg4vxr5t">@awarm.space</a></cite></blockquote>



<p class="wp-block-paragraph">So they&#8217;ve held off on purpose. As Jared summed it up, &#8220;so far we have chosen the easy parts of the problem&#8221;, &#8220;that sort of maximally useful and least gnarly set of the problems.&#8221; I think that restraint is the responsible call. But it does mean that today, if you want comments on your long-form post, you&#8217;re on your own.</p>



<h2 class="wp-block-heading">So everyone built their own</h2>



<p class="wp-block-paragraph">If you&#8217;re building your own blog on ATProto today, there isn&#8217;t a single work-around. You have a few options:</p>



<ul class="wp-block-list">
<li><strong>A companion Bluesky post.</strong> You publish your article, then also post a normal Bluesky post pointing at it, and treat its replies as your comments. Jim Ray&#8217;s <code><a href="https://tangled.org/jimray.bsky.team/bsky-conversation">bsky-conversation</a></code> web component does this nicely. The catch is that those replies are regular Bluesky posts. They&#8217;re capped at 300 characters, you can only use plain text. I know I ramble, but I think that&#8217;s annoying whenever you want to post a reply to a well-thought blog post or essay.</li>



<li><strong>A native comment record.</strong> Leaflet built its own <code>pub.leaflet.comment</code>, with no character limit, rich text, threading, even comments anchored to a specific passage like margin notes in a doc. It&#8217;s really nice. But it lives in Leaflet&#8217;s namespace, so only Leaflet readers see those comments. They&#8217;re invisible to Pckt, to my own reader (so far), to anything that isn&#8217;t watching for that exact record type.</li>



<li><strong>A whole separate annotation layer.</strong> Then there&#8217;s <a href="https://margin.at/">margin.at</a>, which lets you annotate, highlight, and reply to <em>any</em> URL on the web, using its own <code>at.margin.*</code> records built on top of the W3C Web Annotation model. It&#8217;s a clever, broader idea, but it&#8217;s another shape that doesn&#8217;t line up with any of the above.</li>
</ul>



<p class="wp-block-paragraph">For where I stand, it seems that the hard part isn&#8217;t the implementation, or the lexicon, it&#8217;s agreeing on the protocol underneath. On that same podcast episode, Jim Ray walked through the problems:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">the comment would in theory be stored on my PDS&#8230; How do I actually gather up all of the different comments that have been left through some kind of backlinks mechanism? But then, you know, what happens if that PDS disappears? [&#8230;] How do you show a tombstone comment? [&#8230;] How do you handle things like moderation? Who does the moderating?</p>
<cite><a href="https://bsky.app/profile/jimray.bsky.team">@jimray.bsky.team</a></cite></blockquote>



<p class="wp-block-paragraph">Every one of those is real. Your data lives on your PDS, so when you comment on my blog post, that comment record lives on your PDS, not mine. My PDS has no idea it exists, and there&#8217;s no query anywhere that says &#8220;give me every record on the whole network that references this post.&#8221; That question simply can&#8217;t be asked directly.</p>



<p class="wp-block-paragraph">So how does a reader show comments at all? It listens to the firehose, the stream of every record being written across the network, catches comment records as they fly past, and indexes them itself. That works, but it means a comment is only ever visible on a reader that happens to be watching for that specific record type. A <code>pub.leaflet.comment</code> shows up in Leaflet because Leaflet is listening for it. Nobody else is.</p>



<p class="wp-block-paragraph">And then there&#8217;s the deleted-commenter problem Jim flagged. If someone deletes their account, their comment can leave a ghost behind: an indexed copy sitting in some reader&#8217;s database with no live PDS backing it.</p>



<p class="wp-block-paragraph">I think we&#8217;ve solved some of those problems in other areas of the web, but the decentralization of the data certainly makes things a bit more complicated.</p>



<p class="wp-block-paragraph">So for now we have work-arounds. You can start using the companion-post trick in your implementation already, it&#8217;s most likely the easiest to pull off, especially since we&#8217;re already creating companion-posts alongside standard.site records to promote the posts on Bluesky. Leaflet&#8217;s comment record is lovely. Margin is an interesting idea, brings a bit of a twist on the &#8220;threaded comments&#8221; idea. And the protocol-level problems really are hard. But I find it interesting that a network built for social interaction hasn&#8217;t landed a shared answer to commenting, the thing that made the social web social in the first place.</p>



<p class="wp-block-paragraph">To be fair, there&#8217;s something I like in that mess. Different teams each built a comment system because nothing stopped them: the protocol is new and flexible, people sign in with their existing ATProto account, and the data is already on their PDS, so the barrier to trying your own approach is close to zero.</p>



<p class="wp-block-paragraph">standard.site is built to be extended; its <a href="https://standard.site/docs/introduction/" target="_blank" rel="noopener">own docs</a> say the existing properties &#8220;should not be seen as constraints, but rather as starting points.&#8221; So going off and building your own thing is the intended move, not a hack. That&#8217;s the same energy that makes the whole atmosphere feel vibrant and fast right now. Everyone is shipping new things every day, is finding new creative things to store on PDS. The downside is solutions that don&#8217;t talk to each other.</p>



<p class="wp-block-paragraph">Maybe that will change with time. As the dust settles, the most popular solutions to different problems will be the ones the protocol will adopt?</p>



<p class="wp-block-paragraph">Maybe a <code>site.standard.comment</code> will eventually show up? I hope so. For now, this problem is, to me, one of the clearest examples of how young this all still is.</p>



<p class="wp-block-paragraph">It does make it interesting to dive in some more!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/comments-on-atproto/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">513738</post-id>	</item>
		<item>
		<title>Putting the WordPress block editor on the AT Protocol</title>
		<link>https://herve.bzh/wordpress-block-editor-at-protocol/</link>
					<comments>https://herve.bzh/wordpress-block-editor-at-protocol/#comments</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Thu, 11 Jun 2026 18:14:50 +0000</pubDate>
				<category><![CDATA[Geek Inside]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ATProto]]></category>
		<category><![CDATA[Bluesky]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=507773</guid>

					<description><![CDATA[What if your ATProto content was a WordPress block tree? I built a long-form editor where the standard.site "content" field is just Gutenberg blocks, no PHP anywhere. I'm playing with ATProto, even though I'm still not fully sold on it as a web old-timer. 🙂]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I&#8217;ve had my own home on the web, one I fully control, for about 20 years now. It started on a cheap shared hosting plan where PHP was all I needed and knew. I taught myself to build WordPress themes by asking questions in the .org support forums, and I&#8217;ve been taking care of my little home ever since. I&#8217;ve renovated more than a few times, I&#8217;ve experimented with different CMSes, I&#8217;ve tweaked things, &#8230;</p>



<p class="wp-block-paragraph">I say that up front because it&#8217;s the lens I brought to a small experiment I launched today: <a href="https://skypress.blog/">SkyPress</a>, a long-form editor for the AT Protocol that happens to run the WordPress block editor. There&#8217;s a <a href="https://skypress.blog/@skypress.blog/its-always-sunny-on-skypress/3mnzm5k2vc22t">proper launch post over here</a>, but I wanted to expand a bit on the why, as well as a few of my ongoing thoughts and conflicts about ATProto.</p>



<h2 class="wp-block-heading">Where it started</h2>



<p class="wp-block-paragraph">I&#8217;ve been spending some time looking at how the long-form editors in the atmosphere structure their content. <a href="https://leaflet.pub">Leaflet</a> has its multi-page document blocks; <a href="https://pckt.blog">Pckt.blog</a> has its own block format; both write something structured into the <code>content</code> field of a <code>site.standard.document</code> record. Poking at those got me thinking again about something I was more familiar with: how a WordPress post is put together under the hood.</p>



<p class="wp-block-paragraph">Some of this came out of <a href="https://herve.bzh/radical-speed-month-and-a-new-reader/" data-type="link" data-id="https://herve.bzh/radical-speed-month-and-a-new-reader/">work @pfefferle and I did bringing Bluesky, Mastodon, and the fediverse into the WordPress.com Reader</a>. That meant looking closely at <a href="https://standard.site/">standard.site</a>, and at how each platform decides what to drop into that <code>content</code> field. The more I looked, the more I wanted to try it myself.</p>



<figure class="wp-block-image alignwide size-large"><img loading="lazy" decoding="async" width="1024" height="788" data-attachment-id="507787" data-permalink="https://herve.bzh/wordpress-block-editor-at-protocol/skypress-editor/" data-orig-file="https://herve.bzh/wp-content/uploads/2026/06/skypress-editor.png" data-orig-size="2246,1728" data-comments-opened="1" data-image-title="skypress-editor" data-image-description="" data-image-caption="" data-large-file="https://herve.bzh/wp-content/uploads/2026/06/skypress-editor-1024x788.png" src="https://herve.bzh/wp-content/uploads/2026/06/skypress-editor-1024x788.png" alt="Screenshot of the SkyPress editor" class="wp-image-507787" srcset="https://herve.bzh/wp-content/uploads/2026/06/skypress-editor-1024x788.png 1024w, https://herve.bzh/wp-content/uploads/2026/06/skypress-editor-300x231.png 300w, https://herve.bzh/wp-content/uploads/2026/06/skypress-editor-768x591.png 768w, https://herve.bzh/wp-content/uploads/2026/06/skypress-editor-1536x1182.png 1536w, https://herve.bzh/wp-content/uploads/2026/06/skypress-editor-2048x1576.png 2048w, https://herve.bzh/wp-content/uploads/2026/06/skypress-editor-1200x923.png 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">I had three questions I wanted to answer for myself:</p>



<ol class="wp-block-list">
<li>How hard is it, really, to build an ATProto editor without taking on a pile of overhead?</li>



<li>Could I rely only on data saved to the PDS, with nothing of my own to store on the side?</li>



<li>How easy would it be to re-create some of the WordPress block editor experience outside of WordPress?</li>
</ol>



<h2 class="wp-block-heading">A lexicon that came together on its own</h2>



<p class="wp-block-paragraph">Here&#8217;s the thing that made it click. WordPress knows all about turning post content into structured data, and that structure happened to map neatly onto what an ATProto <code>content</code> field could be. That&#8217;s a happy accident for my experiment.</p>



<p class="wp-block-paragraph">Automattic maintains <a href="https://github.com/Automattic/isolated-block-editor"><code>isolated-block-editor</code></a>, which is the Gutenberg editor repackaged to run with no WordPress behind it. It hands you an <code>onSaveBlocks</code> callback, and instead of a string of HTML you get the raw block tree: an array of <code>{ name, attributes, innerBlocks }</code> objects. Add <code><a href="https://developer.wordpress.org/block-editor/reference-guides/packages/packages-blocks/">@wordpress/blocks</a></code> and <code><a href="https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-library/">@wordpress/block-library</a></code> for parsing and rendering, and you have a full editor <em>and</em> a renderer, no PHP anywhere.</p>



<p class="wp-block-paragraph">So <a href="https://skypress.blog/lexicon/">the SkyPress content lexicon</a>, <code>blog.skypress.content.gutenberg</code>, ended up almost embarrassingly thin: a <code>version</code> and a <code>blocks</code> array, dropped straight into the document&#8217;s open content union. The canonical content is the block tree exactly as the editor produced it, not rendered HTML. Any reader that doesn&#8217;t understand the <code>$type</code> falls back to <code>textContent</code>, same as every other custom content format in the atmosphere.</p>



<p class="wp-block-paragraph">The reason this works is older than ATProto. When Dennis Snell explained the Gutenberg block format back in 2017, he put it plainly:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Thus, a Gutenberg post isn&#8217;t HTML, but a tree of objects and associated attributes.</p>
<cite><a href="https://fluffyandflakey.blog/2017/09/04/gutenberg-posts-arent-html/">Gutenberg posts aren’t HTML…</a></cite></blockquote>



<p class="wp-block-paragraph">That tree is exactly the shape ATProto wants. Matías Ventura framed the bigger move as <a href="https://matiasventura.com/post/gutenberg-or-the-ship-of-theseus/">a Ship of Theseus</a>, rebuilding the materials while the ship keeps sailing, and the block, as a discrete unit of structured data, is the plank we swapped in. So for me the hard part, designing that content model, was already done. I mostly got to borrow it. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">Why hasn&#8217;t the atmosphere settled on structured content?</h2>



<p class="wp-block-paragraph">This is where the experiment bumped into something I still don&#8217;t quite understand yet. <code>standard.site</code> made a deliberate choice to standardize the metadata around a document and leave content open; bring your own format. I get the reasoning and the flexibility it brings. But that <code>content</code> field is a <em>singular</em> union, so someone building an editor still has to pick one <code>$type</code> and accept that every other reader degrades to plain <code>textContent</code>.</p>



<p class="wp-block-paragraph">I got into this a bit with <a href="https://bsky.app/profile/jimray.bsky.team">@jimray.bsky.team</a> on Bluesky:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">In my ideal world, an editor would be able to serve Leaflet readers, Pckt readers, and markdown readers well from the same record, so you read a nicely formatted post regardless of the reader you use.</p>
<cite><a href="https://bsky.app/profile/jeremy.herve.bzh/post/3mnxmilp55k2h">https://bsky.app/profile/jeremy.herve.bzh/post/3mnxmilp55k2h</a></cite></blockquote>



<p class="wp-block-paragraph">That&#8217;s not how it works today, and different editors keep building different content formats that only their own readers fully understand. And ATproto seems to be growing a lot right now, so new formats will keep popping up. Hey, I just added one to the pile! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f605.png" alt="😅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">It reminded me of a choice WordPress made years ago. I offer as a data point and nothing more, I don&#8217;t mean to offer any advice or recommendation to anyone, I know very little about ATProto!</p>



<p class="wp-block-paragraph">When Gutenberg moved to blocks, it kept storing that structured data <em>as HTML too</em>, tucked inside comments, so a legacy system that knows nothing about blocks can still render the post. The technical overview from 2017 put it this way:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">the source of truth for the content should remain in <code>post_content</code>, where the bulk of the post data needs to be present in a way that is accessible and portable, while still providing additional structure on top of HTML semantics.</p>
<cite><a href="https://make.wordpress.org/core/2017/01/17/editor-technical-overview/">Editor Technical Overview</a></cite></blockquote>



<p class="wp-block-paragraph">I&#8217;m not holding that up as the answer. The block editor itself is divisive enough that I&#8217;d never claim WordPress has this figured out; it&#8217;s one take on one narrow corner of the problem, a structured format that still degrades into something every reader can show. Whether that&#8217;s a good fit for the atmosphere, I honestly don&#8217;t know. I just keep poking at it.</p>



<h2 class="wp-block-heading">Am I sold on ATProto? Not quite</h2>



<p class="wp-block-paragraph">I&#8217;m still trying to get on board with the whole idea of ATProto, and this little experiment is a great way to learn more, and poke at those questions.</p>



<p class="wp-block-paragraph">Part of me still thinks I may not be the person it&#8217;s for.</p>



<p class="wp-block-paragraph">Remember that cheap shared hosting plan. I already own my content, I&#8217;ve moved between platforms, built my own themes, broken things and put them back together. Owning my words isn&#8217;t anything new to me. And I&#8217;m comfortable digging around in my own data inside WordPress, because I know that process inside and out.</p>



<p class="wp-block-paragraph">So the core ATProto idea, separating where your data lives (the PDS) from where people read it (the AppView), feels a little foreign to me. Having to run, pay, and maintain two systems to control one set of content seems like a lot. And it&#8217;s usually not just two systems; it&#8217;s two domains as well, one for the PDS and one for the AppView. The PDS gives you portability and the AppView gives you a web address people can actually reach, which makes sense to some extent, but it&#8217;s also two of everything to keep an eye on, and potentially two points of failure. It&#8217;s hard to go from &#8220;I run my little blog and it mostly just works&#8221; to that without asking myself some questions. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">Don&#8217;t get me wrong though. None of that is a knock on the protocol. I think it&#8217;s a fair description of the bet ATProto asks you to make, and for plenty of people, especially folks who never had a home of their own on the web, that bet may make complete sense.</p>



<h2 class="wp-block-heading">Where do you publish a post about your own publishing tool?</h2>



<p class="wp-block-paragraph">So I built a long-form publishing tool. Cool. Yet, I&#8217;m posting about it on my WordPress site. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f605.png" alt="😅" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">I spent quite a bit of time deciding where to actually publish this very post.</p>



<p class="wp-block-paragraph">I wanted to use SkyPress. I mean, I just released it, I probably should! But I already have this home, 20 years deep, with my readers, my RSS subscribers, my Fediverse friends. Why would I switch now? Especially considering that this site runs the <a href="https://wordpress.org/plugins/atmosphere/">ATmosphere plugin</a>: it already publishes my posts to ATProto as <code>site.standard.document</code> records anyway.</p>



<p class="wp-block-paragraph">By the way, we&#8217;re asking ourselves the same questions for the plugin. What exactly should go in that <code>content</code> field, though, is a question we&#8217;re still hashing out in an open pull request: HTML, markdown, pckt, Leaflet, and which one wins when <code>content</code> only has room for one. I&#8217;m definitely still struggling about that multi-format puzzle!</p>



<p class="wp-block-paragraph">So for this one, I ended up picking the home I already have. I will be using SkyPress for other posts over the next few weeks, though! Maybe that will help me better understand all of this!</p>



<p class="wp-block-paragraph">I&#8217;ve written before that <a href="https://herve.bzh/the-web-was-always-social/">the web was always social</a>, and that because a protocol isn&#8217;t perfect, it doesn&#8217;t mean we should drop it. Quite the opposite. A rising tide lifts all boats, and to me the only way to find the gaps in something like standard.site is to build on it and bump into those gaps myself.</p>



<p class="wp-block-paragraph">If you want to give it a try, the editor is live at <a href="https://skypress.blog/">SkyPress.blog</a>, and the <a href="https://skypress.blog/@skypress.blog/its-always-sunny-on-skypress/3mnzm5k2vc22t">launch post</a> walks through what it actually does. It&#8217;s an alpha, so expect rough edges. And if you&#8217;ve thought about the singular-<code>content</code>-union question, or this whole structured-versus-legible tension, I&#8217;d love to hear it. Let me know!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/wordpress-block-editor-at-protocol/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">507773</post-id>	</item>
	</channel>
</rss>