<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ricardo Sanchez</title>
    <description>The latest articles on DEV Community by Ricardo Sanchez (@sancheznot).</description>
    <link>https://dev.to/sancheznot</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F763979%2F719900f0-1baa-43c2-bcbd-b0f55115fc6c.jpeg</url>
      <title>DEV Community: Ricardo Sanchez</title>
      <link>https://dev.to/sancheznot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sancheznot"/>
    <language>en</language>
    <item>
      <title>I built a private MMORPG stack for a 3D farming game (Godot + Go)</title>
      <dc:creator>Ricardo Sanchez</dc:creator>
      <pubDate>Wed, 05 Aug 2026 22:55:39 +0000</pubDate>
      <link>https://dev.to/sancheznot/i-built-a-private-mmorpg-stack-for-a-3d-farming-game-godot-go-2nlb</link>
      <guid>https://dev.to/sancheznot/i-built-a-private-mmorpg-stack-for-a-3d-farming-game-godot-go-2nlb</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsw4uzj39xsqu8iu95c7e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsw4uzj39xsqu8iu95c7e.jpg" alt="Farm World 3D gameplay" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Farm World started as a simple idea: a 3D multiplayer farm where you build, plant, drive machines, and meet people in town. I did not want to rent someone else's netcode forever. I wanted a stack I could own for years.&lt;/p&gt;

&lt;p&gt;So I built one.&lt;/p&gt;

&lt;p&gt;This is not a "look at my landing page" post. It is the messy middle: protocol design, Blender without being a 3D artist, SQLite under a live world loop, and the bugs that only show up when real players join.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Farm World is
&lt;/h2&gt;

&lt;p&gt;A multiplayer 3D farming game:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Own a plot, grow crops, raise animals, store harvest.&lt;/li&gt;
&lt;li&gt;Buy vehicles, hitch field tools, work the land like a small farm sim.&lt;/li&gt;
&lt;li&gt;Walk into town, sell, craft, take quests, hang out with other players.&lt;/li&gt;
&lt;li&gt;Play in the browser or download a desktop build.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Client: &lt;strong&gt;Godot 4.6&lt;/strong&gt; (GL Compatibility, so web export stays realistic).&lt;br&gt;&lt;br&gt;
Server: &lt;strong&gt;Go&lt;/strong&gt;, plain &lt;strong&gt;WebSocket&lt;/strong&gt; JSON, &lt;strong&gt;SQLite&lt;/strong&gt; persistence.&lt;br&gt;&lt;br&gt;
No Unity Netcode. No Photon. No "MMORPG framework" bought off a shelf.&lt;/p&gt;

&lt;p&gt;Rough size today: about &lt;strong&gt;29k lines of Go&lt;/strong&gt; on the server (without tests), hundreds of &lt;strong&gt;GLB&lt;/strong&gt; props and crops in the asset tree, plus a Next.js site for play and downloads.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why a private framework
&lt;/h2&gt;

&lt;p&gt;I kept hitting the same wall with ready-made multiplayer kits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Great for shooters or tiny lobbies, awkward for persistent farms.&lt;/li&gt;
&lt;li&gt;Your economy, plots, animals, and world events still need custom authority.&lt;/li&gt;
&lt;li&gt;Once the kit fights your game design, you pay twice: once in money, once in rewrites.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Farm World needs server authority on almost everything that matters: gold, inventory, crop growth, market prices, vehicle cargo, plot power. The client is a view. The server is the truth.&lt;/p&gt;

&lt;p&gt;That decision became the spine of the project. The "framework" is not a product I sell. It is the habit of building:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A small JSON op protocol over WebSocket.&lt;/li&gt;
&lt;li&gt;A single Go process that owns game rules and DB writes.&lt;/li&gt;
&lt;li&gt;A Godot autoload (&lt;code&gt;game_net.gd&lt;/code&gt;) that speaks that protocol and nothing else.&lt;/li&gt;
&lt;li&gt;Migrations that grow with the live world instead of a big bang rewrite.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I plan to keep this shape for years. New systems plug into ops, handlers, and tables. That is the private stack.&lt;/p&gt;
&lt;h2&gt;
  
  
  The protocol is boring on purpose
&lt;/h2&gt;

