41554 blogs · [ { "id": "01a087e5-a5dc-726d-aa59-2fe6eec84065", "title": "OpenClaw, OpenAI and the future", "url": "https://steipete.me/posts/2026/openclaw/", "published_at": "2026-02-15T00:00:00+00:00" }, { "id": "01a087e5-a5dc-726d-aa59-2fe6ef63ebe2", "title": "Shipping at Inference-Speed", "url": "https://steipete.me/posts/2025/shipping-at-inference-speed/", "published_at": "2025-12-28T11:00:00+00:00" }, { "id": "01a087e5-a5dc-726d-aa59-2fe6ef81f6e1", "title": "The Signature Flicker", "url": "https://steipete.me/posts/2025/signature-flicker/", "published_at": "2025-12-18T00:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfa23e666", "title": "Just Talk To It - the no-bs Way of Agentic Engineering", "url": "https://steipete.me/posts/just-talk-to-it/", "published_at": "2025-10-14T09:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfb13ec54", "title": "Claude Code Anonymous", "url": "https://steipete.me/posts/2025/claude-code-anonymous/", "published_at": "2025-09-09T10:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfb5e73f4", "title": "Live Coding Session: Building Arena", "url": "https://steipete.me/posts/2025/live-coding-session-building-arena/", "published_at": "2025-09-06T10:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfbddf449", "title": "My Current AI Dev Workflow", "url": "https://steipete.me/posts/2025/optimal-ai-development-workflow/", "published_at": "2025-08-25T09:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfc0680b4", "title": "Essential Reading for Agentic Engineers - August 2025", "url": "https://steipete.me/posts/2025/essential-reading-august-2025/", "published_at": "2025-08-22T01:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfc5d567a", "title": "Just One More Prompt", "url": "https://steipete.me/posts/just-one-more-prompt/", "published_at": "2025-08-19T08:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfcf99570", "title": "Poltergeist: The Ghost That Keeps Your Builds Fresh", "url": "https://steipete.me/posts/2025/poltergeist-ghost-keeps-builds-fresh/", "published_at": "2025-08-05T14:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfd8ad666", "title": "Don't read this Startup Slop", "url": "https://steipete.me/posts/2025/startup-slop/", "published_at": "2025-08-02T14:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfdb5545f", "title": "Essential Reading for Agentic Engineers - July 2025", "url": "https://steipete.me/posts/2025/essential-reading-july-2025/", "published_at": "2025-08-02T01:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfe66276d", "title": "Self-Hosting AI Models After Claude's Usage Limits", "url": "https://steipete.me/posts/2025/self-hosting-ai-models/", "published_at": "2025-07-31T09:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dfea40171", "title": "Logging Privacy Shenanigans", "url": "https://steipete.me/posts/2025/logging-privacy-shenanigans/", "published_at": "2025-07-29T07:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5dff7b1d3d", "title": "VibeTunnel's first AI-anniversary", "url": "https://steipete.me/posts/2025/vibetunnel-first-anniversary/", "published_at": "2025-07-16T19:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0053354c", "title": "Making AppleScript Work in macOS CLI Tools: The Undocumented Parts", "url": "https://steipete.me/posts/2025/applescript-cli-macos-complete-guide/", "published_at": "2025-07-03T13:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0088877d", "title": "Peekaboo 2.0 – Free the CLI from its MCP shackles", "url": "https://steipete.me/posts/2025/peekaboo-2-freeing-the-cli-from-its-mcp-shackles/", "published_at": "2025-07-03T01:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e01718602", "title": "Command your Claude Code Army, Reloaded", "url": "https://steipete.me/posts/command-your-claude-code-army-reloaded/", "published_at": "2025-07-03T00:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e01c2ac83", "title": "Essential Reading for Agentic Engineers", "url": "https://steipete.me/posts/2025/essential-reading/", "published_at": "2025-07-01T02:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e025614df", "title": "Slot Machines for Programmers: How Peter Builds Apps 20x Faster with AI", "url": "https://steipete.me/posts/2025/when-ai-meets-madness-peters-16-hour-days/", "published_at": "2025-06-25T17:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e03069edb", "title": "My AI Workflow for Understanding Any Codebase", "url": "https://steipete.me/posts/2025/understanding-codebases-with-ai-gemini-workflow/", "published_at": "2025-06-25T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e03e30f6d", "title": "stats.store: Privacy-First Sparkle Analytics", "url": "https://steipete.me/posts/2025/stats-store-privacy-first-sparkle-analytics/", "published_at": "2025-06-18T09:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e04407a2d", "title": "Showing Settings from macOS Menu Bar Items: A 5-Hour Journey", "url": "https://steipete.me/posts/2025/showing-settings-from-macos-menu-bar-items/", "published_at": "2025-06-17T11:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e04e0d356", "title": "VibeTunnel: Turn Any Browser into Your Mac's Terminal", "url": "https://steipete.me/posts/2025/vibetunnel-turn-any-browser-into-your-mac-terminal/", "published_at": "2025-06-16T11:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e05172059", "title": "Vibe Meter 2.0: Calculating Claude Code Usage with Token Counting", "url": "https://steipete.me/posts/2025/vibe-meter-2-claude-code-usage-calculation/", "published_at": "2025-06-15T18:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e05650acf", "title": "llm.codes: Make Apple Docs AI-Readable", "url": "https://steipete.me/posts/2025/llm-codes-transform-developer-docs/", "published_at": "2025-06-14T13:22:16+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e058599e0", "title": "Automatic Observation Tracking in UIKit and AppKit: The Feature Apple Forgot to Mention", "url": "https://steipete.me/posts/2025/automatic-observation-tracking-uikit-appkit/", "published_at": "2025-06-11T09:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0627f4d1", "title": "Peekaboo MCP – lightning-fast macOS screenshots for AI agents", "url": "https://steipete.me/posts/2025/peekaboo-mcp-lightning-fast-macos-screenshots-for-ai-agents/", "published_at": "2025-06-07T11:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e063a10f8", "title": "Migrating 700+ Tests to Swift Testing: A Real-World Experience", "url": "https://steipete.me/posts/2025/migrating-700-tests-to-swift-testing/", "published_at": "2025-06-06T18:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e067375bf", "title": "Commanding Your Claude Code Army", "url": "https://steipete.me/posts/2025/commanding-your-claude-code-army/", "published_at": "2025-06-05T09:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e07669095", "title": "Code Signing and Notarization: Sparkle and Tears", "url": "https://steipete.me/posts/2025/code-signing-and-notarization-sparkle-and-tears/", "published_at": "2025-06-05T07:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e081cdf2b", "title": "Vibe Meter: Monitor Your AI Costs", "url": "https://steipete.me/posts/2025/vibe-meter-monitor-your-ai-costs/", "published_at": "2025-06-04T11:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e08658851", "title": "Claude Code is My Computer", "url": "https://steipete.me/posts/2025/claude-code-is-my-computer/", "published_at": "2025-06-03T08:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e09273d48", "title": "Stop Over-thinking AI Subscriptions", "url": "https://steipete.me/posts/2025/stop-overthinking-ai-subscriptions/", "published_at": "2025-06-02T09:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e09456a9e", "title": "Introducing Demark: HTML in. MD out. Blink-fast.", "url": "https://steipete.me/posts/2025/introducing-demark-html-to-markdown-in-swift/", "published_at": "2025-06-01T18:45:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e09f78555", "title": "The Future of Vibe Coding: Building with AI, Live and Unfiltered", "url": "https://steipete.me/posts/2025/the-future-of-vibe-coding/", "published_at": "2025-06-01T15:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0a925e88", "title": "MCP Best Practices", "url": "https://steipete.me/posts/2025/mcp-best-practices/", "published_at": "2025-06-01T14:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0a9c8264", "title": "Finding My Spark Again", "url": "https://steipete.me/posts/2025/finding-my-spark-again/", "published_at": "2025-06-01T13:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0b96d3dc", "title": "Top-Level Menu Visibility in SwiftUI for macOS", "url": "https://steipete.me/posts/2021/top-level-menu-visibility-in-swiftui/", "published_at": "2021-04-09T16:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0baaa62f", "title": "Fixing keyboardShortcut in SwiftUI", "url": "https://steipete.me/posts/2021/fixing-keyboardshortcut-in-swiftui/", "published_at": "2021-01-31T11:30:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0c306a33", "title": "Supporting Both Tap and Long Press on a Button in SwiftUI", "url": "https://steipete.me/posts/2021/supporting-both-tap-and-longpress-on-button-in-swiftui/", "published_at": "2021-01-27T16:30:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0ca6238f", "title": "On Using Apple Silicon Mac Mini for Continuous Integration", "url": "https://steipete.me/posts/2020/apple-silicon-mac-mini-for-ci/", "published_at": "2020-12-14T09:30:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0d46caa2", "title": "Apple Silicon M1: A Developer's Perspective", "url": "https://steipete.me/posts/2020/apple-silicon-m1-a-developer-perspective/", "published_at": "2020-11-28T13:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0d7ba3a1", "title": "Gardening Your Twitter: Curating Your Timeline", "url": "https://steipete.me/posts/2020/curating-your-twitter-timeline/", "published_at": "2020-10-21T14:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0e0407fc", "title": "Gardening Your Twitter: Growing Your Followers", "url": "https://steipete.me/posts/2020/growing-your-twitter-followers/", "published_at": "2020-10-21T13:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0e105c35", "title": "Forbidden Controls in Catalyst: Optimize Interface for Mac", "url": "https://steipete.me/posts/2020/forbidden-controls-in-catalyst-mac-idiom/", "published_at": "2020-09-22T18:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0ed01582", "title": "Disabling Keyboard Avoidance in SwiftUI's UIHostingController", "url": "https://steipete.me/posts/2020/disabling-keyboard-avoidance-in-swiftui-uihostingcontroller/", "published_at": "2020-09-21T20:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0ed19fa7", "title": "The State of SwiftUI", "url": "https://steipete.me/posts/2020/state-of-swiftui/", "published_at": "2020-09-13T09:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e0fbb252f", "title": "Logging in Swift", "url": "https://steipete.me/posts/2020/logging-in-swift/", "published_at": "2020-08-24T17:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e10a9bcbb", "title": "Building with Swift Trunk Development Snapshots", "url": "https://steipete.me/posts/2020/building-with-swift-trunk/", "published_at": "2020-06-12T15:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e11874b94", "title": "Calling Super at Runtime in Swift", "url": "https://steipete.me/posts/2020/calling-super-at-runtime/", "published_at": "2020-06-10T15:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e118d92ba", "title": "zld — A Faster Version of Apple's Linker", "url": "https://steipete.me/posts/2020/zld-a-faster-linker/", "published_at": "2020-06-05T08:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1261f5ac", "title": "How to Fix LLDB: Couldn't IRGen Expression", "url": "https://steipete.me/posts/2020/couldnt-irgen-expression/", "published_at": "2020-06-04T13:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e131cc583", "title": "Updating macOS on a Hackintosh", "url": "https://steipete.me/posts/2020/updating-a-hackintosh/", "published_at": "2020-06-01T08:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e137b1bc3", "title": "InterposeKit — Elegant Swizzling in Swift", "url": "https://steipete.me/posts/2020/interposekit/", "published_at": "2020-05-31T10:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1409e940", "title": "The Great Mac Catalyst Text Input Crash Hunt", "url": "https://steipete.me/posts/2020/mac-catalyst-crash-hunt/", "published_at": "2020-05-29T22:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e14f438d5", "title": "Jailbreaking for iOS Developers", "url": "https://steipete.me/posts/2020/jailbreaking-for-ios-developers/", "published_at": "2020-05-25T22:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e15325e62", "title": "Network Kernel Core Dump", "url": "https://steipete.me/posts/2020/network-kernel-core-dump/", "published_at": "2020-05-21T10:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1547f4d3", "title": "How to macOS Core Dump", "url": "https://steipete.me/posts/2020/how-to-macos-core-dump/", "published_at": "2020-05-21T08:30:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e163b068f", "title": "Kernel Panics and Surprise boot-args", "url": "https://steipete.me/posts/2020/kernel-panic-surprise-boot-args/", "published_at": "2020-05-20T08:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e168b8e4a", "title": "The LG UltraFine 5K, kernel_task, and Me", "url": "https://steipete.me/posts/2020/the-lg-ultrafine5k-kerneltask-and-me/", "published_at": "2020-05-19T06:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e172bbde9", "title": "Let's Try This Again", "url": "https://steipete.me/posts/2020/lets-try-this-again/", "published_at": "2020-05-14T17:03:35+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e177e0e4a", "title": "How We Work at PSPDFKit", "url": "https://steipete.me/posts/2019/how-we-work/", "published_at": "2019-07-03T07:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e18772dc3", "title": "Swizzling in Swift", "url": "https://steipete.me/posts/2019/swizzling-in-swift/", "published_at": "2019-06-26T08:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e18bb1f59", "title": "WWDC for First-Timers, 2019 Edition", "url": "https://steipete.me/posts/2019/wwdc-tips-2019-edition/", "published_at": "2019-05-30T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e192b8219", "title": "Challenges of Adopting Drag and Drop", "url": "https://steipete.me/posts/2018/challenges-of-drag-and-drop/", "published_at": "2018-11-07T08:10:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e19501e2b", "title": "Marzipan: Porting iOS Apps to the Mac", "url": "https://steipete.me/posts/2018/porting-ios-apps-to-mac-marzipan-iosmac-uikit-appkit/", "published_at": "2018-09-20T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1988f740", "title": "How to Use Slack and Not Go Crazy", "url": "https://steipete.me/posts/2018/how-to-use-slack-and-not-go-crazy/", "published_at": "2018-06-21T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1a835bbe", "title": "Hardcore Debugging - Heavy Weapons for Hard Bugs", "url": "https://steipete.me/posts/2018/hardcore-debugging/", "published_at": "2018-03-07T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1b76759f", "title": "Binary Frameworks in Swift", "url": "https://steipete.me/posts/2018/binary-frameworks-swift/", "published_at": "2018-01-29T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1c69336b", "title": "Even Swiftier Objective-C", "url": "https://steipete.me/posts/2017/even-swiftier-objective-c/", "published_at": "2017-06-14T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1c944ba1", "title": "The Case for Deprecating UITableView", "url": "https://steipete.me/posts/2017/the-case-for-deprecating-uitableview/", "published_at": "2017-01-19T12:10:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1d53f833", "title": "Running tests with Clang Address Sanitizer", "url": "https://steipete.me/posts/2016/test-with-asan/", "published_at": "2016-10-18T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1da9b3d8", "title": "UI testing on iOS, without busy waiting", "url": "https://steipete.me/posts/2016/ui-testing-revisited/", "published_at": "2016-09-29T15:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1de18808", "title": "Hiring a distributed team", "url": "https://steipete.me/posts/2016/hiring-a-distributed-team/", "published_at": "2016-09-20T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1e37e4b0", "title": "Writing Good Bug Reports", "url": "https://steipete.me/posts/2016/writing-good-bug-reports/", "published_at": "2016-09-13T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1ef82ff5", "title": "Real-time collaboration, Apple, and you", "url": "https://steipete.me/posts/2016/real-time-collaboration/", "published_at": "2016-09-08T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e1fb94ace", "title": "Converting Xcode Test Runs to JUnit, the Fast Way", "url": "https://steipete.me/posts/2016/converting-xcode-test-results-the-fast-way/", "published_at": "2016-08-11T10:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e2004f2f7", "title": "Efficient iOS Version Checking", "url": "https://steipete.me/posts/2016/efficient-ios-version-checking/", "published_at": "2016-07-06T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e201db25a", "title": "Investigating Thread Safety of UIImage", "url": "https://steipete.me/posts/2016/investigating-thread-safety-of-uiimage/", "published_at": "2016-06-30T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e204ea0dc", "title": "Swifty Objective-C", "url": "https://steipete.me/posts/2016/swifty-objective-c/", "published_at": "2016-05-26T12:10:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e211418f7", "title": "Running UI Tests on iOS With Ludicrous Speed", "url": "https://steipete.me/posts/2016/running-ui-tests-with-ludicrous-speed/", "published_at": "2016-04-27T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e220c6fed", "title": "A Pragmatic Approach to Cross-Platform", "url": "https://steipete.me/posts/2016/a-pragmatic-approach-to-cross-platform/", "published_at": "2016-04-13T06:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e22680158", "title": "Surprises with Swift Extensions", "url": "https://steipete.me/posts/2016/surprises-with-swift-extensions/", "published_at": "2016-03-24T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e235d9299", "title": "Using ccache for Fun and Profit", "url": "https://steipete.me/posts/2015/ccache-for-fun-and-profit/", "published_at": "2015-10-06T12:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e2450b357", "title": "UITableViewController designated initializer woes", "url": "https://steipete.me/posts/2015/uitableviewcontroller-designated-initializer-woes/", "published_at": "2015-04-15T09:15:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e24ac3ffa", "title": "Researching ResearchKit", "url": "https://steipete.me/posts/2015/researching-researchkit/", "published_at": "2015-04-14T21:46:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e24da34e5", "title": "The curious case of rotation with multiple windows on iOS 8", "url": "https://steipete.me/posts/2015/rotation-multiple-windows-bug/", "published_at": "2015-01-25T21:25:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e25a04181", "title": "UIKit Debug Mode", "url": "https://steipete.me/posts/2015/uikit-debug-mode/", "published_at": "2015-01-09T15:05:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e2605926a", "title": "Retrofitting containsString: on iOS 7", "url": "https://steipete.me/posts/2014/retrofitting-containsstring-on-ios-7/", "published_at": "2014-07-17T23:40:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e26dd6c52", "title": "A Story About Swizzling \"the Right Way™\" and Touch Forwarding", "url": "https://steipete.me/posts/2014/a-story-about-swizzling-the-right-way-and-touch-forwarding/", "published_at": "2014-07-04T12:17:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e27542938", "title": "Hacking with Aspects", "url": "https://steipete.me/posts/2014/hacking-with-aspects/", "published_at": "2014-05-06T00:45:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e2853ac35", "title": "Fixing UITextView On iOS 7", "url": "https://steipete.me/posts/2014/fixing-uitextview-on-ios-7/", "published_at": "2014-01-08T20:03:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e28b5859f", "title": "Fixing What Apple Doesn't", "url": "https://steipete.me/posts/2014/fixing-what-apple-doesnt/", "published_at": "2014-01-04T15:09:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e296c861e", "title": "How To Inspect The View Hierarchy Of Third-Party Apps", "url": "https://steipete.me/posts/2013/how-to-inspect-the-view-hierarchy-of-3rd-party-apps/", "published_at": "2013-12-27T18:42:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e2a69e560", "title": "Fixing UISearchDisplayController On iOS 7", "url": "https://steipete.me/posts/2013/fixing-uisearchdisplaycontroller-on-ios-7/", "published_at": "2013-10-04T19:00:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e2b3b0767", "title": "Smart Proxy Delegation", "url": "https://steipete.me/posts/2013/smart-proxy-delegation/", "published_at": "2013-07-30T18:28:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e2bf723d6", "title": "Adding Keyboard Shortcuts To UIAlertView", "url": "https://steipete.me/posts/2013/adding-keyboard-shortcuts-to-uialertview/", "published_at": "2013-03-06T22:38:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e2c376b42", "title": "How To Center Content Within UIScrollView", "url": "https://steipete.me/posts/2013/how-to-center-uiscrollview/", "published_at": "2013-02-21T12:07:00+00:00" }, { "id": "01a087e5-a5dd-7248-a7aa-0a5e2c8bcfcf", "title": "UIAppearance for Custom Views", "url": "https://steipete.me/posts/2013/uiappearance-for-custom-views/", "published_at": "2013-02-12T14:31:00+00:00" } ] posts Claim your blog
Back to Peter Steinberger
Blog · corpus.blog/blogs/steipete.me/posts

Peter Steinberger

steipete.me

2026

2025

2021

2020

2019

2018

2017

2016

2015

2014

2013