<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/styles.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Jürgen Šuvalov</title><description>Personal website of Jürgen Šuvalov - a product person and technologist from Tallinn, Estonia.</description><link>https://jyrkki.eu/</link><item><title>Effective Change vs Slop-Shaming</title><link>https://jyrkki.eu/posts/effective-change-vs-slopshaming/</link><guid isPermaLink="true">https://jyrkki.eu/posts/effective-change-vs-slopshaming/</guid><description>Quoting Anil Dash.</description><pubDate>Fri, 21 Aug 2026 20:20:00 GMT</pubDate><content:encoded>&lt;p&gt;A couple of days ago I had a rough night, feeling really frustrated and sad about the recent discourse I’ve seen around LLMs. The reductive, naive and needlessly polarizing nature of it is one reason I haven’t really participated in it much online myself.&lt;/p&gt;
&lt;p&gt;The next day I saw &lt;a href=&quot;https://bsky.app/profile/anildash.com/post/3mtjoit76nc2k&quot;&gt;a post&lt;/a&gt; on the Atmosphere by &lt;a href=&quot;https://www.anildash.com&quot;&gt;Anil Dash&lt;/a&gt; that really resonated with me and he has since turned those thoughts into a &lt;a href=&quot;https://www.anildash.com/2026/08/21/ai-slop-and-shame&quot;&gt;blog post&lt;/a&gt; that eloquently details many of the same ideas I had percolating around in my sour brain.&lt;/p&gt;
&lt;blockquote cite=&quot;https://www.anildash.com/2026/08/21/ai-slop-and-shame/&quot;&gt;&lt;p&gt;“We have to care more about being effective than we care about being “right”. We have to care more about power and actually winning than we care about merely dunking on people.”&lt;/p&gt;&lt;footer&gt;Anil Dash, &lt;cite&gt;&lt;a href=&quot;https://www.anildash.com/2026/08/21/ai-slop-and-shame/&quot;&gt;Why shaming people about AI slop isn’t enough to stop Big AI&lt;/a&gt;&lt;/cite&gt;, August 21, 2026&lt;/footer&gt;&lt;/blockquote&gt;
&lt;p&gt;I really recommend reading his post. The only thing I’ll add here is that, in my humble opinion, laziness and arrogance might be part of the reason people resort to dunking, but a lot of folks seem genuinely exhausted by the current status quo and I empathize with that. I hate this for us. I just think that the wider direction we’ve been heading in was rotten way before the clankers showed up and now seems like the time is ripe to organize and effect some actual change. Maybe that’s naive, but at least that’s my hope.&lt;/p&gt;</content:encoded></item><item><title>This Box is Mine</title><link>https://jyrkki.eu/posts/this-box-is-mine/</link><guid isPermaLink="true">https://jyrkki.eu/posts/this-box-is-mine/</guid><description>A very non-technical post on why I am really into atproto.</description><pubDate>Thu, 30 Jul 2026 22:13:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jyrkki.eu/_astro/heroImg.DzvEmMk-_16sQO0.webp&quot; alt=&quot;A wireframe box drawn on top of a photo of clouds seen from above. Inside the box is the content of a single record: the host eurosky.social, the identity jyrkki.eu (did:plc:yksnhpsdsjmd67o2f54okub6), the collection app.bsky.feed.post, the record&apos;s at:// URI, and its contents — text: “@danabra.mov&apos;s atproto podcast tour continues on @syntax.fm”, $type: “app.bsky.feed.post”.&quot; width=&quot;1200&quot; height=&quot;636&quot; /&gt;&lt;p&gt;The goal of this post is to give a high-level, non-technical overview of why I like &lt;a href=&quot;https://atproto.com/&quot;&gt;atproto&lt;/a&gt;, the technology behind apps like &lt;a href=&quot;https://bsky.social/about&quot;&gt;Bluesky&lt;/a&gt;. If you’ve tried Bluesky, it probably felt like a Twitter clone, and as far as the UX goes that’s fair.&lt;/p&gt;
&lt;p&gt;The short version: I really like using it, and unlike everywhere else, I can leave without losing anything. The rest of this post is about why I think that’s really important.&lt;/p&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/atproto_hugeboxes.B_qy7akH_Zk7QdP.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/atproto_hugeboxes.B_qy7akH_1UGjM0.avif 480w, /_astro/atproto_hugeboxes.B_qy7akH_2joJKX.avif 768w, /_astro/atproto_hugeboxes.B_qy7akH_Zywd8n.avif 1080w, /_astro/atproto_hugeboxes.B_qy7akH_Z2jjzXI.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/atproto_hugeboxes.B_qy7akH_2e76iN.webp 480w, /_astro/atproto_hugeboxes.B_qy7akH_Z2smBwa.webp 768w, /_astro/atproto_hugeboxes.B_qy7akH_Z1mOlBl.webp 1080w, /_astro/atproto_hugeboxes.B_qy7akH_1Wzpmf.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/atproto_hugeboxes.B_qy7akH_ZtHgJ3.webp&quot; srcset=&quot;/_astro/atproto_hugeboxes.B_qy7akH_2e76iN.webp 480w, /_astro/atproto_hugeboxes.B_qy7akH_Z2smBwa.webp 768w, /_astro/atproto_hugeboxes.B_qy7akH_Z1mOlBl.webp 1080w, /_astro/atproto_hugeboxes.B_qy7akH_1Wzpmf.webp 1440w&quot; alt=&quot;A hand-drawn diagram on a grey background. Six wireframe boxes, each holding a single social media logo: Facebook, Threads, Instagram, X, Reddit and LinkedIn. In the centre, a black diamond labelled “Jyrkki” has a separate dashed arrow pointing into every box.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4188&quot; height=&quot;2343&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;One huge box per app and they do not talk to each other.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Let’s start with the current state of the web, focusing on social media. At a high level, you can think of every social media app as a huge box, owned and run by a single company. You sign up, and if your connections sign up too, you get to hang out in this box together. The boxes don’t talk to each other — you have to be in the same box as your connections. If you leave a box, you lose all your content and connections.&lt;/p&gt;
&lt;p&gt;Most of these boxes started out as pretty nice places to be. But as we have seen, all the major ones have been enshittified.&lt;/p&gt;
&lt;p&gt;A quick tangent on &lt;a href=&quot;https://en.wikipedia.org/wiki/Enshittification&quot;&gt;enshittification&lt;/a&gt;. The term was coined by Cory Doctorow, and I’ll borrow his brief explanation:&lt;/p&gt;
&lt;blockquote cite=&quot;https://www.wired.com/story/tiktok-platforms-cory-doctorow/&quot;&gt;&lt;p&gt;“Here is how platforms die: First, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves. Then, they die.”&lt;/p&gt;&lt;footer&gt;Cory Doctorow, &lt;cite&gt;&lt;a href=&quot;https://www.wired.com/story/tiktok-platforms-cory-doctorow/&quot;&gt;The “Enshittification” of TikTok&lt;/a&gt;&lt;/cite&gt;, Wired, January 23, 2023&lt;/footer&gt;&lt;/blockquote&gt;
&lt;p&gt;I don’t want to get deep into it in this post. But it’s not hard to see why the current box model plus the economic incentive to maximize shareholder value ends up producing a degraded experience for users, however noble the initial vision might have been. Once the users are locked in and the investors want their money back, the value has to come from somewhere. And once you go public, you have a very real responsibility to make the number go up, user experience be damned.&lt;/p&gt;
&lt;p&gt;The important part is that the box is what makes it work. Enshittification is only a viable strategy if leaving is expensive. Your content, your connections and your years of history all live inside someone else’s box, so you stay and you take it.&lt;/p&gt;
&lt;p&gt;Now here’s a different approach.&lt;/p&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/atproto_mysmallbox.gi_TiORa_qiPqw.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/atproto_mysmallbox.gi_TiORa_Z1OSJ7f.avif 480w, /_astro/atproto_mysmallbox.gi_TiORa_Z1du3Uo.avif 768w, /_astro/atproto_mysmallbox.gi_TiORa_173N5B.avif 1080w, /_astro/atproto_mysmallbox.gi_TiORa_Z2hutpD.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/atproto_mysmallbox.gi_TiORa_2r0gdI.webp 480w, /_astro/atproto_mysmallbox.gi_TiORa_Z21Mcom.webp 768w, /_astro/atproto_mysmallbox.gi_TiORa_1tPdsi.webp 1080w, /_astro/atproto_mysmallbox.gi_TiORa_Z1TI42W.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/atproto_mysmallbox.gi_TiORa_ZlGp13.webp&quot; srcset=&quot;/_astro/atproto_mysmallbox.gi_TiORa_2r0gdI.webp 480w, /_astro/atproto_mysmallbox.gi_TiORa_Z21Mcom.webp 768w, /_astro/atproto_mysmallbox.gi_TiORa_1tPdsi.webp 1080w, /_astro/atproto_mysmallbox.gi_TiORa_Z1TI42W.webp 1440w&quot; alt=&quot;The same style of hand-drawn diagram, but inverted. At the bottom, a single small wireframe box labelled @jyrkki.eu with a “Jy” avatar inside it. Dashed arrows run outwards from that box to six app logos: mu.social, sifa.id, anisota.net, tangled.org, rocksky.app and bsky.app.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4188&quot; height=&quot;2343&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;This box is mine and I use it for the apps.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Imagine if your Facebook, Twitter, Instagram and Reddit content, likes, follows and images were all stored in your own Dropbox or Google Drive, and the apps were just reading from it and writing to it. If you got fed up with one app, you would switch to another one and everything would still be there, because it was never theirs to begin with.&lt;/p&gt;
&lt;p&gt;That’s roughly how atproto works.&lt;/p&gt;
&lt;p&gt;Notice that the box just got a lot smaller. Instead of one giant box per app with everyone’s stuff in it, everyone gets their own box. And you own yours. Apps write to it and read from it, but they don’t hold it.&lt;/p&gt;
&lt;p&gt;You don’t have to host the box yourself. Usually that’s taken care of for you by a service. When you first join Bluesky, they will happily host your box, and you don’t even have to know there is a box to get an (arguably better) Twitter-like experience out of the gate.&lt;/p&gt;
&lt;p&gt;But once you learn there is a box — and let’s say you’re European and concerned about depending on US tech — you can move it. &lt;a href=&quot;https://eurosky.tech/&quot;&gt;Eurosky&lt;/a&gt;, for example, runs European hosting for exactly this, on servers in Germany operated by a Dutch non-profit. Or if you like running things at home, you can absolutely self-host it.&lt;/p&gt;
&lt;p&gt;Moving your box is not yet a couple of clicks, but it is getting better quickly, and you can now move back to Bluesky’s hosting as well, which wasn’t possible at first. But the thing that matters is that it’s possible at all, which is far more than Facebook will ever offer you.&lt;/p&gt;
&lt;p&gt;And while Bluesky is the most popular atproto app, what goes in your box isn’t limited to posts. There are apps that let you write and publish blogs. There are Instagram-like alternatives for photos. There is even an alternative for the abhorrent LLM hellscape that is LinkedIn.&lt;/p&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/atstorefyi.COKAnJ4Q_Z1vhLrR.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/atstorefyi.COKAnJ4Q_2sAArR.avif 480w, /_astro/atstorefyi.COKAnJ4Q_1XgxTo.avif 768w, /_astro/atstorefyi.COKAnJ4Q_Z1bxEXk.avif 1080w, /_astro/atstorefyi.COKAnJ4Q_Z17zAaw.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/atstorefyi.COKAnJ4Q_2aYtjw.webp 480w, /_astro/atstorefyi.COKAnJ4Q_1FEqL3.webp 768w, /_astro/atstorefyi.COKAnJ4Q_1XYpR.webp 1080w, /_astro/atstorefyi.COKAnJ4Q_5W4dF.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/atstorefyi.COKAnJ4Q_ZN08GI.webp&quot; srcset=&quot;/_astro/atstorefyi.COKAnJ4Q_2aYtjw.webp 480w, /_astro/atstorefyi.COKAnJ4Q_1FEqL3.webp 768w, /_astro/atstorefyi.COKAnJ4Q_1XYpR.webp 1080w, /_astro/atstorefyi.COKAnJ4Q_5W4dF.webp 1440w&quot; alt=&quot;A screenshot of a dark app directory page headed “Find apps you&apos;ll love”, with colourful category tiles: Social with 65 apps, Developer with 27, Productivity with 22, Games with 21, Publishing with 20, Work with 18, Audio with 15, Bookmarks with 13 and Community with 12.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;1802&quot; height=&quot;649&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;A slice of the atproto app ecosystem, browsable on &lt;a href=&quot;https://atstore.fyi/&quot;&gt;atstore.fyi&lt;/a&gt;.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;What’s especially cool is that these apps can reuse the stuff other apps put in your box. When you sign up for a new atproto app, it can pull in your Bluesky follows, so your feed isn’t empty on day one. And if you leave an app because it shuts down or the experience degrades, you can join an alternative and your content, your follows and your history come with you. Or you could go build that alternative yourself.&lt;/p&gt;
&lt;h2 id=&quot;but-isnt-bluesky-just-another-company-that-might-do-the-same-thing&quot;&gt;But isn’t Bluesky just another company that might do the same thing?&lt;/h2&gt;
&lt;p&gt;Bluesky the company has investors. The overwhelming majority of people on the network today use Bluesky’s app and Bluesky’s hosting. So yes, they could absolutely make their app worse.&lt;/p&gt;
&lt;p&gt;The difference is in what would happen next. When Instagram degrades, you either eat it or you start over from zero somewhere else. When Bluesky degrades, you take your box and open a different app, and your posts and your followers are still there. That doesn’t make bad decisions impossible. It makes them expensive, because the punishment is actually available to users instead of being theoretical. A company that can’t hold your stuff hostage has to keep earning your time.&lt;/p&gt;
&lt;p&gt;That’s why I care about owning the box. Being able to leave is what keeps apps honest. It’s definitely not the whole solution, but at least it’s a start.&lt;/p&gt;
&lt;p&gt;But the most important part will always be the user experience. With Bluesky and other atproto clients, you pick your own feeds. No billionaire shoving his own posts into what you see. The main reason I open Bluesky every day is not that I get off on the plumbing — it’s that I like using it. You could even build your own feeds, but I’d recommend starting with the &lt;a href=&quot;https://foryou.club/&quot;&gt;For You&lt;/a&gt; feed that &lt;a href=&quot;https://bsky.app/profile/spacecowboy17.bsky.social&quot;&gt;@spacecowboy17.bsky.social&lt;/a&gt; runs off his gaming PC.&lt;/p&gt;
&lt;p&gt;Anyway, I’m still missing some of you over there. Come join, and reach out if you have any questions.&lt;/p&gt;
&lt;p&gt;And if this piqued your interest in the technology itself, I would recommend starting with these posts by &lt;a href=&quot;https://overreacted.io/&quot;&gt;Dan Abramov&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://overreacted.io/open-social/&quot;&gt;Open Social&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://overreacted.io/where-its-at/&quot;&gt;Where It’s at://&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://overreacted.io/a-social-filesystem/&quot;&gt;A Social Filesystem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://overreacted.io/there-are-no-instances-in-atproto/&quot;&gt;There Are No Instances in atproto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;AT Protocol folks: feedback on anything I’ve oversimplified here is very welcome. Keep in mind this is written for my friends and family rather than for you.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;qa&quot;&gt;Q&amp;amp;A&lt;/h2&gt;
&lt;p&gt;I’ll try to answer some questions as an addendum to the post. The atproto community is actively building, so these things are subject to change. Mind the updated date.&lt;/p&gt;
&lt;h3 id=&quot;1-what-happens-if-bluesky-implodes-before-you-get-your-box-out-is-there-any-built-in-redundancy&quot;&gt;1. What happens if Bluesky implodes before you get your box out? Is there any built-in redundancy?&lt;/h3&gt;
&lt;p&gt;That’s a recoverable situation, with some caveats. There is a public mirror for the whole of atproto called &lt;a href=&quot;https://updates.microcosm.blue/3mhj675s55c2a&quot;&gt;Hubble&lt;/a&gt;, but they do not mirror blobs (images, videos, etc) and private app data. Right now that project is supported by a grant from Bluesky, so I guess future funding is an open question.&lt;/p&gt;
&lt;p&gt;You can also back up your box using a community project called &lt;a href=&quot;https://pdsmoover.com/&quot;&gt;PDS MOOver&lt;/a&gt;. But it’s not something I would expect most people to do.&lt;/p&gt;
&lt;p&gt;I glossed over a lot of technical details in the post, but there is additional plumbing that atproto relies on. One of those pieces is how identity is managed. And for the time being, that is centralized and operated by Bluesky. But &lt;a href=&quot;https://atproto.com/blog/plc-replicas&quot;&gt;replicas of that data exist as well&lt;/a&gt;. It is possible to take back some control over that using your own domain, but realistically there’s always going to be some third party involved in the chain.&lt;/p&gt;
&lt;p&gt;There’s nuance to all of this, but the services are getting more user-friendly all the time. For example, migrating from Bluesky to Eurosky was made almost seamless using their &lt;a href=&quot;https://move.eurosky.tech/&quot;&gt;EU-HAUL tool&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;2-can-a-malicious-vendor-prevent-you-from-exporting-your-box&quot;&gt;2. Can a malicious vendor prevent you from exporting your box?&lt;/h3&gt;
&lt;p&gt;Yes, they could make it painful, but not impossible if you prepared. Migration is currently non-adversarial and if a vendor tried to lock you in, you have &lt;a href=&quot;https://www.da.vidbuchanan.co.uk/blog/adversarial-pds-migration.html&quot;&gt;adversarial options available&lt;/a&gt;. My hope is that those facts align the incentives for atproto platforms to not fuck us over.&lt;/p&gt;
&lt;h3 id=&quot;3-are-there-any-services-that-merely-provide-box-hosting&quot;&gt;3. Are there any services that merely provide “box hosting”?&lt;/h3&gt;
&lt;p&gt;Yes, for example &lt;a href=&quot;https://selfhosted.social/info&quot;&gt;selfhosted.social&lt;/a&gt;. You can check out &lt;a href=&quot;https://discourse.atmosphere.community/t/pds-hosting-list/478&quot;&gt;this discussion&lt;/a&gt; as well. Storage-only is a pretty thin business model though, so most hosting providers have additional offerings.&lt;/p&gt;
&lt;h3 id=&quot;4-are-there-any-limitations-to-what-can-be-stored-on-the-box&quot;&gt;4. Are there any limitations to what can be stored on “the box”?&lt;/h3&gt;
&lt;p&gt;Yes. There’s two types of “files” that can be stored in the box: records and blobs. Records are things like posts, likes, follows, RSVPs and so on. The size limit for a record is 1MiB. Blobs are images, videos and other media. These live separately and are references by records. There’s no protocol-wide size cap. But &lt;a href=&quot;https://bsky.app/profile/alex.bsky.team/post/3mrqcrhzajc2c&quot;&gt;last I heard&lt;/a&gt;, Bluesky is planning to raise the default blob size on “their box’s” configuration limit to 300MB, because folks wanted to uploade longer videos.&lt;/p&gt;
&lt;p&gt;This is not meant for arbitrary data storage. Atproto apps define what kind of data is stored on your box. An awesome tool for visualizing that data just dropped today, &lt;a href=&quot;https://pixeline.be/pds-grandperspective/#h=jyrkki.eu&quot;&gt;here’s mine&lt;/a&gt;. &lt;a href=&quot;https://pdsls.dev/&quot;&gt;pdsls.dev&lt;/a&gt; is also a great tool for looking into the actual records.&lt;/p&gt;
&lt;h3 id=&quot;5-what-if-i-want-to-join-another-atproto-app-and-dont-want-my-friends-and-follows-to-come-with-me-can-the-import-be-filtered&quot;&gt;5. What if I want to join another atproto app and don’t want my friends and follows to come with me? Can the import be filtered?&lt;/h3&gt;
&lt;p&gt;Not really, because there is no real “import”. When you sign up for a new app, that app just integrates with your existing box. They might choose to not use your follows. For example, &lt;a href=&quot;https://tangled.org/&quot;&gt;tangled.org&lt;/a&gt; does not automatically make me follow all the repositories hosted by people I follow on Bluesky. But more realistically if you would like to have a separate social graph on a new app, you would likely create a a separate account on an atproto hosting provider.&lt;/p&gt;
&lt;h3 id=&quot;6-how-private-can-my-box-be&quot;&gt;6. How private can my box be?&lt;/h3&gt;
&lt;p&gt;Right now, it comes with glass walls. Some app-specific data is not stored on the box, like mutes or DMs (although real end-to-end encryption for messaging is still a work in progress) on Bluesky. But most of it has been designed to be public.&lt;/p&gt;
&lt;p&gt;There is active work being done on what’s called &lt;a href=&quot;https://atproto.com/blog/2026-spring-roadmap#permissioned-data&quot;&gt;“permissioned data”&lt;/a&gt; that would support non-public data with explicit access controls. Both the Bluesky team as well as the community are working on this.&lt;/p&gt;
&lt;p&gt;The open design is a feature and part of the credible exit story, but I am hopeful about the community and the work they are doing on permissioned data.&lt;/p&gt;
&lt;h3 id=&quot;7-whats-the-business-model-hi-mom&quot;&gt;7. What’s the business model? (Hi mom!)&lt;/h3&gt;
&lt;p&gt;The protocol itself is just a technology, every app provider needs to figure out their own business model. Whether that is ads, premium features, subscription fees or something else. I think a lot of current apps survive on enthusiasm and community donations and to be clear, some are VC-backed. But although the protocol doesn’t hand anyone a novel business model, my hope is that it takes away some of the worst ones — enshittification through insane switching costs.&lt;/p&gt;
&lt;p&gt;I don’t think the tech is enough. The fact that we get to keep our phone numbers when switching our operator is something we take for granted, but this was not always the case. It was regulation that made it happen. And for better or worse, social media has arguably taken up a larger presence in our lives than simple phone calls and texting. So we should demand better.&lt;/p&gt;</content:encoded></item><item><title>Mozambique, Vol. 2</title><link>https://jyrkki.eu/posts/mozambique-vol-2/</link><guid isPermaLink="true">https://jyrkki.eu/posts/mozambique-vol-2/</guid><description>Back in Maputo for a second X-Road workshop.</description><pubDate>Tue, 21 Jul 2026 18:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jyrkki.eu/_astro/heroImg.CPuaXg6S_ZWHg16.webp&quot; alt=&quot;The view from my hotel room – Maputo&apos;s coastline at golden hour. A large roundabout and a palm-lined beach sit between the road and the Indian Ocean, with the city&apos;s high-rises receding into the haze along the shore.&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;p&gt;Yesterday I got back from my second work trip to Mozambique. Previously I gave a technical workshop on running an X-Road instance to the folks that would be operating it in Mozambique. This session’s focus was on X-Road members, i.e. the organizations that would actually be using the platform to integrate their APIs. I should probably write a post on what the hell &lt;a href=&quot;https://x-road.global/&quot;&gt;X-Road&lt;/a&gt; actually is, but for now the TLDR is that it’s an open-source technology, initially developed and deployed in Estonia in 2001, that is now used by &lt;a href=&quot;https://x-road.global/xroad-world-map&quot;&gt;a bunch of governments&lt;/a&gt; to enable secure and decentralized peer-to-peer API integrations between organizations.&lt;/p&gt;
&lt;p&gt;The flights there weren’t great. For some reason I couldn’t check in online (no reason provided, just “computer says no”) and because of that I got aisle seats on all the flights. I usually prefer window seats so that I could lean my head against the wall to sleep. Additionally, on every flight the person sitting behind me was pretty tall so I didn’t want to recline my seat. This meant no sleep during the almost 24 hours in transit. And then it turned out that my baggage didn’t make it to Maputo. Somehow they had lost the tag on the case and they kept it in Frankfurt. In fact, it is &lt;em&gt;still&lt;/em&gt; in Frankfurt, more than a week later even though I submitted the lost baggage claim right after landing. How they dropped the ball this hard is beyond me. I got a few T-shirts and some underwear from a mall near the hotel to make it through the week but I wasn’t able to purchase replacements for all the stuff I wanted.&lt;/p&gt;
&lt;p&gt;I spent most of my first day in Maputo at the hotel, dealing with access management issues for our training environment. The list of participants had changed from the initial information we were sent so I had to reconfigure their public keys and I helped debug the VPN configuration issues they ran into while testing access. We had improved our CI/CD system, but I think we goofed up the public key provisioning flow a little. We put the public keys into user_data in Terraform. A key rotation then meant swapping the key in the repo, a terragrunt plan on opening the PR, and a terragrunt apply after merge. Changing user_data on a running instance makes the AWS provider stop and start it. But cloud-init’s ssh module only runs once per instance, and a stop/start keeps the same instance-id, so the new key never got written. Which meant I still had to either replace the instance or push the key over SSM. All of which took quite a bit of time. Will fix it for the next session.&lt;/p&gt;
&lt;p&gt;The next day we were driven to a resort about 30 km from Maputo and after spending a little while dealing with the last access issues, the workshop could begin. There were 20 participants from various government institutions plus some folks from the previous training workshop to support them during the session. That was super helpful – the last time I had to run around a lot between participants, debugging issues when they got stuck somewhere. I still had to run around a little this time, but I had five people helping me so it was a lot easier to manage. Often I could just stay at my station and help our supporting team solve more complicated issues, sometimes having to ssh into the participants’ machines to figure out what they had missed.&lt;/p&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/resort.p44brWUU_163Gbg.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/resort.p44brWUU_1QunWu.avif 480w, /_astro/resort.p44brWUU_1RceE7.avif 768w, /_astro/resort.p44brWUU_Z5GdCU.avif 1080w, /_astro/resort.p44brWUU_Z1AfheS.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/resort.p44brWUU_Ft1RU.webp 480w, /_astro/resort.p44brWUU_GaRzx.webp 768w, /_astro/resort.p44brWUU_Z15Yqea.webp 1080w, /_astro/resort.p44brWUU_2tDDXN.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/resort.p44brWUU_1bS27d.webp&quot; srcset=&quot;/_astro/resort.p44brWUU_Ft1RU.webp 480w, /_astro/resort.p44brWUU_GaRzx.webp 768w, /_astro/resort.p44brWUU_Z15Yqea.webp 1080w, /_astro/resort.p44brWUU_2tDDXN.webp 1440w&quot; alt=&quot;A resort swimming pool in the foreground. To the left, an open-sided building with a metal roof where people sit at white tables. A thatched umbrella, tropical trees and a clear blue sky in the background.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4032&quot; height=&quot;2268&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;The resort where we ran the workshop.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The setup overall was pretty similar to the last session – I would share my screen on a projector with the docs and terminal/web UIs open side-by-side and walk through the materials I had prepared. We made some upgrades though. I got a &lt;a href=&quot;https://www.arzopa.com/products/arzopa-z3fc-16-1-180hz-2560x1440-qhd-portable-gaming-monitor&quot;&gt;portable monitor&lt;/a&gt; so I could have a private screen to debug issues and see the chat and progress tracker without putting them on the projector. And for the chat, we had set up a &lt;a href=&quot;https://ancsemi.github.io/Haven/&quot;&gt;Haven&lt;/a&gt; instance and pre-provisioned the user credentials for the participants. It’s pretty Discord-like and was much better to use than the WhatsApp group that was initially created. And since I had more time to prepare in advance than before the previous session, I was able to spend more time on crafting better documentation. I even included videos for sections that required using web interfaces. I used &lt;a href=&quot;https://openscreen.net/&quot;&gt;Open Screen&lt;/a&gt; to record and edit the clips, and the UX was great. If you need to create product demos or teaching materials, I would highly recommend it. The workshop spanned three days and we were able to get through all the planned content plus some bonus materials I had prepared in time. I’m still waiting for the feedback but I think it went rather well.&lt;/p&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/setup.sdurdfx__Z1Qg6z5.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/setup.sdurdfx__uyH3g.avif 480w, /_astro/setup.sdurdfx__218DRQ.avif 768w, /_astro/setup.sdurdfx__Z29lLU9.avif 1080w, /_astro/setup.sdurdfx__Z1diCd2.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/setup.sdurdfx__seY37.webp 480w, /_astro/setup.sdurdfx__1XNURH.webp 768w, /_astro/setup.sdurdfx__1JNYOd.webp 1080w, /_astro/setup.sdurdfx__Z2ojYhB.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/setup.sdurdfx__Z3oYOd.webp&quot; srcset=&quot;/_astro/setup.sdurdfx__seY37.webp 480w, /_astro/setup.sdurdfx__1XNURH.webp 768w, /_astro/setup.sdurdfx__1JNYOd.webp 1080w, /_astro/setup.sdurdfx__Z2ojYhB.webp 1440w&quot; alt=&quot;A workshop desk with a portable monitor showing a chat panel and an issue tracker on the left, a compact mechanical keyboard in the center, a MacBook with a browser open on the right, and a mouse. Behind it, participants work on laptops at cloth-covered tables.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4032&quot; height=&quot;2268&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;My station for the workshop.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/monitor.VgHQAPf8_1YWj7g.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/monitor.VgHQAPf8_Z1P3WXI.avif 480w, /_astro/monitor.VgHQAPf8_DDAbX.avif 768w, /_astro/monitor.VgHQAPf8_1Yyc9X.avif 1080w, /_astro/monitor.VgHQAPf8_29KH89.avif 1392w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/monitor.VgHQAPf8_2eOXeX.webp 480w, /_astro/monitor.VgHQAPf8_ZlDBoh.webp 768w, /_astro/monitor.VgHQAPf8_1luEDW.webp 1080w, /_astro/monitor.VgHQAPf8_Z2qqnay.webp 1392w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/monitor.VgHQAPf8_Z2qqnay.webp&quot; srcset=&quot;/_astro/monitor.VgHQAPf8_2eOXeX.webp 480w, /_astro/monitor.VgHQAPf8_ZlDBoh.webp 768w, /_astro/monitor.VgHQAPf8_1luEDW.webp 1080w, /_astro/monitor.VgHQAPf8_Z2qqnay.webp 1392w&quot; alt=&quot;A dark-themed dashboard titled &apos;X-Road Training Progress&apos; showing a grid with participants down the side and implementation steps across the top, filled with rows of green dots marking completed steps.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;1392&quot; height=&quot;1137&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;The progress tracker.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/guests.BObpEz1r_ZrDzR9.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/guests.BObpEz1r_239hdt.avif 480w, /_astro/guests.BObpEz1r_1Vnh4h.avif 768w, /_astro/guests.BObpEz1r_ZBx13W.avif 1080w, /_astro/guests.BObpEz1r_1Eavdk.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/guests.BObpEz1r_R7U8T.webp 480w, /_astro/guests.BObpEz1r_V54t2.webp 768w, /_astro/guests.BObpEz1r_Z1fAxyX.webp 1080w, /_astro/guests.BObpEz1r_116XHj.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/guests.BObpEz1r_ZbqvcK.webp&quot; srcset=&quot;/_astro/guests.BObpEz1r_R7U8T.webp 480w, /_astro/guests.BObpEz1r_V54t2.webp 768w, /_astro/guests.BObpEz1r_Z1fAxyX.webp 1080w, /_astro/guests.BObpEz1r_116XHj.webp 1440w&quot; alt=&quot;Three vervet monkeys perched in the bare branches of a tree, with a turquoise swimming pool and white resort furniture visible below and behind them.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;2268&quot; height=&quot;4032&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;Our lunch-time guests.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/beach.dPsO2_WK_ZrEK4G.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/beach.dPsO2_WK_Z24L81Q.avif 480w, /_astro/beach.dPsO2_WK_Zycbcg.avif 768w, /_astro/beach.dPsO2_WK_ZJKqpK.avif 1080w, /_astro/beach.dPsO2_WK_bhIhm.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/beach.dPsO2_WK_Z275Q20.webp 480w, /_astro/beach.dPsO2_WK_ZAvTcp.webp 768w, /_astro/beach.dPsO2_WK_Z1ULMuk.webp 1080w, /_astro/beach.dPsO2_WK_ZYICMd.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/beach.dPsO2_WK_1lblFb.webp&quot; srcset=&quot;/_astro/beach.dPsO2_WK_Z275Q20.webp 480w, /_astro/beach.dPsO2_WK_ZAvTcp.webp 768w, /_astro/beach.dPsO2_WK_Z1ULMuk.webp 1080w, /_astro/beach.dPsO2_WK_ZYICMd.webp 1440w&quot; alt=&quot;A wide, empty beach of golden sand leading down to deep blue surf under a clear sky. A few people stand near the waterline, one of them in a red shirt.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4032&quot; height=&quot;2268&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;The beach by the resort.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;After the third day, we were driven back to our hotel in Maputo. I had the next day free so even though I slept in, I was able to explore the city a little. I embarked on a mission to get some &lt;a href=&quot;https://en.wikipedia.org/wiki/Capulana&quot;&gt;capulanas&lt;/a&gt; for my mom and decided to walk the 5.5 km to the city center. I didn’t pass any slums but was able to see at least some distinct neighbourhoods. Nice houses surrounded by walls and gates contrasted with late-Portuguese-colonial tropical modernism and dirty streets. After purchasing the capulanas from &lt;a href=&quot;https://casaelefantemaputo.wixsite.com/elefante&quot;&gt;Casa Elefante&lt;/a&gt; I took some time to just wander around and then headed back to the hotel. The sun had set during my walk back and I have to admit that at one point it did feel a little sketchy, but never really unsafe. We then had dinner with a local colleague at &lt;a href=&quot;https://www.southbeach.co.mz/&quot;&gt;South Beach&lt;/a&gt;, which is right next to the Radisson Blu hotel in Maputo. It was my third time there and I continued working through the seafood section of the menu while a four-piece jazz band played mellow, laid-back takes on familiar songs.&lt;/p&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/crossing.DjXJWCrJ_ZOG8ho.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/crossing.DjXJWCrJ_Z1Ou3SO.avif 480w, /_astro/crossing.DjXJWCrJ_2ld6Va.avif 768w, /_astro/crossing.DjXJWCrJ_His0t.avif 1080w, /_astro/crossing.DjXJWCrJ_Z2bc11.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/crossing.DjXJWCrJ_2foRjR.webp 480w, /_astro/crossing.DjXJWCrJ_1kTTkU.webp 768w, /_astro/crossing.DjXJWCrJ_4eUus.webp 1080w, /_astro/crossing.DjXJWCrJ_ZFeIw2.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/crossing.DjXJWCrJ_Z2gfRnn.webp&quot; srcset=&quot;/_astro/crossing.DjXJWCrJ_2foRjR.webp 480w, /_astro/crossing.DjXJWCrJ_1kTTkU.webp 768w, /_astro/crossing.DjXJWCrJ_4eUus.webp 1080w, /_astro/crossing.DjXJWCrJ_ZFeIw2.webp 1440w&quot; alt=&quot;A busy Maputo street seen from across the road. Two women in patterned capulanas wait on a median, one balancing a large metal pot on her head. Cars, a pickup and a van pass by, with a grand yellow colonial-era building behind.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;1763&quot; height=&quot;992&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;Somewhere near the city center.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/house.CkovR8KG_1OniFW.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/house.CkovR8KG_1bua1e.avif 480w, /_astro/house.CkovR8KG_Z1W9vW2.avif 768w, /_astro/house.CkovR8KG_Z12V9op.avif 1080w, /_astro/house.CkovR8KG_a35k7.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/house.CkovR8KG_Z23nHVf.webp 480w, /_astro/house.CkovR8KG_ZNy3i5.webp 768w, /_astro/house.CkovR8KG_Z1gMAOt.webp 1080w, /_astro/house.CkovR8KG_Z3Nm5W.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/house.CkovR8KG_Z11kIqU.webp&quot; srcset=&quot;/_astro/house.CkovR8KG_Z23nHVf.webp 480w, /_astro/house.CkovR8KG_ZNy3i5.webp 768w, /_astro/house.CkovR8KG_Z1gMAOt.webp 1080w, /_astro/house.CkovR8KG_Z3Nm5W.webp 1440w&quot; alt=&quot;A weathered high-rise apartment block with rows of balconies, one entire side covered by a large geometric mural in blue, yellow and red. A tall palm tree stands in the foreground beside a street with parked cars.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;2268&quot; height=&quot;4032&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;Late-colonial tropical modernism.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/marx.BOg0Ol3V_ZxhvtP.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/marx.BOg0Ol3V_TLDU6.avif 480w, /_astro/marx.BOg0Ol3V_K4VKQ.avif 768w, /_astro/marx.BOg0Ol3V_1hAizH.avif 1080w, /_astro/marx.BOg0Ol3V_Z1l7cC.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/marx.BOg0Ol3V_2nKB7C.webp 480w, /_astro/marx.BOg0Ol3V_HKdKH.webp 768w, /_astro/marx.BOg0Ol3V_6yVv8.webp 1080w, /_astro/marx.BOg0Ol3V_Z1cmthc.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/marx.BOg0Ol3V_Z2hcVem.webp&quot; srcset=&quot;/_astro/marx.BOg0Ol3V_2nKB7C.webp 480w, /_astro/marx.BOg0Ol3V_HKdKH.webp 768w, /_astro/marx.BOg0Ol3V_6yVv8.webp 1080w, /_astro/marx.BOg0Ol3V_Z1cmthc.webp 1440w&quot; alt=&quot;A green-and-white street sign reading &apos;Avenida Karl Marx, Bairro Central B&apos;, mounted on a pole with tall apartment blocks and parked cars behind it.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;2268&quot; height=&quot;4032&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;Avenida Karl Marx.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/ironhouse.CnBQ-EpS_Z1kUfJJ.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/ironhouse.CnBQ-EpS_Z1HM9Pr.avif 480w, /_astro/ironhouse.CnBQ-EpS_Z17z2yn.avif 768w, /_astro/ironhouse.CnBQ-EpS_1r3hQR.avif 1080w, /_astro/ironhouse.CnBQ-EpS_2oT8pC.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/ironhouse.CnBQ-EpS_Z1dM6kd.webp 480w, /_astro/ironhouse.CnBQ-EpS_ZCyY39.webp 768w, /_astro/ironhouse.CnBQ-EpS_1qtDhb.webp 1080w, /_astro/ironhouse.CnBQ-EpS_2oktOV.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/ironhouse.CnBQ-EpS_1ymdLq.webp&quot; srcset=&quot;/_astro/ironhouse.CnBQ-EpS_Z1dM6kd.webp 480w, /_astro/ironhouse.CnBQ-EpS_ZCyY39.webp 768w, /_astro/ironhouse.CnBQ-EpS_1qtDhb.webp 1080w, /_astro/ironhouse.CnBQ-EpS_2oktOV.webp 1440w&quot; alt=&quot;A pale blue building clad entirely in moulded metal panels, with wraparound verandas and iron railings, set behind a dark red fence and framed by trees in the evening light.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4032&quot; height=&quot;2268&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;Casa de Ferro. The old iron house downtown.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/statue.D4vN5R-e_ZX8gVM.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/statue.D4vN5R-e_ZaDCq2.avif 480w, /_astro/statue.D4vN5R-e_Z9VLIp.avif 768w, /_astro/statue.D4vN5R-e_Z29SbKX.avif 1080w, /_astro/statue.D4vN5R-e_1pJSr0.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/statue.D4vN5R-e_Z1lEYuB.webp 480w, /_astro/statue.D4vN5R-e_Z1kX8MY.webp 768w, /_astro/statue.D4vN5R-e_1U0JrI.webp 1080w, /_astro/statue.D4vN5R-e_prFPK.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/statue.D4vN5R-e_jwBTI.webp&quot; srcset=&quot;/_astro/statue.D4vN5R-e_Z1lEYuB.webp 480w, /_astro/statue.D4vN5R-e_Z1kX8MY.webp 768w, /_astro/statue.D4vN5R-e_1U0JrI.webp 1080w, /_astro/statue.D4vN5R-e_prFPK.webp 1440w&quot; alt=&quot;A bronze statue of a man in military uniform and cap, one finger raised, standing on a marble plinth in the middle of a roundabout. Behind it is a grand neoclassical building, with the city&apos;s high-rises around the square.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;3454&quot; height=&quot;1943&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;Samora Machel presiding over the square, the city hall behind him.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The next day we started flying back. I confirmed with the local baggage inquiry agent at Maputo airport that my case was still in Frankfurt and asked them to instruct the Frankfurt team to send it to Estonia. The flights back were pretty enjoyable. I had downloaded a number of episodes of &lt;a href=&quot;https://themattwalkerpodcast.buzzsprout.com/&quot;&gt;the Matt Walker Podcast&lt;/a&gt; where he talks about the science of sleep, and fittingly managed to sleep through the majority of the trip. We also had a seven-hour layover in Sweden where I managed to get some additional sleep at a lounge. I think somebody’s alarm was playing at some point because I had dreams about trying to snooze an alarm unsuccessfully. Brains are weird. Upon arriving in Tallinn after a brief flight, I confirmed with a baggage inquiry employee that Lufthansa would send my stuff to Estonia and I should expect to receive it within a couple of days. He had also visited Maputo before so we had a brief conversation about Mozambique and the various digital government projects happening in Africa. I then returned home to my eternally hungry cat.&lt;/p&gt;</content:encoded></item><item><title>A Trip to Mozambique</title><link>https://jyrkki.eu/posts/a-trip-to-mozambique/</link><guid isPermaLink="true">https://jyrkki.eu/posts/a-trip-to-mozambique/</guid><description>I got to visit Mozambique as part of a digital government consulting gig.</description><pubDate>Fri, 12 Jun 2026 22:50:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jyrkki.eu/_astro/balconyHero.6KF7Mhj5_ZnqdN0.webp&quot; alt=&quot;A panoramic view from the balcony of a hotel. There&apos;s a road next to the hotel, followed by a quite heavily forested area. The sun is setting behind a lonesome cloud in the background.&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;p&gt;I just got back from a week-long trip to Mozambique. Sometimes my experience with X-Road and managing the platform in Estonia lands me consulting gigs in exotic places. Exotic to me, anyway.&lt;/p&gt;
&lt;p&gt;I was contacted by some friends/colleagues that I have worked with many times over the years and they wanted me to do &lt;a href=&quot;https://x-road.global/&quot;&gt;X-Road&lt;/a&gt; training in Mozambique. Since I have way too much free time currently and I’ve never been to Africa-proper, I of course said yes.&lt;/p&gt;
&lt;p&gt;I first had to do a lecture on the fundamentals of X-Road over Zoom, which went decently well. We had materials available from a previous session done a while ago in another country. I wish I had a little more time to prepare and redesign them in my own personal taste (it was A LOT of text and very few images/diagrams). But it was okay.&lt;/p&gt;
&lt;p&gt;Then it was time for the hands-on training session in person. I had to get a vaccine for yellow fever because either I have lost my vaccine passport or I have never been vaccinated for it, I don’t really remember. Technically it takes 10 days for the vaccine to become active and the record in the passport to be valid but it never got checked. I travelled there with the owner of the company I agreed to help. The flights were okay. Tallinn - Frankfurt - Johannesburg - Maputo. The Frankfurt - Johannesburg stretch was a little over 10 hours which was kind of a drag, but I listened to a lot of podcasts and managed to get some sleep.&lt;/p&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/meal_at_frankfurt_airport.DgxaV9YL_CF7Gv.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/meal_at_frankfurt_airport.DgxaV9YL_Z1QASf4.avif 480w, /_astro/meal_at_frankfurt_airport.DgxaV9YL_Z2jbg2L.avif 768w, /_astro/meal_at_frankfurt_airport.DgxaV9YL_Z1CPlgr.avif 1080w, /_astro/meal_at_frankfurt_airport.DgxaV9YL_8WoOr.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/meal_at_frankfurt_airport.DgxaV9YL_RKN4I.webp 480w, /_astro/meal_at_frankfurt_airport.DgxaV9YL_qbqh1.webp 768w, /_astro/meal_at_frankfurt_airport.DgxaV9YL_23uPG0.webp 1080w, /_astro/meal_at_frankfurt_airport.DgxaV9YL_Z1eSx23.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/meal_at_frankfurt_airport.DgxaV9YL_Z25rdlc.webp&quot; srcset=&quot;/_astro/meal_at_frankfurt_airport.DgxaV9YL_RKN4I.webp 480w, /_astro/meal_at_frankfurt_airport.DgxaV9YL_qbqh1.webp 768w, /_astro/meal_at_frankfurt_airport.DgxaV9YL_23uPG0.webp 1080w, /_astro/meal_at_frankfurt_airport.DgxaV9YL_Z1eSx23.webp 1440w&quot; alt=&quot;On the left of the table, there is a small salad bowl. In the middle some mashed potatoes, meatballs and sausages, with a mustard sauce bowl. On the right, a glass of iced tea.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4032&quot; height=&quot;2268&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;When in Frankfurt.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;We spent the first night in a Radisson Blu hotel next to the coast. The room was pretty nice. There were two TV channels that showed movies so I watched a bit of the 1997 Batman and Robin movie while working on the training materials for the first couple of days. And then to my surprise, the next movie they showed was &lt;a href=&quot;https://www.rottentomatoes.com/m/good_luck_to_you_leo_grande&quot;&gt;&lt;em&gt;Good Luck to You, Leo Grande&lt;/em&gt;&lt;/a&gt;, which is a lovely film.&lt;/p&gt;
&lt;p&gt;The next morning we were driven to a lodge about an hour’s drive away from Maputo. Unfortunately, since we were on such a tight schedule, most of what I actually saw in Mozambique was from car windows. When we got out of Maputo, we were driving on dirt roads.&lt;/p&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/room_at_the_lodge.DtsiFksl_242gC5.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/room_at_the_lodge.DtsiFksl_1o71Gz.avif 480w, /_astro/room_at_the_lodge.DtsiFksl_Z1mz5oK.avif 768w, /_astro/room_at_the_lodge.DtsiFksl_EKn6j.avif 1080w, /_astro/room_at_the_lodge.DtsiFksl_Z8HbVa.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/room_at_the_lodge.DtsiFksl_Z2lQp2m.webp 480w, /_astro/room_at_the_lodge.DtsiFksl_Z2lnjK.webp 768w, /_astro/room_at_the_lodge.DtsiFksl_1g875P.webp 1080w, /_astro/room_at_the_lodge.DtsiFksl_rEx3m.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/room_at_the_lodge.DtsiFksl_Z25QPOU.webp&quot; srcset=&quot;/_astro/room_at_the_lodge.DtsiFksl_Z2lQp2m.webp 480w, /_astro/room_at_the_lodge.DtsiFksl_Z2lnjK.webp 768w, /_astro/room_at_the_lodge.DtsiFksl_1g875P.webp 1080w, /_astro/room_at_the_lodge.DtsiFksl_rEx3m.webp 1440w&quot; alt=&quot;In the foreground ins a hotel bed. In the background, a chair, a sofa and in the corner an open shower with brown tiles on the wall.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4032&quot; height=&quot;2268&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;Interesting open shower in my room at the lodge. There’s a bath with a showerhead in the room next to it.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;When we arrived at the lodge, the first thing I checked was the network speed. It was about 2 Mbps up and down in the conference room where we would be hosting the training sessions. I quickly had my clanker rig up a more sophisticated network simulation test because we were expecting 20 participants and that speed might be okay for ssh access but would probably start bottlenecking web interfaces. The results of the simulation tests said as much, it was stable but slow. Fortunately the local folks rearranged some network settings and we ended up with about 40Mbps up and down, which was plenty for the training session. A somewhat unfortunate consequence of that network change was that there was no more internet access at the rest of the lodge, which meant that I would be spending my evenings and nights in the same conference room, preparing for the next day.&lt;/p&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/nights_in_conference_room.CxJchhsv_Z12Nah.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/nights_in_conference_room.CxJchhsv_5bDNM.avif 480w, /_astro/nights_in_conference_room.CxJchhsv_ZmnHXU.avif 768w, /_astro/nights_in_conference_room.CxJchhsv_Z2hyh8e.avif 1080w, /_astro/nights_in_conference_room.CxJchhsv_ZuKw2l.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/nights_in_conference_room.CxJchhsv_Z2fCMFm.webp 480w, /_astro/nights_in_conference_room.CxJchhsv_2mXXkR.webp 768w, /_astro/nights_in_conference_room.CxJchhsv_1oLTOd.webp 1080w, /_astro/nights_in_conference_room.CxJchhsv_Z1SBsSP.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/nights_in_conference_room.CxJchhsv_2l1YAW.webp&quot; srcset=&quot;/_astro/nights_in_conference_room.CxJchhsv_Z2fCMFm.webp 480w, /_astro/nights_in_conference_room.CxJchhsv_2mXXkR.webp 768w, /_astro/nights_in_conference_room.CxJchhsv_1oLTOd.webp 1080w, /_astro/nights_in_conference_room.CxJchhsv_Z1SBsSP.webp 1440w&quot; alt=&quot;In a conference room, on table covered in red cloth, there is a Macbook laptop. Next to it a mechanical keyboard and gaming mouse. It is dark outside, seen through the door in the backkground.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4032&quot; height=&quot;2268&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;My setup for the sleepless nights.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;a class=&quot;figure-link&quot; data-lightbox=&quot;&quot; href=&quot;https://jyrkki.eu/_astro/pool_i_never_got_into.D98OLJoH_Z1zXahu.webp&quot; data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;picture data-astro-cid-khyig4bw=&quot;true&quot;&gt;&lt;source srcset=&quot;/_astro/pool_i_never_got_into.D98OLJoH_11OA4t.avif 480w, /_astro/pool_i_never_got_into.D98OLJoH_151JtJ.avif 768w, /_astro/pool_i_never_got_into.D98OLJoH_1apJbv.avif 1080w, /_astro/pool_i_never_got_into.D98OLJoH_Z1xbdpV.avif 1440w&quot; type=&quot;image/avif&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;source srcset=&quot;/_astro/pool_i_never_got_into.D98OLJoH_1UTLwA.webp 480w, /_astro/pool_i_never_got_into.D98OLJoH_1Y6UVQ.webp 768w, /_astro/pool_i_never_got_into.D98OLJoH_Z1l8iqx.webp 1080w, /_astro/pool_i_never_got_into.D98OLJoH_11rRKW.webp 1440w&quot; type=&quot;image/webp&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot;&gt;&lt;img src=&quot;https://jyrkki.eu/_astro/pool_i_never_got_into.D98OLJoH_Z2cwCUz.webp&quot; srcset=&quot;/_astro/pool_i_never_got_into.D98OLJoH_1UTLwA.webp 480w, /_astro/pool_i_never_got_into.D98OLJoH_1Y6UVQ.webp 768w, /_astro/pool_i_never_got_into.D98OLJoH_Z1l8iqx.webp 1080w, /_astro/pool_i_never_got_into.D98OLJoH_11rRKW.webp 1440w&quot; alt=&quot;A pool surrounded by tropical trees. In the foreground you can see my leg and sneaker. A rare moment of pause.&quot; loading=&quot;lazy&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; data-astro-cid-khyig4bw=&quot;true&quot; decoding=&quot;async&quot; width=&quot;4032&quot; height=&quot;2268&quot;&gt;&lt;/picture&gt;&lt;/a&gt;&lt;figcaption data-astro-cid-khyig4bw=&quot;&quot;&gt;&lt;p&gt;The pool at the lodge I never had time to get into.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;So here’s the setup we used for the workshop. We set up (~170) EC2 instances for all the participants in af-south-1, so each participant would have their own X-Road instance and add-ons. We had all participants provide us with their public keys for ssh access. And since we weren’t able to get enough public IPs from AWS, we set up &lt;a href=&quot;https://netbird.io/&quot;&gt;NetBird&lt;/a&gt; VPN. We provided the materials for the workshop via a &lt;a href=&quot;https://www.bookstackapp.com/&quot;&gt;BookStack&lt;/a&gt; instance running on ECS. I also set up some scripts to dump and push the books via BookStack’s API so that I could edit the pages as markdown files on my local machine while retaining the capability for others to use the WYSIWYG editor in BookStack.&lt;/p&gt;
&lt;p&gt;During the first training day my colleague, who was providing us with AWS support from Estonia, vibeslopped a progress tracker tool that turned out pretty useful. It basically installed a probe on every EC2 instance and based on the training plan checked whether installed packages, configuration values etc. matched the expected values and provided a dashboard where we could see everyone’s progress or unexpected values. There were quite a few cases where we were able to proactively catch some misconfigurations. At first it was a Python back-end with a vanilla HTML/CSS/JS front-end and the probe itself was a huge bash script. After the training week I migrated all the back-end stuff and the probe to modular Python code and the front-end to Svelte because the tool was genuinely useful and I wanted it to have a more maintainable codebase moving forward.&lt;/p&gt;
&lt;p&gt;Each day I would project my screen to the wall with half the screen showing the materials and the other half my terminal. I’d then proceed to set up the components, explaining the nuance, design decisions, context and various learnings from my Estonian experience. The workshop sessions were really intense. Everybody was super engaged but because there were 20 participants, that meant I had to spend a lot of time running around and providing support to folks. At one point I even started having my clanker ssh into their machines and because I was running it from the training materials repo, it could easily debug the issues and provide clear steps for fixes. I’ve already added authentication to the progress tracker so the tracker could be provided to the trainees in the future and I think it might be useful to add a support agent to it. It would just need to be oriented to focus on training and not implementing fixes on behalf of trainees. But I think I’ll focus on improving the materials before reaching for that.&lt;/p&gt;
&lt;p&gt;The participants were really friendly and warm. Even though the week was intense, I had a lot of fun. I just wish I had more time to get to know them. We had breakfast, lunch and dinner at the lodge’s restaurant and I got to hang out with some people but that time was limited and there was a small language barrier issue as well. And after dinners I had to spend my nights preparing for the next day since I didn’t have too much time to prepare beforehand. I also learned a lot about what to improve during each day. I got about 3-4 hours of sleep each night during the week.&lt;/p&gt;
&lt;p&gt;After the last training day, we were driven back to the Radisson Blu hotel. I was surprised to see that those dirt roads we took while traveling to the lodge now had a full traffic jam and the street was filled with people either finishing up their workday or already in a weekend mood, casually strolling between the snail-paced queues of cars. I probably slept a little during the drive back. After checking in, we had dinner with a colleague in a nearby restaurant. The seafood was great and they had a live band that among other popular tunes played a jazzy version of Creep by Radiohead. After getting back to the hotel, I crashed hard.&lt;/p&gt;
&lt;p&gt;The only opportunity for exploring Maputo was the following Saturday, but when I awoke to my alarm at 6 AM, my body protested profusely. So I only woke up later to grab breakfast and then continued to enjoy my slumber until we had to be driven to the airport.&lt;/p&gt;
&lt;p&gt;I’ve got another trip there coming up in July. Hopefully I’ll be able to walk around more then.&lt;/p&gt;</content:encoded></item><item><title>Hello World</title><link>https://jyrkki.eu/posts/hello-world/</link><guid isPermaLink="true">https://jyrkki.eu/posts/hello-world/</guid><description>Hi! I am Jürgen and I have a blog now. Here&apos;s the why and the how.</description><pubDate>Thu, 02 Apr 2026 03:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;https://jyrkki.eu/_astro/hello-world.BIQAYnrh_1rVz9K.webp&quot; alt=&quot;Jürgen with messy hear, grinning wide. There&apos;s a speech bubble next to his face that says &amp;quot;Hello World!&amp;quot;. The background is blurred but we can see it&apos;s a bar.&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;p&gt;Hello Internet, Hello Web, Hello Friends. Did you know that the word “hello” was popularized as a greeting by Thomas Edison for telephone usage, even though the inventor of the telephone, Alexader Graham Bell, preferred “ahoy”? Anyway…&lt;/p&gt;
&lt;h2 id=&quot;the-dread&quot;&gt;The Dread&lt;/h2&gt;
&lt;p&gt;I have been feeling down about the state of the web for a while. I grew up with the web. I remember the wonderful chaos in the dot-com bubble era. And at first, the so called “Web 2.0” seemed like an improvement. And in a lot of ways it was. But then the great &lt;a href=&quot;https://en.wikipedia.org/wiki/Enshittification&quot;&gt;enshittification&lt;/a&gt; happened. Now, we are experiencing the great sloppification. And the &lt;a href=&quot;https://en.wikipedia.org/wiki/Dead_Internet_theory&quot;&gt;Dead Internet Theory&lt;/a&gt; seems more and more real.&lt;/p&gt;
&lt;h2 id=&quot;the-hope&quot;&gt;The Hope&lt;/h2&gt;
&lt;p&gt;During the last year or so, I’ve been finding a lot of joy in rediscovering the weird web. I think it started when I began going through the catalogue of &lt;a href=&quot;https://shoptalkshow.com/&quot;&gt;ShopTalk Show&lt;/a&gt; episodes and following the guests they had on. I discovered that RSS and personal websites are still alive and kicking. That coincided with me trying to onboard to Bluesky and Mastodon, where I have found a lot of thoughtful and original people to follow. Both on the decentralized social media sites as well as via RSS. And most of them preach a similar gospel - just build websites. This beautiful &lt;a href=&quot;https://henry.codes/writing/a-website-to-destroy-all-websites/&quot;&gt;essay&lt;/a&gt; by Henry Desroches hit me especially hard. And even though it’ll take a little while for me to design a website as beautiful and weird as his, I figured having a website to chuck words at is a decent start.&lt;/p&gt;
&lt;h2 id=&quot;the-effort&quot;&gt;The Effort&lt;/h2&gt;
&lt;p&gt;So this is my little corner of the web. I built it with Astro. More details are available in &lt;a href=&quot;https://jyrkki.eu/colophon&quot;&gt;the colophon&lt;/a&gt;. I realize that it’s not feasible for everyone to custom build a website. But there are tools out there that make it pretty simple. And if not a website - maybe try joining the fediverse, whether that’s on ActivityPub (Mastodon) or atproto (Bluesky) and nudging others into it as well.&lt;/p&gt;
&lt;h2 id=&quot;the-future&quot;&gt;The Future&lt;/h2&gt;
&lt;p&gt;For my site, I don’t really have any specific plans. I’ll write about what I feel like. Mostly that’ll be tech, music and general musings. And despite the grim state of things politically, economically and technologically, I am trying to stay optimistic about the future. And I think there are a lot of reasons to be, you just might have to search for them a little.&lt;/p&gt;
</content:encoded></item></channel></rss>