<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Indie Core Dev — Blog</title>
  <link>https://www.indiecore.net/blog/</link>
  <atom:link href="https://www.indiecore.net/blog/feed.xml" rel="self" type="application/rss+xml"/>
  <description>Notes from a one-person game studio in France.</description>
  <language>en</language>
  <item>
    <title>What AdMob Unity mediation adapter status means</title>
    <link>https://www.indiecore.net/blog/admob-unity-mediation-adapter-status/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/admob-unity-mediation-adapter-status/</guid>
    <pubDate>Thu, 10 Sep 2026 09:00:00 GMT</pubDate>
    <description>Three mediation adapters showed up NotReady in a project with no mediation installed. I installed one for real to find out which field actually tells you anything.</description>
  </item>
  <item>
    <title>Unity IL2CPP vs Mono on Android, measured</title>
    <link>https://www.indiecore.net/blog/unity-il2cpp-vs-mono-android-measured/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/unity-il2cpp-vs-mono-android-measured/</guid>
    <pubDate>Wed, 09 Sep 2026 09:00:00 GMT</pubDate>
    <description>Same project, both scripting backends, Unity 6. IL2CPP came out 47% smaller and took twice as long to build — and the Mono APK would not install on the test device at all.</description>
  </item>
  <item>
    <title>ask-first: questions in a card, not a paragraph</title>
    <link>https://www.indiecore.net/blog/ask-first-claude-code-plugin/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/ask-first-claude-code-plugin/</guid>
    <pubDate>Tue, 08 Sep 2026 09:00:00 GMT</pubDate>
    <description>A free Claude Code plugin that moves every question out of prose and into a card — one question at a time, with a recommended answer. Here is why I built it, how it works, and how to install it.</description>
  </item>
  <item>
    <title>AdMob Unity test IDs, and two error codes</title>
    <link>https://www.indiecore.net/blog/admob-unity-test-ids-and-two-error-codes/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/admob-unity-test-ids-and-two-error-codes/</guid>
    <pubDate>Mon, 07 Sep 2026 09:00:00 GMT</pubDate>
    <description>I loaded the three AdMob test units in a real Unity build, then broke the ad unit ID two ways. The failures look nothing alike, and one gets mistaken for no fill.</description>
  </item>
  <item>
    <title>Unity 6 Android build errors that exit 0</title>
    <link>https://www.indiecore.net/blog/unity-6-android-build-errors-that-exit-zero/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/unity-6-android-build-errors-that-exit-zero/</guid>
    <pubDate>Mon, 07 Sep 2026 09:00:00 GMT</pubDate>
    <description>Four times last week a headless Unity 6 Android build told me it had succeeded when it had not. Every one returned exit code 0, which is the only thing CI reads.</description>
  </item>
  <item>
    <title>The AdMob Unity SDK check that stops nothing</title>
    <link>https://www.indiecore.net/blog/admob-unity-sdk-empty-app-id/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/admob-unity-sdk-empty-app-id/</guid>
    <pubDate>Mon, 07 Sep 2026 09:00:00 GMT</pubDate>
    <description>The Google Mobile Ads plugin says it will not build without an App ID. I left the field empty and got an APK anyway — one that dies before the first frame.</description>
  </item>
  <item>
    <title>AdMob limited ad serving on the wrong app</title>
    <link>https://www.indiecore.net/blog/admob-limited-ad-serving-wrong-app/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/admob-limited-ad-serving-wrong-app/</guid>
    <pubDate>Sat, 05 Sep 2026 09:00:00 GMT</pubDate>
    <description>I created a second AdMob app for a game that already had one. The listing link went to the empty app, the app I was shipping got limited ad serving, and only one of them could be fixed without a release.</description>
  </item>
  <item>
    <title>Four things break when CI posts to LinkedIn</title>
    <link>https://www.indiecore.net/blog/posting-to-linkedin-from-ci/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/posting-to-linkedin-from-ci/</guid>
    <pubDate>Fri, 04 Sep 2026 09:00:00 GMT</pubDate>
    <description>The LinkedIn API call that publishes a post is six lines. The token that expires every 60 days with no refresh, the read scope you cannot have, and a filename that became a dead link took the rest of the afternoon.</description>
  </item>
  <item>
    <title>Gradle build failed is not the error</title>
    <link>https://www.indiecore.net/blog/unity-gradle-build-failed-is-not-the-error/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/unity-gradle-build-failed-is-not-the-error/</guid>
    <pubDate>Thu, 03 Sep 2026 09:00:00 GMT</pubDate>
    <description>Unity prints CommandInvokationFailure, then 67 environment variables. The line saying what broke is 235 lines up. Four failures I reproduced in Unity 6000.4.</description>
  </item>
  <item>
    <title>One engine, many games</title>
    <link>https://www.indiecore.net/blog/one-engine-many-games/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/one-engine-many-games/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>Six word puzzles built as six copies of one game. What it cost, and what an app directory looks like once the game moves out of it and only identity stays behind.</description>
  </item>
  <item>
    <title>Generate levels offline, not at runtime</title>
    <link>https://www.indiecore.net/blog/generate-levels-offline-not-at-runtime/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/generate-levels-offline-not-at-runtime/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>Runtime generation promises infinite levels for free. What it gives you is levels nobody has checked. The offline pipeline I use instead.</description>
  </item>
  <item>
    <title>Rating puzzle difficulty by decisions</title>
    <link>https://www.indiecore.net/blog/rating-puzzle-difficulty-by-decisions/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/rating-puzzle-difficulty-by-decisions/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>Grid size is the obvious difficulty proxy and it is wrong. Measuring the branching factor of the solve gives a rating that survives contact with players.</description>
  </item>
  <item>
    <title>Difficulty rates a stage, progression places it</title>
    <link>https://www.indiecore.net/blog/difficulty-rates-progression-places/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/difficulty-rates-progression-places/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>Sorting a level library easiest-to-hardest gives a campaign that is flat for a hundred stages and then a wall. What replaced the sort.</description>
  </item>
  <item>
    <title>The opening layout is part of the puzzle</title>
    <link>https://www.indiecore.net/blog/opening-layout-is-part-of-the-puzzle/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/opening-layout-is-part-of-the-puzzle/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>Where the loose pieces sit is a packing problem, and its objective is how large the board can be drawn. Optimise that and you leak the answer.</description>
  </item>
  <item>
    <title>Shipping a 4 MB level pack</title>
    <link>https://www.indiecore.net/blog/shipping-a-4mb-level-pack/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/shipping-a-4mb-level-pack/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>392 levels of JSON, pretty-printed for review and minified for the store. The Vite plugin that does it, and the hook choice that hid a real error.</description>
  </item>
  <item>
    <title>Testing a level pack you did not write</title>
    <link>https://www.indiecore.net/blog/testing-a-level-pack-you-did-not-write/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/testing-a-level-pack-you-did-not-write/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>Unit-testing the game does not tell you whether the 392 levels in this build are solvable. So the suite plays every one of them.</description>
  </item>
  <item>
    <title>Pricing an economy off its difficulty model</title>
    <link>https://www.indiecore.net/blog/pricing-an-economy-off-its-difficulty-model/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/pricing-an-economy-off-its-difficulty-model/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>Levels differ 13x in the thinking they demand, so a flat coin reward is wrong on nearly all of them. Tying payouts to the difficulty walk.</description>
  </item>
  <item>
    <title>Cutting a Capacitor Android build in half</title>
    <link>https://www.indiecore.net/blog/capacitor-android-build-apk-size/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/capacitor-android-build-apk-size/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>13.1 MB down to 5.9 MB delivered. R8 is off in the project Capacitor generates, and one library's consumer ProGuard rule was pinning 9,304 classes.</description>
  </item>
  <item>
    <title>A release pipeline you cannot forget</title>
    <link>https://www.indiecore.net/blog/release-pipeline-you-cannot-forget/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/release-pipeline-you-cannot-forget/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>The Android project is generated, not committed — which reset the version code to 1 and nearly made the app un-updatable. Plus the checks worth failing on.</description>
  </item>
  <item>
    <title>Cloudflare injects a beacon. My CSP said no.</title>
    <link>https://www.indiecore.net/blog/cloudflare-beacon-csp-blocked/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/cloudflare-beacon-csp-blocked/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>A CSP error in production, from a script I never added. The usual fix is to allow the host — which would have made my privacy policy false.</description>
  </item>
  <item>
    <title>Lighthouse's image budget is w × h ÷ 6</title>
    <link>https://www.indiecore.net/blog/lighthouse-image-budget/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/lighthouse-image-budget/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>Improve image delivery&quot; makes two complaints in one panel. Both have exact arithmetic behind them, readable straight out of the JSON report.</description>
  </item>
  <item>
    <title>opacity 0 does not hide anything</title>
    <link>https://www.indiecore.net/blog/opacity-zero-is-not-hidden/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/opacity-zero-is-not-hidden/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>My lightbox was invisible and still in the tab order. Fixing that broke focus handling silently, because focus() on a hidden element reports nothing.</description>
  </item>
  <item>
    <title>The check that passed while broken</title>
    <link>https://www.indiecore.net/blog/the-check-that-passed-while-broken/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/the-check-that-passed-while-broken/</guid>
    <pubDate>Tue, 01 Sep 2026 09:00:00 GMT</pubDate>
    <description>Two checks in my build were green for months while testing nothing. One was switched off by a guard clause, the other by a missing space in a regex.</description>
  </item>
  <item>
    <title>Changing a Google Play privacy policy URL</title>
    <link>https://www.indiecore.net/blog/change-privacy-policy-url-google-play/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/change-privacy-policy-url-google-play/</guid>
    <pubDate>Sun, 30 Aug 2026 09:00:00 GMT</pubDate>
    <description>Five live listings pointed at my old Blogger URLs. How I moved them without ever serving a broken privacy policy link.</description>
  </item>
  <item>
    <title>The blast radius rule for AI coding</title>
    <link>https://www.indiecore.net/blog/blast-radius-rule-ai-coding/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/blast-radius-rule-ai-coding/</guid>
    <pubDate>Fri, 28 Aug 2026 09:00:00 GMT</pubDate>
    <description>How I decide what an AI agent may change on its own — sorted by what a mistake costs to undo, not by how hard the task is. Three zones, and the check for each.</description>
  </item>
  <item>
    <title>I don't review AI code. My build does.</title>
    <link>https://www.indiecore.net/blog/build-reviews-ai-code/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/build-reviews-ai-code/</guid>
    <pubDate>Fri, 28 Aug 2026 09:00:00 GMT</pubDate>
    <description>Reading every diff at generation speed isn't review, it's skimming. Here is the 169-line verifier that gates this site, and the bug behind every check in it.</description>
  </item>
  <item>
    <title>I stopped writing prompts. I write the repo.</title>
    <link>https://www.indiecore.net/blog/context-engineering-repo/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/context-engineering-repo/</guid>
    <pubDate>Fri, 28 Aug 2026 09:00:00 GMT</pubDate>
    <description>The best prompt I ever wrote was a README. What changed when I moved my conventions out of the chat window and into the files they describe.</description>
  </item>
  <item>
    <title>Deploying a static site to Cloudflare Workers</title>
    <link>https://www.indiecore.net/blog/static-site-cloudflare-workers/</link>
    <guid isPermaLink="true">https://www.indiecore.net/blog/static-site-cloudflare-workers/</guid>
    <pubDate>Wed, 26 Aug 2026 09:00:00 GMT</pubDate>
    <description>A build-verify-deploy pipeline on Cloudflare's free tier, and the five traps that cost me an evening — including one that silently takes your staging URL offline.</description>
  </item>
</channel>
</rss>