&lt;p&gt;Every message is basically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"op"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"action_sow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"slot_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cell_x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"cell_y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"seed_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wheat"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Login, resume session, sow, harvest, place buildings, spawn vehicles, chat, friends… same envelope. On the Go side, it lands in one &lt;code&gt;Message&lt;/code&gt; struct with many optional fields. On Godot, it is &lt;code&gt;send_op({ "op": "..." })&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Boring is a feature. When a new system arrives (pets, craft pots, world events, voice signals), you add an op and a handler. You do not invent a second networking universe.&lt;/p&gt;

&lt;p&gt;Client-side, it looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gdscript"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;request_sync&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;send_op&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"sync"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;request_sow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;slot_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cell_x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cell_y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;send_op&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"action_sow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"slot_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;slot_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"cell_x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cell_x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"cell_y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cell_y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"seed_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;seed_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Hard problem 1: an MMORPG server from zero
&lt;/h2&gt;

&lt;p&gt;"From zero" means: accept sockets, authenticate, rate limit login, keep session tokens, load plot state, tick growth, broadcast presence, and never trust the client with gold.&lt;/p&gt;

&lt;p&gt;A few lessons that cost real nights:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full sync is a trap.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;sync&lt;/code&gt; that rebuilds the whole player profile feels safe early on. It is also how you melt FPS. We once shipped a client loop that asked for full sync tens of times per second after restoring farm machines. The HUD ping lied. The real cost was JSON parsing on the main thread. Fix: stop the loop, prefer deltas, treat full sync as a rare reconnect tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The world loop is a product feature.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Crops do not grow because the client animates. Rain, market multipliers, and harvest yield live on the server clock. That makes events fair across players and keeps cheaters bored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQLite can carry an early MMO if you respect it.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
One file DB, WAL, careful transactions, indexes on hot paths, and migrations that do not lock the world for minutes. I did not start with a cluster. I started with correctness and measurable queries. When something is slow, it is usually an N+1 load of tiles or a sync that got fat again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazimc3hbzgyz8b9aae51.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fazimc3hbzgyz8b9aae51.png" alt="Farm World custom telemetry dashboard tracking server metrics, funnel events, and SQLite performance" width="800" height="453"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkmgfxryonbvigxxq6vnk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkmgfxryonbvigxxq6vnk.png" alt="Farm World custom telemetry dashboard tracking server metrics, funnel events, and SQLite performance" width="800" height="453"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Custom admin analytics dashboard built to monitor server health (Goroutines, Heap, SQL latency) and player onboarding friction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authority boundaries stay sacred.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If the client could invent a harvest, the economy dies. Every meaningful action is validated server side against inventory, plot ownership, and cooldowns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard problem 2: hundreds of GLBs without being a Blender expert
&lt;/h2&gt;

&lt;p&gt;I am not a professional 3D artist. I still needed a town, crops at multiple growth stages, kitchen props, vehicles, hitch tools, and vegetation.&lt;/p&gt;

&lt;p&gt;The workflow that actually worked:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Source packs and kitbash where the art direction allows it.&lt;/li&gt;
&lt;li&gt;Blender only for the boring jobs: scale, origin, export GLB, fix materials that Godot hates.&lt;/li&gt;
&lt;li&gt;Naming discipline so crops and props map cleanly to item IDs.&lt;/li&gt;
&lt;li&gt;Accept that "pretty enough and consistent" beats "perfect and never shipping".&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The surprise cost was not sculpting. It was pipeline: import settings, LODs later, collision, and keeping the web build from drowning in megabytes. Art is a systems problem once you have hundreds of files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard problem 3: a 16 km² map that has to run in the browser
&lt;/h2&gt;

&lt;p&gt;The world is about &lt;strong&gt;16 square kilometers&lt;/strong&gt;. That sounds cool in a trailer. On the web, it is a constant fight: Terrain3D regions, props, vehicles, town collision, audio, and a WASM build that cannot pretend it is a fat desktop install.&lt;/p&gt;

&lt;p&gt;Making that map playable in the browser has been one of the hardest product constraints of the whole project. GL Compatibility is not a preference; it is survival. Streaming attention, draw distance, and "do not load the entire planet at once" thinking matter more than fancy lighting.&lt;/p&gt;

