-
Commanding Your Claude Code Army
Published:• 3 min readHow a simple terminal trick helps me manage multiple Claude Code instances without losing my mind (or my terminal tabs)
-
Code Signing and Notarization: Sparkle and Tears
Published:• 10 min readThe brutal truth about implementing Sparkle auto-updates in sandboxed macOS apps - from 40 failed releases to enlightenment.
-
Vibe Meter: Monitor Your AI Costs
Published:• 7 min readBuilding Vibe Meter, a macOS menu bar app to track AI spending in real-time - from workshop demo to shipped product in three days.
-
Claude Code is My Computer
Published:• 6 min readI run Claude Code with --dangerously-skip-permissions flag, giving it full system access. Let me show you a new way of approaching computers.
-
Stop Over-thinking AI Subscriptions
Published:• 5 min readAfter spending heavily on AI tools for two months, here's why the math actually works out—and which subscriptions are worth every penny.
-
Introducing Demark: HTML in. MD out. Blink-fast.
Published:• 3 min readHow I vibe coded my first Swift package using existing JavaScript libraries and AI assistance to solve HTML to Markdown conversion in Swift.
-
The Future of Vibe Coding: Building with AI, Live and Unfiltered
Published:• 22 min readPeter demonstrates 'vibe coding' - a new approach to software development with AI, building two apps from scratch in a 3-hour live workshop.
-
MCP Best Practices
Published:• 8 min readA comprehensive guide outlining best practices for building reliable, user-friendly Model Context Protocol (MCP) tools with proper configuration, testing, and release management.
-
Finding My Spark Again
Published:• 2 min readPeter reflects on his post-exit journey from emptiness to rediscovering his passion for building, sparked by AI's transformative potential.
-
Top-Level Menu Visibility in SwiftUI for macOS
Published:• 3 min readWorking around SwiftUI's CommandsBuilder limitations to conditionally show top-level menus on macOS using direct AppKit integration.
-
Fixing keyboardShortcut in SwiftUI
Published:• 7 min readDebugging and fixing a SwiftUI keyboardShortcut bug that fails when mixing SwiftUI with UIKit through reverse engineering and LLDB analysis.
-
Supporting Both Tap and Long Press on a Button in SwiftUI
Published:• 6 min readCreating a SwiftUI button that supports both tap and long-press gestures by bridging to UIKit when SwiftUI's gesture system fails on Catalyst.
-
On Using Apple Silicon Mac Mini for Continuous Integration
Published:• 9 min readDocumenting the challenges and solutions for integrating Apple Silicon M1 Mac minis into a continuous integration system, including automation fixes and performance comparisons.
-
Apple Silicon M1: A Developer's Perspective
Published:• 8 min readA comprehensive evaluation of the M1 MacBook Air as a development machine, covering Xcode performance, compatibility issues, and the transition challenges for developers.
-
Gardening Your Twitter: Curating Your Timeline
Published:• 7 min readPractical strategies for curating your Twitter timeline through strategic following, muting, and filtering to create an informative and enjoyable social media experience.
-
Gardening Your Twitter: Growing Your Followers
Published:• 7 min readStrategies for growing a meaningful Twitter following through authentic persona development, consistent engagement, and effective content creation based on 12 years of experience.
-
Forbidden Controls in Catalyst: Optimize Interface for Mac
Published:• 7 min readInvestigating why certain UIKit controls throw runtime exceptions in Catalyst's 'Optimize Interface for Mac' mode and discovering which controls are forbidden.
-
Disabling Keyboard Avoidance in SwiftUI's UIHostingController
Published:• 6 min readFixing unwanted keyboard avoidance behavior in UIHostingController using runtime dynamic subclassing to override keyboard notification handling methods.
-
The State of SwiftUI
Published:• 7 min readTesting SwiftUI's production readiness in iOS 14 and macOS Big Sur through Apple's Fruta sample app, revealing performance issues and platform-specific limitations.
-
Logging in Swift
Published:• 15 min readAn in-depth exploration of Apple's unified logging system and the promising OSLogStore API that Apple removed from iOS 14 at the last minute.
-
Building with Swift Trunk Development Snapshots
Published:• 4 min readA troubleshooting guide for building with Swift trunk development snapshots, documenting compilation errors, linker issues, and their solutions.
-
Calling Super at Runtime in Swift
Published:• 16 min readImplementing dynamic super calls in Swift through runtime manipulation, assembly language, and ARM64 register management for InterposeKit.
-
zld — A Faster Version of Apple's Linker
Published:• 3 min readHow to speed up iOS build times by 40% using zld, a drop-in replacement for Apple's linker, with practical integration tips for real projects.
-
How to Fix LLDB: Couldn't IRGen Expression
Published:• 10 min readSolving the mysterious LLDB 'Couldn't IRGen expression' error by investigating Swift module path serialization and discovering that removing dSYM bundles fixes debugging issues.
-
Updating macOS on a Hackintosh
Published:• 5 min readA practical guide to safely updating macOS on a Hackintosh by first updating OpenCore bootloader and essential kexts before upgrading the system.
-
InterposeKit — Elegant Swizzling in Swift
Published:• 3 min readIntroducing InterposeKit, a modern Swift library for elegant method swizzling that leverages Swift 5.2's callAsFunction for type-safe Objective-C method interception.
-
The Great Mac Catalyst Text Input Crash Hunt
Published:• 8 min readDeep-dive investigation and fix for a Mac Catalyst text input crash caused by a race condition in Apple's RemoteTextInput framework.
-
Jailbreaking for iOS Developers
Published:• 8 min readA comprehensive guide to iOS jailbreaking for developers, covering legal security research tools, debugging capabilities, and practical applications beyond app piracy.
-
Network Kernel Core Dump
Published:• 2 min readStep-by-step instructions from Apple for capturing macOS kernel core dumps over a network connection between two Macs.
-
How to macOS Core Dump
Published:• 4 min readA technical guide to deciphering Apple's cryptic boot arguments and setting up macOS kernel core dumps to debug persistent kernel panics.
-
Kernel Panics and Surprise boot-args
Published:• 4 min readInvestigation into mysterious kernel panics reveals Apple repair centers left my MacBook with undocumented security-weakening boot arguments.
-
The LG UltraFine 5K, kernel_task, and Me
Published:• 9 min readA four-year saga with the problematic LG UltraFine 5K display and the surprising discovery that plugging it into the wrong MacBook side causes performance issues.
-
Let's Try This Again
Published:• 1 min readAfter five years away from personal blogging, I'm returning to share technical stories that don't fit on Twitter or corporate blogs.
-
How We Work at PSPDFKit
Published:• 14 min readAn inside look at PSPDFKit's development processes, from proposal-based feature planning to monorepo management and release automation.
-
Swizzling in Swift
Published:• 10 min readA deep dive into safe method swizzling techniques in Swift, covering common pitfalls and the correct way to implement dynamic super calls.
-
WWDC for First-Timers, 2019 Edition
Published:• 22 min readPractical tips and advice for making the most of your WWDC experience, from packing essentials to navigating labs and networking events.
-
Challenges of Adopting Drag and Drop
Published:• 10 min readDiscusses the challenges and limitations faced when implementing drag and drop functionality for PDF editing on iOS 11.
-
Marzipan: Porting iOS Apps to the Mac
Published:• 13 min readExplores Apple's Marzipan technology for running UIKit apps on macOS and how to experiment with it before official third-party support.
-
How to Use Slack and Not Go Crazy
Published:• 12 min readBest practices for using Slack effectively in a distributed team without getting overwhelmed by notifications and channels.
-
Hardcore Debugging - Heavy Weapons for Hard Bugs
Published:• 10 min readAdvanced debugging techniques for tracking memory management issues, retain/release cycles, and hard-to-find bugs in iOS development.
-
Binary Frameworks in Swift
Published:• 8 min readExplores Swift's ABI stability and the challenges of shipping binary frameworks before Swift 5.
-
Even Swiftier Objective-C
Published:• 10 min readExplores new Objective-C features and improvements introduced at WWDC 2017 that make the language more Swift-like.
-
The Case for Deprecating UITableView
Published:• 13 min readArgues why UITableView should be deprecated in favor of UICollectionView for better flexibility and modern iOS development.
-
Running tests with Clang Address Sanitizer
Published:• 10 min readGuide to using Clang Address Sanitizer for finding memory bugs, race conditions, and other runtime issues in iOS and Android development.
-
UI testing on iOS, without busy waiting
Published:• 5 min readComprehensive guide to effective UI testing on iOS using KIF framework without busy waiting and performance optimization techniques.
-
Hiring a distributed team
Published:• 10 min readLessons learned about hiring and building a successful distributed remote team at PSPDFKit over six years.
-
Writing Good Bug Reports
Published:• 13 min readEssential guide to writing effective bug reports that help developers understand, reproduce, and fix issues quickly and efficiently.
-
Real-time collaboration, Apple, and you
Published:• 6 min readAnalysis of Apple's real-time collaboration features announced in 2016 and their implications for developers.
-
Converting Xcode Test Runs to JUnit, the Fast Way
Published:• 4 min readA fast method for converting Xcode test results to JUnit format for better CI integration and test reporting.
-
Efficient iOS Version Checking
Published:• 10 min readBest practices for efficiently checking iOS versions in code while supporting multiple deployment targets.
-
Investigating Thread Safety of UIImage
Published:• 6 min readDeep dive into UIImage thread safety issues and how to properly handle images in concurrent environments.
-
Swifty Objective-C
Published:• 18 min readModern Objective-C language features that make it more Swift-like, including nullability annotations, generics, and new syntax improvements.
-
Running UI Tests on iOS With Ludicrous Speed
Published:• 11 min readTechniques for dramatically speeding up UI test execution in Xcode using parallelization and optimization strategies.
-
A Pragmatic Approach to Cross-Platform
Published:• 11 min readHow PSPDFKit shares a common C++ codebase across iOS, Android, and Web platforms while maintaining native user experiences.
-
Surprises with Swift Extensions
Published:• 5 min readCommon pitfalls and surprising behaviors when creating Swift extensions on Objective-C classes, with solutions for proper method naming.
-
Using ccache for Fun and Profit
Published:• 6 min readComplete guide to using ccache to dramatically speed up C/C++/Objective-C build times for large iOS projects and CI systems.
-
UITableViewController designated initializer woes
Published:• 3 min readNavigate the complications of subclassing UITableViewController after iOS 8.3 introduced designated initializers that break proper initialization patterns.
-
Researching ResearchKit
Published:• 6 min readAnalyze Apple's first major open-source project ResearchKit to discover interesting implementation details and practical iOS development solutions.
-
The curious case of rotation with multiple windows on iOS 8
Published:• 2 min readDiagnose and solve an iOS 8 regression where unwanted rotation occurs in apps using multiple windows despite explicit configuration.
-
UIKit Debug Mode
Published:• 2 min readUnlock hidden UIKit debugging features by bypassing Apple's InternalBuild checks to access secret flags for logging touches, gestures, and animations.
-
Retrofitting containsString: on iOS 7
Published:• 1 min readBackport iOS 8's convenient NSString containsString: method to iOS 7 using runtime patching that won't conflict with Apple's implementation.
-
A Story About Swizzling "the Right Way™" and Touch Forwarding
Published:• 8 min readLearn why traditional method swizzling breaks UIKit's touch forwarding and discover a better approach that preserves _cmd integrity.
-
Hacking with Aspects
Published:• 3 min readExplore how Apple detects popover presentation in UIImagePickerController and learn to bypass the restriction using my Aspects library.
-
Fixing UITextView On iOS 7
Published:• 2 min readFix the severe scrolling and content positioning bugs in iOS 7's UITextView with PSPDFTextView, a drop-in replacement.
-
Fixing What Apple Doesn't
Published:• 2 min readFix the misaligned label in iOS 7's printer controller by swizzling UIPrinterSearchingView's layoutSubviews method.
-
How To Inspect The View Hierarchy Of Third-Party Apps
Published:• 3 min readLearn how to inspect view hierarchies of third-party iOS apps using a jailbroken device and debugging tools like Reveal for design insights.
-
Fixing UISearchDisplayController On iOS 7
Published:• 1 min readFix the broken animation, frame positioning, and status bar issues in UISearchDisplayController on iOS 7 with this comprehensive solution.
-
Smart Proxy Delegation
Published:• 4 min readEliminate delegate boilerplate code in Objective-C using NSProxy to automatically handle respondsToSelector checks and method forwarding.
-
Adding Keyboard Shortcuts To UIAlertView
Published:• 3 min readAdd keyboard shortcuts to UIAlertView and UIActionSheet for faster simulator testing by intercepting keyboard events with Enter and Escape keys.
-
How To Center Content Within UIScrollView
Published:• 3 min readLearn the best approach to center content in UIScrollView using contentInset instead of layoutSubviews or setContentOffset for better zooming behavior.
-
UIAppearance for Custom Views
Published:• 4 min readLearn how to properly implement UIAppearance in custom views, including important gotchas about setter tracking and initialization patterns.
-
Hacking Block Support Into UIMenuItem
Published:• 12 min readImplement block support for UIMenuItem by swizzling the responder chain to enable cleaner API patterns.
-
Using Subscripting With Xcode 4.4 And iOS 4.3+
Published:• 2 min readUse Objective-C's modern subscripting syntax with Xcode 4.4 and iOS 4.3+ through a clever header-only hack that enables array[index] notation.
-
Pimping recursiveDescription
Published:• 2 min readEnhance UIView's recursiveDescription to clearly show view controller hierarchies and containment relationships for easier debugging.
-
NSURLCache Uses A Disk Cache As Of iOS 5
Published:• 3 min readDiscover how NSURLCache in iOS 5 now automatically implements disk caching to a SQLite database based on Cache-Control headers.
-
Moving On... Or How Waiting For A Visa Was The Best Thing That Ever Happened To Me.
Published:• 4 min readAfter months of waiting for a US visa, I share my journey from freelance to full-time indie developer and the creation of PSPDFKit.
-
Don't Call willChangeValueForKey Unless It's Really Needed
Published:• 4 min readLearn why willChangeValueForKey and didChangeValueForKey are unnecessary when using setter methods for KVO in Objective-C.
-
Reboot
Published:• 1 min readThis post marks the reboot of my blog where I plan to share iOS development insights and personal thoughts.