{"id":113,"date":"2026-01-22T01:09:17","date_gmt":"2026-01-22T00:09:17","guid":{"rendered":"https:\/\/www.matteobononi.it\/blog\/?p=113"},"modified":"2026-01-22T14:09:38","modified_gmt":"2026-01-22T13:09:38","slug":"rimworld-planner-building-a-useless-but-working-tool","status":"publish","type":"post","link":"https:\/\/www.matteobononi.it\/blog\/rimworld-planner-building-a-useless-but-working-tool\/","title":{"rendered":"RimWorld Planner \u2014 building a useless but working tool"},"content":{"rendered":"\n<p>I built <a href=\"https:\/\/www.matteobononi.it\/rimworld_planner\/\" target=\"_blank\"><strong>RimWorld Planner<\/strong><\/a> because I wanted to plan a base without opening the game. That\u2019s really all there is to it. RimWorld is one of those games where half the fun happens outside the actual game \u2014 in spreadsheets, sketches, and overthinking layouts that will inevitably collapse when raiders arrive. I just wanted a clean grid and a few tools to draw walls, measure distances, and imagine colonies that might never exist.<\/p>\n\n\n\n<p>The project started simple, but then I got stuck on the idea of making it <em>offline-first<\/em>. I wanted something that could work entirely in the browser, without an account, without saving anything remotely unless you chose to. So now it does exactly that: maps are stored locally by default, and only if you opt in, they can be published to a small gallery on the server. No backend needed to get started.<\/p>\n\n\n\n<p>Under the hood, it\u2019s mostly JavaScript \u2014 no fancy frameworks, just some modular logic to handle drawing, zooming, saving, and exporting ASCII maps. I added compatibility with the <a href=\"https:\/\/steamcommunity.com\/sharedfiles\/filedetails\/?id=3554743746\" target=\"_blank\" rel=\"noreferrer noopener\">More Planning<\/a> mod, since I used it a lot in RimWorld and the format was easy to support. I\u2019d like to connect it with other planners too, if anyone\u2019s interested. The idea is to make it as open and adaptable as possible, so people can build on top of it if they want.<\/p>\n\n\n\n<p>There\u2019s also a <strong>Room Generator<\/strong> feature that tries to generate random rooms with different shapes and purposes. It didn\u2019t work for a while (honestly, it broke more often than it worked), but now it behaves better. Every so often I add something new, or change how things work. It\u2019s not finished \u2014 it probably never will be \u2014 but it\u2019s usable. And that\u2019s good enough for me.<\/p>\n\n\n\n<p>Sometimes I think about projects like this as small proof-of-concepts of persistence: tools that don\u2019t need a reason to exist beyond being pleasant to make and surprisingly functional once done. RimWorld Planner might be useless, but it works. And if someone out there finds it useful \u2014 or asks me to integrate it with something else \u2014 then maybe it wasn\u2019t so useless after all.<\/p>\n\n\n\n<p>\u2192 Try it here: <a href=\"https:\/\/www.matteobononi.it\/rimworld_planner\/\" target=\"_blank\">matteobononi.it\/rimworld_planner\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A small browser-based tool I built to plan RimWorld colonies without launching the game. Offline-first, ASCII export, and slightly useless \u2014 but it works.<\/p>\n","protected":false},"author":1,"featured_media":114,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59],"tags":[46,47,44,43,48],"class_list":["post-113","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esperimenti","tag-javascript","tag-more-planning","tag-planner","tag-rimworld","tag-side-project"],"_links":{"self":[{"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/posts\/113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/comments?post=113"}],"version-history":[{"count":1,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/posts\/113\/revisions"}],"predecessor-version":[{"id":115,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/posts\/113\/revisions\/115"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/media\/114"}],"wp:attachment":[{"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/media?parent=113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/categories?post=113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.matteobononi.it\/blog\/wp-json\/wp\/v2\/tags?post=113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}