&lt;p&gt;With a small player count so far, the result is already good enough to ship and keep iterating: people drive, farm, and explore without the tab melting. The open question is scale. More concurrent players means more presence traffic, more vehicles in view, more pressure on the same web budget. The map size stays. The stack has to earn it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard problem 4: 100 plots, 784 cells each, and ping spikes
&lt;/h2&gt;

&lt;p&gt;We have &lt;strong&gt;100 farm plots&lt;/strong&gt;. Each one is a &lt;strong&gt;28×28 grid&lt;/strong&gt;, so &lt;strong&gt;784 cells&lt;/strong&gt; per plot. That is not a cute number on a whiteboard. It is tiles, soil, crops, trees, buildings, paint, and power state that can all want to travel over the wire.&lt;/p&gt;

&lt;p&gt;The pain showed up when a plot got "real": something like &lt;strong&gt;200 harvest cells&lt;/strong&gt; plus a dense tree layer. Full property payloads got fat. The client spent frames merging and spawning. The server spent time building profiles and broadcasting to people who did not even need the detail. Ping spikes were not mysterious network weather. They were us shipping too much world to the wrong people.&lt;/p&gt;

&lt;p&gt;I spent hours reworking both sides:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interest/distance.&lt;/strong&gt; Nearby players and the plot owner get full detail. Far players get a thin &lt;strong&gt;stub&lt;/strong&gt;: skyline bits you can see from the road, without the crop and tree arrays that would wipe or bloat their local cache.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetch on approach.&lt;/strong&gt; When you walk closer, the client asks for the real plot (&lt;code&gt;fetch_plot&lt;/code&gt; style flow) instead of assuming every slot arrives complete on welcome.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deltas over dumps.&lt;/strong&gt; Growth and harvest prefer &lt;strong&gt;tile patches&lt;/strong&gt; and targeted &lt;code&gt;property_update&lt;/code&gt;s. Re-sending 784 cells because one tomato ripened is how you invent lag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presence is local too.&lt;/strong&gt; Movement does not fan out to every connected socket on a 16 km² map. If you are far away, you should not pay for my tractor position every tick.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client LOD to match.&lt;/strong&gt; Plot interiors, fences, and foliage already think in distance bands. Network stubs and scene LODs have to agree, or you optimize one layer, and the other still melts the frame.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This was not one clever PR. It was a loop of measure, cut payload, fix a merge bug, watch the spike come back under a busier plot, repeat. The goal was boring: keep ping peaks low even when farms look alive.&lt;/p&gt;

&lt;p&gt;Things that moved the needle beyond plots and the big map:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stop chatty sync loops (the farm machine bug was a teacher).&lt;/li&gt;
&lt;li&gt;Send growth patches instead of re-sending the whole plot when possible.&lt;/li&gt;
&lt;li&gt;Treat export audio, caching, and pack size as first-class bugs on web.&lt;/li&gt;
&lt;li&gt;Measure. A "50 ms ping" HUD can hide a 70 ms JSON parse.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is also the human side of shipping: version modals when server and client disagree, production bugs like crops that show in inventory but refuse to sell, audio that works in the editor and vanishes on web export. That is the real curriculum.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would tell myself on day one
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Design the op list before the UI screens.&lt;/li&gt;
&lt;li&gt;Assume full state sync will betray you.&lt;/li&gt;
&lt;li&gt;Put economy math on the server on day one, even if the formulas are naive.&lt;/li&gt;
&lt;li&gt;Learn just enough Blender to unblock export, then stop cosplaying as a studio.&lt;/li&gt;
&lt;li&gt;Write down pitfalls. Future you will step on the same rake.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The long game
&lt;/h2&gt;

&lt;p&gt;Farm World is the game players see. Under it sits a private multiplayer habit I expect to reuse: Godot client, Go authority server, SQLite until proven otherwise, JSON ops, ruthless server validation.&lt;/p&gt;

&lt;p&gt;I am still adding systems (crafting and town businesses, pets, mobile/export paths, better audio spaces). The stack is meant to survive that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If the development side caught your attention, you can play the free demo in the browser at &lt;a href="https://www.farms-world.com/play" rel="noopener noreferrer"&gt;farms-world.com/play&lt;/a&gt;, grab a desktop build from the site, or join the &lt;a href="https://discord.gg/tbHqtwAjkt" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; and tell me what broke.&lt;/p&gt;

