Traveling to Chicago for work this week and coming to terms with this chaotic weather. 😅

Chicago forecast shows rain on Sunday with a range of 46 to 69 Fahrenheit, clouds on Monday with 35 to 46, clouds on Tuesday with 32 to 44, rain on Wednesday with 39 to 71, clouds on Thursday with 46 to 60, and clouds in Friday with 41 to 49.

This bit from the most recent Upgrade makes me think that we only have Automator and AppleScript in macOS because the OS team didn’t want Workflow/Shortcuts (which was bought by the Siri team).

Almost certainly we would have neither in macOS if they had been interested in Workflow in 2017.


Reflecting on 100 Days of SwiftUI

Reflecting on my experience with the “100 Days of SwiftUI” course, with tips on how to make the most of it.


Woo hoo! Day 100 is “just” a final exam and I passed (with merit)! Almost hard to believe that I’ve come to the end of my #100DaysOfSwiftUI journey.

A “certificate of merit” presented to “Chasen” for completing 100 Days of SwiftUI. It includes a quote: “Programming is an art. Don’t spend all your time sharpening your pencil when you should be drawing.” Below is Paul Hudson’s signature with “Founder” underneath.  The white background features faint dotted patterns and a blue-toned calendar on the left, with the “Hacking with Swift” logo in the upper left.

Day 99 included our last quiz and challenge: add a photo credit over the image, fill in some loading/saving methods for favorites, and add sorting to the resorts list. #100DaysOfSwiftUI

The iOS Simulator displays an iPad with a “Resorts” app open in split view. The left pane lists ski resorts with country flags, names, and run counts. At the top of the list, a sort picker is open, showing options “Default,” “Alphabetical” (selected), and “Country.” In the list, “Deer Valley” is highlighted with a heart icon, showing “103 runs.” The right detail view displays a skier in a red jacket navigating deep snow, with the caption “Photo Credit: Maarten Duineveld” in the lower corner. Below the image, resort details are presented, including “Size: Small,” “Price: $$$,” “Elevation: 2,000m,” and “Snow: 103cm.” A descriptive paragraph highlights Deer Valley’s location in Utah, upscale amenities, and its role in the 2002 Winter Olympics.

For Day 98, we implemented searching resorts, replaced the facility info with icons, added a button for the user to mark favorite resorts, and added a favorite indicator in the Resorts list. #100DaysOfSwiftUI

The iOS Simulator displays an iPad with a “Resorts” app open in split view. The left pane lists resorts, and “Vail Ski Resort” is selected with a heart icon. The right detail view shows the resort’s information. A modal alert labeled “Family” overlays the entire screen and says, “This resort is popular with families” with an OK button.

For Day 97 we started actually building a new project using NavigationSplitView, NavigationLink, and format: .list(type: .and) (for concatenating strings). #100DaysOfSwiftUI

The iOS Simulator displays an iPad app with a split view layout. The left sidebar lists ski resorts with names, flags, and run counts, e.g. Squaw Valley in the U.S. has 270 runs. The detail view on the right shows the text, “Welcome to SnowSeeker!” with a prompt to “select a resort from the left-hand menu; swipe from the left edge to show it.”The iOS Simulator displays the same iPad app, now showing “Deer Valley” selected in the sidebar. The detail view features an image of a skier in red gear on snowy terrain, with stats below: size “Small,” price “$$$,” elevation “2,000m,” and snow “103cm.” A description highlights Deer Valley’s location in Utah, its upscale amenities, and its history as a 2002 Winter Olympics venue. Facilities include “Family, Beginners, and Accommodation.”


Day 96 and we’re looking at iPad-friendly APIs for the first time.

I’ll be honest—I had not tried running any of our previous apps in the iPad simulator, but now I see they were working fine the whole time. Pretty cool!

This screenshot looks absolutely chaotic. 👹 #100DaysOfSwiftUI

The iOS Simulator displays an iPad mini interface with a split view layout. The left pane shows a folder labeled “Primary.” The right pane features a search bar with the term “S” entered, a “Cancel” button, and two results, “Subh” and “Stefanie.” Below, links labeled “Tap for sheet” and “Tap for alert” are above text that reads “Name: Paul Country: England Pets: Luna and Arya.” A black circle appears under this text. The same text is repeated again, but in blue. Additional text at the bottom reads “Welcome! Your high score: 0.” A stepper for the high score (with plus and minus buttons) appears below. A floating keyboard bar shows the suggestion “S,” with options like “She” and a microphone icon.

