The Year 2023 in Review
The year is slowly coming to a close, and so, just like last year, I’m pausing to put together a blog post to reflect on it. Join me as I dive into the highlights and lessons from 2023 from both a personal and business perspective. If you’re here only for particular topics, you can directly navigate to sections about my nomad trip, freelancing, new iOS app, relocation from Berlin to Dresden, more travels later in the year, insights on my health and habits, or my switch from Twitter to Mastodon.
Winter Nomad Trip
Right at the beginning of the year, my partner and I set out on yet another three-month nomad adventure. First up was a month in the capital of the Canary Islands, a destination that’s becoming more and more familiar to us.
We joined the Czech and international nomad communities and worked from our favorite coworking space. The funny thing was that we kept bumping into people we knew from last year’s travels. I didn’t bring my running shoes, so I started running barefoot on the beach in the mornings, which felt great. Further, my brother and his friends came to visit for one week, and we had a good time hiking and enjoying tapas and wine together.
After a brief stop in Berlin to swap our summer clothes for winter ones, we returned to Bansko in Bulgaria. This time for the winter season and the whole two months! The Canaries had been colder and rainier than usual, but Bansko was a whole different kind of cold.
I got the flu, which kept coming back, but once I got better, I was excited to jump into skiing. It had been six years since I last skied! Every morning, we’d check out the weather conditions to decide whether we’d go skiing or work from one of the coworking spaces. We often met other nomads on the slopes, so we’d ride or go for a hot drink together. And for one week, my partner’s parents came to visit and spend one week skiing with us.
As we were staying near the ski lift, we could be among the first people on the slopes. The best part was taking the first lift up on a clear day and having the groomed slopes to ourselves, even if it lasted just for a little while!
At the end of the season, right before spring came and we were supposed to hang up our Martenitsa bracelets on a blossoming tree1, we took a sample snowboarding lesson with an instructor. We looked like pros until we actually got on the boards – we were so clumsy! It was a funny way to end our winter adventures. 😀
Last year, I faced the tough decision to pause the active development of Diagrams2. I took on my first significant freelance project and joined the team behind a well-known Mac-native Git client. It was an honor to be able to contribute to a tool that I’ve been using daily for several years.
The project involved integrating SwiftUI into an established AppKit-based codebase and developing several views using this shiny framework. Despite its limitations (especially on macOS when supporting older OS versions), it proved to be a game-changer in simplifying the process of implementing UIs. It’s also great that you can still resort to AppKit when SwiftUI doesn’t cover your needs and build SwiftUI-compatible wrappers.
I really enjoyed the collaboration with a skilled, distributed team. Being able to focus solely on the development part was also very refreshing—such a stark contrast to my time on Diagrams, where I juggled multiple roles! This project further taught me the value of a pragmatic approach, a lesson I’ve since applied to other areas, particularly to the development of my new app.
New iOS App
Another major decision I made last year was to start building a new app, this time for iOS. Although I had been elaborating on the concept and working on UI prototypes for quite some time, it was only after wrapping up the freelance project that I fully got into it. It has been incredibly exciting, and it reminded me of the early days of Diagrams. The difference is that now I have a lot more experience, which makes things smoother.
I’m not yet ready to reveal all the details about the app, but I can say that it’s about shared lists. The main challenge of this year was to come up with a reliable way to sync data across devices based on CloudKit, which is the most obvious choice for the backend when talking Apple platforms. While CloudKit takes care of the transportation and storage layers, it’s still pretty hard to design a sync system that works well in offline settings and handles conflicts in the most appropriate way.
I briefly looked into Core Data, Apple’s framework for managing object graphs and persistence. Especially the
NSPersistentCloudKitContainer API looked promising. However, I quickly realized it wasn’t going to work for my needs. The black box nature of this framework and its overwhelming complexity stemming from all the legacy it contains were major drawbacks. The final show-stopper, though, was the inability to use custom merge policies3. I shifted my focus to learning about all the sharp edges of the CloudKit APIs and decided to build my own lightweight, local-first persistence and sync engine. While I was able to draw inspiration from open-source projects, it still looked like an immense task. Luckily, just around that time, Apple introduced the
CKSyncEngine API, and that made all the difference. I couldn’t wish for a better timing. Thanks, Apple!
There was one particular challenge I really struggled with, namely how to handle the merging of conflicted versions of a shared ordered list while trying to preserve the intentions behind changes made by different parties. I dove deep into the topic of sync technologies and found myself going down the rabbit hole of CRDTs (conflict-free replicated data types). Yet, I still couldn’t find a fitting solution for this scenario, one which would ensure that parties couldn’t get out of sync while also preventing metadata from growing indefinitely.
I then stumbled upon MRDTs (mergeable replicated data types), a concept similar to the branching workflow in Git, where the lowest common ancestor is maintained and used for resolving conflicts using a three-way merge function. After seeing the introductory talk, I was instantly blown away by how elegantly this seemingly simple approach solved the scenario described above. This was my technical discovery of the year! I was also happy to hear that the solution I ended up with got validated by Drew McCormack from Agenda, who knows a thing or two about sync on Apple platforms.
With the sync being taken care of, there was another technical question to cope with, namely, how to architect the app. Using SwiftUI was a pretty clear choice. As for the general architectural pattern, I initially considered MVVM before settling on the Redux-like The Composable Architecture by Point-Free. This library resonated with my way of thinking about software architecture, and it’s of such a high quality! Their accompanying video series proved to be by far the best source of input when it comes to modern Swift development. I mean, it’s pretty incredible how much Brandon and Stephen were able to achieve in 2023 alone. If you’re not following this project, I can’t recommend it enough!
My new iOS app is currently undergoing a private beta test, and there’s still a lot to do. My plan is to launch it on the App Store sometime in 2024. Wish me luck! 🤞
Relocation to Dresden
After a good five years in Berlin, we moved back to Dresden, where we had lived before. Finding a fitting apartment took us a while, and the whole process of moving and setting up our new place filled up much of the second half of the year. But it was worth the effort!
For the first time in my life, we’re experiencing a large apartment with room to breathe, and I now have a dedicated office, which is such a positive change. I’m generally not into material stuff, but I’ve always dreamt about having a large wooden dining table, and so we turned it into reality.
We’re still adjusting to life back in Dresden, which contrasts quite a bit with Berlin. It’s great catching up with old friends and being closer to our families. The only thing I’m missing here is the forests and moor fields we were surrounded by in Berlin4. There’s still the Großer Garten, where one can go jogging, but it’s just not the same. You can’t have it all, I guess.
As we got settled in our new home, I delved into the topic of home automation. Beyond installing the usual accessories for lighting, heating, and weather monitoring, I also decided to build a DIY doorbell forwarder from scratch. This project required me to refresh some basic knowledge of electronics and get my hands dirty with soldering. Ultimately, it took several iterations to get it right. If you’re interested, I’ll be sharing more about it in a detailed blog post later in the year. All in all, setting up smart devices has been a fun part of the whole relocation process, and I’ve got even more ideas for where to take it further.
As I was busy with the move to Dresden and working on my new app, there wasn’t room for any more nomad trips this year. However, I still managed to fit in a few shorter events in Saxony and the Czech Republic. Alongside these, there were a couple of trips that really stood out.
Firstly, after the pandemic break, I got back into attending developer conferences. I visited the Macoun conference in Frankfurt, which always feels like a class reunion. But the real highlight for me was the Do iOS conference in Amsterdam. I almost forgot how wonderful it is to meet people from the international community in person and how much I’ve missed that. I enjoyed it so much that I’m already making plans for similar events next year.
Additionally, I had a fantastic trip to Huelva in Spain, where my brother is spending his Erasmus semester. We managed to bring my mom and grandma along, which was quite an achievement, as they’re not used to traveling. Our week there was full of fun moments. Like watching my mom trying to handle the seafood, we’ve been getting from the local market and cooking every day. Or when we took my grandma to a student party hosted by my brother and his friends.
Health & Habits
At the beginning of the year, I read the book Genius Foods by Max Lugavere and This Book Could Save Your Life by Graham Lawton. We’ve been preparing meals from fresh ingredients every day for some time now5, but these books pushed me to tweak my diet, especially when it comes to breakfasts, usage of oils, and consuming some basic foods like eggs, nuts, olive oil, veggies, oily fish, or high-quality chocolate more often.
It also led me to try intermittent fasting. It was quite an interesting experience, particularly noticing the increased energy levels in the mornings. However, I chose to stop because I was worried about losing weight, something I couldn’t risk since I’m already at the lower end of the BMI scale and actively participate in sports. Despite this, I’ve maintained the habit of not eating immediately after waking up and avoiding late meals.
Last year, I found out that I’m sensitive to caffeine. After completely cutting it out of my diet at first, I began experimenting to find a smaller dose that wouldn’t make me feel uneasy but would still give me a bit of an energy boost. I’ve settled on having a small cup of low caf in the mornings, sometimes switching it up with decaf. And just so you know, I’m a big fan of my AeroPress!
Another gadget I stayed true to is the Oura ring, a key tool in tracking my sleep and activity levels. It even has the ability to predict illnesses, and it showed me how I shifted from being a night owl to an early bird throughout the year. Yep, I completely changed my daily routine! Now, I get up early, typically between 5:30 and 7:00 am, and head to bed early as well, around 8:00 to 10:00 pm. And as for sleep, I was able to improve it by installing black curtains in the bedroom. I’m also looking into how light influences sleep, especially reducing exposure to blue light before sleeping using Vitae bulbs, but this is still a work in progress.
We’ve always had the Netatmo weather station at home, but with the new take on home automation, we’ve equipped all the rooms with a module and set up notifications for high levels of CO₂. It’s been quite a revelation how quickly the rooms fill up and how often it’s necessary to bring in fresh air.
I’ve also continued with my daily exercise routine, sticking to activities like push-ups, skiing, badminton, and jogging. Speaking of jogging, this year, I ran a total of 575 kilometers, got the kilometer in under 5 minutes, and set PRs in both 5k and 10k. One of my favorite aspects was going for runs during my travels, including my nomad trip and conferences.
After missing a few months, I’ve reintroduced the habit of journaling into my daily routine. This time, I’ve given myself the freedom to pick whatever format and length fit the day best—even if it’s only a few noteworthy sentences. Reflecting on my days has been beneficial, but I haven’t yet gone back to look at my past entries. This is something I have to figure out.
While I managed to get through a few books in the first half of the year, the habit of reading has been on the back burner since. Time is limited, and I had to make the decision to cut back on it. I’ve found that I can fit in some reading when traveling, but at home, I tend to prefer creating over consuming.
Twitter has been declining for several years, but this year, things got moving even quicker with Elon’s takeover. I’ve been hanging in limbo for a while, not knowing how to react. I then finally decided to set up my Mastodon account, and it has quickly become my go-to social network. I’m enjoying the narrowly focused community and the ability to use it with 3rd-party clients6. It very much reminds me of the early days of Twitter, ehm X, as they call it now. Sadly, there’s still a lot of valuable content on X, which is why I’m keeping my account over there, even if I check it only sporadically.
Uff… And that’s a wrap!
I picked up the habit of writing these yearly reviews to share a peek behind the scenes of my life and work with my peers, but the biggest benefit it provides to me is that I take the time to reflect on the past in a structured way. It ended up longer than I thought. So sorry, not sorry. 🙈
In Bulgaria, there’s a tradition where friends gift each other a Martenitsa bracelet on March 1. The recipient is meant to wear this bracelet until they spot a blossoming tree, signaling the end of winter. Upon seeing such a tree, the custom is to then hang the bracelet on its branches, symbolizing a welcome to the spring season. ↩︎
This affects only new features or significant updates. I’m still very much committed to maintaining the app and updating it for upcoming macOS versions. Here you can find more details on what led to this decision. ↩︎
You might be asking if SwiftData was worth looking into. But since it’s just a wrapper around Core Data, it wasn’t really an option either. ↩︎
We’re happy subscribers of HelloFresh. To be completely honest, my partner used to work for the company, but regardless of that fact, I can’t imagine going back! ↩︎