&lt;p&gt;Questions welcome in the comments: protocol design, Godot web export, or "why SQLite for an MMO" are all fair game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gameplay Screenshots
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftu6p9an1qpk3nu7xt695.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftu6p9an1qpk3nu7xt695.png" alt="Farm World gameplay overview" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft9pkmu24gjyrz42bm33r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft9pkmu24gjyrz42bm33r.png" alt="Farm World gameplay overview" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjvig4pk8adw6g5v61lui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjvig4pk8adw6g5v61lui.png" alt="Farm World gameplay overview" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Febekaufwf2hwdxftuuqd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Febekaufwf2hwdxftuuqd.png" alt="Farm World gameplay overview" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnv583fbz6b4m282m421v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnv583fbz6b4m282m421v.png" alt="Farm World gameplay overview" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm4ksk69rglesxydlxfnb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm4ksk69rglesxydlxfnb.png" alt="Farm World gameplay overview" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qni3nf79curwkjhrueq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qni3nf79curwkjhrueq.png" alt="Farm World gameplay overview" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>showdev</category>
      <category>godot</category>
      <category>go</category>
    </item>
    <item>
      <title>Godot AI? Here is the solution: What is Golem-AI?</title>
      <dc:creator>Ricardo Sanchez</dc:creator>
      <pubDate>Thu, 04 Jun 2026 18:31:20 +0000</pubDate>
      <link>https://dev.to/sancheznot/godot-ai-here-is-the-solution-what-is-golem-ai-13nn</link>
      <guid>https://dev.to/sancheznot/godot-ai-here-is-the-solution-what-is-golem-ai-13nn</guid>
      <description>&lt;p&gt;Enlace a post en Español &lt;a href="https://dev.to/sancheznot/godot-ai-traigo-esta-solucion-que-es-golem-ai-d2h"&gt;Click&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are developing games in Godot and using AI to help you code, you are probably tired of constantly switching tabs between your editor and the browser. Copying code, pasting it, explaining your scene context over and over again... it is a massive workflow killer.&lt;/p&gt;

