• 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?


  • This weekend I went to Darker Waves in Huntington Beach. It was pretty great. We saw: Molchat Doma, The Cardigans, DEVO, Soft Cell, The Psychedelic Furs, The B-52’s (via video screen), and New Order. We also overheard Tears for Fears on the way out, saw a bit of X, heard a touch of OMD, and a few other bands I couldn’t name.

    The amount of people at this thing was pretty insane.

    At one point I had to really shove myself through a huge mass of people to make it back to my wife, and it started to feel kind of weird and scary how, as I progressed further through the crowd, people began to push back and get angrier that I was trying to get past them, even though I was saying “I’m sorry, excuse me,” and trying to get the attention of each person as I passed.

    Half-way there, someone did a very pointed two finger triple-tap on my shoulder after I had passed them, clearly pissed off, and I ignored it and kept going because I knew no good could come from a tap like that.

    I started saying, “I’m sorry, excuse me, trying to get back to my wife!” as a means of further explanation for my apparent transgressions. One row away, an old guy tried to stop me, saying I wasn’t being “nice enough” as I tried to get through the crowd, after I had to push between him and his wife because she tried to body block me after I said “please excuse me” to her twice. Everyone had been drinking all day in the sun so honestly I’m lucky I didn’t get knocked out by some old geezer.

    It was a little traumatizing, like one of those anxiety dreams where you’re trying to wade through a mass of people but suddenly your arms are wet noodles and the crowd swallows you whole and you wake up crying thinking you’ll never see your wife and dogs again. Don’t you try to tell me I am the only person who has those sorts of dreams!

    Aside from that, it was great. From DEVO onward, whoever was playing, I was dancing to it, I didn’t want to stop moving. I felt like a shark, telling myself that if I stop moving: all the sun, THC, and alcohol will get to me and I will crumble to pieces. It worked. I had a great time. And I learned I should probably be listening to Soft Cell (very horny) and The B-52’s (basically everything I already listen to).


  • Cultivate a strong sense of curiosity.

    That’s it.

    When people ask me why I am so lucky, and when I contemplate why I’ve managed to find some level of success in my life despite making almost every single wrong decision you can make as a young person, it feels like the truest and most honest answer is simply: I am a curious person.

    A lot of people get to know me and land at a very simple reduction: “Brad is a smart person!” But that’s not true. I’m not a smart person by objective measure. I probably wouldn’t score highly on an IQ test. I’ve made a lot of very questionable decisions in my life, and not just in regard to common sense and critical thinking, but also moral and ethical decisions. I dropped out of both high school and college, so my only real academic credential is a GED–and the GED exam was so easy that it’s hard to believe it’s designed so that 40% of recent high school graduates will fail.

    When I meet people that I think are smart, it’s usually because they know a lot about various things, and I assume that is probably why people think I am smart. I can sit around and talk about all sorts of things, but the only reason I can do that is because I know those things, because I read about those things, because I was curious about those things. That’s it. It’s not like I came out of the womb with a bunch of mostly useless trivia in my head, I had to read about that stuff.

    The most concrete and familiar bit of advice related to this that most people hear as a software engineer is the idea that a software engineer should be a “life-long learner”. This is important for SDEs specifically because technology is always progressing, and you never know when you might find yourself facing an entirely new paradigm at a new position or with a new project. But, deep down, “life-long learner” is just another way to describe curiosity. Someone who is always learning is just someone who is continuously pursuing things that pique their curiosity. I had to use my own curiosity right now to google “peak your curiosity” ’cause I knew that couldn’t be right.

    People also tend to think I am very charismatic and funny, a real pleasure to talk to. I think some of this is luck, as I’ve always thought of myself as an introvert who doesn’t really play well with others, but somehow I’ve got the right mix of personal trauma that makes me a pretty funny person without the alcoholism necessary for a career in standup comedy. But what really sets me apart from a lot of other people is that I am a good listener, and I demonstrate a genuine interest in what the other person is saying (usually, unless they are very boring or stupid).

    If you look at any guide, written at any point in history, on how to make people like you (aka “make new friends” if you’re not a sociopath), the same thing always appears at the very top: Ask people questions about themselves. Now, this can be a chore you force yourself into doing as a form of social manipulation, and that’s okay too (you socio), but if you manage to foster an internal sense of curiosity, you should want to ask people about themselves.

    So, there you go, your one quick trick to making people think you are smart and making them like you: be curious about things and people. Easy!

    If you don’t know how to do this, here’s some tips and things that I do.

    When something interests you, anything, even in the most vague way, go read about it–you can usually start and end with Wikipedia on most subjects, but never stop yourself from scratching an itch, no matter how minor, dig in if you feel the urge. Wikipedia should link to sources, check out those sources.

    If you hear a song you like, go listen to the album it came from; then go listen to all of the albums by that band or artist. Go read about the band online. Read interviews with the band. Check out side projects by all the members of that band, there might be more music you like in there (although, often not, sadly–I’m looking at you, Paul McCartney). Musicians sometimes make other forms of art too; they write, paint, speak publicly, and all that is worth seeking out as well.1

    If you see a movie you like, it’s always worth it to watch other films by that director. Watch all of them! If you really enjoyed a certain actor’s performance, go watch more films with that actor in it. Keep in mind, the look and feel of a film is (often) mostly the work of the cinematographer, and cinematographers can hop directors, so be sure to scope out the cinematographer in some of your favorite movies and see if they did other work. If you’re really into movies, you could follow editors and screenwriters around…

    When you are meeting someone new, it can mean a lot to them when you pick out some little thing they talked about and say, “Hey, can you tell me more about this?” Another way of putting it is this: there is nothing anyone likes more than talking about themselves, so do your best to get your guest talking, and they’ll think they had an amazing time hanging out with you and always remember you fondly.2

    The nice thing about this is that there are so many people in the world, and they are so different from each other, that almost everyone has knowledge of, or insight into, something you’ve never experienced and maybe never will. People who’ve worked different jobs, who’ve lived in different places, who are entirely different races and from entirely different cultures, may have entirely different perspectives on familiar topics, or have opinions on things you’ve never even had to think about yourself. If you are a curious person, then everyone you meet can be a fount of wisdom, you just have to find that thing they are passionate about and get them talking.

    That’s about it. I didn’t really plan this post out very well, and it’s been sitting in my drafts forever, but I wanted to get it out into the world and I can always update it later or structure it out a bit more. The advice is too simple, not really much else to say here in the end. Just… you know… be interested in things. Don’t spend all your time just consuming content passively, take an active role in finding things (and people!) that interest you and pursue them diligently. I promise you, it pays off in the long run.

    1. But never, ever, ever meet the people who make the art you enjoy. Don’t do it! You can buy merch from them at their concerts, shake their hand if you see them at an art showing, but for the love of all that is good and holy in this world, do not have a conversation with them. That is one area that curiosity has almost always burned me. Don’t meet your heroes. They’re just normal people, and you could be hearing / seeing / enjoying something in their art that they are not at all aware of, and whatever connection you may think you have with that person because of their art may be a total misconception. Fair warning… ↩︎
    2. This can also be an extremely good way at detecting people you should not spend time with. The more they talk about themselves, the better you get an idea of the kind of person they are, so you should be able to more easily detect red flags. Even better: if they spend the entire time talking about themselves, and show absolutely no interest in asking you any questions whatsoever, you know that person has no genuine interest in you and you can act accordingly. ↩︎

  • I received a Meta Quest 3 on release day, so about 30 days ago at the time I’m writing this. So maybe I should title this post, “One Month with the Quest 3,” but I’ve already written “Meta Quest 3 Review” and I’m too tired out from long nights spent in the metaverse to go back and change it.

    If you asked me just 40 days ago if I would ever buy a Meta Quest headset, I would have said something like, “Fuck no, what the fuck is wrong with you? Why would you ask me a question like that? Do you even know who I am?” Because I haven’t liked Facebook, Meta, and Mark Zuckerberg for quite some time. But, the times, they are a-changin’, with Elon Musk single-handedly rebooting Zuckerberg’s reputation. I’ll never use Facebook ever again, but fine, I’ll give this standalone VR thing a shot now.

    This is not my first foray into VR. Back in 2019, I bought a Samsung Odyssey+ WMD headset, which attached to my PC via an all-too-short cable. I quickly fell in love with VR, especially with Beat Saber which felt like a culmination of everything I’ve ever loved about gaming and music into one package. My days became a fever dream of playing Beat Saber, and evangelizing Beat Saber to anyone who would listen: “Hark!” I would say, probably, “Have you heard? The perfect game exists, and in it, you play Fruit Ninja, but choreographed to music!” My eyes bloodshot, my voice shaking with neurotic joy.

    But very quickly I fell out of love, about a month in, after a particularly intense play session of Half-Life: Alyx–with free movement on–made me feel so nauseated I still felt sick to my stomach the day after. The cable, to the PC, turned playing into a hassle, because I would have to move my entire PC between rooms. These factors combined to ensure I didn’t want to put the effort into getting my “VR legs”, the headset went into a cupboard, and I dreamt of playing Beat Saber again in a future where VR was easy and convenient to enjoy.

    Well, that day is here, mostly. The Meta Quest 3 is the easiest way to play Beat Saber just about anywhere you want. Is it the best way to play Beat Saber? Probably not, not until they sort out the controller tracking issues. But for your $500 to $900–depending on how many accessories you are willing to buy to fix various issues with the out of box experience–you’re getting a good portable rig to play Beat Saber on, and it does some other nifty things as well.

    Almost as soon as I got the Quest 3, I started telling people that this was the thing to buy if you could not wait to get a demo of the Apple Vision Pro experience. It may be an early prototype of a budget version of the Vision Pro, but all the various bits and pieces are here, just cobbled together into a bit of a mess of a product. It’s unfair to compare it to the Vision Pro, a product that does not actually exist yet, a product that will cost 6-7 times as much, but it’s very hard not to do so.

    You can do all the Vision Pro stuff: watch movies and television in a virtual environment, or on a virtual screen using passthrough mode. You can play games. You can do calls complete with silly little avatars hanging out in a virtual space. You can set up a virtual screen for your computer, so you can compute in privacy or with more and bigger screens than you really have. What else can the Vision Pro do? That’s basically it? Well, that was a low bar, and the Quest 3 has no problem meeting it. The problem is, of course, that the Quest 3 is going to give you the $500 experience of using these features and not the $3500 experience, if such a thing is even reasonably possible.

    What does that mean, exactly? Well, the movie and television watching stuff is not built in, it’s handled by third party apps, and the free ones aren’t great. The paid ones don’t offer the best experience either. People claim that watching movies on the Vision Pro is like watching them on a big OLED HDR television; on the Quest 3, watching movies is more like watching them on a 1080p SDR display. Sure, it’s big like a theater screen, but it doesn’t look great. If you have a decent television, this won’t replace it.

    The Quest 3 is much more powerful than the Quest 2, which is nice, but it’s still basically a mobile phone strapped to your face, so the graphics in games aren’t fantastic. And at the moment, there aren’t a lot of games that have been updated to utilize the “power” of the Quest 3, so that bump in power is not entirely reflected in the games you’ll play, and even when it is, the benefits are mostly resolution and clarity. The games themselves still look like they are PS3 era, maybe PS4 at best. This isn’t necessarily a problem specific to the Quest 3, it takes some serious muscle to render two images at once, so even PCVR games can look a little rough around the edges anyway.

    The biggest downside to the Quest 3, coming from the Samsung Odyssey+, is the switch from AMOLED displays to LCD. Instead of getting inky, immersive blacks in dark environments, you get… gray. Gray everywhere. Any really dark games, like The Walking Dead: Saints & Sinners, look hazy and washed out as a result, and you don’t feel particularly immersed at all. It’s a bizarre decision that negatively affects the experience of playing games and watching movies pretty significantly. You’d think OLED is table stakes for VR headsets, but I guess not.

    What was that I said about accessories? Oh, yes, by default the Quest 3 comes with a fabric strap that is absolutely awful. At the very least, you want to buy the Elite Strap ($70), which adds a clamping halo that you can seat down by your occipital spur and makes the headset way more comfortable.

    But now that you actually want to wear the thing, the battery life is mostly dead in under 2 hours of playtime, so that’s not great. Sure, you can find some way to rig up a battery pack in your pocket, but it’s easier to get the Elite Strap With Battery ($130), which adds a second battery and effectively doubles your battery life and acts as a counter-balance to the weight on the front of the headset, making it even more comfortable to wear.

    The other accessory that should have been included in the box is the Silicone Facial Interface, which is practically a requirement if you use your Quest headset for exercise. By default you get a soft fabric one, which soaks up sweat like a sponge and can get hot on your face. The silicone facial interface, of course, does not soak up any sweat, and after an intense workout you can very easily wipe the sweat off of it. I’m not sure how sweat doesn’t get inside the headset or on the lenses, but so far all the sweat that gets onto the headset is just on the silicone facial interface.

    Meta Horizon Worlds

    When it comes to platform specific features and exclusives, the big thing is Horizon Worlds, Meta’s version of the “metaverse”, where you can visit different “worlds” (user created levels). Worlds can be as simple as an artistic experience to walk through lazily, as complex as a multiplayer first person shooter, or just a real life facsimile of some bar somewhere. It seems like these are the main three types of world: art, game, or social venue.

    I’ve spent a decent amount of time in Horizon Worlds and there are two things that you learn very quickly: there aren’t a lot of people using Horizon Worlds, and the people who are regulars are very, very committed. I guess it shouldn’t be shocking that there are people for whom Horizon Worlds is their main social and gaming experience every single day. Many people in Horizon Worlds migrated from other virtual worlds that got shut down: some people speak wistfully of Playstation Home, others of AltSpace. No one speaks positively of VRChat, because the people who like VRChat are over there, and the people who don’t like VRChat stick to Horizon Worlds.

    Before I get into anything too negative, I want to say that the community vibe in Horizon Worlds is initially extremely refreshing. People are very welcoming and typically very kind. The vibe reminded me of the early internet in a very good way. People are very quick to trade follow requests with you, and if you’re nice you can very quickly make friends. Of course, you can run into assholes, but you can just walk away from them, because they won’t follow you–there is always someone wiling to stay behind and talk to the asshole. I almost immediately made a new friend on my first night visiting, who joined me on subsequent explorations for well over a week.

    Another great thing about Horizon Worlds and services like it is that it gives a relatively safe space for people with autism to socialize. I heard from multiple people how socializing in VR is sometimes the only way for some children and adults with autism to properly socialize with other people. That’s a really beautiful thing in and of itself.

    I’ve met people who spend several hours every day in Horizon Worlds, and needless to say, these people are filling some sort of gaping hole in their lives with it. I’ve heard many sob stories. One guy talked about how his paperwork to leave the military got botched, so he apparently had no choice to sell his car and house, and talked about how he was going to have to euthanize his dogs because he can’t afford to take care of them. Most of the women I have spoken to in Horizon Worlds bring up having been physically abused by the men in their lives. To put a really fine point on it, I’ve heard two people (a man and a woman, unrelated to each other) talk about some or all of their children being taken by Child Protective Services. I’m not even sure why you would tell people that. I’ve heard three separate people talk about having to console people who come to Horizon Worlds to talk about committing suicide.

    So that’s kind of the big issue with Horizon Worlds. Clearly Mark Zuckerberg and people at Meta thought, and may still think, that Horizon Worlds would be some great destination that normal people from all over the world would want to use and congregate in. And that may have been true during the early days of the pandemic, I have heard from people who were around back then that Horizon Worlds was popping off during the pandemic. But after that initial rush subsided, all that is left is all the “regulars”, and just like in real life, all those regulars have formed little cliques with each other. There’s politics and drama, and of course some people see Horizon Worlds as yet another sexual internet playground somehow, and once you start to encounter those things, it kind of takes the shine off. At that point, Horizon Worlds just ends up being a too-accurate facsimile of the real world, and it no longer feels like a piece of light escapism, but a mirror.


  • I determined long ago that shame is a feeling I don’t handle particularly well. This can be problematic on the internet, because people will, from time to time, declare that some behavior people regularly engage in is actually quite shameful. This takes all sorts of forms, the “behavior” can vary so widely it feels useless to make examples, it can be literally anything, and the reason it is shameful is usually because it implies some sort of moral failing, of infinitely varying degrees.

    The problem is that, sometimes, the behavior being declared shameful is something that doesn’t really seem all that shameful to me. Even worse, sometimes, the behavior is something that I’m guilty of doing myself. And that phrasing, right there, is the core of the problem snowball that starts to roll down the hill: Why am I saying I am guilty of doing something, that, moments ago, I thought was completely innocuous? That makes me feel bad. Like, really bad! I’m good person, I don’t deserve to feel bad… right?

    Sometimes this is good. Sometimes feeling bad about your actions is an opportunity for self-reflection, and to grow. Sometimes I can do that. Wish I could do it all the time, but I almost always feel this itch to speak up. Sometimes, I’ll try to stay silent, but in situations in which the behavior is clearly not worthy of the shame, instead of moving on with my life, I will take the complete silence of any opposition as a sign that there are other people who would speak up, but they can’t because they’re afraid of the same thing I am afraid of: outing themselves as being a person who is guilty of the shameful behavior. Then, because my Quaker heritage (or my white privilege) instilled “speak truth to power” into my bones, and that makes for one hell of a feeling of self-righteousness, I start to speak up to the “powerful” on behalf of the “silent contingent”, both groups now basically existing only inside my own head.

    At this point the shame has spiraled completely out of control. Not only am I experiencing that initial bout of shame from having been guilty of the behavior, but now I’m publicly outing myself as a defender of that behavior, which probably outs me as person who engages in that behavior, and pits me (in my mind) against basically everyone, which destabilizes my feelings of security and belonging in whatever community I am now openly disagreeing with. I end up oscillating rapidly between feeling like I shouldn’t have said anything and that I am damaging my reputation / relationships / life / career, and that it’s so ridiculous that those things could be damaged by my (clearly more correct) opinion that it only reinforces how strongly I have to convey it. I start to get both angry and depressed, at myself and the world, at the same time, until the anger fades and I am just left with the depression.

    The depression lingers for a while, because the external feelings of shame that fueled my indignation are replaced by an internally generated shame, the shame of embarrassing myself, that even if my point was correct and justified, the end result was mostly that I just got myself very upset, destabilized my mood for well over a day, and possibly damaged other people’s opinions of me depending on how committed they were to the disagreement.

    Thankfully, after many years of being this person and doing this sort of thing over and over again, and sometimes when it wasn’t justified and I was not in the right, I’ve found that people are far more forgiving of me than I am of myself, that the feelings of shame that I experience over these situations is entirely undeserved, and that most people forget about them long before I do. What I haven’t found is a way to handle the shame better, but maybe next time I can feel the shame spiral beginning, I can read this post and avoid it.

    Did it work?