I’ve been working on an experimental project with a friend, a static analyzer. This project has been in my head for years now, but it’s quite ambitious and in my estimate, it’d take at least a few months before you’d have something decent. My friend used AI to build it in a fe … | Continue reading
In our recent SwiftUI workshops, we have told people at the start to not use an LLM during the workshop. We think LLMs are great and help us to get to the results we want much quicker — for some tasks we easily get a ten times speedup. We tell the workshop attendees that they cou … | Continue reading
I just launched the FormatStyle Guide, a new project that explores Swift Foundation’s FormatStyle APIs in the browser via WebAssembly. Similar in spirit to the SwiftUI Field Guide, I always wanted a quick visual overview of the available APIs. Unlike the SwiftUI Field Guide, I … | Continue reading
In 2013, I got rejected for Apple’s “Tech Talks”. At the time, with objc.io doing well, I assumed I would have been accepted. I jumped on my bike, cycled to the nearest cinema, and walked in asking what it would cost to rent the place for a day. They said €3,000. I reali … | Continue reading
In January, Nathan and I built a Mac app over the course of a month. Last year, I set the goal to collaborate more with other people in 2026, and Nathan was the first person I thought of. We’ve been doing SwiftUI workshops together throughout last year, and I really enjoy working … | Continue reading
Over the last weeks, I’ve been experimenting with building agents. An agent in itself is a simple concept. It’s a loop where you give it input, and then the LLM responds. Crucially, you can tell the LLM to use specific tools that you describe, and the LLM’s response can include c … | Continue reading
The other week I met Orta again. When talking about LLM-assisted coding, we also discussed dependencies. He told me about an approach he’s been taking: he just integrates dependencies into his code by literally pasting in the files and then adjusting them as needed. He also recom … | Continue reading
This month, I want to focus on using LLMs more, and AI in general, so I’m working on a bunch of projects. I’ve been using Claude (and more recently Codex) over the last year or so, but now I’m actually using them very intentionally with the goal of understanding how to work with … | Continue reading
This has been a very eventful year for me personally. While I don’t want to talk publicly about all the bad things that happened, there’s been enough for a year. Yet, this is a hopeful post. I’m doing well given the circumstances. I learned a whole bunch of new things about my … | Continue reading
When you write SwiftUI views, one of the big advantages over UIKit is that SwiftUI performs automatic dependency tracking. Whenever your model invalidates or one of your view’s properties change, your view is rerendered. Consider the following view that loads an image. It runs … | Continue reading
When I have an LLM assistant write prototypes in a language that I don’t know, my prompts are high-level and focused on features, not implementation. For simple projects, often a one-shot approach works. For example, I’ll say: take these notes from my therapist and help me build … | Continue reading
I teach SwiftUI for a living. Through our workshops, books, and videos we try to help people build a mental model of how SwiftUI works as well as show some of the details. I really, really enjoy doing that and have built a successful lifestyle business doing just that. Note: this … | Continue reading
I gave a talk about my understanding of the Attribute Graph. I created a presentation page that contains the video, an edited transcript and some references. It was really fun creating the talk: I used my “record typing” tool to automate the typing and animate the graph, preview … | Continue reading
When we cover SwiftUI’s state system in our workshops, we often get asked: How can I set up my view model in a view? There’s a bit more to this question, so let’s try to spell out the requirements: We want our view to create a view model and maintain ownership: when the view goes … | Continue reading
For the last few years SwiftUI’s alignment guides have been broken in combination with if-statements. Here’s a small example: struct ContentView: View { var value = true var body: some View { Color.green .frame(width: 100, height: 100) .ove … | Continue reading
In SwiftUI, there are two kinds of bindings. There are bindings created using keypaths, and then there are bindings created using Binding(get:set:). These are not the same at all. For example, consider the following (contrived) view: struct ContentView: View { @State var valu … | Continue reading
In our SwiftUI workshops, we often see people reaching for the Group view. There’s a lot of code out there that does this, and yet, I noticed myself avoiding Group, even though it can be pretty handy. In investigating, I realized that it’s not even Group that is the problem. It s … | Continue reading
I noticed that phase animators weren’t behaving as expected, and I initially assumed I’d found a bug in SwiftUI. It took me way too long to realize the problem here, that’s why I am writing this up. Spoiler alert: there is no bug . I am preparing a workshop on SwiftUI Animations … | Continue reading
Just to be consistent I’ll add the notes for this week as well. Mostly had family time and managed to put in a few longer but very cold bike rides. We took the train to The Netherlands, the bike rides here are cold as well. I rented a gravel bike which is really nice (even though … | Continue reading
This was a fun and busy year that flew by. At a personal level, a lot has happened (the oldest started school, we went on a bicycle holiday, and I started therapy again.) Work-wise, the biggest thing is that I started a new company in addition to objc.io. This is the new home for … | Continue reading
Last week I finished almost all preparation for the first workshop of next year. There was a weird crash in the Workshop app. This app has evolved a lot over the last few years, and I didn’t quite understand the reason it was crashing (duplicate symbols?). I did remove the last r … | Continue reading
Last week I again tried to not focus too much on work, and instead went to Berlin to meet friends and get my passport renewed. I also played my first theatre role in almost thirty years. The previous role was at the closing play of primary school, this time it was at the youngest … | Continue reading
Last week was more personal stuff and less work. I spent a morning teaching a zine workshop to primary school kids, which was really fun. One of our kids was sick and I had to take care of her for a day, which only left three short days of work time. I spent an evening rehearsing … | Continue reading
Last week Florian and me taught a workshop in Hamburg. While I’m a fluent German speaker it’s definitely still a lot less fluent than my English and always a bit of a (fun) challenge. We got there Sunday night, and the offices (and our hotel) was in a business part of the city. W … | Continue reading
Last week was intense but really fun. We taught a SwiftUI workshop on site which is always quite involved (with travel) but so worth it. There’s just no substitute for real face-to-face interaction. I think most people really appreciated our visualizations and explanations. We pu … | Continue reading
I’m writing this week’s notes from London. I traveled here by train, it was a bit more of a hassle compared to my regular train rides (security/border control) but still a lot nicer than flying. On my way to London I stopped over in The Netherlands to do two days of hiking with m … | Continue reading
Last week I mostly spent preparing for two upcoming workshops. We have a good outline for our SwiftUI Workshop, yet customize each workshop heavily for the client we work with. Once we know what exercises to do, we create a new repository with the starting point for exercise 1, t … | Continue reading
Going to pragma was awesome as always. We went with the whole family and took so many trains! (I even got a status upgrade by Deutsche Bahn and am now a gold member.) Fürstenberg → Berlin Berlin → München München → Kufstein Kufstein → Innsbruck We then stayed in Innsbruck for two … | Continue reading
I’m still not running but really enjoying the biking. If my injury doesn’t improve soon I’ll start looking for some treatment instead. However, biking doesn’t cause any pain so maybe I should just keep enjoying that and not do anything else for a while. After my trip to Paris las … | Continue reading
I spent last week teaching a workshop in Berlin. It was the first time in years doing an in-person workshop, which was really great. Im doing another in-person workshop in Hanover this week, and giving a talk in Hamburg at their CocoaHeads meetup. Both teaching the workshop from … | Continue reading
Last week I had to prepare a bunch of other things (workshops, start on a presentation) and only had limited time for the Field Guide. I also wanted to recover a bit from pushing myself. It’s kind of similar to running training: to achieve things on the short term, you need to pu … | Continue reading
Over the last few weeks I worked with a strong focus and did not take the time to write weeknotes. The SwiftUI Field Guide is now live. I’ll try to blog a bit more about the why and how in the upcoming weeks. It felt a bit like preparing for a marathon: I worked hard at it almost … | Continue reading
We’re in the polishing phase of the new SwiftUI web project, and I spent quite some time on getting the animations right. The framework now supports some basic transitions as well as animating the frame of views. Currently, property animations are not supported (although I think … | Continue reading
Last week was really busy, but in a relatively balanced way. We got fresh snow and spent a bunch of time pulling sledges. I also ran every single day of the week, without problems (92km in total). One more week until my 12-week marathon preparation starts. This week I’m hoping to … | Continue reading
The persistent cough I’ve had for weeks is finally getting better. I started running again (small steps). Originally, I wanted to start my marathon preparation a few weeks ago, but I had to postpone to get healthy again first. This means I can’t do a 16-week prep as usual, so I’l … | Continue reading
Last week the kids were still at home, so my week was mostly filled with care tasks. I had officially started my marathon plan on Dec 18th, and while the first day or two went great, I then got a pretty intense cough which is still not completely gone. I only managed to put in a … | Continue reading
When working with bindings in SwiftUI, it can be useful to modify bindings. For example, in a Slack I’m part of, someone had a binding to a Boolean and wanted to negate it. This was (roughly) the code they had: extension Binding where Value == Bool { func toggled() -> Self { … | Continue reading
In between Christmas and New Years I’ve been slowly making progress on my layout explanations website. Nicholas (the designer) has been putting out different possible designs, and I’ve been trying to implement some of it (both in SwiftUI as well as in my web port). I also spent … | Continue reading
We recorded some Swift Talk episodes about tweakable values. We also continued implementing the new design for our website (and Swift Talk). It’s still not finished, hopefully soon. I also spent a bunch of time on my SwiftUI layout explanation site. It’s not so easy to figure ou … | Continue reading
We held two workshops last week, one in PT and one in ET. This meant staying up (quite) late for five days in a row. It always takes some getting used to. But the advantage is that I had lots of daylight time to do other stuff. I built a large wooden horse for my daughter. I fin … | Continue reading
Here are the combined weeknotes for the last two weeks. I visited my friend in London and met up with a bunch of friends. The NSLondon folks were nice enough to organize a drinks night, was great to see many old and new friends. London feels almost like the opposite of where we … | Continue reading
On Monday I was excited to finally have a regular week of work again without any travel or other big things. Little did I know. On Monday we all got really sick. It knocked the whole family out for multiple days. In the end, I did get a few days of solid work in last week. After … | Continue reading
The first half of last week I was still away, so nothing much happened. The second half of the week we started preparing two more workshops. We prepare each workshop specifically for the company we teach, so it’s always quite a bit of work. We believe it’s useful for the company … | Continue reading
I think a lot of Apple’s documentation could be improved. For example, I think SwiftUI’s layout system could be explained in a much better way. We try to do so in our workshops and books, but I think interactive explanations on a public website would be even better. A few years a … | Continue reading
Still on my time off. We’re away in a holiday park, so I’m keeping the laptop mostly shut. I’ve done a tiny bit of work at the beginning of the week, hopefully I can share some of that soon. Mainly writing this post as to not break the streak. | Continue reading
As a short break from my time off, we ran a workshop last week. I also took the opportunity to finally (after we moved in a few months ago) get my desk set up. I switched the saw horses for my standing desk base, added cable management and brought out all the gear I use when runn … | Continue reading
I’m taking some time off this month to focus on the family and get the final home improvement bits done before winter is here. I am working on some small side-projects and we will run a workshop this week. One of the things I experimented with is a generic programming library. T … | Continue reading
We shipped Thinking in SwiftUI last week! It’s now available in PDF and print. We’re very happy with the result (and open for suggestions, of course). One thing that’s currently missing which we might add (depending on how hard it is) is an ePub version. Without having implement … | Continue reading