Day 95 was a full challenge day—build an app from scratch based on some requirements!

The iOS Simulator displays a Dice Roller app showing two dice with six sides each. Results include rolls of 2 and 4, totaling 6. A blue “Roll Dice” button is centered below the results. A log displays the roll history and date.

Day 94 is a review and challenge day! Graphics code can be a doozy because when you get the wrong result, it’s difficult to know what’s actually wrong in the code (or with your math). 😅 I got some help with this one. 😬 #100DaysOfSwiftUI

The iOS Simulator displays a rainbow-colored list of rows labeled Row 0 to Row 14, arranged vertically in a tapered, 3D perspective. Colors shift from orange at the top (with a light opacity) to red at the bottom (at full opacity). Tab bar icons include Swift symbols labeled Day 94 (selected), Day 93, Cover Flow, Images, and More.

Day 93 was a fun walk through of using GeometryReader, including using visualEffect() and scrollTargetBehavior(). #100DaysOfSwiftUI

The iOS Simulator displays fifteen rows labeled Row 0 through Row 14, each in a different color. Each row is angled in 3D space, keeping the center in place but rotating the left or right sides, creating a cascading effect. The bottom tab bar contains icons labeled Day 93 (selected), Cover Flow, Images, Frames, and More.

For Day 92, we started a new project (our second to last!) and learned about how layout, alignment guides, and absolute positioning work within SwiftUI.

I really loved the explainer, starting from How layout works in SwiftUI. #100DaysOfSwiftUI

The iOS Simulator displays a white screen with multiple text elements, including “Hello, World!” inside a red rectangle, “Live long and prosper” in black, and overlapping versions of the phrase in varying alignments. Tab bar icons for “Day 92,” “Alignment,”, and “Custom alignment” appear at the bottom, with Day 92 selected.

Picking #100DaysOfSwiftUI back up, and in the home stretch at Day 91! It was a challenge day with a review quiz and an open-ended prompt to fix a couple minor bugs and add a feature.

The iOS Simulator displays a flashcard with a quiz question reading, “What is Taylor Swift’s birth year,” on a scratched metallic background. A timer at the top shows 91 seconds remaining, with circular buttons for cancel and confirm at the bottom corners.

For Day 90, we made a bunch of accessibility fixes and added a view for creating new cards! #100DaysOfSwiftUI

The iOS Simulator shows a card creation interface with text fields for Prompt and Answer, an Add Card button below, and a Done button at the top.

2024 iPhone Home Screens

As the year comes to a close, I want to take a quick snapshot of what my home screens look like now so I can compare them in a year from now.

I say home screens because I use focus modes extensively to change my home screens (depending on my current focus):

Focus Mode Triggered
Morning Automatically at 4:00 AM and off either at 9:00 AM (workdays) or 12:00 PM (weekends)
Fitness Automatically when I start/stop a workout
Work Automatically at 9:00 AM on weekdays
Driving Automatically when I start/stop driving
Personal Manually when I want to be in a Focus mode
Do Not Disturb Manually whenever I need to be completely offline
Evening Automatically by 8:30 PM
Sleep Automatically when my Wind Down schedule starts

Let’s go through them roughly by time of day:

Morning

Here’s what my Morning home screen looks like (in Small icon mode so it’s easier to understand with labels; I actually use Large icon mode everywhere):

An iOS home screen (in Small icon mode with labels under the icons) showing a blurred gray background, indicating an overcast day. The first row has a Health widget and Camera. The second row has Start Morning, Start Dishes, Self Care, and InBody. The third row has Take Vitamins, Brush Teeth, Face Routine, and Balance Health. The fourth row has Start Jackson, Start Stretching, Start Exercise, and Start Shower. The fifth row has Start Coffee, Start Food, Drink Water, and Start Work. The dock at the bottom has Messages, Music, Overcast, and Safari. An iOS home screen (in Large icon mode without labels under the icons) showing a blurred gray background, indicating an overcast day. The first row has a Health widget and Camera. The second row has Start Morning, Start Dishes, Self Care, and InBody. The third row has Take Vitamins, Brush Teeth, Face Routine, and Balance Health. The fourth row has Start Jackson, Start Stretching, Start Exercise, and Start Shower. The fifth row has Start Coffee, Start Food, Drink Water, and Start Work. The dock at the bottom has Messages, Music, Overcast, and Safari.

