A few months ago I released Ealain, a screensaver for macOS that shows bauhaus-style abstract art generated with Stable Diffusion. When I got the Vision Pro, I thought about which of my apps or screensavers would make the most sense ported over. This process took a while and was rife with indecision. Eventually I realized that Ealain could be really cool, to have a changing frame of art to the side or behind my virtual workspace, assuming I ever use my Vision Pro regularly.
So, long story short, today I released Ealain – Infinite Art for Vision Pro. It’s an expanded version of the screensaver that has been converted to a virtual display. It still simply rotates through generative artwork, but now you can choose from multiple styles, which are identified by fictional artist names, complete with AI generated biographies. You can also create multiple displays, and each can display a different selection of artists. I added the ability to Favorite images, which will keep them in your collection permanently, and there’s a feature allowing you to only show your favorite images.
I’m charging $9.99 for this app instead of posting it for free. I decided this year that giving away my apps on the App Store is kind of silly of me, and put prices on all of my apps. Do you know what happened? I am pretty sure more people download my apps now than before, and people are more inclined to leave positive reviews or reach out to me personally about how much they like the app.
My theory is that free apps appear worthless, as if the app creator doesn’t care about it or think it is worth money, and that makes people inclined to treat the app carelessly. They use it briefly, then they move on. If they pay for it, they’re going to be looking for signs of craft and quality, and if they find what they’re looking for (like I believe they will), that only increases their enjoyment of the app.
On top of that, Ealain is for a headset that costs about $4000 or more, so $9.99 should be pocket change to the type of person who has one and uses it regularly. And, owning a Vision Pro, I have to pay for it somehow. So, please, buy my app. I only need 400+ sales to pay it off. I’m begging you, before Tim Cook breaks my kneecaps!
As far as technical stuff goes, this is my first SwiftUI app. The interface is entirely SwiftUI. I tried to use SwiftData for the database layer, but it didn’t seem appropriate to the project, so I relied on the same CoreData setup I use for Aislingeach. The app is not open source just yet, the code is a bit of a mess and the architecture makes no sense, but it will be up on GitHub when I feel it is ready.
I feel that SwiftUI was pretty fun to build with. It’s kind of perfect for a very small scale app like this one. I was able to get the app functioning pretty quickly, once I wrapped my head around “view is a function of state”. You can do a lot with very little, versus classic Apple style MVC with UIKit. It’s very “why use many word when few word do job”, but it’s still very easy to write very ugly, hard to look at, and hard to navigate code. But I understand that is a symptom of not refactoring enough, to some extent. I’m not a big fan of “magical” things in my programming languages and SwiftUI is progressing rapidly into something that is almost entirely magical, where you will someday write @CRUDApp { @TodoList }
and SwiftUI will automatically build all the screens for you that you need for a basic CRUD app. That magicality (my word, it’s new) can make things feel opaque when debugging in a way I don’t really like. That’s how I feel about SwiftUI. I’ll probably use UIKit for big projects still, and SwiftUI for small ones.
Originally I planned on having all Ealain clients generate art themselves using the AI Horde, but I felt like it would hold back the quality of the art and make for a worse first-run experience, so instead it works similarly to the screensaver where it is loading pre-generated images from remote storage, and I have a node script I can run at home to locally generate images on my 4090. Unlike the screensaver, this app caches the images locally. But there’s still a lot of images, so RIP your bandwidth if you use it a lot.
This is my seventh app on the App Store (counting Numu, which I took off the store) which is pretty crazy to think about. Counting screensavers, this is finished project number 10 since I started building native apps. Am I a real app developer now?