<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Walnut Icecream</title>
    <description>The latest articles on DEV Community by Walnut Icecream (@walnut_icecream_7168313d0).</description>
    <link>https://dev.to/walnut_icecream_7168313d0</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4116766%2F9903db2c-d65f-4dc4-8d8e-f755ce838f4f.png</url>
      <title>DEV Community: Walnut Icecream</title>
      <link>https://dev.to/walnut_icecream_7168313d0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/walnut_icecream_7168313d0"/>
    <language>en</language>
    <item>
      <title>I made a decentralised Minecraft server where the host can change between players</title>
      <dc:creator>Walnut Icecream</dc:creator>
      <pubDate>Wed, 09 Sep 2026 04:43:48 +0000</pubDate>
      <link>https://dev.to/walnut_icecream_7168313d0/i-made-a-decentralised-minecraft-server-where-the-host-can-change-between-players-26ib</link>
      <guid>https://dev.to/walnut_icecream_7168313d0/i-made-a-decentralised-minecraft-server-where-the-host-can-change-between-players-26ib</guid>
      <description>&lt;p&gt;A while back our friend who hosted our Minecraft server on his PC had his exams, so he stopped playing and along with that stopped hosting our server too. We couldn't play for a whole week, so I made this fun little project called Nomad to solve that.&lt;/p&gt;

&lt;p&gt;It automatically starts the server on my PC if I'm the first guy online and redirects everyone else onto my hosted server, and if someone is already hosting it, you just directly join theirs. When the host closes the world, the save is automatically synced to a cloud storage location, which can either be your personal server or a Cloudflare R2 bucket. The Cloudflare option is free up to 10GB of storage and includes a pretty generous amount of upload/download operations per month, and beyond that it's just a small fee. This is almost always free since you're realistically never going to reach the free limit, but even if you do, it's still substantially cheaper than renting a server that's running 24/7.&lt;/p&gt;

&lt;p&gt;The idea is basically that the world isn't tied to one person anymore, so whoever is online can host it and everyone else can join them. It's still a pretty small project and I mostly made it because I thought the idea was cool, but I'd love to know what you guys think, This is still under development, I'll refine it and make a full release version if you guys wanna test it.&lt;/p&gt;

&lt;p&gt;Github Link: &lt;a href="https://github.com/WalnutIcecream/Nomad.git" rel="noopener noreferrer"&gt;https://github.com/WalnutIcecream/Nomad.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Technical details&lt;/p&gt;

&lt;p&gt;There is no central coordinator.&lt;/p&gt;

&lt;p&gt;Each world has two objects in the storage backend:&lt;/p&gt;

&lt;p&gt;worlds//lease.json&lt;br&gt;
worlds//world.tar.gz&lt;/p&gt;

&lt;p&gt;lease.json contains the current host, address, status and expiry time.&lt;/p&gt;

&lt;p&gt;The lease is a compare-and-swap operation using conditional writes from the storage backend. If two people try to host at the same time, only one can acquire the lease.&lt;/p&gt;

&lt;p&gt;The host renews the lease every 20 seconds. The lease lasts 5 minutes. If the host stops renewing it, another player can take over after it expires.&lt;/p&gt;

&lt;p&gt;The world is uploaded before the lease is released. This prevents another host from pulling the world while the previous host is still uploading it.&lt;/p&gt;

&lt;p&gt;The basic host lifecycle is:&lt;/p&gt;

&lt;p&gt;acquire → pull → boot → renew → stop → upload → release&lt;/p&gt;

&lt;p&gt;If the host crashes, the lease expires automatically. No separate process is required to recover it.&lt;/p&gt;

&lt;p&gt;The launcher uses a WorldStoreProtocol, so storage is independent from the rest of the application. There are currently three storage backends:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cloudflare R2

Git

Self-hosted S3-compatible storage such as MinIO, Garage or SeaweedFS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The R2 backend uses the S3 API. The Git backend uses fast-forward-only pushes as the compare-and-swap mechanism. The VPS backend uses an S3-compatible endpoint.&lt;/p&gt;

&lt;p&gt;The server itself is vanilla Minecraft. Nomad handles the server lifecycle, world synchronization, Java runtime, configuration and hosting lease.&lt;/p&gt;

&lt;p&gt;There is a CLI and a PySide6 GUI.&lt;/p&gt;

&lt;p&gt;The project is written in Python and requires Python 3.11+ and Java 21. &lt;/p&gt;

</description>
      <category>minecraft</category>
      <category>opensource</category>
      <category>python</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