Fitness

Here’s what my Fitness home screen looks like:

An iOS home screen (in Small icon mode with labels under the icons) showing a blurred outdoor background. The first row has a Fitness widget and Camera. The second row has Voice Memos, Drink Water, Start Food, and Start Shower. The dock at the bottom has Messages, Music, Overcast, and Safari. An iOS home screen (in Large icon mode without labels under the icons) showing a blurred outdoor background. The first row has a Fitness widget and Camera. The second row has Voice Memos, Drink Water, Start Food, and Start Shower. The dock at the bottom has Messages, Music, Overcast, and Safari.

Work

Here’s what my Work home screen looks like:

An iOS home screen (in Small icon mode with labels under the icons) showing a blurred red background. The first row has a Mail widget and a Work widget. The second row has Slack, OmniFocus, Start Laundry, and Start Shower. The third row has Camera, Start Coffee, Start Food, and Drink Water. The fourth row has Start Dishes, Start Jackson, and the dock at the bottom with Messages, Music, Overcast, and Safari. An iOS home screen (in Large icon mode without labels under the icons) showing a blurred red background. The first row has a Mail widget and a Work widget. The second row has Slack, OmniFocus, Start Laundry, and Start Shower. The third row has Camera, Start Coffee, Start Food, and Drink Water. The fourth row has Start Dishes, Start Jackson, and the dock at the bottom with Messages, Music, Overcast, and Safari.

Driving

Here’s what my Driving home screen looks like:

An iOS home screen (in Small icon mode with labels under the icons) showing a blurred outdoor background. The first row has a Fitness widget and a Personal widget. The second row has Timery, Ivory, Pokémon GO, and Notes. The third row has Maps, Swarm, Mail, and Sleep++. The fourth row has Start Laundry, Start Stretching, Start Exercise, and Start Shower. The fifth row has Start Dishes, Start Food, Drink Water, and Start Jackson. The dock at the bottom has Messages, Music, Overcast, and Safari. An iOS home screen (in Large icon mode without labels under the icons) showing a blurred outdoor background. The first row has a Fitness widget and a Personal widget. The second row has Timery, Ivory, Pokémon GO, and Notes. The third row has Maps, Swarm, Mail, and Sleep++. The fourth row has Start Laundry, Start Stretching, Start Exercise, and Start Shower. The fifth row has Start Dishes, Start Food, Drink Water, and Start Jackson. The dock at the bottom has Messages, Music, Overcast, and Safari.

Personal

Here’s what my Personal home screen looks like:

An iOS home screen (in Small icon mode with labels under the icons) showing a blurred dark background. The first row has a Timery widget, HealthView widget, and Fitness widget. The second row has Camera, Balance Health, Inverter, and Sleep++. The third row has Photos. The dock at the bottom has Messages, Music, Overcast, and Safari. An iOS home screen (in Large icon mode without labels under the icons) showing a blurred dark background. The first row has a Timery widget, HealthView widget, and Fitness widget. The second row has Camera, Balance Health, Inverter, and Sleep++. The third row has Photos. The dock at the bottom has Messages, Music, Overcast, and Safari.

Do Not Disturb

Here’s what my Do Not Disturb home screen looks like:

An iOS home screen (in Small icon mode with labels under the icons) showing a blurred purple background. The first row has a Fitness widget and a Personal widget. The second row has Timery, Ivory, Pokémon GO, and Notes. The third row has Maps, Swarm, Mail, and Sleep++. The fourth row has Start Laundry, Start Stretching, Start Exercise, and Start Shower. The fifth row has Start Dishes, Start Food, Drink Water, and Start Jackson. The dock at the bottom has Messages, Music, Overcast, and Safari. An iOS home screen (in Large icon mode without labels under the icons) showing a blurred purple background. The first row has a Fitness widget and a Personal widget. The second row has Timery, Ivory, Pokémon GO, and Notes. The third row has Maps, Swarm, Mail, and Sleep++. The fourth row has Start Laundry, Start Stretching, Start Exercise, and Start Shower. The fifth row has Start Dishes, Start Food, Drink Water, and Start Jackson. The dock at the bottom has Messages, Music, Overcast, and Safari.

