Tom Lokhorst

Indie developer.
Currently working on iPhone mirroring app getbezel.app and Vision Pro app splitscreen.vision
Fan of both space and time.

Tom Lokhorsttomlokhorst
2025-07-03
Tom Lokhorsttomlokhorst
2025-07-03

I'm so excited for Swift Island conference, coming up in just two months. Three days of workshops to dive into all the new stuff from WWDC. There's still some tickets available! swiftisland.nl

Tom Lokhorst boosted:
Chris Eidhofchris@m.objc.io
2025-07-01

I did a (not very high quality) recording of my talk about the Attribute Graph. I hope it's helpful! chris.eidhof.nl/presentations/

Tom Lokhorsttomlokhorst
2025-06-30

With parameter packs in Swift you can create a sort of fake tuple to which implements Equatable. Very useful in SwiftUI. nonstrict.eu/blog/2025/creatin

Screenshot of code:

struct ExampleView: View {
    @State private var searchText = "Dog"
    @State private var selectedCategory = Category.animals

    var body: some View {
        List {
        }
        .onChange(of: Equatables(searchText, selectedCategory)) {
            // This fires when either searchText OR selectedCategory changes
            performSearch()
        }
    }
}

struct Equatables<each T: Equatable>: Equatable {
    let values: (repeat each T)

    init(_ values: repeat each T) {
        self.values = (repeat each values)
    }

    static func == (lhs: Equatables, rhs: Equatables) -> Bool {
        for isEqual in repeat each lhs.values == each rhs.values {
            guard isEqual else { return false }
        }
        return true
    }
}
Tom Lokhorsttomlokhorst
2025-06-26

@gedeonm I love these updates. Great to read how you’re experiencing the show for the first time.

Tom Lokhorsttomlokhorst
2025-06-19

Using .frame(minWidth: 0, minHeight: 0) also works. And doesn't require indenting everything. Thanks @Chris!

ZStack {
    Color.green
    ZStack {
        Color.yellow
        Text("Hi")
    }
    .aspectRatio(1, contentMode: .fill)
    .border(.red)
}
.frame(minWidth: 0, minHeight: 0)
Tom Lokhorsttomlokhorst
2025-06-19

The workaround to get back the old behavior is to use a GeometryReader.

GeometryReader { proxy in
    ZStack {
        Color.green
        ZStack {
            Color.yellow
            Text("Hi")
        }
        .aspectRatio(1, contentMode: .fill)
        .border(.red)
    }
    .frame(width: proxy.size.width, height: proxy.size.height)
}
Tom Lokhorsttomlokhorst
2025-06-19

Weird bug on macOS 26 (beta 1). Windows seems to be top-left aligned, rather than centered as before. FB18201269

Screenshots showing test app on macOS 15 and macOS 26 side by side. The macOS 15 app has text centered in the window. The macOS 26 app has text off to the right.WindowGroup {
    ZStack {
        Color.green
        ZStack {
            Color.yellow
            Text("Hi")
        }
        .aspectRatio(1, contentMode: .fill)
        .border(.red)
    }
}
Tom Lokhorsttomlokhorst
2025-06-16

@Viditb You can find a bunch on Youtube. Like youtube.com/watch?v=34UXapXQBy8
Slightly more inconvenient, there's also DVD .iso files on The Internet Archive. See gist.github.com/IsaacXen/874c5

Tom Lokhorsttomlokhorst
2025-06-16

@Viditb On wwdcindex.com we have links to the video files on Apple's CDN for all that they still host. The earliest ones are from 2007.

Tom Lokhorsttomlokhorst
2025-06-10

I'm collecting some statistics on the first day view counts of WWDC sessions on YouTube.
"Meet Liquid Glass" is the clear winner, followed by "Say hello to the new look of app icons". Then there's an obvious long tail of all the other sessions.

Bar chart of view counts:

Meet Liquid Glass	56745
Say hello to the new look of app icons	24071
Create icons with Icon Composer	8636
Get to know the new design system	8129
What’s new in Xcode	6676
What’s new in SwiftUI	5034
Elevate the design of your iPad app	3406
What’s new in UIKit	3247
Meet Containerization	2726
Discover Metal 4	2500
Tom Lokhorsttomlokhorst
2025-06-04

wwdcindex.com has transcripts for 3550 WWDC sessions.
Each transcript is split into paragraphs, the paragraphs have anchor icons next to them so you can deeplink to a specific part of a session. (For example: nonstrict.eu/wwdcindex/wwdc201)
This is using the Text fragment format, which is very useful for this use case. developer.mozilla.org/en-US/do

Screenshot of part of a paragraph of textI with an anchor icon in the margin.
Tom Lokhorst boosted:
2025-06-04

App Icon for Bezel: getbezel.app Thanks to @mathijskadijk and Tom for giving me such fun projects to work on 😁

Tom Lokhorsttomlokhorst
2025-06-04

@matthewskiles Thank you for this! I really appreciate the back-and-forth to get to a great final version.

Tom Lokhorsttomlokhorst
2025-06-02

Whisper transcription is a nice first draft, but it can use some manual cleanup afterwards.

Screenshot of source code.

if session.year < 2011 {
    replacements["mac OS 10"]   = "Mac OS X"
    replacements["mac OS X"]    = "Mac OS X"
    replacements["macOS 10"]    = "Mac OS X"
    replacements["macOS"]       = "Mac OS"
    replacements["mac OS"]      = "Mac OS"
}
if session.year >= 2011 && session.year < 2016 {
    replacements["mac OS 10"]   = "Mac OS X"
    replacements["mac OS X"]    = "Mac OS X"
    replacements["macOS 10"]    = "Mac OS X"
    replacements["macOS"]       = "Mac OS"
    replacements["OS 10"]       = "OS X"
    replacements["OS X"]        = "OS X"
}
if session.year >= 2016 {
    replacements["Mac OS"] = "macOS"
    replacements["MacOS"] = "macOS"
}
Tom Lokhorsttomlokhorst
2025-05-28

@danielkasaj Indeed.

Tom Lokhorsttomlokhorst
2025-05-28

@mattiem Your teachings are working!

Tom Lokhorsttomlokhorst
2025-05-28

Every so often I accidentally hit some key combination in Xcode and half my code disappears. Then I have to type "Unfold" in the Help menu to get it back again. 🤦‍♂️

Screenshot of Xcode with code folded. Help menu is open searching for the "Unfold All" command.
Tom Lokhorsttomlokhorst
2025-05-27

@ismh86 Update: I’ve added transcripts for all 3550 WWDC sessions.
wwdcindex.com

Tom Lokhorsttomlokhorst
2025-05-27

We've been working on adding Full Screen support to @bezelapp. These two WWDC sessions from 2011 and 2015 are still relevant and have been super useful.
nonstrict.eu/wwdcindex/wwdc201
nonstrict.eu/wwdcindex/wwdc201

Client Info

Server: https://mastodon.social
Version: 2025.04
Repository: https://github.com/cyevgeniy/lmst