<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Indie Tooling</title><description>News, tools, and working notes for independent game developers: engines, asset pipelines, editors, and shipping small games.</description><link>https://indietooling.com</link><language>en-AU</language><copyright>Copyright 2026 Indie Tooling</copyright><item><title>Steam&apos;s discounts tab is going algorithmic</title><link>https://indietooling.com/posts/steam-discounts-tab-goes-algorithmic</link><guid isPermaLink="true">https://indietooling.com/posts/steam-discounts-tab-goes-algorithmic</guid><description>Valve is swapping hand-picked deals for a feed tailored to each player. For small games that&apos;s mostly good news, and there&apos;s work worth doing now.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;On 29 September, Valve announced it will stop running Steam’s Discounts &amp;amp; Events section from a curated calendar. Instead, each logged-in player will see discounted games and events picked for them. If you sell a small game, this one’s worth a few minutes.&lt;/p&gt;
&lt;h2 id=&quot;whats-changing&quot;&gt;What’s changing&lt;/h2&gt;
&lt;p&gt;Valve has paused scheduling new curated placements: the Daily, Midweek and Weekend Deals. Slots already booked will still run, so don’t cancel yours. A timetable is promised in the coming weeks, with the curated calendar fully retired in early 2027 alongside new tools for managing discounts and events.&lt;/p&gt;
&lt;p&gt;It isn’t dynamic pricing, so you still set your own discounts. And there’s nothing to opt into.&lt;/p&gt;
&lt;h2 id=&quot;why-its-mostly-good-news&quot;&gt;Why it’s mostly good news&lt;/h2&gt;
&lt;p&gt;Under the old system, only a handful of the games on sale each day reached the front of the tab, and they leaned towards bestsellers. Valve says its tests showed players ten times more games a day, with clear rises in store visits, wishlists and cart adds. It hasn’t published the numbers yet.&lt;/p&gt;
&lt;p&gt;Developers are seeing it too. Hooded Horse CEO Tim Bender shared one indie game that got 7,341 visits from the grid in one month, against 14 in the previous five. That’s one example rather than an average, but it’s a promising one.&lt;/p&gt;
&lt;p&gt;The catch: you can’t pitch your way onto the tab any more. The algorithm decides who sees you, and vague tags or a weak store page mean being shown to the wrong people.&lt;/p&gt;
&lt;h2 id=&quot;what-to-do-now&quot;&gt;What to do now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tighten your tags.&lt;/strong&gt; Your top tags should say what the game really is. A cosy farming game tagged “Action” will meet the wrong players.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tune the page for a cold click.&lt;/strong&gt; These visitors have never heard of you, so check the capsule, the first five seconds of your trailer, your first screenshots and a one-line pitch. &lt;a href=&quot;/posts/store-page-while-the-build-is-ugly&quot;&gt;Store page basics&lt;/a&gt; still apply.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grab a baseline.&lt;/strong&gt; Note your Discounts &amp;amp; Events traffic in Steamworks now, then compare it after your next sale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discount more often, not deeper.&lt;/strong&gt; Each sale is another chance to be picked. Valve hasn’t said bigger discounts rank higher, so there’s no need to slash prices.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Join themed events and publisher sales,&lt;/strong&gt; and keep an eye on your review score.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next up, watch for Valve’s timetable and the new Steamworks tools. That’s where we’ll learn what you control and what you don’t.&lt;/p&gt;
&lt;p&gt;Sources: &lt;a href=&quot;https://steamcommunity.com/groups/steamworks/announcements/detail/676258795703240952&quot;&gt;Steamworks announcement&lt;/a&gt;, &lt;a href=&quot;https://www.gamedeveloper.com/pc/steam-s-discounts-and-events-tab-will-soon-be-fully-algorithm-driven&quot;&gt;Game Developer&lt;/a&gt;, &lt;a href=&quot;https://80.lv/articles/steam-quietly-made-a-huge-discoverability-change-for-indie-games/&quot;&gt;80 Level&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>Shipping</category><category>steam</category><category>discounts</category><category>steamworks</category><category>discoverability</category><category>store page</category><author>The Shipping Desk</author></item><item><title>Unity 7 alpha: what&apos;s new, and why to stay on Unity 6</title><link>https://indietooling.com/posts/unity-7-alpha-stay-on-unity-6</link><guid isPermaLink="true">https://indietooling.com/posts/unity-7-alpha-stay-on-unity-6</guid><description>The first Unity 7 alpha swaps Mono for CoreCLR in the editor. The payoff hasn&apos;t arrived yet, so stay on Unity 6 and use the time to get ready.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Unity opened the Unity 7.0 alpha to everyone on 5 October, two months ahead of the December preview it talked about at Unite Seoul in July. It’s in Unity Hub under Pre-releases. Before you hit download, here’s what’s actually inside.&lt;/p&gt;
&lt;h2 id=&quot;what-changed&quot;&gt;What changed&lt;/h2&gt;
&lt;p&gt;The big one: the Unity Editor now runs on CoreCLR, the runtime behind modern .NET, instead of Mono. Unity has been working towards this for years, and it’s the reason Unity 7 exists.&lt;/p&gt;
&lt;p&gt;What you write stays the same, though. The alpha still targets C# 9 and .NET Standard 2.1, just like Unity 6. The C# 14 and .NET 10 support shown off in July isn’t here yet, and Unity can’t commit to a public date. Player builds don’t change either.&lt;/p&gt;
&lt;p&gt;Domain reloads are technically gone, replaced by a new reload system, but Unity says the speed gains aren’t visible yet. Early testers are seeing reload times much like Unity 6.5. Performance work is planned for a later 7.x release.&lt;/p&gt;
&lt;h2 id=&quot;should-you-switch&quot;&gt;Should you switch?&lt;/h2&gt;
&lt;p&gt;Not if you’re shipping. Unity itself says the alpha isn’t for production, and nothing in it makes your game better today. Stay on Unity 6.3 LTS, which is supported until December 2027.&lt;/p&gt;
&lt;p&gt;The more pressing date is closer: Unity 6.0 LTS reaches end of support this month. If you’re still on it, moving to 6.3 matters more than anything in Unity 7.&lt;/p&gt;
&lt;h2 id=&quot;get-ready-from-unity-6&quot;&gt;Get ready from Unity 6&lt;/h2&gt;
&lt;p&gt;You can do most of the prep without touching the alpha:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run Project Auditor 2.0’s Domain Reload checks to find code that will break when Mono goes.&lt;/li&gt;
&lt;li&gt;Turn on Fast Enter Play Mode now. It will become the only option, and it flushes out statics that never reset.&lt;/li&gt;
&lt;li&gt;Swap &lt;code&gt;BinaryFormatter&lt;/code&gt; out of your save system. It’s obsolete under CoreCLR.&lt;/li&gt;
&lt;li&gt;List your Asset Store packages and native plugins. Unity has tested the 68 most popular packages, so for anything else, ask the publisher. It helps to &lt;a href=&quot;/posts/open-the-package-before-unity&quot;&gt;know what’s in your packages&lt;/a&gt; anyway.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Got a spare afternoon and a backup? Copy your project, open it in the alpha and report what breaks. Unity is shipping builds twice a week, so today’s bug could be fixed well before 7.0 lands in 2027.&lt;/p&gt;
&lt;p&gt;For now, Unity 7 is a plumbing release. The pipes matter, but the water isn’t running yet. We’ll keep covering it in &lt;a href=&quot;/category/engines&quot;&gt;Engines&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sources: &lt;a href=&quot;https://discussions.unity.com/t/unity-7-0-alpha-is-now-available/1738310&quot;&gt;Unity 7.0 alpha announcement&lt;/a&gt;, &lt;a href=&quot;https://discussions.unity.com/t/coreclr-scripting-and-net-update-october-2026/1738338&quot;&gt;CoreCLR, Scripting and .NET update&lt;/a&gt;, &lt;a href=&quot;https://discussions.unity.com/t/path-to-coreclr-2026-upgrade-guide/1714279&quot;&gt;Path to CoreCLR upgrade guide&lt;/a&gt;, &lt;a href=&quot;https://unity.com/releases/unity-6/support&quot;&gt;Unity 6 support&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>Engines</category><category>unity</category><category>unity 7</category><category>coreclr</category><category>unity 6 lts</category><category>upgrading</category><author>The Engines Desk</author></item><item><title>Your downloads folder is not a library</title><link>https://indietooling.com/posts/downloads-folder-is-not-a-library</link><guid isPermaLink="true">https://indietooling.com/posts/downloads-folder-is-not-a-library</guid><description>Bought packs pile up as zip files with useless names. A short filing habit stops a solo developer paying twice for the same art.</description><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most indie projects do not lose assets inside the engine. They lose them one directory up, in Downloads, in a folder called sort-later, or inside an old project that shipped and then got archived.&lt;/p&gt;
&lt;p&gt;The pattern is dull, and it costs money. You need a door tile, a nine-slice panel, or a footstep on gravel. You are sure you already bought it. The file browser shows a zip, a Unity package, or a pile of PNGs still wearing the vendor’s names. Opening each one in an editor is a twenty-minute job, so you buy whatever is on sale. Three weeks later the original turns up while you are looking for something else.&lt;/p&gt;
&lt;p&gt;The failure is rarely the big pack. It is &lt;code&gt;Fantasy_Pack_final_v2.zip&lt;/code&gt;, bought on a sale, never opened, and sitting two folders from the one you are now paying for again. Nothing in the name tells you what is inside, so you cannot rule it out.&lt;/p&gt;
&lt;p&gt;A library, for a solo developer, can be modest. It still needs four fields filled in on the day the pack arrives.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/file-browser-cannot-see&quot;&gt;A preview that does not require the engine&lt;/a&gt;. If you cannot see the sprite, hear the clip, or recognise the mesh from a thumbnail, the file may as well not exist when you are tired.&lt;/p&gt;
&lt;p&gt;Your words, rather than the vendor’s. Village props. UI nine-slice. CC0. Used on the jam game. The filename was written for their shop, not for your project six months from now.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/open-the-package-before-unity&quot;&gt;The licence, stored with the pack&lt;/a&gt;. Attribution, CC0, and personal-use-only all look the same inside a zip. The question arrives at export time, which is the worst moment to hunt through old email.&lt;/p&gt;
&lt;p&gt;One place you open on purpose. A single directory, or a single app. “Wherever it landed” is how the second copy of the same crate gets bought.&lt;/p&gt;
&lt;p&gt;Do the chore on arrival. Preview, tag, write the licence, and move the archive out of Downloads. It takes longer than dragging a zip onto the desktop. It takes less time than redrawing a tileset you already own.&lt;/p&gt;
&lt;p&gt;Start with the backlog, but not all of it. Take the five newest archives in Downloads, give each its own folder, and put a short text file inside with your tags, the licence, and the shop it came from. The older ones can wait until you next go looking for something. Then the habit is already in place.&lt;/p&gt;
&lt;p&gt;A folder and a text file will do the job. If you would rather not maintain them by hand, this is the problem we built &lt;a href=&quot;https://assethoard.com&quot; rel=&quot;sponsored noopener&quot;&gt;AssetHoard&lt;/a&gt; to solve. It is a local-first desktop library for the game assets you already own, and it previews Unity packages, Godot resources, Unreal assets, and everyday formats without opening the editor.&lt;/p&gt;
</content:encoded><category>Assets</category><category>asset packs</category><category>asset management</category><category>file organisation</category><category>game assets</category><author>The Asset Desk</author></item><item><title>Open the package before Unity does</title><link>https://indietooling.com/posts/open-the-package-before-unity</link><guid isPermaLink="true">https://indietooling.com/posts/open-the-package-before-unity</guid><description>A Unity package can hide scale, a demo scene, and a licence you have not read. Look before it lands in the game project.</description><pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A Unity package is a suitcase. Import it and the suitcase unpacks into &lt;code&gt;Assets/&lt;/code&gt;, often under a vendor folder you did not choose, plus materials, a demo scene, and a readme you will not open.&lt;/p&gt;
&lt;p&gt;Before that happens, four things are worth knowing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How large it really is.&lt;/strong&gt; A pack sold as a small prop set can arrive with a demo scene, 4K textures, and a post-processing profile you did not ask for. Import first and delete later, and you will miss a file. Next month you will not know which leftovers are safe to remove.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scale and pivot.&lt;/strong&gt; A crate that shows up two metres tall, or with its pivot in the corner, gets copied wrong all over the level. You only need to notice once, before the prefab is duplicated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whether the licence covers this build.&lt;/strong&gt; Shop summaries are short. The terms might want a credit line, or they might forbid resale of the raw files. You are not reselling the files. You still need the credit in the game, and you will not remember it from the receipt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whether you already have something close enough.&lt;/strong&gt; Solo projects &lt;a href=&quot;/posts/downloads-folder-is-not-a-library&quot;&gt;collect near-duplicates&lt;/a&gt;: three barrels, four sets of UI arrows, two stone textures from different sales. Another import does not make the game clearer. It makes the project heavier.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;.unitypackage&lt;/code&gt; is a gzipped tar archive. Inside, each asset sits in a folder named by its GUID, holding the file itself, its &lt;code&gt;.meta&lt;/code&gt; data, and a &lt;code&gt;pathname&lt;/code&gt; file that says where it will land in &lt;code&gt;Assets/&lt;/code&gt;. Extract it with any tool that reads tar and skim the pathnames to see what is really in there.&lt;/p&gt;
&lt;p&gt;Unity’s import window lists every file with a checkbox. Untick the demo scene and anything you will not use.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/file-browser-cannot-see&quot;&gt;Look inside the package&lt;/a&gt;, decide what you will keep, and import only that if the tool allows it. Delete the demo scene the same day. Write one line in your own notes — barrels, commercial, credit in the options screen — and move on.&lt;/p&gt;
&lt;p&gt;If the only way to look is a throwaway project, use a throwaway project. Do not use the game. A blank project is cheap. Untangling a third-party folder the night before a jam deadline is not. Import it there, check the scale against a one-metre cube, read the licence file, and only then move the pieces you want across.&lt;/p&gt;
</content:encoded><category>Assets</category><category>unity</category><category>unitypackage</category><category>asset store</category><category>asset licensing</category><category>import settings</category><author>The Asset Desk</author></item><item><title>From Aseprite to the engine, on purpose</title><link>https://indietooling.com/posts/aseprite-to-the-engine</link><guid isPermaLink="true">https://indietooling.com/posts/aseprite-to-the-engine</guid><description>Name the tags, export a size you meant, and give the next frame an obvious folder. The mess starts after the drawing.</description><pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aseprite is usually the calm part of a 2D pipeline. The mess starts at export, in a folder of files called final, final-2, and the one you actually shipped.&lt;/p&gt;
&lt;p&gt;Pick a convention and write it where you will see it, which means in the project, not in your head. A serviceable one looks like this.&lt;/p&gt;
&lt;p&gt;Source files stay out of the engine’s import folder. &lt;code&gt;art/src/player.aseprite&lt;/code&gt; is the drawing. The export goes where the engine already looks, with the same stem: &lt;code&gt;res://art/player.png&lt;/code&gt;, or &lt;code&gt;Assets/Art/Player.png&lt;/code&gt;. The frame size is decided once. If the player is 32 by 32, the export is 32 by 32, including the idle that only uses the middle.&lt;/p&gt;
&lt;p&gt;Tags are doing real work. &lt;code&gt;idle&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, and &lt;code&gt;hit&lt;/code&gt; still make sense in six months. &lt;code&gt;a1&lt;/code&gt; does not. If you slice a sheet by hand, name the slices after the frames. “The third row is the attack” is not documentation.&lt;/p&gt;
&lt;p&gt;Aseprite’s export dialog can write the tag names and frame ranges to a JSON file beside the sheet. A script can then read the ranges, so you stop retyping them whenever the run cycle gains a frame.&lt;/p&gt;
&lt;p&gt;Set the import filter once per project. Pixel art wants nearest in Godot and Point in Unity. A blurry sprite is usually an import setting, not a drawing problem.&lt;/p&gt;
&lt;p&gt;Export the sheet the engine expects, not the one that is easiest to preview on a desktop. Godot is happy with a spritesheet and region sizes you set on the animation. Unity is happy with a sliced texture and a pivot you chose. The mistake is a new layout every time you add a frame, then an animation player offset by four pixels, then an evening spent nudging it back.&lt;/p&gt;
&lt;p&gt;Keep the Aseprite file. PNG is what the build consumes. The source is how you change an ear colour without redrawing the walk. &lt;a href=&quot;/posts/packs-out-of-git&quot;&gt;Back it up with the project&lt;/a&gt;. A PNG you cannot edit is a trap you set for yourself.&lt;/p&gt;
&lt;p&gt;Try it today on your newest character. Rename the tags and export once. Check that the sheet width is a whole number of frames.&lt;/p&gt;
&lt;p&gt;When a pack arrives as someone else’s source file, the same rules apply. Read the tags, export into your convention, and &lt;a href=&quot;/posts/open-the-package-before-unity&quot;&gt;record the licence&lt;/a&gt; next to the export. Do not drop their folder tree straight into the game and hope.&lt;/p&gt;
</content:encoded><category>Tools</category><category>aseprite</category><category>pixel art</category><category>sprite sheets</category><category>animation export</category><category>godot</category><category>unity</category><author>The Tools Desk</author></item><item><title>Keep the art packs out of the Git repository</title><link>https://indietooling.com/posts/packs-out-of-git</link><guid isPermaLink="true">https://indietooling.com/posts/packs-out-of-git</guid><description>Binary packs make clones slow and diffs useless. Keep the game in Git, and keep the library somewhere you can preview.</description><pubDate>Sat, 26 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Git is for the game: scenes, scripts, the small textures made for this project, and &lt;a href=&quot;/posts/boring-export-presets&quot;&gt;the export presets&lt;/a&gt;. It is a poor cupboard for two gigabytes of packs you might use.&lt;/p&gt;
&lt;p&gt;The symptoms are familiar. The repository takes twenty minutes to clone onto a new laptop. A one-line script change sits beside a diff Git cannot show, because an art file changed underneath. Git LFS helps until the storage quota arrives and the new machine cannot fetch the files. You are a solo developer, so the new collaborator is you in three months.&lt;/p&gt;
&lt;p&gt;Split the problem in two.&lt;/p&gt;
&lt;h2 id=&quot;what-belongs-in-git&quot;&gt;What belongs in Git&lt;/h2&gt;
&lt;p&gt;The project holds what the build needs, at the size the game needs. A 256-pixel prop, not the 4K source you might reuse on another title. Commit that. Review it. Tag a release against it.&lt;/p&gt;
&lt;p&gt;Ignore patterns earn their keep. Vendor zips, demo scenes, and lock files from the art tool should not be a surprise commit. Check status at the end of a long art day. That is when a 400 megabyte pack sneaks in.&lt;/p&gt;
&lt;p&gt;Rewriting history to remove it is possible, but it is a bad afternoon. Catching it before the commit takes ten seconds. Run &lt;code&gt;git status&lt;/code&gt; and read the list of new files before you stage anything. If a path surprises you, it does not go in.&lt;/p&gt;
&lt;p&gt;If a binary truly has to live in the repo, prefer the exported file the engine imports. Keep the vendor archive &lt;a href=&quot;/posts/downloads-folder-is-not-a-library&quot;&gt;in the library&lt;/a&gt;. Write the licence into a text file next to the code. Git is good at text.&lt;/p&gt;
&lt;h2 id=&quot;what-belongs-in-the-library&quot;&gt;What belongs in the library&lt;/h2&gt;
&lt;p&gt;Everything else: shop zips, full packs, source files, near-duplicates, the door you did not use. Keep a short text note per pack with where it came from and what the licence allows, so the answer survives the shop page disappearing. It does not have to be in Git. It has to be backed up, and it has to be searchable, so you can answer whether you already own a barrel without cloning anything.&lt;/p&gt;
&lt;p&gt;A second disk, a plain folder with a ruthless naming scheme, or a local asset manager will all do. Whichever you pick, it should stay on the machine and not become another remote you log into before you can see a sprite.&lt;/p&gt;
&lt;p&gt;The test is a fresh clone. Do it today: clone the repository into an empty folder, open it in the engine, and follow your own notes. Time it. If a new checkout builds with the steps in your notes, the repo is the right size. If it only builds on the machine that already has the packs, the packs are still pretending to be source control.&lt;/p&gt;
</content:encoded><category>Tools</category><category>git</category><category>version control</category><category>asset packs</category><category>git lfs</category><category>backups</category><author>The Tools Desk</author></item><item><title>Godot scenes are text, so read them</title><link>https://indietooling.com/posts/godot-scenes-are-text</link><guid isPermaLink="true">https://indietooling.com/posts/godot-scenes-are-text</guid><description>A text scene only helps if you look at the diff. A few habits keep a solo Godot project understandable, even with one author.</description><pubDate>Wed, 23 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Godot’s text scenes are easy to waste. A &lt;code&gt;.tscn&lt;/code&gt; file is a scene you can open in the editor, and it is also a diff you can read. That second fact matters the first time a change you do not remember lands in a file you did not mean to save.&lt;/p&gt;
&lt;p&gt;Prefer text resources over binary &lt;code&gt;.res&lt;/code&gt; for anything you might review later. Binary is a reasonable place for an imported cache. It is a bad place to keep a scene you wrote. Save when you mean to. An editor that writes the scene every time the window loses focus will fill your history with accidents.&lt;/p&gt;
&lt;p&gt;Name nodes as if you will search for them, because you will. &lt;code&gt;Camera2D&lt;/code&gt; is a type. &lt;code&gt;IntroCamera&lt;/code&gt; is a name. Renaming later changes the scene and every path that pointed at the old node, so rename early, before animations and scripts have memorised the placeholder.&lt;/p&gt;
&lt;p&gt;Open a &lt;code&gt;.tscn&lt;/code&gt; in a text editor once. Each node is a header line with its name, type and parent, such as &lt;code&gt;[node name=&quot;IntroCamera&quot; type=&quot;Camera2D&quot; parent=&quot;.&quot;]&lt;/code&gt;, followed by the properties that differ from the defaults. External files are listed at the top as &lt;code&gt;ext_resource&lt;/code&gt; lines. Once you can read that, a renamed node is one changed header and a swapped texture is one changed path.&lt;/p&gt;
&lt;p&gt;Keep scenes small enough to diff. A level that is one file with hundreds of nodes shows a wall of changes when you move a torch. A level built from instanced rooms shows you the torch. Instancing is how Tuesday’s edit stays visible.&lt;/p&gt;
&lt;p&gt;Exported script values land in the scene as data, which is what you wanted, and they show up in the diff as data. A magic number buried in &lt;code&gt;_process&lt;/code&gt; shows up as code, and you will misread it at midnight.&lt;/p&gt;
&lt;p&gt;When an import setting changes — filter, repeat, a sprite region — Godot writes that beside the asset. Commit those import files with the asset they describe, or the next machine will guess. Leave the editor cache &lt;a href=&quot;/posts/packs-out-of-git&quot;&gt;out of the repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once a week, read a diff before you commit, even if you are alone. You are looking for accidental churn: a moved camera, a duplicated node, a path that escaped to an absolute disk location, the kind of thing that also breaks &lt;a href=&quot;/posts/boring-export-presets&quot;&gt;an export preset&lt;/a&gt;. Text scenes make that visible.&lt;/p&gt;
&lt;p&gt;You nudge one platform, and the diff shows forty changed lines. Now you know the file changed for a reason you did not choose, and you can revert it before it becomes history.&lt;/p&gt;
</content:encoded><category>Engines</category><category>godot</category><category>tscn</category><category>version control</category><category>git diff</category><category>scene structure</category><author>The Engines Desk</author></item><item><title>If the player has to squint, the system is not finished</title><link>https://indietooling.com/posts/readable-at-a-glance</link><guid isPermaLink="true">https://indietooling.com/posts/readable-at-a-glance</guid><description>A system the player cannot read is a system you will misread too. Clarity belongs in the same list as the rules.</description><pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There is a moment in every systems-heavy game where the person who made it says the game is deep, and the player says they cannot tell what just happened. Both can be right. Depth that does not read is a private joke.&lt;/p&gt;
&lt;p&gt;Readable at a glance means a stranger can tell, in about a second, which pieces are theirs, what is dangerous, and whether the last action worked. It does not mean the game is small. It means the picture stays honest when there are a lot of pieces.&lt;/p&gt;
&lt;p&gt;A few tests beat a style conversation.&lt;/p&gt;
&lt;p&gt;Hide the tutorial and play for two minutes. Where did your eyes go, and were they right? If you needed a log window to know the state, the log window is doing the game’s job.&lt;/p&gt;
&lt;p&gt;Turn the effects down in your head. If the feedback only exists as screenshake and a particle, add a change in shape, colour, or number that &lt;a href=&quot;/posts/store-page-while-the-build-is-ugly&quot;&gt;survives a screenshot&lt;/a&gt;. Pause on a messy frame and look at the still. You should still know who is winning.&lt;/p&gt;
&lt;p&gt;Try the squint test. Take a screenshot from the busiest moment, shrink it to the size of a postage stamp, or blur your eyes. The player character and the thing that can kill them should still separate from the background. If two shapes merge into one blob, they are the same object as far as a tired player is concerned.&lt;/p&gt;
&lt;p&gt;Colour needs a job. Yours, theirs, neutral, warning. Then stop inventing new jobs. A fifth colour for “special, but not a warning” is how the warning colour stops working.&lt;/p&gt;
&lt;p&gt;Numbers need a home. If currency, health, and ammunition all float in the same font in the same corner, they are one number pretending to be three. Separate them by position before you separate them with a paragraph of explanation.&lt;/p&gt;
&lt;p&gt;This is a production rule as well as a taste rule. A readable game is faster to debug. When a system breaks, you can see it break. When everything is a similar sprite with a similar particle, you will add print statements and call it a mystery.&lt;/p&gt;
&lt;p&gt;Watch someone else play, and say nothing. Every time they ask “what was that?”, write down the frame. Three of those questions are worth more than a week of your own opinion, because you can no longer see the problem. You already know what everything is.&lt;/p&gt;
&lt;p&gt;None of this asks for a &lt;a href=&quot;/category/tools&quot;&gt;complicated pipeline&lt;/a&gt;, a realistic art style or a large team. It asks you to decide what the picture is for. The picture tells the truth about the rules, quickly, including on the frame where everything goes wrong.&lt;/p&gt;
</content:encoded><category>Engines</category><category>game design</category><category>readability</category><category>visual clarity</category><category>playtesting</category><category>ui design</category><author>The Engines Desk</author></item><item><title>Your file browser cannot see inside the engine files</title><link>https://indietooling.com/posts/file-browser-cannot-see</link><guid isPermaLink="true">https://indietooling.com/posts/file-browser-cannot-see</guid><description>Unity packages, Unreal assets, Godot resources, and shop zips are often blank icons. That is how a year of packs goes missing.</description><pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;File browsers are good at documents. They are poor at game files. A Unity package, an Unreal asset, &lt;a href=&quot;/posts/godot-scenes-are-text&quot;&gt;a Godot resource&lt;/a&gt;, a zipped store pack: these are often a generic icon and a size. The size tells you almost nothing. Forty megabytes might be one texture or a whole UI kit.&lt;/p&gt;
&lt;p&gt;That is a nuisance in one engine. It becomes a real cost when you work in two, which a lot of indie developers do. A jam in Godot, a prototype in Unity, a pile of packs bought for both. The packs sit in one folder. The editors that could preview them are not open, and you are not going to launch two of them to remember what you own.&lt;/p&gt;
&lt;p&gt;You can live with that while the set is small. You cannot live with it once the folder holds a year of sales and “free this week” downloads. At that point the file browser is not neutral. It is hiding the catalogue.&lt;/p&gt;
&lt;p&gt;Here is how it goes wrong. You buy a UI kit in a sale. Six months later you buy another, because the first is called &lt;code&gt;ui_kit_final.zip&lt;/code&gt; and tells you nothing. Both are in Downloads. Neither has a preview. You do not find the duplicate until you open the second and see the same buttons.&lt;/p&gt;
&lt;p&gt;A few habits shrink the damage before you pick a tool.&lt;/p&gt;
&lt;p&gt;Name the archive when you download it. A prefix you would actually type — &lt;code&gt;cc0-&lt;/code&gt;, &lt;code&gt;by-&lt;/code&gt;, &lt;code&gt;commercial-&lt;/code&gt; — sorts faster than a good intention. Put the game you meant it for in the name if you have nowhere else to write it.&lt;/p&gt;
&lt;p&gt;Do not unpack everything just to see. Unpacked vendor trees multiply. If you unpack, unpack &lt;a href=&quot;/posts/downloads-folder-is-not-a-library&quot;&gt;into the library&lt;/a&gt;, look, and keep either the export you will use or the original archive. Three copies in three projects is how disk space and certainty both disappear.&lt;/p&gt;
&lt;p&gt;You can start today with ten minutes. Sort the folder by size, take the ten largest archives, and rename each one so a stranger could guess what is inside. It is dull work. It is also the first time you will learn what you own.&lt;/p&gt;
&lt;p&gt;Prefer a preview that understands the format. A thumbnail of a zip icon is not a thumbnail of the sprite. If a tool can show the sprite, the mesh, or the waveform without an import, use it for the library and keep the engine for the game.&lt;/p&gt;
&lt;p&gt;The project should receive the files you chose, at the size you chose. It should not be the place you browse everything you have ever downloaded. Those are different jobs. Mixing them is how the project folder becomes a landfill while Downloads stays untouched.&lt;/p&gt;
</content:encoded><category>Engines</category><category>asset previews</category><category>godot resources</category><category>unity packages</category><category>unreal assets</category><category>file formats</category><author>The Engines Desk</author></item><item><title>Make the export boring before you touch the store page</title><link>https://indietooling.com/posts/boring-export-presets</link><guid isPermaLink="true">https://indietooling.com/posts/boring-export-presets</guid><description>Run the export preset twice before you write a store page. The release note should describe the build you actually uploaded.</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The interesting part of a release is the game. The part that decides whether the interesting part arrives is the export preset, and it should be dull.&lt;/p&gt;
&lt;p&gt;Dull means one command, or one button, produces the build you intend to upload. The version in the window title matches the version in the filename. Debug menus are off. The default resolution is the one you tested, not the one your monitor happens to use. A second run of the same preset produces the same folder, with the same name, without you renaming a copy.&lt;/p&gt;
&lt;p&gt;Do that for every target you claim. If the page says Windows and Linux, both presets get a run on the day you upload. “Linux worked in March” is not a platform. A web export needs a refresh with the console open. Godot and Unity will both let you ship a build that prints errors into a place the player will never see, and you will not see them either, unless you look once before the upload.&lt;/p&gt;
&lt;p&gt;Check the output folder as well as the build. Old zips, a leftover debug binary, and a test save file all travel well. Open the finished archive in a fresh folder, ideally on a machine that does not have the editor installed, and run it. Missing files and a missing runtime only show up there.&lt;/p&gt;
&lt;p&gt;Write the steps in the project, even when you are the only author. Which editor version, which preset name, whether you upload the folder or the zip. Future you will have switched versions and forgotten which tickbox mattered. In Godot, the export templates have to match the editor version, and “why won’t it export” is a bad question to meet on release day.&lt;/p&gt;
&lt;p&gt;Run the preset twice and compare. The file sizes should match, and so should the folder layout. If they do not, something in the build depends on the clock, your machine, or a file you forgot you had.&lt;/p&gt;
&lt;p&gt;Only then &lt;a href=&quot;/posts/store-page-while-the-build-is-ugly&quot;&gt;open the store page&lt;/a&gt;. Screenshots from a build that still says it is a dev cut teach the player to expect a dev cut. Bump the number. Play for ten minutes from the exported binary, not from the editor, and then take the shots. Editor play and exported play are different products. Fullscreen, input, and the question of where a save file went only show up in one of them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/posts/release-brief-annotated&quot;&gt;A release note&lt;/a&gt; can then be short. Version, platforms, what changed, what you tested, what you know is broken. That is a useful note. A paragraph about how excited you are is not.&lt;/p&gt;
</content:encoded><category>Shipping</category><category>export presets</category><category>godot export</category><category>game builds</category><category>release checklist</category><category>itch.io</category><author>The Shipping Desk</author></item><item><title>Write the store page while the build is still ugly</title><link>https://indietooling.com/posts/store-page-while-the-build-is-ugly</link><guid isPermaLink="true">https://indietooling.com/posts/store-page-while-the-build-is-ugly</guid><description>An itch page is a list of promises. Write the sentence while the game is still rough, then delete every promise the build does not keep.</description><pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The store page is not a coat of copy you add at the end. It is a list of promises, and it is cheaper to write them while the game is still allowed to be bad.&lt;/p&gt;
&lt;p&gt;Open the page when you have a screenshot you are slightly embarrassed by. Fill in four things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The sentence.&lt;/strong&gt; One line on what the player does. “Stack rooms, then leave before the tide” is a sentence. “A unique atmospheric experience” is fog. If you cannot write the sentence, you are not ready for tags, a trailer, or a price. You are ready to play the first minute and notice what you actually do. Say the sentence to a friend who has not seen the game. If their first question is what the game is, the sentence is not finished.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The tags you can defend.&lt;/strong&gt; Puzzle, local multiplayer, pixel art, the engine you used. Tags are how strangers arrive. A tag you only half fit is how they leave. If it is single-player, do not tick multiplayer because a second controller technically moves a debug camera.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The controls and the length.&lt;/strong&gt; Keyboard, about twenty minutes, a browser build. People buy small games on purpose. Hiding the length does not make the game larger. It makes the page feel like it is talking past them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The status.&lt;/strong&gt; Prototype, jam build, or a version you are willing to leave up. Say which. A jam build can be wonderful and unfinished. Calling it finished is how a kind player becomes a disappointed one.&lt;/p&gt;
&lt;p&gt;Once the four are filled in, read the page as a stranger would, top to bottom, without the game open. Every claim should be something you could point to in a build today. Underline the ones you cannot. Those are not copy problems. They are work you have not done, and the page has just made a list of it.&lt;/p&gt;
&lt;p&gt;Then keep the page in step with the build. When a feature dies, the sentence loses it the same week. When you add a Linux build, the page says Linux after &lt;a href=&quot;/posts/boring-export-presets&quot;&gt;the preset has been run&lt;/a&gt;, not before.&lt;/p&gt;
&lt;p&gt;Screenshots can be ugly at this stage. They should still be from the game, cropped the way the store will crop them, with the interface &lt;a href=&quot;/posts/readable-at-a-glance&quot;&gt;readable at thumbnail size&lt;/a&gt;. A shot that only works fullscreen is a poster. Open the draft page on your phone before you decide. Most strangers will see it there first, at a size where small text turns into grey.&lt;/p&gt;
&lt;p&gt;Price can wait. Zero is a fine price for a page that is still a promise to yourself. The sentence should not wait. You will aim the rest of the work at it, or you will notice the sentence was a wish and change it.&lt;/p&gt;
</content:encoded><category>Shipping</category><category>steam store page</category><category>itch.io page</category><category>wishlists</category><category>game marketing</category><category>capsule art</category><author>The Shipping Desk</author></item><item><title>A release brief, annotated</title><link>https://indietooling.com/posts/release-brief-annotated</link><guid isPermaLink="true">https://indietooling.com/posts/release-brief-annotated</guid><description>A labelled specimen of a release note: version, platforms, what changed, what was tested, and what the page must not claim. The game is invented.</description><pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This page is a specimen. The game is not real, the version is not real, and nothing was uploaded. It is here so a release brief on this site has a shape you can copy: short, specific, and unwilling to invent a feature.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Specimen.&lt;/strong&gt; Northroom 0.3, a fictional one-room stealth toy, imagined for this page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platforms.&lt;/strong&gt; Windows and a web build. There is no Linux build in 0.3, so the note does not say Linux.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What changed.&lt;/strong&gt; Guards now lose you when you break line of sight for a full two seconds, instead of knowing your tile forever. The lantern uses oil, and oil is a pickup in the room rather than an infinite meter. The pause screen shows the actual controls. That is the list. There is no line about various fixes, because that line is where specifics go to hide.&lt;/p&gt;
&lt;p&gt;Each item is something a player could notice and check. “Guards lose you after two seconds” can be tested with a stopwatch. “Improved AI” cannot. If you cannot say how a reader would confirm a line, rewrite it until you can, or cut it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What was tested.&lt;/strong&gt; The Windows export and the web export, &lt;a href=&quot;/posts/boring-export-presets&quot;&gt;from the preset&lt;/a&gt;, not from the editor. One full clear, one deliberate failure, and a refresh on the web build to see that progress does not pretend to save. There is no save in 0.3. &lt;a href=&quot;/posts/store-page-while-the-build-is-ugly&quot;&gt;The store page&lt;/a&gt; should say so, and this note says so.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Left broken on purpose.&lt;/strong&gt; Windowed mode on Windows remembers the wrong size. It will not be fixed in 0.3. Writing it down is the difference between a known limit and a surprise. It also saves a player the bug report, and saves you the reply.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What the page may claim.&lt;/strong&gt; One room, about fifteen minutes, keyboard, no saving, Windows and web. It may not claim a campaign, a map, or controller support. Those were wishes, and they are not in this build.&lt;/p&gt;
&lt;p&gt;Write the brief before you upload, not after. Drafting it late means writing from memory, and memory remembers the features you meant to finish. Do it with the exported build open beside you.&lt;/p&gt;
&lt;p&gt;That is a release brief. It is boring to write and easy to trust. Version, platforms, the behaviour that changed, the test you actually ran, and the bug you are leaving in. A reader — including you, next month — can tell what the build does.&lt;/p&gt;
&lt;p&gt;When Indie Tooling runs a real release note, it will use this shape and it will be about a real build. If a sentence needs a feature that does not exist, the sentence goes. That rule is the point of the page.&lt;/p&gt;
</content:encoded><category>Shipping</category><category>release notes</category><category>patch notes</category><category>changelog</category><category>game updates</category><author>The Shipping Desk</author></item></channel></rss>