• Reeder 5 looks great. I will give it a shot for a few weeks as my default RSS reader. I also migrated all my read-later articles to it.


  • After a decade of storing bookmarks in read-later services, Pinboard, DEVONThink I noticed something: Storing bookmarks in the browser works as well. 🤦‍♂️


  • Not sure how but I missed the introduction of GroupBox in SwiftUI. Everything is a card now! GroupBox documentation


  • I missed that there was a new Unprofessional episode this year, still have great memories listening to it years ago. Unprofessional Podcast


  • Fell into a new rabbit hole about 3d printed model planes and cars just because of one channel: Tom Stanton Youtube


  • The App to post this landed on my homescreen. I should get started with the App icon.


  • It’s done. I migrated away from DEVONThink. Again.


  • I recently bought a Fuji X100V after shooting years on iPhones only. I almost couldn’t believe how good and fun this camera is. 4DC40DF5-CC45-4454-A7B6-E97D9EF55A16.jpg 174B94E5-B4CA-4D8C-990C-43988BEF08CD.jpg 0F3D22FA-4B55-46F0-AD30-D467978B67D8.jpg


  • Thank you all so much for the kind words and congratulations! It means so much to us! 🎉😭🥳


  • I was lucky, she said “Yes”! 2D5D36D2-5F7A-4D3A-98CC-58D38A7ECF2A.jpg


  • Unrelated feelings about the whole Hey situation:

    I have 0 interest in another proprietary E-Mail host/App.

    Own your domain and use public protocols.

    App Store guidelines need to be just and mutual beneficial. The playing field should be as even as possible.

    Side-loading of notarized Apps could drive new innovation on many areas.

    Apple, why are you fighting this battle now?


  • CI and TestFlight deployments using GitHub Actions

    A typical post of the category: “Better write a blog post about it, otherwise I will forget how to make it work”

    Early on in the development of Icro I integrated fastlane to run continuous integration tests on bitrise and build and uploaded release version from a local Mac. As GitHub Actions is now available and offers similar features as bitrise for open source projects, I decided to move the CI tests over and also start using it for Apple TestFlight deployments.

    CI

    Thanks to the already defined lanes, the migration to run unit tests on every push and pull request was trivially easy.

    The Fastfile just uses the run_tests action configured with the correct workspace and scheme:

    default_platform(:ios)
    
    platform :ios do
      desc "Run unit tests"
      lane :tests do
        run_tests(workspace: "Icro.xcworkspace",
                  derived_data_path: "derivedData",
                  devices: ["iPhone Xs"],
                  scheme: "Icro")
      end
      ...
    end
    

    The GitHub action workflow file defines when the action should be run, installs the bundle dependencies (including fastlane) and runs the lane

    name: CI
    
    on: [push, pull_request]
    
    jobs:
      build:
    
        runs-on: macos-latest
    
        steps:
        - uses: actions/checkout@v1
        - name: submodules-init
          uses: snickerbockers/submodules-init@v4
        - name: Bundle Install
          run: bundle install
        - name: Build and test
          run: bundle exec fastlane tests
    

    TestFlight deployment

    Running unit tests usually does not require complicated code-signing steps or access to shared accounts, and passwords. All this is required to deploy builds to TestFlight. As a first step, the certificates and provisioning profiles need to be made accessible for GitHub actions. Luckily fastlane also helps with this: match. Following the guide to integrate fastlane match, I created a repository accessible for GitHub Actions to store encrypted profiles and certificates. The passphrase for the certificates is saved inside GitHub Secrets. Fastlane match will then install the certificates in the keychain of the Action runner to successfully sign the build. The added lane to the Fastfile looks like this:

    lane :beta_ci do
        bump_version
        create_keychain(
          name: "Fastlane_CI",
          password: "CI_Password",
          default_keychain: true,
          unlock: true,
          timeout: 3600,
          add_to_search_list: true,
        )
        match(type: "development", readonly: true, keychain_name: 'Fastlane_CI', keychain_password: 'CI_Password')
        match(type: "appstore", readonly: true, keychain_name: 'Fastlane_CI', keychain_password: 'CI_Password')
        build_app(workspace: "Icro.xcworkspace", scheme: "Icro")
        upload_to_testflight(skip_waiting_for_build_processing: true, username: "icro@hartl.co")
      end
    

    bump_version is just a simple internal lane to set the build number to the number of commits on master. We need to call create_keychain to use a specialised keychain on the Action runner. Otherwise, the build would be blocked forever, during the signing, a keychain-popup to access the installed certificates would block the execution. Two match actions will install the certificates for development and appstore to ensure a successful signing. Using a restricted App Store Connect user, the build gets uploaded to TestFlight. The Fastfile does not have access the defined GitHub secrets. Therefore the passphrase for match and the password for the App Store Connect account are defined as environment variables on the deployment workflow file.

    name: Deploy
    
    on:
      release:
        types: [published]
    
    jobs:
      build:
    
        runs-on: macos-latest
    
        steps:
        - uses: actions/checkout@v1
        - name: submodules-init
          uses: snickerbockers/submodules-init@v4
        - name: Bundle Install
          run: bundle install
        - name: Set Appstore Connect User
          run: bundle exec fastlane fastlane-credentials add --username icro@hartl.co --password $
        - name: Fastlane Beta CI
          run: bundle exec fastlane beta_ci
          env:
            MATCH_PASSWORD: $
            FASTLANE_PASSWORD: $
    

    The deployment is triggered on every newly created release inside GitHub (just a tag). The workflow will install the bundles again, set the fastlane credentials by accessing the APPSTORE_PASSWORD inside GitHub secrets. As a final step, the lane gets called with the match passphrase and App Store Connect password defined.

    With this setup in place, every push and pull request to Icro will run unit tests, every new release will automatically create and upload a new build to App Store Connect.


  • MacBook Pro 16 Inch First Impressions

    I was lucky enough to receive a new 2019 MacBook Pro 16” from work as a replacement for my 2016 MacBook Pro 15” (featuring a broken E, G, CMD and, space key).

    First impressions:

    Keyboard

    Love it. Initially, I didn’t hate the butterfly keys, but having unreliable keys changed this instantly. The new keyboard feels firmer and more precise than the Magic Keyboard and I hope it gets updated in the future as well. Big thumbs up for the inverted-T arrow keys. I don’t care about the return of the ESC key as caps-lock is my ESC for years now.

    Screen

    I was expecting a bigger perceived difference, I only notice it in direct comparison.

    Size and weight

    Same deal as with the screen. I was afraid of the size and weight gain but it’s a non-issue. I still would like to see a 14” model in the future.

    I’m just so happy to be able to type again.


  • Hiroshima 6065A407-ABEA-46EF-AD8B-54CA955723E9.jpg C2735843-028A-4B73-9E15-76934B9D483F.jpg 7E18C462-01BC-47EF-8E8E-D07A76772494.jpg CEDA7F08-F750-417D-B5A4-3D1362BE139A.jpg


  • Tea ceremony (Kyoto), Naoshima DADAD925-78F5-4F4F-84AF-E922A7BD68C6.jpg B5892000-6C7A-4C24-B4DE-8FA4DBF72866.jpg 609EB5D8-0CD8-49F4-83A8-6461EAB07B50.jpg 459BE911-785D-4BE6-930E-D0474FB1E2A0.jpg