I use Day One for journaling. The other day I was checking about another journaling app made by an indie dev. It looks nicer, feels faster, and has some better features, and I’m assuming uses CloudKit to sync data. But it’s missing an API. I use IFTTT to automatically record some things in Day One for me. I really like that about Day One. It’s more than an app and I guess more of a service. It is difficult for indie devs to make that experience. As soon as you move away from CloudKit, you’re brining on a whole bunch more baggage—servers, databases, privacy policies, and who knows what else. But, using CloudKit doesn’t really allow developers to create services.
I think CloudKit is holding back a lot of indie apps. A lot of indie apps use CloudKit. I’ve used CloudKit. It’s not the most simple solution, but it’s free, and you don’t have to manage servers. It’s a pretty good option.
And maybe there’s already ways around this. I honestly haven’t looked into it much, but I think there’s ways to access CloudKit from the web or server? Haven’t heard good things about that though…
I think this could be partially mitigated if 3rd party apps could add automation triggers to Shortcuts (e.g., when I post something new in Mastodon, run a Shortcut that saves it to Day One.) That could be cool. But still probably pretty limited. Like could I have Shortcuts constantly checking for updates on an RSS feed? Maybe they could let apps with automation hooks wake up once every 15 mins or something.1
Not all apps need to be exposed to the web like I’m talking about, but a lot of the projects I’ve started could benefit from it. I’m always drawn into CloudKit though and accept the limitations, because one less dependency I have to manage is great, and an entire backend is a pretty big dependency. I’m keeping my eye on other options like PocketBase, which can be extended with your own Go code, but lacks an iOS SDK at the moment. And maybe I should take another look at what Firebase can do these days, but Google…
Like everything, it’s a balance. I don’t want to spin up a backend for every side project I start, but maybe I need to so I feel less limited?
I suppose I could already do this now. Create a Shortcut to check and RSS feed, store the latest in something like DataJar, and if there’s a newer one, parse and save into another app. Then just create 96 automations to run every 15 mins.↩︎
I did a little refactoring to get ready for the search results view to handle recent selections. I thought about using some fancy Environment values, but opted to just pass some functions around so that I could reuse some views. Might revisit later.
Now I’m at a tricky part. I need to encode my media enums so that I can persist them when selected.
Media is an enum with associated values:
enumMedia{
case movie(Movie)
case tvShow(TVShow)
case person(Person)
}
I was struggling with figuring out how to encode the associated values correctly. Then it hit me, pass the Encoder to the encode function of each model:
This also gives me the opportunity to set the mediaType so it will decode correctly. I was scared this was going to be a really difficult problem in Swift—again I’m new to Codable—but actually turned out to be pretty straightforward and clean!
I’ve been trying a lot of Mastodon apps lately and I’ve tried a few Twitter apps in the past. For the ones I’ve tried, they all have one thing in common—new posts are at the top. Why?
A lot of apps will save your spot in the timeline. When it starts up, you begin scrolling up to see new posts. That feels really backwards to me. I read top to bottom, and I think most people do too. So scrolling up to see new content feels really disjointed. It would be so much more natural to have newer posts below so that you are always reading top to bottom instead of jumping up every few lines. This would also make reading threads and replies feel better.
New posts at top makes more sense for algorithmic timelines and for apps that always start you at the top. But for apps that leave you where you were, I think they need to let you scroll to the bottom for new content. So please steal this idea and make it—I don’t want to have to make a Mastodon client.
Well, got myself in weird pickle yesterday. All I wanted to do was fix lilyandsam.show. It wasn’t showing all the recent episodes. I guess it was failing because the RSS feed I’m parsing had changed and I didn’t know. I couldn’t run it locally because I’m on an Apple silicon chip now which node-sass couldn’t handle. Updated that, got things fixed, but then Netlify couldn’t build it. Ugh. Long story short, I updated things locally, fixed the issues, then reverted the lib updates and pushed to prod 🤫. Website seems to be working now.
Been trying out Helix. I’ve been enjoying LunarVim quite a bit. But Helix feels a bit faster and less finicky. But, still feels a bit rough around the edges. Really hope they add emmet support and a file tree. Seems to be struggling a bit with my Vue project—syntax highlighting not quite right, incorrect comment characters. I can’t seem to figure out how to get it show hidden files in the file picker too. I like that I don’t have to install a bunch of stuff to get it to work though. Gonna keep giving it a go and see what I think. Been spending most of my time in Xcode anyway. I’m a little concerned about getting used to Helix bindings and not being able to use them in other editors like you can vim bindings.
For my movie compare app, I added a clear button. When you select 2 movies, a button will show up to clear them both. Might be useful. Might not be. We’ll see.
I also added an indication in the search results if you have already selected one of the results.
So fancy! But probably need to give it some more contrast.
I think I like this, but I wonder if people might get confused and think that it means their current search already has a selection. I’ll mull it over.
I thought I knew what I was going to be writing about here, then I started looking back through my previous yearly themes and whoops, sorry 2022. Forgot about you.
2020 — Year of Groundwork
2021 — Year of Momentum
2022 — ???
I guess the Year of Momentum went well…but honestly, 2022 was an extension of both Groundwork and Momentum. I had a lot of hopes for some big changes in 2022, but it ended up being mostly smaller changes. Those smaller changes have been good, but they could be better. That’s what I want in 2023.
2023 is going to be the Year of Discipline.
At first, this sounds a bit negative. But for me, it’s about not being driven by whims, being dedicated, and improving my habits. For example:
I ran over 450 miles in 2022 (200 more miles than 2021.) This year, I want to run farther, more often, and faster. Just get a bit better.
I started working on side projects 3 times a week and writing devlogs. I want to do better at not skipping days.
I tend to overeat, especially junk food and at night. It affects my sleep and my mood quite a bit. So I want to have more disciplined eating habits.
I’ll turn off my alarm and skip some morning workouts because I’m too tired.
Things like that. I’m okay at a lot of things, but I want to become better. Better runner, better writer, better developer, better healthy habits haver, etc. and I believe that being more diligent and disciplined is key. And I think making these smaller, incremental changes will lead directly to the larger changes I was hoping for in 2022.
Sorry I pretty much forgot about you 2022, but you kinda forgot about me too. So we’re even.
With the holidays, my routines have been all messed up. So it’s been over a week since I last worked on anything. Today I finally woke up early(ish), did some exercising, and now taking some time this morning to get back into things.
I wanted to improve the UX of picking movies and seeing results. This is how I left it a week ago:
A lot of changing context
It’s fine. But not good. A lot of tapping and things popping up. I wanted to streamline it.
So this is what I came up with:
Wow! It's like magic!
I like this a lot better. 2 big improvements in my opinion:
You are not taken to another location to view the results.
You do not trigger a comparison, it happens immediately when 2 movies are selected. It will even update when one is changed.
It feels a lot faster to me now, which is probably good.
As far as code, I made a custom ViewModifier for the shape and shadow of the movie posters because I was using that in a few places. I can never remember how to do that, so I always go to Hacking with Swift.
I also had to make my models Equatable so that I could use .onChange. I also used .onChange’s ability to capture the previous value to compare it:
.onChange(of: comparison) { [comparison] newComparison inguardlet first = newComparison.first, let second = newComparison.second else {
return
}
if first != comparison.first || second != comparison.second {
Task {
commonCredits = try? await MovieDataService.shared.compare(first, to: second)
}
}
}
Nifty!
I think the next thing I need to work on is improving the search experience. I’m not 100% sure what the TMDb API gives back for search, but it doesn’t seem to limit or sort the results as I’d expect.