I built a tiny Ktor reverse proxy that forwards Snowplow events and pushes real-time updates over WebSockets to a debug UI.
All the best side projects start with “this should be easy… right?” 😅
paul-samuels.com/blog/2026/02...
#kotlin #ktor
I built a tiny Ktor reverse proxy that forwards Snowplow events and pushes real-time updates over WebSockets to a debug UI.
All the best side projects start with “this should be easy… right?” 😅
paul-samuels.com/blog/2026/02...
#kotlin #ktor
Exploring a Call Once property wrapper in Swift using parameter packs.
paul-samuels.com/blog/2026/01...
#swift #propertyWrapper #parameterPacks
Finally wrote up the story of a local dev tool I’ve been poking at for ~4.5 years. Lots of lessons about DX, removing friction, support pain and why “just works” matters more than features.
paul-samuels.com/blog/2026/01...
#compose #kotlin #docker #swift #swiftui
Sometimes solving a problem isn't about more code, it's about asking the right question.
Step back, reframe and you might find a simpler solution.
Here's a recent example exploring KSP generated Kotlin code and Kotlinx.Serialization: paul-samuels.com/blog/2025/12...
#kotlin #ksp
💡 Kotlin devs: ever had `?.let` mysteriously fail to compile?
I dug into a subtle Kotlin mistake I commonly see in pull requests, explain the issue and how best to fix it.
📝 New post: Kotlin Gotchas: Why Your ?.let Sometimes Fails to Compile
🔗 paul-samuels.com/blog/2025/11...
#Kotlin
We often reach for interfaces or base classes when we see duplicated code.
But what if you can’t change the types?
You can still make the algorithm generic - just teach it how to read and build data.
📝 Generic Algorithms Without Constraints
🔗 paul-samuels.com/blog/2025/11...
#swift #kotlin
🧹 DYSNI — Do Ya Still Need It?
We deleted >800 lines of old Objective-C by asking one simple question: Do Ya Still Need It?
Simpler code. Less confusion. More clarity.
👉 paul-samuels.com/blog/2025/10...
#CleanCode #Refactoring #DYSNI #Swift #ObjC
New post: Git Rebase Tips and Tricks
Habits and commands that make rebasing smoother - from keeping merge bubbles to verifying results and fixing mistakes.
paul-samuels.com/blog/2025/10...
#git #rebase #devtools #programming
Great DX isn’t always a slick UI - sometimes it’s a horrible popup that saves you hours.
I built a pop up that yells when local OAuth tokens expire and I love it.
paul-samuels.com/blog/2025/10...
#DevExperience #Kotlin
Default arguments in Swift and Kotlin can make code cleaner - but at what cost? I explore how overusing them can weaken compiler checks, obscure intent, and blur boundaries between layers. Sometimes, being explicit is better.
paul-samuels.com/blog/2025/10...
#Swift #Kotlin
Might be more server side adjacent but I wrote this paul-samuels.com/blog/2025/08...
The only Xcode refactoring tool I actually use? Explaining regex - no sketchy web tools required.
paul-samuels.com/blog/2025/09...
I had a similar issue years ago - if I used AirPods Max when developing the audio bitrate was as if it was a cheap Bluetooth headset for phone calls. Got no help when reached out to Apple (disappointing as it was a brand new M1 and their flagship headphones). Solution was just use phone for music
I wrote a post on turning CI logs into actions
The general idea is to wrap your existing build scripts with a tool that can parse the logs for specific JSON payloads and then perform actions like comment on GitHub PRs, ping slack channels etc.
paul-samuels.com/blog/2025/09...
#swift
I wrote a post on self hosting a Vapor app on a Raspberry Pi
paul-samuels.com/blog/2025/08...
#swift #vapor
I wrote a post on a crafty little retain cycle in Swift, finding it and breaking it
paul-samuels.com/blog/2025/06...
#swift
I wrote a post on my experience of using Kotlin Symbol Processing in various ways over multiple years.
I cover how I like to structure my code and give example use cases for how we utilise KSP in our projects.
paul-samuels.com/blog/2025/06...
#kotlin #ksp
This is the current sweet spot we use it for. We have several bits of sharing like backend code generated for JVM and JS so we can run in webviews on the clients and native JVM in the backend. We also share types/serialisation between backend, Android and iOS to create a compile time contract
It’s situational but I work on a team ~10 iOS ~10 Android and we all work on our core platform and backends so tooling keep things consistent and avoiding pointless discussions on PRs or people causing churn reformatting stuff constantly is worth not having my own personal style
Here's a post on making sure your SwiftTesting parameterised tests show up in the test navigator with nice names using `CustomTestStringConvertible`
paul-samuels.com/blog/2025/03...
#swifttesting #swift
I wrote a post on "Building Complex Things" talking about virtualising macOS machines for iOS CI paul-samuels.com/blog/2025/03...
#iOS #macOS
It generates library files with ObjC interfaces that you can import into Swift. They are currently working towards native swift interop I believe. There are also libraries that help bridge things like coroutines to async/await and flows to AsyncSequences etc
“Best” is very situational in what you need and how your team is structured. We have had really good success with Kotlin Multiplatform - all our Android devs obviously know Kotlin and Swift/Kotlin are syntactically pretty similar and have fairly equal language features.