• 🧑‍💻 Today I’ve implemented:

    • As a user I want to see the list of pastes I have in my Pastebin
    • As a user I want to edit a paste in my Pastebin
    • As a user I want to share a paste as a status in the Statuslog

    Still have to finish:

    • As a user I want to add a new paste to my Pastebin
  • Week 2023-15


    Another short week in Germany 🇩🇪. On Monday, we had a holiday, Easter Monday, and, as the day was beautiful, we took tinyScientist to a park. It was his first time on a swing (for babies), and he loved it!

    I like visiting different places, but I hate traveling. A simple 3-hour flight means a whole day of preparations, trains, airport, security checks, etc… but we don’t have teleportation yet, so…

    Working? Vacationing? Hacking? Partying?

    This week we had our Workation and almost all of Nord Security traveled to a resort in Turkey 🇹🇷; more than 1000 people flew from different parts of the World to our 2023 gathering. That’s not a typo, 10^3+ people traveled to our event…


    For me, it all started with a train ride to the airport. Although the airport is far from the city center, public transit works and the express train runs from the Hauptbahnhof to the airport terminal in about 20–25 minutes.


    We arrived at the resort around 2am after a long flight and bus ride from the Antalya airport to the hotel. The main restaurant and bar are open until 6am, so after checking in, we headed there for dinner.

    I missed the city tour in the morning, I was exhausted and barely remember turning off the alarm. I woke up around 10am for a late breakfast, followed by a visit to the Sea. And then back for lunch.

    There’s an hour time difference between Antalya and Germany, so after lunch I FaceTimed home to watch tinyScientist having his lunch.

    In the afternoon, I worked on my omg.lol for macOS with the most amazing view, and spent the rest of the day chatting with folks from work. Implemented the WebpageNetworkService for the Webpage feature, responsible for all the network calls.

    After dinner, I went to my room to FaceTime scientist and tinyScientist again.


    On Thursday, I went to bed around 9 or 10 pm, planning to wake up earlier on Friday to see the sunrise. I got up around 5:30 am, packed my things and walked to the private beach. Since almost everyone was partying on the night before, I was the only one on the beach in the morning.

    Once I was done taking pictures, I sat in a chair, listening to the Mediterranean Sea (and some birds). Priceless. I can’t remember when was the last time I did something like this. Good thing my AirPods Pro had no juice.

    Another good reason to wake up early: breakfast before everyone else. I didn’t make healthier choices and ate scrambled eggs, egg with vegetables and boiled potatoes.

    I spent the rest of the morning socializing with teammates until lunch, which I skipped. The good thing is that all restaurants in the hotel are open 24/7, so having a late lunch is not a problem.

    I found time to do some more work on my omg.lol client. Implemented the WebpagePersistenceService and the WebpageRepository. The first responsible for storing the webpage (and history of changes) on Core Data, and the latter the abstraction on top of the network and persistence services. The glue.

    Found a Starbucks inside the resort, next to one of the pools. Since this is an all-inclusive resort, Starbucks is also included. Perfect for cold drinks next to the beach or a pool.

    At 4pm, we had our Q1 OKRs meeting with the entire company, followed by dinner and the OKR party. The OKR meeting was the only work part of the workation.

    But before the party, I finished the Webpage Feature implementation and can now update otavio.lol using it.


    I intended to take more pictures of the sun rising, but I overslept and woke up at 6:30. At that time, the sun was already out there, so I went straight to breakfast. Omelet, bread, and cheese.

    And then headed out to my favorite spot in the whole resort.

    Implemented the SwiftUI previews for the Webpage UI and then joined some folks from my team by one of the pools, drinking an Iced Coffee Americano from the hotel’s Starbucks.

    I felt guilt for my food choices and decided to eat better during lunch.

    After lunch, I must have coffee, so I did. After grabbing another Starbucks, I took the opportunity to walk the resort a bit and found this cat – one of many cats that live in the hotel – staring at me.

    I spent the rest of the day with my team, chatting and having dinner and some baklavas.

    When the party started, I went to my room to talk to scientist and tinyScientist, pack my bag, and sleep.


    Homecoming day. I woke up early again, and had a nice walk on the beach, followed by a long, unhealthy breakfast. Our bus was scheduled to leave for the airport at lunchtime, so I might have eaten more than needed to make up for the lunch I was about to miss.

    Spent the morning with the folks from the team and left the resort to visit some shops and buy souvenirs and Turkish tea to take back home. My bag was already packed from the day before, but I had to take everything out and repack it to make room for the tea set I bought.

    I traveled with a single backpack (a big one, the limit for taking on the cabin), but after putting the tea set in it, it weighed about 10 kg. The limit is 8 kg, and I was afraid someone would weight it at the airport, but no one did, so it was fine.

    I was so exhausted I didn’t feel the trip home. It was almost like teleportation finally existed. The workation was spectacular, something I’ve never done before, but it’s good to be back home. I missed scientist and tinyScientist, and seeing them again was a relief. The day ended with us giving tinyScientist a bath.

  • 👨‍💻 I’ve updated Micro.publish with the following features:

    • As a user I want to schedule my post to be published in a specific date
    • As a user I want Obsidian to automatically fetch my Categories when the app launches

    The plugin can be installed from within Obsidian in Community Plugins.

  • Week 2023-12

    Earlier this week I deleted another internet account: OpenAI.

    We - Nord Security - hosted the CocoaHead Berlin on Wednesday. It was great, full house, and we had too speakers from Nord Security. Bob from NordLocker talked about SwiftUI and Ieva from NordVPN about fastlane, screenshot automation and the iOS strategy to inject mock data for App Store screenshots.

    Speaking of work, on Thursday I had a long training on Leadership (and Management) at the company. Earlier this year I got a new title/role, going from Senior Software Engineer to Engineering Team Lead, which means I’m half of the time Software Engineer and the other half Engineering Manager. It’s a brand new world to me, so I went back home exhausted. There’s a lot to process.

    On Friday I had another day off, still taking 2022 vacation days before the end of March (German regulations, vacation days from a given year have to be spent before end of March of the following year). I took tinyScientist to a coffee shop around 9am, where we had coffee with a friend and talked about iOS and macOS development, leadership and management, and layoffs. tinyScientist got bored with all the talk and decided to take a nap in his kinderwagen.

    In the previous weeks I finished two features of my omg.lol native client: Statuslog and PURLs, and during this week I started working on the Now Page. I still don’t know how I’m gonna distribute the app, if via AppStore, or directly for download as NetNewWire and Micro.blog do. Same goes for pricing, I still haven’t decided if it’ll be a paid app or not.

    Finally, the most important thing which happened during the week: tinyScientist had his first solid meal. We were not expecting him to eat (we thought he would only play with the food), but he loved pumpkin. As result, he had pumpkin four days in a row for lunch.

  • Call me crazy, but I like Core Data.

  • Deleted my Pinboard account and archived all my Pinboard related projects on GitHub.

  • 👨‍💻 There’s no API for displaying an Emoji Picker, so I had to build my own.

  • 🪴 👨‍💻 Another entry to my digital garden, Fixtures, used in Unit Tests. As always, all the examples are in Swift.

  • 🪴 👨‍💻 The next topic I’m working for my Digital Garden is Fixtures, as part of the series on Unit Testing.

  • 🪴 👨‍💻 I’ve added a new entry to my digital garden called Fakes. It’s part of a series of notes on unit testing with doubles and fixtures that I’m putting together. The examples are in Swift, but the concepts are the same for all languages.

  • 🪴 The next topic I’m working for my Digital Garden is Fakes, why they’re important and when to use them in Unit Tests.

  • 👨‍💻 So far it’s scaling pretty well. Repositories know about Services, and Features know about Repositories. The main application knows about Feature (which are micro apps). Instances needed by all the micro apps are resolved and injected by the main application.

  • Like this plugin? Say thanks with a coffee :-)

    I added this to my Obsidian plugin 👨‍💻

  • 👨‍💻 I wish I had more time to work on my native omg.lol client for macOS and iOS. I still have some vacation days I have to take before the end of March and might use them for that.

  • SwiftUI Navigation

    With a couple of lines of code I migrated my app from NavigationView to NavigationSplitView, which offers much better navigation in SwiftUI.

    Pinboarding sidebar visible

    And I got for free the ability to show/hide the sidebar.

    Pinboarding sidebar hidden

    Apple has a pretty good session about NavigationSplitView and NavigationStack on their developer portal. The jokes and puns are awful, but the content is really good.

  • Micro.publish

    Obsidian is the source of truth for most of my writings1 and I though it would be interesting to post to Micro.blog directly from it. In the past I explored several applications such as Ulysses, iA Writer, and many others which allow publishing to Micro.blog, but they don’t work for me, they don’t reflect the way I think and take notes. Obsidian does.

    So I searched on Micro.blog and found this post from @philbowell:

    I wonder if there is a way to post to Micro.blog from Obsidian. 🤔

    And nope, there isn’t. So I took the challenge.

    Obsidian isn’t a native application and I can’t remember when it was the last time I wrote something which isn’t compiled to run on an specific architecture 👨‍💻, so I had to learn TypeScript and npm, and spent a good amount of time making Visual Studio Code look pretty (stealing ideas from my friend Atila).

    Luckily for me, the TypeScript syntax isn’t that different from Swift, so in a matter of hours I had something working. Since the Obsidian Plugin architecture is OOP, I decided to go with OOP using MVVM, without third-party dependencies to avoid taking unnecessary complexity into Obsidian.

    The result of all this is Micro.publish, my Obsidian plugin to publish to Micro.blog. The plugin isn’t available to install from Obsidian’s Community Plugins yet since they review all the plugins there, but it’s possible to install it directly from GitHub by following some manual steps.

    Micro.publish has the features I need. It allows

    • setting default tags
    • setting the default post visibility
    • setting a default blog (for those with more than one M.b blog)

    And before publishing, it’s possible to override these default settings for the post being published.

    More features are planned, and will be coming soon.

    1. DayOne, don’t worry I won’t dump you. ↩︎

  • protocol CompressionService {
        func compress(
            url: URL
        ) throws -> URL

    Simple interface. More than 300 lines of code to test all the scenarios.

  • Sometimes when I am writing in SwiftUI I think “that would be so much easier in AppKit”, and when I’m working with AppKit, “that would be so much easier in SwiftUI” 👨‍💻 🤦‍♂️

  • The company has the tradition of giving us Fridays off during summer, and this year isn’t different. I’m gonna use my time to finish all the pending posts I have to publish at swiftdev.coffee 👨‍💻

  • The list of topics I have to write for my other blog - swiftdev.coffee - keeps growing. The amount of time I have to write them, on the other hand… 👨‍💻

  • I have a post ready to publish in swiftdev.coffee, but I don’t think it’s a smart move to publish it during WWDC week 👨‍💻

  • Nice to see SwiftLint being mentioned at WWDC 👨‍💻

  • Looking forward to finding some time to finish my first post for my new blog swiftdev.coffee 👨‍💻 ☕️

  • My new blog, swiftdev.coffee is about to go live. My goal for the blog is to capture some of my learnings and ideas I apply when building software, focusing on Swift, SwiftUI, and everything Apple related. So grab a good cup of coffee and follow me there.

  • 👨‍💻 I’m creating another blog (hosted by Micro.blog) for Swift related content. My idea is to publish long posts there, leaving my main blog for comments about life, the universe, and everything.

Older Posts →