Sharing a little preview of a cool feature coming to Sofa: the ability to addem>
Sharing a little preview of a cool feature coming to Sofa: the ability to addem>
Threads has been a lot of fun so far and it’s made something “click” for me with how I want to use social media going forward.
Spoiler: I just want social media to be fun 🕺
This is my favorite view of the castle in Magic Kingdom taken with my favorite lens: Sony 35mm 1.8. I’m ready for another Disney trip 🏰

I don’t know when this happened, but Sofa has an Editors’ Choice badge in the App Store 🤯. Completely wild to see something like this.

If you’re an iOS or Mac developer, you may be asking yourself if you should spend time building for visionOS and Vision Pro.
While I can’t tell you want to do, I wanted to share how I’m thinking about this for myself and Sofa.
June was a busy month for me. Apple’s WWDC was the first week of June and it broughtem>
Some other updates I shared:
I’ve started working on a few new Sofa features that I've been prepping for a while.
First, the ability to addstrong>



The second part of this feature is something I'm callingstrong>
Anyways, Buckets come in two forms:
em>
em>
I still have a lot to build, but this is a big part of making the app more flexible for people.
Links, custom content, and Buckets are intended to fill the gap when there isn't a reliable data source for me to add to the app for different types of content.

Monica loves to steal my chair when I get up for a snack or bathroom break. I then have to decide if I’m going to stand for a few hours or move her. I usually end up standing for a few hours 😜.
Thanks for reading Work Log! Subscribe for free to receive new posts and support my work.
Hey gang 👋, I’m finishing up some much needed downtime after almost of year straight of grinding out a bunch of big Sofa updates. I also need to rest up because a href="https://developer.apple.com/wwdc23/?utm_source=sofa&utm_medium=email">
Back in December of 2022, I released a huge update that brought shared lists, better shortcuts support, streaming providers for movies and tv shows, and lock screen widgets. a href="https://www.sofahq.com/blog/shared-lists-shortcuts-and-more/?utm_source=sofa&utm_medium=email">
I followed that big release up with a string of smaller, quality-of-life updates. These updates focused on plenty of little features, enhancements, and bug fixes. a href="https://www.sofahq.com/blog/sofa-342---quality-of-life-update/?utm_source=sofa&utm_medium=email">
Lastly, I’ve made some changes to Sofa’s pricing to make things simpler and more inclusive. a href="https://www.sofahq.com/blog/a-simpler-more-inclusive-subscription-plan-for-everyone/?utm_source=sofa&utm_medium=email">
Thanks for reading, subscribing, and your general support! Talk soon 👋
This was a href="https://www.reddit.com/r/EVERGOODS/comments/13bardo/packing_comparison_for_the_cpl24_and_ctb26/">
I just got my CTB26 last week, and since I recently took a weekend trip to Chicago I thought it might be helpful for people to see how I packed things out in my CPL24.
For context, I only brought the CPL24 on the trip. I normally travel with a backpack and wheeled suitcase (carry-on), but wanted to keep things light for this trip.

What I packed for a 3 day trip to Chicago
Things I packed:

The pictures show what I packed and how it all fit, but here’s some strong>


I haven’t actually used the CTB26 yet, but here’s some first impressions:
I’m likely going to be selling the CPL24 since I don’t see myself using both. The CTB26 seems like a hit to me. Gives me the same great experience of the CPL24, but a little more space a functionality for travel (which was my main use for the CPL24).
Notion is creeping into my life more and more, and one helpful little database I made is to track my PTO and the number of days I’ve taken or plan to take. I know the company tracks this, but checking Notion is much faster for me.
Here’s the formula to use to calculate the number of days off. It accounts for weekends and week days. I got it from this post.
I was recently interviewed on the Launched podcast with Charlie Chapman about Sofa’s origin story and how things work behind the scenes. If you’re interested, give it a listen!
In software, consistency and cohesion tend to get lumped together as the same thing. I’ve found this leads to painfully tedious arguments around product and design decisions.
strong>
For example, in an app, a primary button may always be blue. This consistency is good. It communicates to people that anytime they see a blue button, an important action is about to take place.
strong>
For example, let’s use an onboarding flow for a person using a product for the first time. The combination of front-end UI, backend infrastructure, workflows, product strategy, marketing, and customer support working well together creates a cohesive experience. If any one of these parts is inconsistent, it takes away from the cohesion of the experience.
Consistency enables a cohesive experience, but consistency alone is not enough. Aim for cohesion.
I recently released a href="https://www.sofahq.com/blog/sofas-ios-14-update">
99% of the views in Sofa were table views. Seeing the writing on the wall, I wanted to start tackling this right away. My path, though, wasn’t clear. Should I stick with UIKit and replace my table views with collection views or go in the SwiftUI direction? Either way, I had to learn new APIs so I decided to take time to experiment.
Since SwiftUI is the future of Apple development, I initially chose this path. I wanted to time-box my efforts for a few weeks in case things didn’t work out.
I started building out the main parts of the app like Home and Lists. It was slow at first but quickly sped up once I got more comfortable. I hit snags with theming and search but was able to hack around those by diving into UIKit when necessary.

