Blog
Articles, short notes, and impressions.
- Adding Xcode MCP to OpenCode and Pi Agent
- Impressions of Xcode 27
- Agent orchestration: from tmux to herdr
- Changing an app's name on the App Store and Play Store
- A Google Play organization account with a DUNS number
- Apps using Keychain and iCloud can't be transferred
- What's changing in the App Store?
- Files inside an iOS app are easy to read
- Writing a skill for xcode-mcp to save tokens
- Why plan mode matters in Claude Code
- Effort mode and subagent models in Claude Code
- tmux shortcuts
- Why reviewing LLM code is harder
- Mobile notification permissions now follow multiple rules
- Royalty exemption for mobile apps (Turkey)
- Using MCPs through skills via the CLI
- Claude Code's sandbox feature
- 90% of Claude Code was written by Claude Code
- /clear and auto-compact in Claude Code
- Tell Claude Code which files not to touch
- Claude Code subagents use a separate context
- The /context command in Claude Code
- A prompt that extracts your project's style doc
- A keychain warning for indie devs selling apps
- Reading the App Store country with StoreKit
- In-app event updates can be submitted in parallel
- Queue mode for n8n performance
- Preventing unnecessary App ID registration
- Ways to protect API tokens in a mobile app
- A weather-based lock screen with Shortcuts
- What the AI agent in n8n really is
- Scan the web daily with Perplexity + n8n
- Claude Code tips (Days 1-5)
- Session replay tools for mobile apps
- A Cloudflare kit for a subscription app
- Cross-device file transfer: PairDrop
- My vibe coding method: a single HTML file first
- Don't obsess over structure or SOLID in vibe coding
- SwiftUI Liquid Glass defaults and opting out
- Following blogs with RSS and automating it
- Backend architecture for a subscription app
- Using Firebase event-driven in AI apps
- Listening to AI newsletters with NotebookLM
- Color palette experiments with AI (the v0 method)
- Deconstructing an app with AI
- Note to self: what makes a good prompt?
- Testing a mobile app under poor network conditions
- SwiftUI animation from Gemini-generated assets
- The token difference between Turkish and English
- Surfacing under different keywords with App Shortcuts
- Design spam rejections are rising on the App Store
- Storing user data: a security checklist
- 3 tools to check after AI builds your iOS app
- Don't skew your retention with friends and family
- Don't use unrelated keywords in ASO
- Let passengers pick songs via SharePlay in CarPlay
- A security checklist when commissioning an app
- The Mythical Man-Month: what hasn't changed in 50 years
- How mobile clients receive responses in an event-driven architecture
- iOS asset optimization with ImageOptim
- Give AI tools step-by-step documents
- Can't decide an A/B test? Flip a coin
- Dark mode for third-party icons in iOS 18
- SwiftUI: the onGeometryChange modifier
- weak vs unowned in Swift
- Accessibility announcements in UIKit and SwiftUI
- Swift's default hash changes every run
- Translating meeting audio with AI in real time
- A keyword research method for ASO
- App Store screenshots in 11 languages with Canva
- The temporary tab feature in Xcode
- Spatial Video for Vision Pro in iOS 17.2
- A layout bug on a square-screen Android device
- Swift 5.9: Parameter Packs and SwiftUI's 10-subview limit
- UIKit's new callback: viewIsAppearing
- What does @escaping do?
- SwiftUI's onChange is deprecated in iOS 17
- Apple's learning-model / SDK patent
- A measurement-unit standard across iOS and Android
- Downloading past versions for testing on Play Store
- Gaps in the early visionOS SDK
- Being skeptical of a model's math claim
- Copilot and training-data consent
- macOS Ventura Stage Manager shortcuts
- MacBook external display in clamshell
- Testing apps with Universal Control