Advertisement · 728 × 90

Posts by Will

Last week ago I saw someone use e14n instead of enshittification and thought it was the funniest thing ever, a way to somehow make the term even shittier.

2 years ago 12 4 0 0

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

2 months ago 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.

4 months ago 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-...

4 months ago 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

6 months ago 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.

6 months ago 2 0 1 0

My talk from ServerSide is up!

6 months ago 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 :)

6 months ago 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.

6 months ago 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-...

6 months ago 21 5 4 0
Advertisement
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...

6 months ago 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...

7 months ago 7 5 0 0
Post image

iOS Dev Tip 💡

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

→ learnandcodewithenid.com

1 year ago 1 1 0 0
Post image

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

1 year ago 482 40 11 4
Post image

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

→ learnandcodewithenid.com

1 year ago 12 1 0 0

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

github.com/will-lumley/...

1 year ago 3 1 1 0

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

1 year ago 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...

1 year ago 41 7 2 0

1517, Martin Luther

1 year ago 22 2 1 0

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

1 year ago 1340 138 19 2
Advertisement
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

1 year ago 14 2 1 0

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

1 year ago 8 2 0 0

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

1 year ago 0 0 0 0

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

1 year ago 0 0 1 0

How so?

1 year ago 0 0 0 0

Completion > perfection

1 year ago 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

1 year ago 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

1 year ago 14 6 3 0

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

1 year ago 1 0 0 0
Advertisement