After a few weeks, I was making and seeing good progress. This was so encouraging that I decided to go all-in and rewrite the entire app in SwiftUI. For those of you with sense, you’ll see where this is headed 🙃.
After a few more weeks things started to get dicey. I was a href="https://twitter.com/poohbers/status/1291057804988514306?s=21">
Around late August I decided I needed to abandon SwiftUI for now and jump back into UIKit. Instantly, my performance issues were gone and things were feeling smooth and snappy. Phew!
The downside was I had a steep learning curve ahead of me. Having to learn code>
Again, up to this point, Sofa was driven by code>
Luckily the internet is amazing and I was able to piece together a solution by learning how to create a view model driven by code>
If there’s interest, I’m happy to write in more detail about the solution I went with. All I’ll say for now is that this setup works great. code>
No way! I had to learn it to make widgets anyway and it had a couple of other benefits.
Since Combine is baked into SwiftUI with things like code>

I experimented a lot with the new design and features in Sofa 2.12. Once I had my footing with SwiftUI, creating views was not only fast but super fun. I was able to explore a bunch of ideas, with em>
I have so much gratitude for people who take the time to share their hard-won knowledge. Not only do they fill important gaps in Apple’s documentation, but they explain in ways that newbies like me can understand. Thank you!
These links helped me ship:
The detour was worth it, even if I had to double back more than I originally anticipated. The app is in a much more reliable and modern place than it was six months ago. Bonus, I got to learn more stuff!
My plan going forward is to stick with UIKit for the core parts of the app and sprinkle in SwiftUI where it makes sense.
If you want to see the fruits of my labor, you can a href="https://itunes.apple.com/app/id1276554886">
This is a webinar I did with Amanda Kalk back in the spring for a href="https://www.thinkcompany.com/">
When it comes to implementing a design system, success is an eternally moving target. Evolution and maintenance are critical over time, but how do you recognize the catalysts and symptoms that mean your system might be failing? Join us for a deeper dive into why your design system might not be working the way you expected—plus what you can do about it.
I was interviewed for the Creators Campfire podcast the other day and had a great time. We chatted about Sofa, app development, and more.
I recently added the ability for people to save custom items to Sofa. This post outlines the thinking behind the feature and how it works.
Two of the main reasons people find Sofa so enjoyable to use are the rich display of the various media types and the mixing of those media types.
When I add a movie, I can see the poster image, title, and some helpful detail. Managing these lists in a highly visual way is much more fun than simple plain text.
The other main benefit is having all of your lists in a single place. Instead of using multiple apps for your reading lists and movie lists, you can manage all of that together in Sofa.
Up to this point if you searched for something that wasn’t in Sofa’s database you couldn’t add it to your list. This totally kills the benefit of a single place to manage your lists.
When working on something complex, I find it helpful to think through the guiding principles. This helps to keep me focused and not overthink areas that aren’t important.
This is already an extra step that someone has to take because the item isn’t in the database. Don’t add any unnecessary steps to this workflow.
One of the best features of Sofa is having the images for each item you add. It’s important that these custom items are as visually unique and don’t feel like a total bummer every time you see them.
A few of the data sources Sofa uses are open for contributions. If someone adds a custom item, encourage them to contribute it to the database so others can benefit.
First, it was important to define what “custom items” meant. Here’s how I define it:
Custom items are items based on existing Sofa data types that aren’t currently in one of the integrated data sources.
This means you can’t add a custom item that isn’t already a defined data type in the app, for example, books, movies, and video games. Remember, one of the main benefits of Sofa is the rich display of media. If you can add anything to the app without being integrated to a data source then I’m not sure how it’s better than a notes app.
Adding custom items is a fallback solution. Ideally people won’t have to use this feature very often.
Since this is a fallback feature, it doesn’t need to be visually prominent. It simply needs to be there when you need it. The most natural place for this is at the bottom of the search results view.
The workflow looks something like this:
I’m doing a couple of things here to make the workflow as fast as possible. First, I take the text from the search bar and carry it over into this view as the starting title. This is a nice quality of life feature that shows there was love put into this.
Second, I restrict what details can be configured for custom items. Only a title and the data type. Yes, I know people will ask to add a custom cover image or metadata, but that also adds a lot of complexity. The “add an item” workflow needs to be super fast and focused. Sofa is geared towards organizing lists, not building libraries.
Since a custom item doesn’t have a data source powering it, this means no cover images. I struggled to think through how to solve this problem. Adding a custom item without a rich cover image felt really out of place in the app.
First, I tried adding text labels in place of a cover image. I moved on quickly from this because it sucked. The covers weren’t feeling distinct enough.

