Will's Avatar

Will

@will-lumley

Mainly a senior iOS engineer, but love to dabble in web development and robotics/embedded-systems in my spare time. Father to four amazing children, and husband to a beautiful wife. Checkout my stuff: https://lumley.io http://github.com/will-lumley/

288
Followers
42
Following
55
Posts
01.01.2024
Joined
Posts Following

Latest posts by Will @will-lumley

Can confirm. When I don’t cut mine for an extended period of time bc I’m lazy it looks pretty bad.

17.02.2026 00:29 👍 2 🔁 0 💬 0 📌 0

I went down a couple of dead ends before finally arriving on the ESP32, so all in all it took about 3 weeks.
But only just taking into account the current approach on the blog, it took me about about 1 week.

11.12.2025 03:34 👍 1 🔁 0 💬 0 📌 0
How I Turned My Broken Garage Remote Into a HomeKit Garage Door for Under $22 A few weeks ago, my garage remote died. Completely. No LED, no click, no signs of life even after replacing the battery. Normally, this would be annoying enough, but my house relies heavily on HomeKit...

My old garage remote died, so instead of replacing it I turned the whole thing into a HomeKit-powered smart garage opener using an ESP32, a relay, and about $20 of parts.

It’s fast, fully local (no cloud), and way more fun than buying a new remote.

How I built it 👇
lumley.io/blogs/smart-...

10.12.2025 07:27 👍 5 🔁 0 💬 1 📌 0

let's express gratitude to the amazing people who selflessly shared their priceless wisdom with us: @danielchooper.bsky.social, Jinkai, @useyourloaf.com, Tjeerd in 't Veen, @jacobstechtavern.com, Bruno Valente Pimentel, Alfonso Tarallo, @massicotte.org and @will-lumley.bsky.social

20.10.2025 12:19 👍 5 🔁 2 💬 0 📌 0

Hard agree. Combine deserved a graceful evolution, not quiet abandonment. Even a small set of first-party bridging tools or async-friendly operators would’ve gone a long way toward easing the transition.

14.10.2025 13:10 👍 2 🔁 0 💬 1 📌 0

My talk from ServerSide is up!

13.10.2025 13:23 👍 36 🔁 10 💬 1 📌 3

Fair question! And a common gotcha I've had with AsyncStream.

In this case it’s fine, as each call to stream() creates its own independent AsyncStream/Continuation pair, and the actor fans out values to all registered continuations when send(_:) is called.
So yeah it’s multi-subscriber safe :)

11.10.2025 13:34 👍 1 🔁 0 💬 0 📌 0

Why make this?
Because observing an @Observable class from a SwiftUI view is easy, but doing the same from another ViewModel got messy fast. Without @Published, you’re left juggling Tasks and AsyncStreams just to stay in sync.

11.10.2025 03:01 👍 4 🔁 0 💬 0 📌 0
AsyncCombine: Because Async Code Shouldn’t Be Ugly When Swift first introduced Combine, I loved it. The syntax was expressive, pipelines were easy to follow, and @Published made state changes feel almost magical. But as Apple pushed us toward Swift Co...

🚀 New blog post!

AsyncCombine: Because Async Code Shouldn’t Be Ugly

I brought back Combine’s sink, assign, and CombineLatest - but built powered by Swift Concurrency.

Observing @Observable from another ViewModel shouldn’t be painful.

Here’s how I fixed it 👉 lumley.io/blogs/async-...

11.10.2025 02:59 👍 21 🔁 5 💬 4 📌 0
Preview
How to Stub URLSession Responses… or Die Trying The internet is filled to the brim with the gravestones of attempts to stub URLSession responses. As something of a strange holdover from the Objective-C days, URLSession is notoriously hard to…

so i wrote a thing about stubbing URLSession based on a 'trick' i discovered the other day jellystyle.com/2025/09/stub...

24.09.2025 09:17 👍 1 🔁 1 💬 0 📌 0
Preview
Swift 6.2 Released We’re excited to announce Swift 6.2, a release aimed at making every Swift developer more productive, regardless of where or how you write code. From improved tooling and libraries to enhancements in ...

www.swift.org/blog/swift-6...

