[{"content":"There is a particular kind of bug that costs you a full evening, walks past every tool you trust, and turns out to be a single character. This is one of those.\nWe were finishing a migration of an iOS app&amp;rsquo;s release pipeline. The new flow used mise for tooling, xcodebuild for archiving and exporting, and the App Store Connect API key for signing and upload, with no Ruby or fastlane in the loop. The very last step, altool --upload-app, kept rejecting the IPA:\nERROR ITMS-90035: Invalid \u2026","date":"2026-05-25","permalink":"\/posts\/a-grave-accent-broke-my-testflight-upload\/","summary":"There is a particular kind of bug that costs you a full evening, walks past every tool you trust, and turns out to be a single character. This is one of those.\nWe were finishing a migration of an iOS \u2026","tags":["iOS","codesign","App Store Connect","Unicode","CI\/CD","Apple"],"title":"A grave accent broke my TestFlight upload"},{"content":"Before a restaurant kitchen opens for the evening, the chef prepares. Ingredients are chopped, sauces are started, tools are laid out in reach. The French call this mise en place: everything in its place. The service goes smoothly not because the chef is faster in the moment, but because the thinking happened in advance.\nThere&amp;rsquo;s a tool for developers called mise. It&amp;rsquo;s a version manager and task runner, and it happens to take its name from the same concept. I don&amp;rsquo;t think \u2026","date":"2026-03-16","permalink":"\/posts\/mise-ai-environment\/","summary":"Before a restaurant kitchen opens for the evening, the chef prepares. Ingredients are chopped, sauces are started, tools are laid out in reach. The French call this mise en place: everything in its \u2026","tags":["AI","mise","Bash","Workflow","Automation","Tools"],"title":"mise en place for the AI Age"},{"content":"For about a year, my personal site ran on Payload CMS, a powerful, developer-friendly headless CMS built on Node.js. It served me well, but over time I started feeling friction in my workflow. So I switched to Hugo, a static site generator where every post is just a Markdown file in a folder.\nThis post is about why I made that change, and how it unlocked something I didn&amp;rsquo;t expect: a much tighter feedback loop with AI tools like Claude.\nWhat was wrong with Payload? Nothing, really. Payload \u2026","date":"2026-03-01","permalink":"\/posts\/from-payload-cms-to-hugo\/","summary":"For about a year, my personal site ran on Payload CMS, a powerful, developer-friendly headless CMS built on Node.js. It served me well, but over time I started feeling friction in my workflow. So I \u2026","tags":["Hugo","Blogging","AI","Workflow"],"title":"The Blog That Almost Didn't Happen"},{"content":"When dealing with JSON APIs, it&amp;rsquo;s quite common to encounter complex properties\u2014both single objects and arrays of objects. As discussed in a previous post about enum alternatives, the typical strategy involves creating Swift objects conforming to Decodable with a property for every JSON value.\nFor more complex objects, developers declare properties with Decodable types (for single values) or arrays of Decodable objects (for lists). However, this approach breaks down when JSON objects need \u2026","date":"2025-07-11","permalink":"\/posts\/protocol-values-in-codable-objects\/","summary":"When dealing with JSON APIs, it&rsquo;s quite common to encounter complex properties\u2014both single objects and arrays of objects. As discussed in a previous post about enum alternatives, the typical \u2026","tags":["Codable","Architecture","Swift"],"title":"Protocol values in Codable objects"},{"content":"Swift&amp;rsquo;s Decodable and Encodable protocols provide convenient ways to map JSON data into native Swift objects. However, basic enum-based approaches can become problematic as projects evolve and APIs introduce new values.\nThe Problem with Standard Decodable Enums When mapping API responses with enums, new undeclared values cause complete decoding failures. For instance, if a conference app maps event categories as a String-based enum:\nenum Category: String, Codable { case talk case workshop \u2026","date":"2025-04-23","permalink":"\/posts\/a-scalable-alternative-to-decodable-enums\/","summary":"Swift&rsquo;s Decodable and Encodable protocols provide convenient ways to map JSON data into native Swift objects. However, basic enum-based approaches can become problematic as projects evolve and \u2026","tags":["Codable","Swift","Architecture"],"title":"A scalable alternative to Decodable enums"}]