Building a MusicKit app when MusicKit won't run in the simulator
A protocol, a real service, and a mock that records its writes: making the simulator useful again, plus the worktree mishap and the newborn-target trap.
Notes on the software, games, and music coming out of Imperfect Systems.
RSS feedA protocol, a real service, and a mock that records its writes: making the simulator useful again, plus the worktree mishap and the newborn-target trap.
A prerequisite ticket said to flip a flag that was already on. Reading the source at the deployed tag turned a no-op into three corrections.
An agent can't click the New Project wizard. Xcode 16's file-system synchronized groups are the seam that lets it own every source file anyway.
Writing the CLAUDE.md for a new iOS app before any Swift exists: the MusicKit-in-simulator trap, CloudKit's SwiftData rules, and the learning-project framing.
Hashnode is a third syndication target, and the first over GraphQL: no client gem, a two-step publish flow, and sync by slug instead of draft ID.
The Forem API as the anti-Medium, a shared LinkedIn announce service with idempotency, and the Zeitwerk acronym gotcha that struck twice.
72 Medium posts my database knew nothing about: the RSS cap, an undocumented GraphQL workaround, Unicode apostrophes, and the kamal stdin trap.
My Mac's Docker daemon was a load-bearing part of production deploys. Build-once-deploy-many with Kamal 2, and the three research assumptions that were wrong.
Detecting Medium publishes by polling the RSS feed, LinkedIn's four mandatory headers, and the Zeitwerk acronym rule that broke migration rollback in CI.
Making dashboard titles link to the live posts: a configurable path prefix, a pub_date gate against broken links, and a spec column I scrapped.
Page 17 of 19