<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Knowledge Base (Posts about mod)</title><link>https://bgstack15.ddns.net/blog/</link><description></description><atom:link href="https://bgstack15.ddns.net/blog/categories/mod.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:bgstack15@gmail.com"&gt;bgstack15&lt;/a&gt; 
&lt;a rel="license" href="https://www.gnu.org/licenses/gpl-3.0.html"&gt;
&lt;img alt="GNU General Public License v3.0"
style="border-width:0; margin-bottom:12px;"
src="https://bgstack15.ddns.net/.images/gplv3-127x51.png"&gt;&lt;/a&gt;</copyright><lastBuildDate>Fri, 24 Apr 2026 13:00:45 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>New Luanti mod: firefighter</title><link>https://bgstack15.ddns.net/blog/posts/2026/04/24/new-luanti-mod-firefighter/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I wrote a new mod for Luanti! It is available on &lt;a href="http://vm4:5123/packages/bgstack15/firefighter/"&gt;Internal ContentDB&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Description of mod &lt;code&gt;firefighter&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;This mod is designed for three mainline &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/www.luanti.org/"&gt;Luanti&lt;/a&gt; games, and adds tools and commands for fighting fires.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/mineclonia/mineclonia"&gt;Mineclonia&lt;/a&gt; (&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/ryvnf/mineclonia/"&gt;ContentDB&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/git.minetest.land/VoxeLibre/VoxeLibre"&gt;VoxeLibre&lt;/a&gt; (&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Wuzzy/mineclone2/"&gt;ContentDB&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/luanti-org/minetest_game"&gt;Minetest Game&lt;/a&gt; (&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Luanti/minetest_game/"&gt;ContentDB&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The canonical scm repo is at &lt;a href="https://bgstack15.ddns.net/cgit/luanti/firefighter"&gt;https://bgstack15.ddns.net/cgit/luanti/firefighter&lt;/a&gt;, and an additional repo suitable for collaboration is at &lt;a href="https://codeberg.org/bgstack15/firefighter"&gt;https://codeberg.org/bgstack15/firefighter&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Using&lt;/h3&gt;
&lt;p&gt;A fire extinguisher is crafted from black wool, iron block, compass (MCL/VL) or steel ingot, red dye, and a bucket of water. In Mineclonia/VoxeLibre, you can repair an extinguisher at an anvil using a bucket of water. You can use the extinguisher as a weak, blunt weapon against mobs, too!&lt;/p&gt;
&lt;p&gt;A fire extinguisher is used by left-clicking/using a tool, and starts suppressing fires in a small area.&lt;/p&gt;
&lt;h4&gt;Chat commands&lt;/h4&gt;
&lt;p&gt;To use the chat commands, a user must have priv &lt;code&gt;server&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;suppress_fire [&amp;lt;radius&amp;gt;] [&amp;lt;max_delay&amp;gt;]&lt;/code&gt;. Around the player, a cube of radius &lt;code&gt;radius&lt;/code&gt;, start suppressing fires. &lt;code&gt;Max_delay&lt;/code&gt; is a nice effect for over time, with a default of 1.5 seconds, but set it to 0 to immediately stop fires.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;call_firestorm&lt;/code&gt;. BURNINATE around the calling player for a medium radius. I hope you have fire resistance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Screenshots&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-firefighter.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-firefighter-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Recipe for Mineclonia/VoxeLibre&lt;/h4&gt;
&lt;p&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/firefighter-recipe-mcl.png"&gt;&lt;/p&gt;
&lt;h4&gt;Recipe for Minetest Game&lt;/h4&gt;
&lt;p&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/firefighter-recipe-mtg.png"&gt;&lt;/p&gt;
&lt;h3&gt;Settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;firefighter.particles&lt;/code&gt; Boolean. Show the particles of the foam and smoke of a fire being extinguished. Disabling this might improve performance. Default is &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;firefighter.extinguisher_uses&lt;/code&gt; Integer. Set how many uses an extinguisher has in survival mode. Default is &lt;code&gt;100&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://content.luanti.org/packages/SkyBuilder1717/fire_extinguisher/"&gt;https://content.luanti.org/packages/SkyBuilder1717/fire_extinguisher/&lt;/a&gt; appears to be for Minetest Game only. I didn't try it.&lt;/li&gt;
&lt;/ul&gt;</description><category>game</category><category>luanti</category><category>mod</category><guid>https://bgstack15.ddns.net/blog/posts/2026/04/24/new-luanti-mod-firefighter/</guid><pubDate>Fri, 24 Apr 2026 12:54:00 GMT</pubDate></item><item><title>New Luanti mod: mcl_villager_cheats</title><link>https://bgstack15.ddns.net/blog/posts/2026/04/20/new-luanti-mod-mcl-villager-cheats/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I wrote a new mod for &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/mineclonia/mineclonia"&gt;Mineclonia&lt;/a&gt; (&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/ryvnf/mineclonia/"&gt;ContentDB&lt;/a&gt;), titled &lt;strong&gt;Villager Cheats for Mineclonia&lt;/strong&gt;. It is available on &lt;a href="http://vm4:5123/packages/bgstack15/mcl_villager_cheats/"&gt;Internal ContentDB&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;This mod adds some features related to villagers. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users with &lt;code&gt;server&lt;/code&gt; priv can restock villager trades. I found the native Mineclonia village restock times incomplete.&lt;/li&gt;
&lt;li&gt;Users can craft villager spawn eggs, which are very expensive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The canonical scm repo is at &lt;a href="https://bgstack15.ddns.net/cgit/luanti/mcl_villager_cheats"&gt;https://bgstack15.ddns.net/cgit/luanti/mcl_villager_cheats&lt;/a&gt;, and an additional repo suitable for collaboration is at &lt;a href="https://codeberg.org/bgstack15/mcl_villager_cheats"&gt;https://codeberg.org/bgstack15/mcl_villager_cheats&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Using&lt;/h3&gt;
&lt;p&gt;See the [Settings][#Settings] section for the timer function and how to use it.&lt;/p&gt;
&lt;p&gt;Recipes can be enabled for villager spawn eggs.&lt;/p&gt;
&lt;h4&gt;Chat commands&lt;/h4&gt;
&lt;p&gt;To use the chat commands, a user must have priv &lt;code&gt;server&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/villie&lt;/code&gt; Dumps details about the pointed villager to the player chat.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/restock&lt;/code&gt; Restock the pointed villager.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/restock_all_villagers&lt;/code&gt; Finds all villagers in world and restocks them.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;API&lt;/h4&gt;
&lt;p&gt;These functions are exposed under global namespace &lt;code&gt;mcl_villager_cheats&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mcl_villager_cheats.get_villager_profession(object)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcl_villager_cheats.restock_if_villager(object)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcl_villager_cheats.restock_all_villagers()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcl_villager_cheats.find_first_villie(playername, action)&lt;/code&gt;
    Action is &lt;code&gt;describe&lt;/code&gt; or &lt;code&gt;restock&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Screenshots&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-mcl_villager_cheats.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-mcl_villager_cheats-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Recipe for villager spawn egg:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Emerald block, bread, emerald block&lt;/li&gt;
&lt;li&gt;Any enchanted book, diamond hoe, cake&lt;/li&gt;
&lt;li&gt;Diamond block, lectern, diamond block&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="/2026/recipe-villager.png" src="https://bgstack15.ddns.net/blog/2026/recipe-villager.png"&gt;&lt;/p&gt;
&lt;p&gt;Recipe for zombie villager spawn egg:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Emerald block, rotten flesh, emerald block&lt;/li&gt;
&lt;li&gt;Any enchanted book, diamond hoe, cake&lt;/li&gt;
&lt;li&gt;Diamond block, lectern, diamond block&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="/2026/recipe-zombie-villager.png" src="https://bgstack15.ddns.net/blog/2026/recipe-zombie-villager.png"&gt;&lt;/p&gt;
&lt;h3&gt;Settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mcl_villager_cheats.use_timer&lt;/code&gt; Boolean. If true, then will restock all villagers at the times specified in the next setting.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcl_villager_cheats.times&lt;/code&gt; Comma-separated list of times to restock all villagers, in millihours. &lt;code&gt;6100&lt;/code&gt; is the default value, and is approximately 06:05, which is right after the time a player wakes up from a bed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcl_villager_cheats.verbose&lt;/code&gt; Boolean. Send chat messages to all players when the timer restocks villagers. Default is &lt;code&gt;false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcl_villager_cheats.recipes&lt;/code&gt; Boolean. Enables the recipes for the villager/zombie villager spawn eggs. Default is &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcl_villager_cheats.enable_village_build_tool&lt;/code&gt; Enable village build tool, in creative only. Default is &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;None found. This is novel.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Further research&lt;/h3&gt;
&lt;p&gt;This does not work as a client side mod (CSM) because a few methods are not available to the client api.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;core.objects_by_guid&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;core.register_chatcommand&lt;/code&gt; despite it being listed as available in &lt;a href="https://github.com/luanti-org/luanti/blob/master/doc/client_lua_api.md"&gt;client_lua_api.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>game</category><category>luanti</category><category>mod</category><guid>https://bgstack15.ddns.net/blog/posts/2026/04/20/new-luanti-mod-mcl-villager-cheats/</guid><pubDate>Mon, 20 Apr 2026 12:54:00 GMT</pubDate></item><item><title>Luanti mods that sound cool</title><link>https://bgstack15.ddns.net/blog/posts/2026/04/12/luanti-mods-that-sound-cool/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;This is intended to be a living list of mods that sound interesting but don't quite make the cut for &lt;a href="https://bgstack15.ddns.net/blog/posts/2025/12/01/my-necessary-luanti-mods-for-mineclonia/"&gt;essential mods&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Interesting mods for Mineclonia&lt;/h2&gt;
&lt;p&gt;These sound interesting. Some of these I have investigated or used or even contributed to. These are listed in no particular order, but probably in order than I came across them.&lt;/p&gt;
&lt;h3&gt;Inventory admin&lt;/h3&gt;
&lt;p&gt;This lets an admin view and change inventory of other players. Haha, like the stadium guards checking those clear bags! This is from the same guy who wrote inventory_pouches, so it must be good! I haven't actually tried this one; I haven't needed to moderate players' inventories.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-inventory_admin.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-inventory_admin-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/LudusExe/Italian-Food-for-Voxelibre"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/JamesClarke7283/inventory_admin"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Extra Woolstuff&lt;/h3&gt;
&lt;p&gt;In case I want to add stairs and slabs made of wool. I haven't wanted those in my worlds yet, but I might. Same guy as Inventory Admin above! I like his work.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-extra_woolstuff.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-extra_woolstuff-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Impulse/extra_wool_stuff/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/JamesClarke7283/extra_woolstuff"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Protector&lt;/h3&gt;
&lt;p&gt;This sounds like the big, popular protection mod. I haven't needed protection on my servers because we have live moderators, but if I needed this, I would check this out first.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-protector.jpg"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-protector-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/04/12/luanti-mods-that-sound-cool/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/TenPlus1/protector/"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Magicsquare&lt;/h3&gt;
&lt;p&gt;I like this one, and use it on a few servers, but it's not essential. It would simplify survival games, for moving animals around, but I can play without it if I had to. It is a rapid replacement of its slightly earlier version known as "mobcrate." When I use this, I use my own fork with &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/Twinsonian/magicsquare/pull/2"&gt;patches&lt;/a&gt; which have not yet been merged into upstream.&lt;/p&gt;
&lt;p&gt;(no picture)&lt;/p&gt;
&lt;p&gt;(no contentdb entry) &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/forum.luanti.org/viewtopic.php?p=447128#p447128"&gt;Forum post&lt;/a&gt; scm: &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/Twinsonian/magicsquare"&gt;upstream&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti/magicsquare/?h=feature%2Fhold-items"&gt;mine&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Invisiblocks&lt;/h3&gt;
&lt;p&gt;From TenPlus1 again (like Protector), this mod sounds more useful for creative mode, when making a game or puzzle map or something. The mob wall item works with Mobs Redo but not Mineclonia mobs. I wouldn't even want to waste my time asking Mineclonia devs to support it because it's not related to Mineclonia directly so they'd decline immediately. The invisible barrier and invisible light blocks are pretty great though.&lt;/p&gt;
&lt;p&gt;I love this idea and implementation, but it's not directly related to survival gameplay, so it's hardly essential. Man, if I could get the MCL animals to obey the mob walls, I probably would put this on my survival servers. But fences work too (minus the mobs lag-jumping over them).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-invisiblocks.jpg"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-invisiblocks-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/TenPlus1/invisiblocks/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/tenplus1/invisiblocks"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Ancient Stuff&lt;/h3&gt;
&lt;p&gt;A random idea from another supercreator &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/users/m16b/"&gt;michi16bit&lt;/a&gt;: some more armor and tools with a cool design!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-m16b_ancient_armor.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-m16b_ancient_armor-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/m16b/m16b_ancient_armor/"&gt;ContentDB&lt;/a&gt; scm: no upstream &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti-readonly/m16b_ancient_armor"&gt;mine&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Italian Food for VoxeLibre&lt;/h3&gt;
&lt;p&gt;I helped this author with some mineclonia-related modding questions. I personally don't see the need for a million food mods in my survival worlds, but if I start adding any, I would start here.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-italian_food.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-italian_food-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Ludus/italian_food/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/LudusExe/Italian-Food-for-Voxelibre"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Automatic Storage &amp;amp; Retrieval System&lt;/h3&gt;
&lt;p&gt;This adds a nifty way to throw tons of items in a single location and you can sort and search. You wouldn't to track individual boxes anymore. This works in Mineclonia, but it doesn't quite fit with the style of gameplay for it.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-asrs-1.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-asrs-1-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-asrs-2.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-asrs-2-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Nathan.S/asrs/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/NathanS21/asrs"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Whiter List (whitelist)&lt;/h3&gt;
&lt;p&gt;This uses a file in the world directory to manage a whitelist of users who can join the world. If I need this feature, this is the one I would use. There are a host of alternatives but this one uses a local file which appeals to me, instead of mod storage which is more obtuse to manage.&lt;/p&gt;
&lt;p&gt;(no picture)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/AntumDeluge/whitelist/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/AntumMT/mod-whitelist"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Bulldozer&lt;/h3&gt;
&lt;p&gt;Obvious. It has no recipe, because it's so powerful, so it is for creative mode only.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-bulldozer.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-bulldozer-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/celeron55/bulldozer/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/celeron55/minetest_bulldozer"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;Updates&lt;/h5&gt;
&lt;h3&gt;Crafty fonts (crafty_fonts)&lt;/h3&gt;
&lt;h6&gt;added 2026-04-16&lt;/h6&gt;
&lt;p&gt;This adds familiar pixel fonts for any Luanti game. This helps the immersion in Mineclonia! The fonts get used automatically by the game when the mod is enabled for your world.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-crafty_fonts.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-crafty_fonts-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/texmex/crafty_fonts/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/tacotexmex/crafty_fonts"&gt;scm&lt;/a&gt;&lt;/p&gt;</description><category>game</category><category>git</category><category>luanti</category><category>mod</category><category>notes</category><guid>https://bgstack15.ddns.net/blog/posts/2026/04/12/luanti-mods-that-sound-cool/</guid><pubDate>Sun, 12 Apr 2026 13:24:00 GMT</pubDate></item><item><title>New Luanti mod: mcl_ruby_stuff</title><link>https://bgstack15.ddns.net/blog/posts/2026/04/08/new-luanti-mod-mcl-ruby-stuff/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I wrote another clone of &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/rudzik8/mcl_emerald_stuff"&gt;mcl_emerald_stuff&lt;/a&gt;, which I named &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti/mcl_ruby_stuff"&gt;mcl_ruby_stuff&lt;/a&gt;. I also previously wrote &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti/mcl_lapis_stuff"&gt;mcl_lapis_stuff&lt;/a&gt; but I failed to have a separate post for that.&lt;/p&gt;
&lt;p&gt;This mod today is only for &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/ryvnf/mineclonia/"&gt;Mineclonia&lt;/a&gt; and &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/git.minetest.land/VoxeLibre/VoxeLibre"&gt;VoxeLibre&lt;/a&gt;. It is published in official &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/bgstack15/mcl_ruby_stuff/"&gt;ContentDB&lt;/a&gt; and in the internal &lt;a href="https://bgstack15.ddns.net/blog/outbound/http:/contentdb.example.com"&gt;ContentDB&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;You have to fashion rubies before you can make the gear.&lt;/p&gt;
&lt;p&gt;Not only is this gear scaled for very late-game play, it also looks fashionable because it is red.&lt;/p&gt;
&lt;h3&gt;Using&lt;/h3&gt;
&lt;p&gt;Craft rubies based on the recipe chosen by the server admin. Craft with rubies to fashion all the ordinary gear like tools, armors, and horse armor. Equip the tools and armor!&lt;/p&gt;
&lt;h3&gt;Screenshots&lt;/h3&gt;
&lt;p&gt;Screenshot of armor and tools made with rubies&lt;br&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mcl_ruby_stuff_screenshot.png"&gt;&lt;/p&gt;
&lt;p&gt;Screenshot of horse armor on a horse&lt;br&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mcl_ruby_stuff_screenshot_horse_armor.png"&gt;&lt;/p&gt;
&lt;h3&gt;Optional support&lt;/h3&gt;
&lt;p&gt;Mod &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/camelia/farmtools/pulls/23"&gt;farmtools&lt;/a&gt; has been requested to support this mod.&lt;/p&gt;
&lt;h3&gt;Alternatives&lt;/h3&gt;
&lt;p&gt;For a &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/luanti-org/minetest_game"&gt;Minetest Game&lt;/a&gt; ruby experience, use mod &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/ReinPlayz/ruby_tools_plus/"&gt;Ruby Tools+&lt;/a&gt;. That mod is entirely unrelated to this one.&lt;/p&gt;
&lt;h3&gt;Settings&lt;/h3&gt;
&lt;p&gt;Once at installation time, configure the build recipe in &lt;code&gt;minetest.conf&lt;/code&gt;, entry &lt;code&gt;mcl_ruby_stuff.recipe&lt;/code&gt;. The options are the following. The recipe affects the strength of the equipment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;emerald_and_redstone_dust&lt;/code&gt;: 1 emerald + 1 redstone dust.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/mcl_core/textures/mcl_core_emerald.png" alt="emerald" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/REDSTONE/mcl_redstone/textures/redstone_redstone_dust.png" alt="redstone dust" width="48" height="48"&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;eight_redstone_dust&lt;/code&gt;: 8 redstone dust.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/REDSTONE/mcl_redstone/textures/redstone_redstone_dust.png" alt="redstone dust" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/REDSTONE/mcl_redstone/textures/redstone_redstone_dust.png" alt="redstone dust" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/REDSTONE/mcl_redstone/textures/redstone_redstone_dust.png" alt="redstone dust" width="48" height="48"&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/REDSTONE/mcl_redstone/textures/redstone_redstone_dust.png" alt="redstone dust" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/REDSTONE/mcl_redstone/textures/redstone_redstone_dust.png" alt="redstone dust" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/REDSTONE/mcl_redstone/textures/redstone_redstone_dust.png" alt="redstone dust" width="48" height="48"&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/REDSTONE/mcl_redstone/textures/redstone_redstone_dust.png" alt="redstone dust" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://codeberg.org/mineclonia/mineclonia/raw/tag/0.120.1/mods/ITEMS/REDSTONE/mcl_redstone/textures/redstone_redstone_dust.png" alt="redstone dust" width="48" height="48"&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nine_redstone_blocks&lt;/code&gt;: 9 redstone blocks. This will make the strength of the equipment 2x that of emerald equipment.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;img src="https://bgstack15.ddns.net/blog/2026/redstone-block.png" alt="redstone block" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://bgstack15.ddns.net/blog/2026/redstone-block.png" alt="redstone block" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://bgstack15.ddns.net/blog/2026/redstone-block.png" alt="redstone block" width="48" height="48"&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;img src="https://bgstack15.ddns.net/blog/2026/redstone-block.png" alt="redstone block" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://bgstack15.ddns.net/blog/2026/redstone-block.png" alt="redstone block" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://bgstack15.ddns.net/blog/2026/redstone-block.png" alt="redstone block" width="48" height="48"&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;&lt;img src="https://bgstack15.ddns.net/blog/2026/redstone-block.png" alt="redstone block" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://bgstack15.ddns.net/blog/2026/redstone-block.png" alt="redstone block" width="48" height="48"&gt;&lt;/td&gt;
        &lt;td&gt;&lt;img src="https://bgstack15.ddns.net/blog/2026/redstone-block.png" alt="redstone block" width="48" height="48"&gt;&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;</description><category>game</category><category>git</category><category>luanti</category><category>mod</category><guid>https://bgstack15.ddns.net/blog/posts/2026/04/08/new-luanti-mod-mcl-ruby-stuff/</guid><pubDate>Wed, 08 Apr 2026 13:07:00 GMT</pubDate></item><item><title>Mod for Luanti: Highlighter Pen</title><link>https://bgstack15.ddns.net/blog/posts/2026/03/11/new-luanti-mod-highlighter-pen/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I wrote a novel Luanti mod, that works in any game. I have tested it specifically in the following games.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/ryvnf/mineclonia/"&gt;Mineclonia&lt;/a&gt;, also on &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/ryvnf/mineclonia/"&gt;ContentDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/luanti-org/minetest_game"&gt;Minetest Game&lt;/a&gt;, also on &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Luanti/minetest_game/"&gt;ContentDB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/git.minetest.land/VoxeLibre/VoxeLibre"&gt;VoxeLibre&lt;/a&gt;, also on &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Wuzzy/mineclone2/"&gt;ContentDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Description&lt;/h3&gt;
&lt;p&gt;This mod for Luanti adds highlighter pen tools. A player can highlight nodes, and erase highlights. The highlights persist after a safe server restart.&lt;/p&gt;
&lt;p&gt;The canonical scm repo for this mod is at &lt;a href="https://bgstack15.ddns.net/cgit/luanti/highlighter_pen"&gt;https://bgstack15.ddns.net/cgit/luanti/highlighter_pen&lt;/a&gt;, and an additional repo suitable for collaboration is at &lt;a href="https://gitlab.com/bgsack15/highlighter_pen"&gt;https://gitlab.com/bgsack15/highlighter_pen&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Using&lt;/h3&gt;
&lt;p&gt;Craft a highlighter pen. Right-click a node with the tool to set a highlight. Left-click to remove a highlight on a node.&lt;/p&gt;
&lt;p&gt;Craft and use a blotter to remove highlights in a small radius (default radius is 3).&lt;/p&gt;
&lt;h3&gt;Dependencies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Vendors &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/forum.luanti.org/viewtopic.php?t=31761"&gt;node_highlighter&lt;/a&gt; because that is not in ContentDB. You can also use that mod, and it will load that instead of using the vendored components.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Optional dependencies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/mt-mods/unifieddyes/"&gt;Unifieddyes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Screenshots&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-highlighter-pen-recipe1.png"&gt;Crafting recipe for a highlighter pen&lt;br&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-highlighter-pen-recipe1.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-highlighter-pen-recipe2.png"&gt;Crafting recipe for a blotter&lt;br&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-highlighter-pen-recipe2.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/mod-highlighter-pen-screenshot.png"&gt;Screenshot of some highlight strokes in the world&lt;br&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/mod-highlighter-pen-screenshot-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Settings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;How many nodes can a highlighter pen be used in survival mode on before the pen runs out (default 200)&lt;/li&gt;
&lt;li&gt;Highlighter pen can erase all highlight-colors from a node (default true)&lt;/li&gt;
&lt;li&gt;Using a highlighter in the air (an empty node) erases this color entirely, on all nodes (default false)&lt;/li&gt;
&lt;li&gt;Blotter radius, where 1 is the single node that was right-clicked (default 3)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Current weaknesses&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The blotter is the only component that respects &lt;code&gt;core.is_protected&lt;/code&gt;, and only on the center of the usage.&lt;/li&gt;
&lt;li&gt;Unifieddyes does not produce highlighter pens for each color variant for creative mode inventory; you have to craft them.&lt;/li&gt;
&lt;/ul&gt;</description><category>game</category><category>luanti</category><category>mod</category><category>opensource</category><guid>https://bgstack15.ddns.net/blog/posts/2026/03/11/new-luanti-mod-highlighter-pen/</guid><pubDate>Wed, 11 Mar 2026 13:19:00 GMT</pubDate></item><item><title>Script to stay synced to upstreams for Luanti mods</title><link>https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I added a script to my &lt;a href="https://bgstack15.ddns.net/blog/posts/2026/02/15/initialize-mineclonia-git-repo/"&gt;repo for initializing a Mineclonia installation&lt;/a&gt; that uses a separate location to synchronize my local repositories to the upstream paths, if they still exist.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/mod-upstreams.sh.html"&gt;files/2026/listings/mod-upstreams.sh&lt;/a&gt;  &lt;a href="https://bgstack15.ddns.net/blog/files/2026/listings/mod-upstreams.sh"&gt;(Source)&lt;/a&gt;&lt;/p&gt;&lt;div class="code"&gt;&lt;table class="codetable"&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-1"&gt;&lt;code data-line-number="  1"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-2"&gt;&lt;code data-line-number="  2"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Startdate: 2026-01-30-6 13:35&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-3"&gt;&lt;code data-line-number="  3"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Purpose: List and track git remotes for Luanti mods I care about&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-4"&gt;&lt;code data-line-number="  4"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-5"&gt;&lt;code data-line-number="  5"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Config&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-6"&gt;&lt;code data-line-number="  6"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://server3/git/luanti"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-7"&gt;&lt;code data-line-number="  7"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;/mod-upstreams&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-8"&gt;&lt;code data-line-number="  8"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-9"&gt;&lt;code data-line-number="  9"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Functions&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-10"&gt;&lt;code data-line-number=" 10"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-11"&gt;&lt;code data-line-number=" 11"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;ginit&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-12"&gt;&lt;code data-line-number=" 12"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    err&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-13"&gt;&lt;code data-line-number=" 13"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-14"&gt;&lt;code data-line-number=" 14"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-15"&gt;&lt;code data-line-number=" 15"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    err &lt;span class="s2"&gt;"# ginit &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-16"&gt;&lt;code data-line-number=" 16"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${#}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; -lt &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-17"&gt;&lt;code data-line-number=" 17"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-18"&gt;&lt;code data-line-number=" 18"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        err &lt;span class="s2"&gt;"Usage: ginit &amp;lt;repository_url&amp;gt; [branch_name] [dirname]"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-19"&gt;&lt;code data-line-number=" 19"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-20"&gt;&lt;code data-line-number=" 20"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-21"&gt;&lt;code data-line-number=" 21"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="nv"&gt;REPO_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-22"&gt;&lt;code data-line-number=" 22"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; basename &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; .git &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-23"&gt;&lt;code data-line-number=" 23"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-24"&gt;&lt;code data-line-number=" 24"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="nv"&gt;DIRNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-25"&gt;&lt;code data-line-number=" 25"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DIRNAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DIRNAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-26"&gt;&lt;code data-line-number=" 26"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -d &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-27"&gt;&lt;code data-line-number=" 27"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-28"&gt;&lt;code data-line-number=" 28"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        err &lt;span class="s2"&gt;"Directory &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; already exists. Changing directory to it."&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-29"&gt;&lt;code data-line-number=" 29"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-30"&gt;&lt;code data-line-number=" 30"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-31"&gt;&lt;code data-line-number=" 31"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-32"&gt;&lt;code data-line-number=" 32"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            err &lt;span class="s2"&gt;"Switching to branch &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-33"&gt;&lt;code data-line-number=" 33"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            git fetch --all
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-34"&gt;&lt;code data-line-number=" 34"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            &lt;span class="c1"&gt;# my old redirect trick to filter stderr&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-35"&gt;&lt;code data-line-number=" 35"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-36"&gt;&lt;code data-line-number=" 36"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-37"&gt;&lt;code data-line-number=" 37"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                    &lt;span class="c1"&gt;# Use 'git switch' (modern) or 'git checkout' (older versions)&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-38"&gt;&lt;code data-line-number=" 38"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                    &lt;span class="c1"&gt;# 'git switch -c' creates and switches to a new branch if it doesn't exist locally&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-39"&gt;&lt;code data-line-number=" 39"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                    git switch -c &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"origin/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-40"&gt;&lt;code data-line-number=" 40"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                        git checkout -b &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"origin/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-41"&gt;&lt;code data-line-number=" 41"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                        git checkout &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-42"&gt;&lt;code data-line-number=" 42"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -r -e &lt;span class="s1"&gt;'/fatal: a branch named.*already exists/d'&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-43"&gt;&lt;code data-line-number=" 43"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-44"&gt;&lt;code data-line-number=" 44"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-45"&gt;&lt;code data-line-number=" 45"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-46"&gt;&lt;code data-line-number=" 46"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-47"&gt;&lt;code data-line-number=" 47"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-48"&gt;&lt;code data-line-number=" 48"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            err &lt;span class="s2"&gt;"Cloning branch &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; into &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-49"&gt;&lt;code data-line-number=" 49"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            git clone -b &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BRANCH_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-50"&gt;&lt;code data-line-number=" 50"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-51"&gt;&lt;code data-line-number=" 51"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            err &lt;span class="s2"&gt;"Cloning default branch into &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-52"&gt;&lt;code data-line-number=" 52"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-53"&gt;&lt;code data-line-number=" 53"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-54"&gt;&lt;code data-line-number=" 54"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt; -d &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-55"&gt;&lt;code data-line-number=" 55"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-56"&gt;&lt;code data-line-number=" 56"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-57"&gt;&lt;code data-line-number=" 57"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            git pull
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-58"&gt;&lt;code data-line-number=" 58"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            err &lt;span class="s2"&gt;"Changed directory to &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-59"&gt;&lt;code data-line-number=" 59"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-60"&gt;&lt;code data-line-number=" 60"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            err &lt;span class="s2"&gt;"Failed to clone repository"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-61"&gt;&lt;code data-line-number=" 61"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-62"&gt;&lt;code data-line-number=" 62"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-63"&gt;&lt;code data-line-number=" 63"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-64"&gt;&lt;code data-line-number=" 64"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-65"&gt;&lt;code data-line-number=" 65"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-66"&gt;&lt;code data-line-number=" 66"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-67"&gt;&lt;code data-line-number=" 67"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="nv"&gt;_origin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-68"&gt;&lt;code data-line-number=" 68"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="nv"&gt;_dest&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-69"&gt;&lt;code data-line-number=" 69"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="nv"&gt;_branches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-70"&gt;&lt;code data-line-number=" 70"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;WORKDIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-71"&gt;&lt;code data-line-number=" 71"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;if&lt;/span&gt; ginit &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_origin&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-72"&gt;&lt;code data-line-number=" 72"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-73"&gt;&lt;code data-line-number=" 73"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-74"&gt;&lt;code data-line-number=" 74"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            git remote add dest &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_dest&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-75"&gt;&lt;code data-line-number=" 75"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -r -e &lt;span class="s1"&gt;'/error: remote.*already exists/d'&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-76"&gt;&lt;code data-line-number=" 76"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        git pull --all
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-77"&gt;&lt;code data-line-number=" 77"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;_branches&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;,main,master"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;'!x[$0]++'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; branch &lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-78"&gt;&lt;code data-line-number=" 78"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-79"&gt;&lt;code data-line-number=" 79"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-80"&gt;&lt;code data-line-number=" 80"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                git switch -c &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"origin/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-81"&gt;&lt;code data-line-number=" 81"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                    git checkout -b &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"origin/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-82"&gt;&lt;code data-line-number=" 82"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                    git checkout &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-83"&gt;&lt;code data-line-number=" 83"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;                git push dest &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;branch&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-84"&gt;&lt;code data-line-number=" 84"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -r -e &lt;span class="s1"&gt;'/fatal: a branch named.*already exists/d'&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-85"&gt;&lt;code data-line-number=" 85"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;        &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-86"&gt;&lt;code data-line-number=" 86"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;    &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-87"&gt;&lt;code data-line-number=" 87"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-88"&gt;&lt;code data-line-number=" 88"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-89"&gt;&lt;code data-line-number=" 89"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# sync_repos origin dest "branches,comma-separated"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-90"&gt;&lt;code data-line-number=" 90"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/JamesClarke7283/enchantments_extractor &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/enchantments_extractor"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-91"&gt;&lt;code data-line-number=" 91"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# enchantments_workbench is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-92"&gt;&lt;code data-line-number=" 92"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://codeberg.org/camelia/farmtools &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/farmtools"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-93"&gt;&lt;code data-line-number=" 93"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://codeberg.org/Wuzzy/minetest_inventory_icon &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/minetest_inventory_icon"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-94"&gt;&lt;code data-line-number=" 94"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/JamesClarke7283/inventory_pouches &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/inventory_pouches"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-95"&gt;&lt;code data-line-number=" 95"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/ketwaroo/minetest-k-ambient-light &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-readonly/minetest-k-ambient-light"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-96"&gt;&lt;code data-line-number=" 96"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/ketwaroo/minetest-k-recycler &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-readonly/minetest-k-recycler"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-97"&gt;&lt;code data-line-number=" 97"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lava_furnace is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-98"&gt;&lt;code data-line-number=" 98"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://codeberg.org/SilverSandstone/leads &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-readonly/leads"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-99"&gt;&lt;code data-line-number=" 99"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# list_to_file is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-100"&gt;&lt;code data-line-number="100"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/minetest-mapserver/mapserver_mod &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-readonly/mapserver_mod"&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-101"&gt;&lt;code data-line-number="101"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# mcl_chiseled_bookshelf is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-102"&gt;&lt;code data-line-number="102"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# mcl_colored_chests is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-103"&gt;&lt;code data-line-number="103"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://codeberg.org/TomCon/mcl_copper_stuff &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-readonly/mcl_copper_stuff"&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-104"&gt;&lt;code data-line-number="104"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://codeberg.org/rudzik8/mcl_cozy &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mcl_cozy"&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-105"&gt;&lt;code data-line-number="105"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://codeberg.org/rudzik8/mcl_decor &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-readonly/mcl_decor"&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-106"&gt;&lt;code data-line-number="106"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://codeberg.org/rudzik8/mcl_emerald_stuff &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mcl_emerald_stuff"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-107"&gt;&lt;code data-line-number="107"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# mcl_lapis_stuff is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-108"&gt;&lt;code data-line-number="108"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/ketwaroo/minetest-mcl-misk-recipes &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mcl_misk_recipes"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-109"&gt;&lt;code data-line-number="109"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://codeberg.org/rudzik8/mcl_morefood &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mcl_morefood"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-110"&gt;&lt;code data-line-number="110"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# milk_potion is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-111"&gt;&lt;code data-line-number="111"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# molten_sailor_mcl is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-112"&gt;&lt;code data-line-number="112"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://git.0x7be.net/dirk/mtimer &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mtimer"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-113"&gt;&lt;code data-line-number="113"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/minetest-go/mtui_mod &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-readonly/mtui_mod"&lt;/span&gt; &lt;span class="s2"&gt;"master"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-114"&gt;&lt;code data-line-number="114"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# obsidian_extra is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-115"&gt;&lt;code data-line-number="115"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/LizzyFleckenstein03/playerlist &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/playerlist"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-116"&gt;&lt;code data-line-number="116"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/acmgit/minetest_poi &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/minetest_poi"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-117"&gt;&lt;code data-line-number="117"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# privs_per_world is mine&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-118"&gt;&lt;code data-line-number="118"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://gitlab.com/cronvel/mt-respawn &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/mt-respawn"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-119"&gt;&lt;code data-line-number="119"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# safe_chest upstream is gone, so I guess I am upstream now.&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-120"&gt;&lt;code data-line-number="120"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;&lt;span class="c1"&gt;# sync_repos https://github.com/smnoe01/safe_chest "${host}/safe_chest"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-121"&gt;&lt;code data-line-number="121"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/mt-historical/snippets &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-readonly/snippets"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-122"&gt;&lt;code data-line-number="122"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/DonBatman/myairwand &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-readonly/myairwand"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="linenos linenodiv"&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/#-123"&gt;&lt;code data-line-number="123"&gt;&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;code&gt;sync_repos https://github.com/Twinsonian/magicsquare &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/magicsquare"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt;
&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The purpose of this script is to make synchronizing to upstream easy. I tend to have very small changes to upstream. On occasion my changes get merged into upstream, and I don't need any feature branches! For some of these, I have private patches that have been declined by upstream or never sent to them in the first place.&lt;/p&gt;
&lt;p&gt;This script also documents the mods I care about. Any of the "readonly" ones are ones for which I have no changes at all. I have changed my mind and have had to move some around, when I realized I wanted to patch them after all.&lt;/p&gt;</description><category>game</category><category>git</category><category>luanti</category><category>mod</category><guid>https://bgstack15.ddns.net/blog/posts/2026/03/03/script-to-stay-synced-to-upstreams-for-luanti-mods/</guid><pubDate>Tue, 03 Mar 2026 14:27:00 GMT</pubDate></item><item><title>New Luanti csm: node_inv_read</title><link>https://bgstack15.ddns.net/blog/posts/2026/02/23/new-luanti-csm-node-inv-read/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I wrote a new client side mod for Luanti that is an inventory cheat. Technically it doesn't work in Minetest Game, so it only works in Mineclonia. I couldn't figure that out.&lt;/p&gt;
&lt;p&gt;This mod lets you punch any node, and if it has inventory, it will show all the inventories to you. I have tested it with up to 6 inventories. And if a node does not use the &lt;code&gt;allow_metadata_inventory_put&lt;/code&gt; functions, you can even move items around!&lt;/p&gt;
&lt;p&gt;Get the &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti/node_inv_read"&gt;code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2026/screenshot-node_inv_read-big.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2026/screenshot-node_inv_read.png"&gt;&lt;/a&gt;&lt;/p&gt;</description><category>game</category><category>luanti</category><category>mod</category><guid>https://bgstack15.ddns.net/blog/posts/2026/02/23/new-luanti-csm-node-inv-read/</guid><pubDate>Mon, 23 Feb 2026 14:13:00 GMT</pubDate></item><item><title>My necessary Luanti mods for Minetest Game</title><link>https://bgstack15.ddns.net/blog/posts/2025/12/09/my-necessary-luanti-mods-for-minetest-game/</link><dc:creator>bgstack15</dc:creator><description>&lt;div&gt;&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;I recently published my &lt;a href="https://bgstack15.ddns.net/blog/posts/2025/12/01/my-necessary-luanti-mods-for-mineclonia/"&gt;list of mods for Mineclonia&lt;/a&gt;, and here is my list of mods I want for &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/minetest/minetest_game"&gt;Minetest Game&lt;/a&gt; (&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Luanti/minetest_game/"&gt;ContentDB&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;It's been said that most Minetest Game servers are just a mod soup that the admin wants. Well, it's true.&lt;/p&gt;
&lt;h2&gt;Mods I use for Minetest Game&lt;/h2&gt;
&lt;h3&gt;Airutils&lt;/h3&gt;
&lt;p&gt;This is a dependency library and helper components for the specific airplanes added by other mods. I do not have any patches for this.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2025/mod-airutils.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2025/mod-airutils-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/apercy/airutils/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/APercy/airutils"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Automobiles Pack (automobiles_pck)&lt;/h3&gt;
&lt;p&gt;Written by the same prolific Luanti mod author &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/apercy/"&gt;Apercy&lt;/a&gt; as the previous mod, this one adds a bunch of cool ground vehicles. I never sent any patches, but I did submit a single &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/APercy/automobiles_pck/issues/39"&gt;bug report&lt;/a&gt;. I want automobiles, and this seemed to be the premiere way to get them!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2025/mod-automobiles-pck.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2025/mod-automobiles-pck-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/apercy/automobiles_pck/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/APercy/automobiles_pck/"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/12/09/my-necessary-luanti-mods-for-minetest-game/"&gt;Read more…&lt;/a&gt; (17 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>game</category><category>luanti</category><category>minetest</category><category>mod</category><category>notes</category><guid>https://bgstack15.ddns.net/blog/posts/2025/12/09/my-necessary-luanti-mods-for-minetest-game/</guid><pubDate>Tue, 09 Dec 2025 14:15:00 GMT</pubDate></item><item><title>My necessary Luanti mods for Mineclonia</title><link>https://bgstack15.ddns.net/blog/posts/2025/12/01/my-necessary-luanti-mods-for-mineclonia/</link><dc:creator>bgstack15</dc:creator><description>&lt;div&gt;&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;I like the Free Software game &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/www.luanti.org/"&gt;Luanti&lt;/a&gt;. You can play in a sandbox world, with a great base for mods in &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/minetest/minetest_game"&gt;Minetest Game&lt;/a&gt; (&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Luanti/minetest_game/"&gt;ContentDB&lt;/a&gt;). You can even get a premium experience with &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/mineclonia/mineclonia"&gt;Mineclonia&lt;/a&gt; (&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/ryvnf/mineclonia/"&gt;ContentDB&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;While Mineclonia can be played without mods because it already bundles many mods in with it, mods improve it even more. And I would definitely want to add mods to MTG. Here is my official list of mods to use in Mineclonia, in alphabetical order. I have even &lt;a href="https://bgstack15.ddns.net/blog/categories/cat_mod/"&gt;written&lt;/a&gt; about some of these before, particuarly the ones I wrote. I will publish my list of MTG mods &lt;a href="https://bgstack15.ddns.net/blog/posts/2025/12/09/my-necessary-luanti-mods-for-minetest-game/"&gt;next time&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Any additional mods that sound cool but aren't necessary will be documented in a &lt;a href="https://bgstack15.ddns.net/blog/posts/2026/04/12/luanti-mods-that-sound-cool/"&gt;future post&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Mods I use for Mineclonia&lt;/h2&gt;
&lt;h3&gt;Enchantments extractor (enchantments_extractor)&lt;/h3&gt;
&lt;p&gt;Enchantments extractor is a nifty object that lets you strip enchantments from objects into books, or splits an object with multiple enchantments into each individual enchanted book. This is very useful to remove the scavenged items with random enchantments, for further use.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2025/mod-enchantments-extractor.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2025/mod-enchantments-extractor-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/Impulse/enchantments_extractor/"&gt;ContentDB&lt;/a&gt; scm: &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/github.com/JamesClarke7283/enchantments_extractor"&gt;upstream&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti/enchantments_extractor/?h=dev"&gt;mine&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Enchantments workbench (enchantments_workbench)&lt;/h3&gt;
&lt;p&gt;I &lt;a href="https://bgstack15.ddns.net/blog/posts/2025/09/04/new-luanti-mod-enchantments-workbench/"&gt;wrote this one&lt;/a&gt;. This was directly inspired by the enchantments extractor, and it gives you an object that lets you upgrade enchanted books and duplicate them: These abilities are very useful in a survival world.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2025/mod-enchantments-workbench.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2025/mod-enchantments-workbench-small.png"&gt;&lt;/a&gt;
&lt;a href="https://bgstack15.ddns.net/blog/2025/mod-enchantments-workbench-2.png"&gt;&lt;img alt="" src="https://bgstack15.ddns.net/blog/2025/mod-enchantments-workbench-2-small.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/bgstack15/enchantments_workbench/"&gt;ContentDB&lt;/a&gt; &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti/enchantments_workbench"&gt;scm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/posts/2025/12/01/my-necessary-luanti-mods-for-mineclonia/"&gt;Read more…&lt;/a&gt; (20 min remaining to read)&lt;/p&gt;&lt;/div&gt;</description><category>game</category><category>luanti</category><category>mineclonia</category><category>mod</category><category>notes</category><guid>https://bgstack15.ddns.net/blog/posts/2025/12/01/my-necessary-luanti-mods-for-mineclonia/</guid><pubDate>Mon, 01 Dec 2025 13:44:00 GMT</pubDate></item><item><title>New Luanti mod: privs_per_world</title><link>https://bgstack15.ddns.net/blog/posts/2025/10/10/new-luanti-mod-privs-per-world/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;I wrote a novel mod for &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/www.luanti.org/"&gt;Luanti&lt;/a&gt;, specifically for &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/ryvnf/mineclonia/"&gt;Mineclonia&lt;/a&gt;. This mod is named &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti/privs_per_world"&gt;privs_per_world&lt;/a&gt; (&lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/codeberg.org/bgstack15/privs_per_world"&gt;codeberg&lt;/a&gt;, &lt;a href="https://bgstack15.ddns.net/blog/outbound/https:/content.luanti.org/packages/bgstack15/privs_per_world/"&gt;ContentDB&lt;/a&gt;) and it is an engine for automatically granting and revoking privileges based on entering and leaving the various &lt;em&gt;worlds&lt;/em&gt; (Overworld, Nether, End) of Mineclonia.&lt;/p&gt;
&lt;p&gt;The default settings grant &lt;code&gt;fast, fly, noclip&lt;/code&gt; to players entering the Nether, and revokes these privileges upon leaving.&lt;/p&gt;
&lt;p&gt;The server admin can configure settings in minetest.conf. See &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti/privs_per_world/tree/settingtypes.txt"&gt;settingtypes.txt&lt;/a&gt;, but it is easier to use &lt;a href="https://bgstack15.ddns.net/blog/cgit/luanti/privs_per_world/tree/settings.lua.example"&gt;settings.lua&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I know that the Mineclonia guys tend to adapt existing mods, so if there's some "worlds" mod that facilitates different "dimensions" and the transport to and from them, this might be useful elsewhere but I don't have any test environments for that.&lt;/p&gt;
&lt;p&gt;Here is the default settings, which are useful for a Mineclonia survival server.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ppw.settings = {
    nether = {
        enter = { 
            give = core.settings:get("privs_per_world.nether_enter_give") or "fly,noclip,fast",
            take = core.settings:get("privs_per_world.nether_enter_take") or "",
        },
        leave = {
            give = core.settings:get("privs_per_world.nether_leave_give") or "",
            take = core.settings:get("privs_per_world.nether_leave_take") or "fly,noclip,fast",
        },
    },
    overworld = {
        enter = {
            give = core.settings:get("privs_per_world.overworld_enter_give") or "",
            take = core.settings:get("privs_per_world.overworld_enter_take") or "",
        },
        leave = {
            give = core.settings:get("privs_per_world.overworld_leave_give") or "",
            take = core.settings:get("privs_per_world.overworld_leave_take") or "",
        },
    }
}
&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Future improvements&lt;/h2&gt;
&lt;p&gt;I might need to use mod storage to store privileges of user before entering/leaving the world, so we can restore them. But this would lose any privileges that change while the user is in the world. So register_on_grant_priv might be useful, if this mod's own set_privileges does not trigger those.&lt;/p&gt;</description><category>game</category><category>luanti</category><category>mod</category><guid>https://bgstack15.ddns.net/blog/posts/2025/10/10/new-luanti-mod-privs-per-world/</guid><pubDate>Fri, 10 Oct 2025 13:10:00 GMT</pubDate></item></channel></rss>