My second attempt was better. I made a series of custom-designed cover images. This was making custom items feel like first-class citizens, but it had a scaling problem. I would need to create em>
The third time is the charm. I remembered that apps like Notion and Trello integrate with Unsplash to pull in beautiful images. Turns out the a href="https://unsplash.com/developers">

The results are pretty great. The images from Unsplash are super high quality and feel right at home in the app.
All of this combined adds some much-needed power to Sofa. All without adding additional complexity.
I’m still digesting all the new stuff from WWDC, but a plan for what I’ll focus on this summer is slowly forming.
If you haven’t yet, go a href="https://itunes.apple.com/app/id1276554886">
For the past year or so this site has been running on a href="https://www.gatsbyjs.org/">
The process ended up being too tedious for what I’m looking for so I moved to WordPress.
I’ll break the Gatsby experience down into two parts: building and publishing.
Building with Gatsby was, and is, awesome. Once I got my head wrapped around GraphQL I was able to really get things moving. Also, hot reloading and Sass FTW.
This is where the experience fell down for me. Writing in markdown was great, but having to push to git and rebuild the site every time I wrote a new post kinda sucked.
If I was on my laptop all the time this would be fine. The problem is I do so much of my writing on my phone and iPad these days. While it’s technically possible to publish from iOS with a href="https://apps.apple.com/us/app/working-copy-git-client/id896694807">
I looked at a few other options, notably, but ended up going with WordPress.
Also, I have some experience using a Headless CMS + Gatsby. It’s more work and maintenance than I’m looking for.
I’m by no means shitting on Gatsby. I love and use it for other projects. The a href="https://www.sofahq.com/">
For example, this entire post was written on my iPhone, in Bear, and then published with the WordPress iOS app. Just what I’m looking for.
In iOS 13, people will be able to choose a light or dark “theme” that will apply system wide. Regardless of what you think about dark mode, apps that don’t adopt this will stick out like a sore thumb.
Luckily, Sofa already has a dark mode, but I needed to integrate it into these new appearance settings.
Since I have themes in Sofa, and plan to add many more, it’s not quite as simple as just following the system appearance settings. What if the user’s system theme is set to “light”, but they specifically want “dark” in Sofa? I need to provide the option of following or ignoring the system settings.
I added a setting in the Sofa themes view that either follows or ignores the user’s system appearance. By default, this is on.
If it’s on, Sofa will follow the user’s system appearance settings. There are some nice benefits to this too. The one I like is having your appearance settings follow sunrise and sunset.
The setting can be turned off two ways…
If the user manually turns this setting off Sofa will no longer follow the system appearance settings and will retain whatever current theme is applied.
If the user manually changes their Sofa theme while this setting is on, the selected theme will be applied and the setting will be turned off.
The assumption I’m making here is that the user wants a specific theme to always be applied and no longer wants to follow the system appearance settings.
Apple calls the new themes “appearance” settings, not dark mode. This makes sense since you can choose between light and dark.
The thing I need to make clear is the difference between iOS System and Sofa settings. When I say “system settings” is it clear I’m talking about your phone’s system-wise settings? I em>
The best course of action may be to follow the Settings app language call this “Appearance”.
Ok, now what about the switch label? Since a UISwitch is a true or false control, the label is kind of a mix between a question and statement. Here’s some options I’m thinking about:
I’m leaning towards “Use System Appearance” because it’s not specific to a specific light or dark appearance, and it’s a concise question/statement.
In case this isn’t clear enough, I’m adding some helper text.
If enabled, Sofa’s theme will match your light or dark appearance preferences in the Settings app.
Combined this should be clear to people how this settings works and what to expect when it’s on or off.

Expandable elements are extremely common across desktop and mobile apps. So common in fact that you might be wondering why I’m spending time writing about this. Things that are common are not always well understood.
A well-designed expandable element comes down to the placement and rotation of the caret (the little arrow). There is more than one way to do this, but let’s first go over the confusing way to do it.

If the caret is placed and pointing to the right you’re going to confuse people. This pattern signifies that upon interaction you will navigate one level deeper in the view hierarchy. If this element expands instead, that will be unexpected behavior. Essentially, you’ll be overloading this pattern with too many meanings.
The first thing you want to decide is where to place the caret. The caret can be placed to the left or right or the expanding element.

strong>
strong>
Easy peasy lemon squeezy.