<?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/"
	 xmlns:source="http://source.scripting.com/" >

<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>Wed, 11 Nov 2026 21:21:15 +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><source:blogroll>https://herve.bzh/feeds/?opml</source:blogroll>
	<item>
		<title>I&#8217;m just a meat proxy</title>
		<link>https://herve.bzh/im-just-a-meat-proxy/</link>
					<comments>https://herve.bzh/im-just-a-meat-proxy/#respond</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Wed, 11 Nov 2026 21:21:15 +0000</pubDate>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=677843</guid>

					<description><![CDATA[<a rel="mention" class="u-url mention" href="https://mastodon.social/@searls">@searls</a> nails it with this. This is exactly where I&#8217;m at right now, altough I named my app &#8220;Carry on!&#8221; in an effort to stay positive 🙂 There are so many parts I could quote from his post, to just go read the whole thing, you won&#8217;t regret it! Figure out which parts of your [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a rel="mention" class="u-url mention" href="https://mastodon.social/@searls">@searls</a> nails it with this. This is exactly where I&#8217;m at right now, altough I named my app &#8220;Carry on!&#8221; in an effort to stay positive <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">There are so many parts I could quote from his post, to just go read the whole thing, you won&#8217;t regret it!</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Figure out which parts of your job truly need a human, route all of them to one place you can reach from anywhere, and then spend your energy shrinking it. For decades, great programmers have made their mark by eliminating repetitive manual tasks that the computer could be doing for them, and this is no different.</p>
<cite><a href="https://justin.searls.co/posts/im-just-a-meat-proxy/">I&#8217;m just a meat proxy</a></cite></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/im-just-a-meat-proxy/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">677843</post-id>	</item>
		<item>
		<title>Stretched thin</title>
		<link>https://herve.bzh/stretched-thin/</link>
					<comments>https://herve.bzh/stretched-thin/#respond</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Wed, 04 Nov 2026 10:23:05 +0000</pubDate>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=670110</guid>

					<description><![CDATA[I feel thin, sort of stretched, like butter scraped over too much bread <a rel="mention" class="u-url mention" href="https://davemart.in">@davemart.in</a> makes a great point on how working with AI can feel these days. I definitely recognize myself in that Bilbo quote. Take care of yourselves, folks!]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">I feel thin, sort of stretched, like butter scraped over too much bread</p>
</blockquote>


<div class="activitypub-quote-block u-quotation-of h-cite wp-block-activitypub-quote" aria-label="Quote" data-quotation-of="https://davemart.in/2026/11/03/stretched-thin/"><p><a class="u-url" href="https://davemart.in/2026/11/03/stretched-thin/" target="_blank">davemart.in/2026/11/03/stretched-thin/</a></p></div>


<p class="wp-block-paragraph"><a rel="mention" class="u-url mention" href="https://davemart.in">@davemart.in</a> makes a great point on how working with AI can feel these days. I definitely recognize myself in that Bilbo quote. Take care of yourselves, folks!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/stretched-thin/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">670110</post-id>	</item>
		<item>
		<title>On Repeat Today: Oumou Sangaré – Saa Magni</title>
		<link>https://herve.bzh/on-repeat-today-oumou-sangare-saa-magni/</link>
					<comments>https://herve.bzh/on-repeat-today-oumou-sangare-saa-magni/#respond</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Wed, 28 Oct 2026 14:00:00 +0000</pubDate>
				<category><![CDATA[Musique / Music]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[On Repeat Today]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=661967</guid>

					<description><![CDATA[Today&#8217;s soundtrack comes from Mali, with Oumou Sangaré&#8217;s Saa Magni: I actually discovered this through a remix that&#8217;s pretty good too!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Today&#8217;s soundtrack comes from Mali, with Oumou Sangaré&#8217;s Saa Magni:</p>



<figure class="wp-block-audio"><audio controls src="https://herve.bzh/wp-content/uploads/2026/10/oumou-sangare-saa-magni-2003-remaster.mp3"></audio></figure>



<p class="wp-block-paragraph">I actually discovered this through <a href="https://www.youtube.com/watch?v=7ITUMoEbcxc">a remix</a> that&#8217;s pretty good too!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/on-repeat-today-oumou-sangare-saa-magni/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://herve.bzh/wp-content/uploads/2026/10/oumou-sangare-saa-magni-2003-remaster.mp3" length="14541468" type="audio/mpeg" />

		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">661967</post-id>	</item>
		<item>
		<title>On Repeat Today: Zelda, but it&#8217;s lofi beats</title>
		<link>https://herve.bzh/on-repeat-today-zelda-but-its-lofi-beats/</link>
					<comments>https://herve.bzh/on-repeat-today-zelda-but-its-lofi-beats/#respond</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 17:08:23 +0000</pubDate>
				<category><![CDATA[Musique / Music]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[On Repeat Today]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=661853</guid>

					<description><![CDATA[I&#8217;ve been looking for calm, quiet, yet rythmical music to work to lately. And since I&#8217;m a Zelda fan (my ringtone has been the Overworld theme from Link&#8217;s Awakening for as long as I can remember), Zelda seemed like a good fit, especially this lofi version: It&#8217;s also an hour long, so enjoy 🙂]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I&#8217;ve been looking for calm, quiet, yet rythmical music to work to lately. And since I&#8217;m a Zelda fan (my ringtone has been the Overworld theme from Link&#8217;s Awakening for as long as I can remember), Zelda seemed like a good fit, especially this lofi version:</p>



<figure class="wp-block-audio"><audio controls src="https://herve.bzh/wp-content/uploads/2026/10/zelda-but-its-lofi-beats.mp3"></audio></figure>



<p class="wp-block-paragraph">It&#8217;s also an hour long, so enjoy <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>
					
					<wfw:commentRss>https://herve.bzh/on-repeat-today-zelda-but-its-lofi-beats/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://herve.bzh/wp-content/uploads/2026/10/zelda-but-its-lofi-beats.mp3" length="115818188" type="audio/mpeg" />

		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">661853</post-id>	</item>
		<item>
		<title>Update all the things, thank your sysadmins</title>
		<link>https://herve.bzh/update-all-the-things-thank-your-sysadmins/</link>
					<comments>https://herve.bzh/update-all-the-things-thank-your-sysadmins/#respond</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 21:26:03 +0000</pubDate>
				<category><![CDATA[Geek Inside]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=655551</guid>

					<description><![CDATA[Update all the things, thank your sysadmins!]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Update all the things, thank your sysadmins!</p>


<p class="ap-reply-mention"><a rel="in-reply-to ugc" class="u-in-reply-to" href="https://mastodon.social/@csilverman/117480409181212678" title="csilverman@mastodon.social">@csilverman</a></p>]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/update-all-the-things-thank-your-sysadmins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">655551</post-id>	</item>
		<item>
		<title>LLMs reward expertise</title>
		<link>https://herve.bzh/llms-reward-expertise/</link>
					<comments>https://herve.bzh/llms-reward-expertise/#respond</comments>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 21:02:21 +0000</pubDate>
				<category><![CDATA[Geek Inside]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=655494</guid>

					<description><![CDATA[The most important skill in prompting is expertise in the domain you’re prompting for. [&#8230;] If you have a good theory of your codebase, you can push the LLM much harder than if you have no familiarity. Because you have your own sense of what a good solution might look like, you can say “no, [&#8230;]]]></description>
										<content:encoded><![CDATA[
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">The most important skill in prompting is expertise in the domain you’re prompting for.</p>



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



<p class="wp-block-paragraph">If you have a good <a href="https://www.seangoedecke.com/programming-with-ai-agents-as-theory-building/">theory of your codebase</a>, you can push the LLM <em>much</em> harder than if you have no familiarity. Because you have your own sense of what a good solution might look like, you can say “no, I think it could be simpler here”, or “but don’t we already do X?”, or “can we express this problem in these familiar terms?“.</p>
<cite><a href="https://www.seangoedecke.com/llms-reward-expertise/">LLMs reward expertise</a> &#8212; Sean Goedecke</cite></blockquote>
]]></content:encoded>
					
					<wfw:commentRss>https://herve.bzh/llms-reward-expertise/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">655494</post-id>	</item>
		<item>
		<title>Invité pour un podcast : WordPress, ta maison dans le web social décentralisé</title>
		<link>https://herve.bzh/podcast-wordpress-maison-social-decentralise/</link>
		
		<dc:creator><![CDATA[Jeremy Herve]]></dc:creator>
		<pubDate>Mon, 12 Oct 2026 15:25:29 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ActivityPub]]></category>
		<category><![CDATA[Fediverse]]></category>
		<category><![CDATA[FR]]></category>
		<guid isPermaLink="false">https://herve.bzh/?p=645078</guid>

					<description><![CDATA[Il y a quelques semaines à l&#8217;occasion de WordCamp Bretagne, j&#8217;ai eu l&#8217;occasion d&#8217;échanger avec Walid Nouh, qui s&#8217;occupe de Projet Libres, un podcast de LinuxFR qui parle de logiciels libres. Vous pouvez maintenant écouter notre conversation ici, sur le Fediverse 🙂 Et pour plus de podcasts sur ce sujet, vous pouvez suivre <a rel="mention" class="u-url mention" href="https://www.projets-libres.org/en/auteur/podcast/">@podcast</a> sur [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Il y a quelques semaines à l&#8217;occasion de WordCamp Bretagne, j&#8217;ai eu l&#8217;occasion d&#8217;échanger avec Walid Nouh, qui s&#8217;occupe de Projet Libres, un podcast de <a href="https://linuxfr.org/" target="_blank" rel="noopener">LinuxFR</a> qui parle de logiciels libres. Vous pouvez maintenant écouter notre conversation ici, sur le Fediverse <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>



<div class="wp-block-group has-custom-offwhite-background-color has-background has-global-padding is-layout-constrained wp-container-core-group-is-layout-d2702112 wp-block-group-is-layout-constrained" style="padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--40)">
<figure class="wp-block-embed is-type-wp-embed is-provider-podcast-projets-libres wp-block-embed-podcast-projets-libres wp-embed-aspect-21-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" title="76 - [Fediverse] WordPress, ta maison dans le web social décentralisé" src="https://podcast.projets-libres.org/@projetslibres/episodes/76-fediverse-wordpress-ta-maison-dans-le-web-social/embed#?secret=HsLwwc4Fvb" data-secret="HsLwwc4Fvb" width="100%" height="112" frameborder="0" scrolling="no"></iframe>
</div></figure>
</div>



<p class="wp-block-paragraph">Et pour plus de podcasts sur ce sujet, vous pouvez suivre <a rel="mention" class="u-url mention" href="https://www.projets-libres.org/en/auteur/podcast/">@podcast</a> sur le Fediverse !</p>
]]></content:encoded>
					
		
		
		<author>jeremy@jeremy.hu (Jeremy Herve)</author><post-id xmlns="com-wordpress:feed-additions:1">645078</post-id>	</item>
		<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>
		
		<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>
					
		
		
		<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>
		
		<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>
					
		
		
		<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>
	</channel>
</rss>