Evening

Here’s what my Evening home screen looks like:

An iOS home screen (in Small icon mode with labels under the icons) showing a blurred view of Earth from space. The first row has a Streaks widget, Start Medical, Camera, and Start Dishes. The second row has Start Jackson, Start Mastodon, Open RSS, and Open YouTube. The third row has Start Food, Start Stretching, Self Care, and Start Shutdown. The fourth row has Balance Health, Take Vitamins, Brush Teeth, and Drink Water. The fifth row has Play Wordle, Bedtime, and Clock. The dock at the bottom has Messages, Music, Overcast, and Safari. An iOS home screen (in Large icon mode without labels under the icons) showing a blurred view of Earth from space. The first row has a Streaks widget, Start Medical, Camera, and Start Dishes. The second row has Start Jackson, Start Mastodon, Open RSS, and Open YouTube. The third row has Start Food, Start Stretching, Self Care, and Start Shutdown. The fourth row has Balance Health, Take Vitamins, Brush Teeth, and Drink Water. The fifth row has Play Wordle, Bedtime, and Clock. The dock at the bottom has Messages, Music, Overcast, and Safari.

Sleep

Here’s what my Sleep home screen looks like:

An iOS home screen (in Small icon mode with labels under the icons) showing a blurred Mars-like space background. The first row has a Streaks widget, Start Medical, Camera, and Start Dishes. The second row has Start Jackson, Start Mastodon, Open RSS, and Open YouTube. The third row has Start Food, Start Stretching, Self Care, and Start Shutdown. The fourth row has Balance Health, Take Vitamins, Brush Teeth, and Drink Water. The fifth row has Play Wordle, Bedtime, Clock, and the dock at the bottom with Messages, Music, Overcast, and Safari. An iOS home screen (in Large icon mode without labels under the icons) showing a blurred Mars-like space background. The first row has a Streaks widget, Start Medical, Camera, and Start Dishes. The second row has Start Jackson, Start Mastodon, Open RSS, and Open YouTube. The third row has Start Food, Start Stretching, Self Care, and Start Shutdown. The fourth row has Balance Health, Take Vitamins, Brush Teeth, and Drink Water. The fifth row has Play Wordle, Bedtime, Clock, and the dock at the bottom with Messages, Music, Overcast, and Safari.

I’m so bummed that the macOS “widgets on your desktop” feature is so unreliable for me. I go to the trouble of setting up a bunch of widgets on my second display, only for them to disappear after some random number of restarts. Seems like a great feature but I can’t trust it. 😞


For Day 89, we learned how to detect when our app moves to the background or foreground so we could pause and restart our timer at the right moment. #100DaysOfSwiftUI

The iOS Simulator displays a trivia app with a question card reading, “Who played the 13th Doctor in Doctor Who” and a timer showing 89 seconds remaining. On the right is a “check” button and on the left is a “cancel” button. The background is a scratched metal texture.

For Day 88, we built a brand new part of the app with a stack of cards and gestures for swiping them left and right to move to the next card. #100DaysOfSwiftUI

The iOS Simulator displays a flashcard with the question, “Who played the 13th Doctor in Doctor Who,” against a gray, scratched metal background.

For Day 87, we learned a little bit about the Combine framework, Timer, and three accessibility settings: Differentiate Without Color, Reduce Motion, and Reduce Transparency. #100DaysOfSwiftUI

The iOS Simulator displays a white screen with the text Timer and ScenePhaseView near the top. A green “Success” button appears in the center, followed by blue text “ReduceMotionView!” and a gray button labeled “ReduceTransparencyView!” The bottom tab bar includes a Day 87 tab (selected) and a Day 86 tab.The iOS Simulator shows the same screen as the previous image with a couple differences. The “Success” button is now black with white text and a checkmark icon. The “ReduceTransparencyView!” button is also black with white text. Other elements remain the same.


For Day 86, we started a brand new project and started playing with all the gesture APIs and hit testing. #100DaysOfSwiftUI

The iOS Simulator displays a white screen with text prompts including double tap me, long press me, magnify me, rotate me, and tap on me at the top. Below, a small red circle is positioned above a larger red circle that partially overlaps a blue square. The text Hello is centered beneath the shapes, and World is spaced further down near the bottom of the screen. At the very bottom is a tab bar with Day 86 selected.