<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Marty</title><description>A personal site by Marty — software, hardware, AI, gaming, finance, homesteading, and whatever else is on my mind.</description><link>https://martyw.dev/</link><item><title>Note · Thu Jun 04 2026</title><link>https://martyw.dev/notes/rapier-for-the-game-engine/</link><guid isPermaLink="true">https://martyw.dev/notes/rapier-for-the-game-engine/</guid><pubDate>Thu, 04 Jun 2026 10:01:00 GMT</pubDate><category>software</category><category>gaming</category><category>javascript</category><category>web</category></item><item><title>Note · Mon Jun 01 2026</title><link>https://martyw.dev/notes/comments-are-down-thats-the-deal/</link><guid isPermaLink="true">https://martyw.dev/notes/comments-are-down-thats-the-deal/</guid><pubDate>Mon, 01 Jun 2026 11:08:00 GMT</pubDate><category>meta</category><category>software</category><category>web</category><category>tools</category></item><item><title>Stable URLs without a redirect table</title><link>https://martyw.dev/posts/stable-urls-without-a-redirect-table/</link><guid isPermaLink="true">https://martyw.dev/posts/stable-urls-without-a-redirect-table/</guid><description>A short random prefix plus a throwaway slug gives you URLs that survive title changes — no UUID ugliness, no slug-history table. Plus why the collision-retry loop matters more than the keyspace suggests.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><category>software</category><category>web</category><category>apis</category></item><item><title>How this blog gets written</title><link>https://martyw.dev/posts/how-this-blog-gets-written/</link><guid isPermaLink="true">https://martyw.dev/posts/how-this-blog-gets-written/</guid><description>How posts and notes here actually get made — AI-assisted, with a structured pass that flags speculation rather than laundering it as fact.</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><category>meta</category><category>ai</category><category>tools</category></item><item><title>Note · Thu May 28 2026</title><link>https://martyw.dev/notes/arcade2d-finally-started/</link><guid isPermaLink="true">https://martyw.dev/notes/arcade2d-finally-started/</guid><pubDate>Thu, 28 May 2026 10:00:00 GMT</pubDate><category>software</category><category>gaming</category><category>javascript</category><category>web</category></item><item><title>Note · Thu May 28 2026</title><link>https://martyw.dev/notes/new-site-new-shape/</link><guid isPermaLink="true">https://martyw.dev/notes/new-site-new-shape/</guid><pubDate>Thu, 28 May 2026 09:00:00 GMT</pubDate><category>meta</category><category>ai</category><category>showerthought</category></item><item><title>My 2026 Tech Stack</title><link>https://martyw.dev/posts/my-2026-tech-stack/</link><guid isPermaLink="true">https://martyw.dev/posts/my-2026-tech-stack/</guid><description>Two years on from the 2024 list. The shipping-code part has changed completely; most of the rest looks the same — and where it doesn&apos;t, the reasons are worth knowing.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><category>software</category><category>web</category><category>ai</category><category>meta</category><category>tools</category></item><item><title>The rent-vs-buy spreadsheet I finally closed</title><link>https://martyw.dev/posts/rent-vs-buy-spreadsheet/</link><guid isPermaLink="true">https://martyw.dev/posts/rent-vs-buy-spreadsheet/</guid><description>For a couple of years I was sure that renting and tipping the difference into index funds beat buying. Then I bought a smaller, older house on a worse street — and worked out what the spreadsheet had been missing about leverage and tax.</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><category>finance</category><category>homestead</category></item><item><title>Note · Fri Aug 29 2025</title><link>https://martyw.dev/notes/caches-need-an-invalidation-story/</link><guid isPermaLink="true">https://martyw.dev/notes/caches-need-an-invalidation-story/</guid><pubDate>Fri, 29 Aug 2025 09:00:00 GMT</pubDate><category>software</category><category>web</category></item><item><title>Promise.all isn&apos;t batching</title><link>https://martyw.dev/posts/promise-all-isnt-batching/</link><guid isPermaLink="true">https://martyw.dev/posts/promise-all-isnt-batching/</guid><description>When parallelising N small queries looks like a fix and is really just self-DoS at a slightly higher concurrency level.</description><pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate><category>software</category><category>javascript</category><category>web</category><category>apis</category></item><item><title>Note · Tue Aug 19 2025</title><link>https://martyw.dev/notes/group-in-the-database/</link><guid isPermaLink="true">https://martyw.dev/notes/group-in-the-database/</guid><pubDate>Tue, 19 Aug 2025 09:00:00 GMT</pubDate><category>software</category></item><item><title>Write batch-shaped functions by default</title><link>https://martyw.dev/posts/write-batch-shaped-functions-by-default/</link><guid isPermaLink="true">https://martyw.dev/posts/write-batch-shaped-functions-by-default/</guid><description>Why I write repository methods that take arrays and return Maps, even when the only caller — today — is asking for one thing.</description><pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate><category>software</category><category>javascript</category><category>apis</category></item><item><title>Note · Wed Aug 06 2025</title><link>https://martyw.dev/notes/dataloader-cache-off-by-default/</link><guid isPermaLink="true">https://martyw.dev/notes/dataloader-cache-off-by-default/</guid><pubDate>Wed, 06 Aug 2025 09:00:00 GMT</pubDate><category>software</category><category>javascript</category></item><item><title>Batching requests we don&apos;t control</title><link>https://martyw.dev/posts/batching-requests-we-dont-control/</link><guid isPermaLink="true">https://martyw.dev/posts/batching-requests-we-dont-control/</guid><description>How pushing dataloader up to the HTTP controller — out of the resolver layer it usually lives in — cut downstream database load by 83% on a read-heavy endpoint.</description><pubDate>Fri, 07 Mar 2025 00:00:00 GMT</pubDate><category>software</category><category>web</category><category>javascript</category><category>apis</category></item><item><title>My 2024 Tech Stack</title><link>https://martyw.dev/posts/my-2024-tech-stack/</link><guid isPermaLink="true">https://martyw.dev/posts/my-2024-tech-stack/</guid><description>What I&apos;m reaching for this year — languages, frameworks, infra — and why.</description><pubDate>Thu, 07 Mar 2024 00:00:00 GMT</pubDate><category>software</category><category>web</category><category>meta</category><category>tools</category></item><item><title>JavaScript Game Development Engine Ideas</title><link>https://martyw.dev/posts/javascript-game-development-engine-ideas/</link><guid isPermaLink="true">https://martyw.dev/posts/javascript-game-development-engine-ideas/</guid><description>Where the JavaScript game-engine landscape has gaps, and how I&apos;d fill them if I built one.</description><pubDate>Mon, 04 Mar 2024 00:00:00 GMT</pubDate><category>software</category><category>gaming</category><category>javascript</category><category>web</category></item><item><title>Thoughts on GraphQL After 2 Years</title><link>https://martyw.dev/posts/thoughts-on-graphql-after-2-years/</link><guid isPermaLink="true">https://martyw.dev/posts/thoughts-on-graphql-after-2-years/</guid><description>What two years of running a production GraphQL service taught me about where it earns its keep and where it doesn&apos;t.</description><pubDate>Mon, 21 Nov 2022 00:00:00 GMT</pubDate><category>software</category><category>graphql</category><category>web</category><category>apis</category></item></channel></rss>