16.09.2025 05:10 👍 7 🔁 5 💬 0 📌 0
Post image

iOS Dev Tip 💡

Easily monitor the device’s thermal state to optimize performance during overheating.

→ learnandcodewithenid.com

17.04.2025 19:20 👍 1 🔁 1 💬 0 📌 0
Post image

Making this argument and then hanging the entire load on TRY is fucking hilarious:

10.04.2025 22:29 👍 484 🔁 40 💬 11 📌 4
Post image

💡Starting with iOS 18.0, you can create mesh gradients in SwiftUI using MeshGradient.

→ learnandcodewithenid.com

19.01.2025 23:24 👍 12 🔁 1 💬 0 📌 0

FaviconFinder by @will-lumley.bsky.social is awesome!

github.com/will-lumley/...

10.01.2025 08:49 👍 3 🔁 1 💬 1 📌 0

Thank you for the shoutout @weijianduan.bsky.social! I’m really glad it’s managed to help you :)

10.01.2025 23:37 👍 3 🔁 0 💬 1 📌 0
Preview
Adjust the intensity of colors in SwiftUI views Lighten or darken colors in SwiftUI views using the brightness(_:) modifier.

There is a convenient brightness(_:) modifier in #SwiftUI that can be used to adjust the intensity of colors in our views. We can lighten the colors by passing it values from 0 to 1 or darken them using negative values:
nilcoalescing.com/blog/AdjustT...

19.12.2024 06:51 👍 41 🔁 7 💬 2 📌 0

1517, Martin Luther

28.12.2024 18:37 👍 22 🔁 2 💬 1 📌 0

it’s forbidden in their culture but a vacuum cleaner wants nothing more than to eat it’s own cord

26.12.2024 17:13 👍 1340 🔁 139 💬 19 📌 2
Preview
GitHub - Jaennaet/pISSStream: macOS menu bar app that shows how full the International Space Station's urine tank is in real time macOS menu bar app that shows how full the International Space Station's urine tank is in real time - Jaennaet/pISSStream

Why I 💛 the web.

#macOS menu bar app that shows how full the ISS urine tank is in real time. 🛰️🚽

Yurnining to check this out.

github.com/Jaennaet/pIS... #Swift

25.12.2024 00:10 👍 14 🔁 2 💬 1 📌 0

*click* React Native. *click* Flutter. *click* .....SwiftUI. *click* GTK. Easy. *click* ......Qt6.

23.12.2024 01:19 👍 8 🔁 2 💬 0 📌 0

How embarrassing! Maybe it’s just an issue on my machine then 💀

15.12.2024 06:36 👍 0 🔁 0 💬 0 📌 0

CMD+Space doesn't bring up Spotlight anymore and this has ruined my opinion on macOS and life.

15.12.2024 05:07 👍 0 🔁 0 💬 1 📌 0

How so?

15.12.2024 03:20 👍 0 🔁 0 💬 0 📌 0

Completion > perfection

13.12.2024 04:51 👍 1 🔁 1 💬 0 📌 0

With #swiftlang It's easy to forget that the diff between a point-free and pointed styles of function argument passing is not just syntactic but semantic. It's normal to consider these to be equivalent:
1. [1, 2].map(String.init)
2. [1, 2].map { String($0) }
But we shouldn't forget that: 1/4

11.12.2024 13:44 👍 12 🔁 1 💬 2 📌 0
Post image

Do you know about the take function for the Optional type? It takes the value if it is not nil and toggles the variable to nil.
https://buff.ly/3Zin2Wv

11.12.2024 11:16 👍 14 🔁 6 💬 3 📌 0

I've always just used GPT-4o, but will give o1 a try after this. Keen to see the difference.

09.12.2024 03:32 👍 1 🔁 0 💬 0 📌 0
Video thumbnail

A problematic little #swiftlang pattern I often see is "unwrap-then-nullify" for optional values that hold some temp state. This oft comes up when dealing with local caches or scrollOffsets or in-flight tasks, etc. Forgetting to nullify a value to "reset" state is a common mistake. Use take method.

06.12.2024 12:28 👍 27 🔁 2 💬 3 📌 0