Running a home server does not have to mean setting up a full-blown monitoring stack. For my needs, a few shell scripts and push notifications are all it takes to keep things simple, reliable, and easy to maintain. I use ntfy.sh for notifications. It is a simple, open-source tool that lets you send push notifications to your devices via a single HTTP request. It is lightweight, easy to set up, and fits perfectly with my minimalist approach.| blog.kulman.sk
When working on iOS applications, I often find myself in situations where I need to develop a new feature while simultaneously fixing a bug. This can be challenging to manage, especially when the changes for the feature and the bug fix overlap. Developers have different approaches to handle this: Stashing changes Creating temporary commits Cloning the repository twice While these methods work, they are not ideal. Recently, I discovered a better solution.| blog.kulman.sk
Switching Bluetooth headphones between devices on macOS can be surprisingly unreliable, especially with popular models like the Sony WH-1000XM5. While these headphones support multi-point connections, the experience is often inconsistent: macOS may hijack playback unexpectedly, or media buttons might control the wrong device. I wanted a seamless, reliable way to switch my headphones between my MacBook and iPhone, using tools I already rely on. Existing solutions and their limitations I initia...| blog.kulman.sk
Auto-Type is a feature that simulates typing a sequence of keystrokes into another application. On macOS, you can achieve this by programmatically generating keyboard events. In this post, I’ll show you how to implement Auto-Type in Swift, covering permissions, event synthesis, character-to-keycode mapping, and practical tips for reliability and security. Understanding the Approach macOS does not provide a direct API for sending text to other apps. Instead, you need to| Igor Kulman
I recently worked on an iOS project where we decided to move away from Cocoapods and Git submodules, and migrate our internal libraries to Swift Package Manager. At the same time, we wanted to consolidate everything into a monorepo to make development and dependency management simpler. One important requirement was to preserve the full Git history of each library during the migration. Motivation The main motivation for this migration was that CocoaPods is effectively end-of-life—it is no lo...| blog.kulman.sk
There is now an official GitHub Copilot extension for Xcode, but it essentially acts as a fancy autocomplete. Given how unreliable Xcode’s autocomplete can be, this is still an improvement. However, to fully leverage GitHub Copilot’s capabilities, you will ll need a more extensible IDE—such as Visual Studio Code. Visual Studio Code tooling The tooling in Visual Studio Code has come a long way in terms of supporting iOS development, and these days, you can configure it to offer a very go...| blog.kulman.sk
In a project I work on the messages in chat can contain a location attachment. Those location attachments are represented as map snapshots showing the attached location and are generated in the iOS application from the coordinates. The map snapshots are created using the MKMapSnapshotter class using quite simple code showing a snapshot of the map 250 meters around the location in the attachment let region = MKCoordinateRegion(center: coordinate, latitudinalMeters: 250, longitudinalMeters: 250...| blog.kulman.sk
I currently work on a project that uses a self hosted Gitlab instance for git and this Gitlab instance can be only accessed after connecting to the company’s OpenVPN. I did not want to be connected to OpenVPN all the time from my machine, especially this being a side project that I do not work on every day. Every time I needed to push or pull code or create or review a PR I connected to OpenVPN, did what I need to do, disconnected.| blog.kulman.sk
The Xcode debugger is quite a powerful tools but I have only seen a few iOS developer using to for more than printing out variable values with the po debugger command or setting values with the expr debugger command. Let me show you a few commands I use for development with very specific use cases. Print current UIViewController to get oriented When I get to work on a new code base the best way for me to get oriented in the iOS application is to know what UIViewController is currently being d...| Igor Kulman
Critical Alerts are an iOS features that is not exactly new, it was introduced with iOS 12 back in 2018, but I have never worked for it before and I have not even used any iOS application that implements it. I think the main reason for this is that this feature cannot be just used by any iOS application, it requires special entitlements that you have to get by asking Apple and you should have a good reason for it to get them.| Igor Kulman
Gitlab allows you to easily measure and report code quality of your merge requests to see your linting or other code issues right in every merge request you make in a nice and concise way. I have been using SwiftLint for a very long time now in my iOS projects so I decided to integrate it to the Gitlab code quality flow. This is quite easy because SwifLint can generate a Code Climate format that Gitlab understands. No need for any custom format conversion or data transformation. To set it up ...| Igor Kulman
When you look for a way to play audio in your iOS application you usually find code like this player = try AVAudioPlayer(contentsOf: url) player.prepareToPlay() player.play() While this code works and will play the given audio file it does not deal with all the nuances of audio playback. Imagine the user is playing a podcast or music, do you want the sound in your app to stop that playback? Or play over it? The key to correct audio playback is understanding AVAudioSession categories. Let’s ...| Igor Kulman
Dealing with code conflicts is somethings every developer is probably used to, but it is never a good experience, especially when dealing with file formats that are not exactly human readable, like Xcode project files. The Xcode projects files (project.pbxproj) are a proper mess with every file appearing multiple times, being referenced by an id, etc .. definitely not something you would want to deal with manually. Luckily there is a better way. Kintsugi Kintsugi is lightweight tool to automa...| Igor Kulman
This summer marks exactly a decade since I started doing mobile apps development. My first mobile app was called MyTVShows and was released to the Windows Phone Store in summer of 2011. The app solved a practical problem for me, keeping track of new episodes. I later rewrote the app as TvTime which was one of my most successful Windows Phone apps. My times of doing Windows Phone development are long over as the platform has been dead for many years but this reminded me of all the struggles I ...| Igor Kulman
When you use an UITableView you usually either use it with selection in normal mode or you switch it to edit mode to do reordering and deleting of the items. In a recent project I had to use an UITableView with items that would be selectable and could be reordered at the some time. To make things a bit more complicated only one section of the UITableView had to have the possibility to reorder items and only inside this section, the user should not have been able to drag an item to another sec...| blog.kulman.sk