<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Island &amp; Pine — writing</title><description>Notes from the Island &amp; Pine studio: lessons pulled out of the work on KopeMaps, JellySplit, Cell Division, and the rest.</description><link>https://islandandpine.com/</link><language>en-us</language><item><title>The AI training graveyard: CMA-ES, REINFORCE, a phased linear model, and the 28 weights that survived</title><link>https://islandandpine.com/blog/ai-training-graveyard-cma-es-reinforce-ppo/</link><guid isPermaLink="true">https://islandandpine.com/blog/ai-training-graveyard-cma-es-reinforce-ppo/</guid><description>Two days in March, five rewritten training pipelines. MCTS lived in the repo for ninety minutes. A phased linear model with 832 parameters got deleted in one commit. The only direct ancestor of a shipping weight file is a 28-weight switching-linear model that took its lessons from everything that failed.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>machine-learning</category><category>reinforcement-learning</category><category>game-ai</category><category>gamedev</category><category>python</category></item><item><title>The AlphaZero detour: batched MCTS, three value targets, and a sign bug that hid in plain sight</title><link>https://islandandpine.com/blog/alphazero-detour-batched-mcts-value-targets/</link><guid isPermaLink="true">https://islandandpine.com/blog/alphazero-detour-batched-mcts-value-targets/</guid><description>A month on AlphaZero for a mobile game that ships one forward pass per move instead. Virtual-loss batched MCTS, three value-target formulations in six hours, a PUCT sign bug that burned two days, and why the engineering survived even though the weights didn&apos;t.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>machine-learning</category><category>reinforcement-learning</category><category>mcts</category><category>alphazero</category><category>pytorch</category><category>gamedev</category></item><item><title>A 403 from Cloudflare R2 on boot, and why I ended up bundling everything in the Docker image</title><link>https://islandandpine.com/blog/cloudflare-r2-403-user-agent/</link><guid isPermaLink="true">https://islandandpine.com/blog/cloudflare-r2-403-user-agent/</guid><description>Cloudflare&apos;s bot protection blocks Python&apos;s default urllib User-Agent with a 403. Here&apos;s the one-line fix — and why I later deleted the download path entirely.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>cloudflare</category><category>r2</category><category>python</category><category>deployment</category><category>docker</category></item><item><title>Training per-opponent hint policies with CMA-ES (and why we deleted the whole system)</title><link>https://islandandpine.com/blog/cma-es-hint-policies-deleted/</link><guid isPermaLink="true">https://islandandpine.com/blog/cma-es-hint-policies-deleted/</guid><description>An in-game hint isn&apos;t &apos;what&apos;s the best move.&apos; It&apos;s &apos;what move gives the player the highest win rate against this specific opponent from here.&apos; That observation got us into twenty separate CMA-ES trainings. Then the main model got strong enough, and we threw all of it out.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>machine-learning</category><category>optimization</category><category>cma-es</category><category>game-ai</category><category>gamedev</category></item><item><title>Drawing connected cells as one outline: contour paths, inset normals, and a bridge animation</title><link>https://islandandpine.com/blog/connected-cell-contour-paths-skia-react-native/</link><guid isPermaLink="true">https://islandandpine.com/blog/connected-cell-contour-paths-skia-react-native/</guid><description>Replacing per-cell rounded rectangles with one SVG contour path per connected component in a Skia React Native game board. A right-hand-rule walker over a vertex grid, inset padding via right-hand normals, convex-only corner rounding with a clamp, and the 300ms bridge animation that hides the fact that the contour on frame N and the contour on frame N+1 share no structure.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>react-native</category><category>skia</category><category>graphics</category><category>gamedev</category><category>typescript</category></item><item><title>Proving your difficulty ladder is real: round-robin heatmaps, pinned seeds, and the Blended Hard probe</title><link>https://islandandpine.com/blog/difficulty-ladder-round-robin-heatmaps/</link><guid isPermaLink="true">https://islandandpine.com/blog/difficulty-ladder-round-robin-heatmaps/</guid><description>A four-tier AI difficulty selector makes a monotone-progress promise to players. Here&apos;s the round-robin tournament, the two heatmaps, and the Math.random() seed bug that turn that promise from marketing into a reproducible assertion.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>gamedev</category><category>machine-learning</category><category>testing</category><category>python</category><category>game-ai</category></item><item><title>Four difficulty tiers, two model families: 14 features, 13 weights, and a distilled CNN</title><link>https://islandandpine.com/blog/four-tier-game-ai-linear-weights-and-cnn/</link><guid isPermaLink="true">https://islandandpine.com/blog/four-tier-game-ai-linear-weights-and-cnn/</guid><description>Cell Division ships Easy, Medium, Hard, and Elite. The first three are linear models over 14 hand-crafted features trained with PPO self-play; Elite is a distilled AlphaZero student. Here&apos;s why that combination — not just the CNN — is the right shape for a graduated-difficulty game.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>gamedev</category><category>machine-learning</category><category>reinforcement-learning</category><category>python</category><category>typescript</category></item><item><title>One perf bug is three bugs: a remounting SVG, un-memoized cells, and 2 MB sprite decodes on iPhone 11</title><link>https://islandandpine.com/blog/iphone-11-swap-lag-react-native-svg-memo-sprites/</link><guid isPermaLink="true">https://islandandpine.com/blog/iphone-11-swap-lag-react-native-svg-memo-sprites/</guid><description>Why [JellySplit](https://jellysplit.com) stuttered on iPhone 11 and not on newer devices or the simulator. A React key that accidentally depended on every move, an unwrapped component that threw away its native sprite view on every swap, and a 2 MB per-sprite decoded-bitmap footprint that started evicting the cache under sustained play. Three fixes stacked — none alone was enough.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>react-native</category><category>performance</category><category>svg</category><category>expo</category><category>ios</category><category>gamedev</category><category>typescript</category></item><item><title>One AI, four board sizes: feature normalization, a 10×10 padded CNN, and entropy-timed pacing</title><link>https://islandandpine.com/blog/jelmata-ai-board-size-generalization-entropy-pacing/</link><guid isPermaLink="true">https://islandandpine.com/blog/jelmata-ai-board-size-generalization-entropy-pacing/</guid><description>The Jelmata AI runs on phones with no GPU. A single linear model serves four board sizes, a distilled CNN handles the top tier with a switching-linear safety net for web builds, and a one-line entropy trick makes a sub-millisecond move feel like a considered one.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>gamedev</category><category>machine-learning</category><category>reinforcement-learning</category><category>typescript</category><category>mobile</category></item><item><title>Shipping a CNN game AI on-device in Expo with ONNX (the linking, the testing, the config plugin)</title><link>https://islandandpine.com/blog/onnx-expo-react-native-cnn-ai/</link><guid isPermaLink="true">https://islandandpine.com/blog/onnx-expo-react-native-cnn-ai/</guid><description>A 303 KB distilled AlphaZero lives inside two of my iOS/Android games. Here&apos;s the three-part Expo integration that wasn&apos;t in any tutorial: the autolinking hole, the Jest sandbox workaround, and the model pipeline.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>expo</category><category>react-native</category><category>onnx</category><category>machine-learning</category><category>gamedev</category></item><item><title>Solving every level at build time: how 1,532 hand-crafted puzzles stay winnable</title><link>https://islandandpine.com/blog/puzzle-solver-as-test-oracle/</link><guid isPermaLink="true">https://islandandpine.com/blog/puzzle-solver-as-test-oracle/</guid><description>A memoized DFS solver runs over every puzzle on each build, precomputes the hint table, then a test simulates playing each one to confirm a 3-star win. Here&apos;s how it works — and the seven puzzles it killed.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>gamedev</category><category>testing</category><category>puzzle</category><category>typescript</category><category>jellysplit</category></item><item><title>Why I swapped custom screenshots for Apple&apos;s App Store preview videos</title><link>https://islandandpine.com/blog/app-store-preview-videos-in-landing-pages/</link><guid isPermaLink="true">https://islandandpine.com/blog/app-store-preview-videos-in-landing-pages/</guid><description>App Store previews are already the best footage of your iOS app. Here&apos;s how I pulled them into my landing page — and the one gotcha that bit me.</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><category>indie</category><category>landing-pages</category><category>ios</category><category>astro</category></item></channel></rss>