&lt;p&gt;To solve this, I built &lt;strong&gt;Golem-AI&lt;/strong&gt; (named after the Godot Engine logo because let's face it, it looks like a tiny, friendly mechanical golem). It is a "Cursor-style" AI assistant extension integrated directly into a dock right inside your &lt;strong&gt;Godot 4.2+&lt;/strong&gt; editor.&lt;/p&gt;

&lt;p&gt;Today, I am opening the repository to the community as a completely open-source project. It is currently in &lt;strong&gt;Beta&lt;/strong&gt; and has some bugs, but it is fully functional, and I want to share it so we can improve it together.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  / ____/___  / /__  ____ ___        /   |  /  _/
 / / __/ __ \/ / _ \/ __ `__ \______/ /| |  / /  
/ /_/ / /_/ / /  __/ / / / / /_____/ ___ |_/ /   
\____/\____/_/\___/_/ /_/ /_/     /_/  |_/___/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎮 How it Looks Inside the Editor&lt;br&gt;
Here is a glimpse of the integrated dock interface, its session history, and the context autocomplete system in action:&lt;/p&gt;

&lt;p&gt;🔥 Key Features&lt;br&gt;
🦙 Local &amp;amp; Cloud Providers: Connect it to Ollama or LM Studio for a 100% free, offline local workflow, or hook it up to OpenAI, Anthropic, Gemini, or Cursor proxies.&lt;/p&gt;

&lt;p&gt;🧠 Cursor-Style UX &amp;amp; Context (@ Mentions): Type @ in the chat composer to automatically attach open scenes, specific project files, or custom skills directly into the prompt.&lt;/p&gt;

&lt;p&gt;🛠️ Editor Tool Calling: It features an optional multi-step verification loop. The AI can actually interact with native Godot editor tools to help you iterate and fix things faster.&lt;/p&gt;

&lt;p&gt;📚 Markdown Skills System: Feed the assistant specific workflows, style guides, or documentation using standard markdown files (/skill or &lt;a class="mentioned-user" href="https://dev.to/skill"&gt;@skill&lt;/a&gt;:id).&lt;/p&gt;

&lt;p&gt;💬 Advanced Chat UI: Built-in "thinking blocks", agent step progress tracking, searchable history sessions, and a native bilingual UI (English / Spanish).&lt;/p&gt;

&lt;p&gt;🛠️ The Current State: "It works, but..." (Looking for Beta Testers!)&lt;br&gt;
Let's be completely transparent: This is a Beta release.&lt;/p&gt;

&lt;p&gt;You will encounter bugs. The tool-calling loop might stumble occasionally, or a lightweight local model might hallucinate your scene tree structure. But that is exactly why I am sharing it today! I want to test it against different gamedev workflows, see how it handles massive projects, and figure out what the Godot community actually needs from an in-editor AI teammate.&lt;/p&gt;

&lt;p&gt;🚀 Quick Start Guide&lt;br&gt;
Testing it or breaking it takes less than two minutes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Installation
Clone the repository directly into your project's addons folder:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="o"&gt;[&lt;/span&gt;https://github.com/sancheznot/Godot-AI-Assistant.git]&lt;span class="o"&gt;(&lt;/span&gt;https://github.com/sancheznot/Godot-AI-Assistant.git&lt;span class="o"&gt;)&lt;/span&gt; addons/ai_assistant_plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Enable the Plugin&lt;br&gt;
Open your project in Godot, navigate to Project -&amp;gt; Project Settings -&amp;gt; Plugins, and check the Enable box next to AI Assistant Plugin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure Your Model&lt;br&gt;
Click the Config button in the new dock toolbar, enable your preferred provider (like Ollama), click the refresh icon ↻ to fetch your models, and you are ready to chat!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🤝 Code with Me (Contribute!)&lt;br&gt;
The project structure is quite modular and straightforward:&lt;/p&gt;

&lt;p&gt;/harness handles the system prompt layers.&lt;/p&gt;

&lt;p&gt;/scenes and /scripts separate the dock UI layout from the plugin logic.&lt;/p&gt;

&lt;p&gt;/skills hosts the pre-built markdown behaviors.&lt;/p&gt;

&lt;p&gt;If you are a GDScript wrangler, an AI architecture enthusiast, or someone who just loves polishing UI/UX layout details, Pull Requests and Issues are incredibly welcome.&lt;/p&gt;

&lt;p&gt;👉 Check out the GitHub Repository here: &lt;a href="https://github.com/sancheznot/Godot-AI-Assistant" rel="noopener noreferrer"&gt;https://github.com/sancheznot/Godot-AI-Assistant&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you test it out, let me know in the comments below! What provider are you running it with? What broke first? Let's make the Godot Golem smarter together.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Godot AI? Traigo esta solución: ¿Qué es Golem-AI?</title>
      <dc:creator>Ricardo Sanchez</dc:creator>
      <pubDate>Thu, 04 Jun 2026 18:25:53 +0000</pubDate>
      <link>https://dev.to/sancheznot/godot-ai-traigo-esta-solucion-que-es-golem-ai-d2h</link>
      <guid>https://dev.to/sancheznot/godot-ai-traigo-esta-solucion-que-es-golem-ai-d2h</guid>
      <description>&lt;p&gt;Link to post in English &lt;a href="https://dev.to/sancheznot/godot-ai-here-is-the-solution-what-is-golem-ai-13nn"&gt;Click&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si estás desarrollando juegos en Godot y usas inteligencia artificial para programar, seguro estás harto de cambiar de ventana entre tu editor y el navegador web. Copiar código, pegarlo, explicar el contexto de tus escenas una y otra vez... es molesto.&lt;/p&gt;

&lt;p&gt;Para solucionar esto, creé &lt;strong&gt;Golem-AI&lt;/strong&gt; (llamado así porque el logo de Godot parece un pequeño golem mecánico). Es un asistente de IA tipo "Cursor" integrado directamente en un dock dentro de tu editor de &lt;strong&gt;Godot 4.2+&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Hoy abro el repositorio como un proyecto completamente open-source. Está en &lt;strong&gt;Beta&lt;/strong&gt; y tiene bugs, pero ya es totalmente funcional y quiero compartirlo con la comunidad para mejorarlo juntos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  / ____/___  / /__  ____ ___        /   |  /  _/
 / / __/ __ \/ / _ \/ __ `__ \______/ /| |  / /  
/ /_/ / /_/ / /  __/ / / / / /_____/ ___ |_/ /   
\____/\____/_/\___/_/ /_/ /_/     /_/  |_/___/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔥 Características Principales&lt;br&gt;
🦙 Modelos Locales y Cloud: Conéctalo a Ollama o LM Studio para un flujo de trabajo 100% gratuito y desconectado, o configúralo con OpenAI, Anthropic, Gemini o proxies de Cursor.&lt;/p&gt;

&lt;p&gt;🧠 Contexto con @ Mentions (Estilo Cursor): Escribe @ en el chat para adjuntar automáticamente escenas abiertas, archivos específicos del proyecto o habilidades personalizadas directamente en el prompt.&lt;/p&gt;

&lt;p&gt;🛠️ Llamado de Herramientas del Editor (Tool Calling): Cuenta con un bucle opcional de verificación de múltiples pasos donde la IA puede interactuar con las herramientas nativas de Godot para ayudarte a iterar más rápido.&lt;/p&gt;

&lt;p&gt;📚 Sistema de Habilidades en Markdown: Entrena al asistente con flujos de trabajo específicos usando archivos markdown estándar (/skill o &lt;a class="mentioned-user" href="https://dev.to/skill"&gt;@skill&lt;/a&gt;:id).&lt;/p&gt;

&lt;p&gt;💬 UI de Chat Avanzada: Incluye bloques de pensamiento ("thinking blocks"), progreso de pasos del agente, historial de sesiones con buscador y una interfaz bilingüe nativa (Español / Inglés).&lt;/p&gt;

&lt;p&gt;🛠️ El Estado Actual: "Funciona, pero..." (¡Llamado a Beta Testers!)&lt;br&gt;
Seamos transparentes: Esto es una versión Beta.&lt;/p&gt;

&lt;p&gt;Vas a encontrar errores. El bucle de ejecución de herramientas puede fallar a veces o un modelo local pequeño podría alucinar con la estructura de tus nodos. Pero precisamente por eso lo comparto hoy de forma abierta. Quiero ver cómo se comporta en diferentes flujos, cómo maneja proyectos masivos y qué es lo que la comunidad de Godot realmente busca en un compañero de IA integrado.&lt;/p&gt;

&lt;p&gt;🚀 Guía de Inicio Rápido&lt;br&gt;
Probarlo o empezar a romperlo toma menos de dos minutos.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Instalación
Clona el repositorio directamente dentro de la carpeta de addons de tu proyecto de Godot:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="o"&gt;[&lt;/span&gt;https://github.com/sancheznot/Godot-AI-Assistant.git]&lt;span class="o"&gt;(&lt;/span&gt;https://github.com/sancheznot/Godot-AI-Assistant.git&lt;span class="o"&gt;)&lt;/span&gt; addons/ai_assistant_plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Activar el Plugin&lt;br&gt;
Abre tu proyecto en Godot, ve a Proyecto -&amp;gt; Ajustes del Proyecto -&amp;gt; Plugins y marca la casilla de Activar al lado de AI Assistant Plugin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configurar tu Modelo&lt;br&gt;
Haz clic en el botón Config en la barra de herramientas del nuevo panel (dock), activa tu proveedor preferido (como Ollama), presiona el icono de actualizar ↻ para cargar tus modelos guardados locales o en la nube, ¡y listo!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🤝 Colabora Conmigo (Contribuir)&lt;br&gt;
La estructura del código es bastante limpia y modular:&lt;/p&gt;

&lt;p&gt;/harness maneja las capas del sistema de prompts.&lt;/p&gt;

&lt;p&gt;/scenes y /scripts separan la interfaz del dock de la lógica del plugin.&lt;/p&gt;

&lt;p&gt;/skills contiene los comportamientos preestablecidos en Markdown.&lt;/p&gt;

&lt;p&gt;Si eres un desarrollador de GDScript, un entusiasta de la arquitectura de IA o simplemente te encanta pulir interfaces visuales, los Pull Requests y los Issues son más que bienvenidos.&lt;/p&gt;

&lt;p&gt;👉 Enlace al repositorio en GitHub: &lt;a href="https://github.com/sancheznot/Godot-AI-Assistant" rel="noopener noreferrer"&gt;https://github.com/sancheznot/Godot-AI-Assistant&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si lo pruebas, ¡cuéntame en los comentarios de abajo qué tal te funcionó! ¿Qué proveedor estás usando? ¿Qué fue lo primero que se rompió? Vamos a hacer al Golem de Godot más inteligente entre todos.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>gamedev</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
