BespokeApp

Last night my daughter was sick, so I spent a couple of hours sitting in her bed to help her fall asleep. With a bit of time on my hands, I put together this little open source project.

I really don’t know if anyone has a need for this other than me. But I’ve built this app a few times for myself in the past, so last night I finally took the initiative to make it generic and reusable – both for my future self and anyone else who might find it useful.

It’s called BespokeApp. It’s a simple iOS app that gives you a tabbed web browser with the pre-defined websites of your choosing.

Why is this helpful? Well, I have a number of websites I visit frequently that are all related.

For example, in my day-to-day business running my little software company, I often bounce between my help desk, my customer database, my website stats, and a few other 3rd party web apps like Linode and NodePing.

Separately, I have a number of web apps running locally on my iMac that I use to manage our home media sever, Docker, and some Raspberry Pi stuff.

I think of all these websites as belonging to distinct groups that are helpful when used together while I’m focused on a specific task. A common workflow I’ll run multiple times per day is…

I’ll get a push notification on my phone about a new support ticket from a customer. So, I’ll open up my bespoke, small biz app, flip to my help desk, and read their ticket. If it looks like they’re having a problem with their license or need me to send them a duplicate receipt, I can one-tap over to my backend system, lookup their order, and reply.

When I’m working on a task that requires information from various sources or multiple websites, BespokeApp just makes it fast and easy to coordinate. Sure, on my Mac (or even Mobile Safari) I could do all of this with bookmarks, but specifically on iOS, this is a pain in the butt to manage with every browser I’ve tried. None of them make switching tabs easy. Or even make accessing a group of bookmarks less than eleventy-thousand taps.

BespokeApp gives me a single app to open with a tabbed interface that lets me quickly switch between related websites.

As I said at the beginning of this post, I’ve written this same app a few different times for myself as I’ve needed different groups. But now it’s generic and reusable.

Two bespoke app icons

Everything is configured with a single property list (.plist) file. It lets you define each tab’s title, image, and the URL it loads.

You can even add multiple (related?) URLs on a single tab. The first one will be loaded by default, and you can then long-press to switch between websites within that tab itself. It’s all very meta.

Bespoke app long press action

Best of all, if you find BespokeApp helpful, you don’t need to clone a separate copy for each group (app). Instead, just duplicate the iOS target in Xcode with a new bundle ID, give it a new name, and use a different .plist. That’ll let you keep all of your bespoke apps in a single project / repo.

So that’s it. BespokeApp is a pragmatic, 152 line long, one-trick pony. I really think you’re gonna love it. (Sorry.)

A Pirate Looks (Nearly) at Forty

I first drafted this post six months ago in response to something that happened to my wife and I six months before that. But for various “reasons” I decided not to publish it.

But then, six weeks ago, Nick Heer wrote this wonderful piece connecting today’s new world of all-you-can-eat streaming music services with the piracy websites of the 2000s – specifically, the amazing communities, breadth of choice, and user experience they offered. And this post started rolling around in my head again.

A few weeks later Nick added a little color to the news that AT&T is giving HBO a free pass on data transfer because, well, AT&T owns HBO. He ended his thoughts with

I fully expect a resurgence of piracy as studios and ISPs attempt to isolate media.

And now I’m banging away on this keyboard today to say, yes, absolutely it will.

Up until last June, it had been a long, long time since we pirated any content. But that’s exactly what happened to my family last year – and is the impetus for this post.

I musically came of age my freshman year of college when the rise of Napster coincided with my first access to non-dial up internet. I’d fall down a new rabbit hole every night as friends on AIM and in the dorm would recommend an unfamiliar artist. I’d search their name and moments later be listening to their back catalog.

But by the time I got my first post-college job and a little disposable income in my pocket, the iTunes Music Store had been around for two years and I was more than happy to support my favorite artists.

And as far as music goes, I’ve been almost entirely above board and legit for the last fifteen years. But like Nick, I was also a member of Oink and discovered so much new music there.

The difference, for me at least, was that after “trying” some mp3s for “free”, if I wanted them permanently in my collection, I’d almost always pay for them via iTunes – assuming the songs were available. I can’t say why I did that other than I wanted my library to be “official”, and outside of buying CDs, the paid-for digital versions were canonical.

But movies and TV shows? What an utter shit-show the industry was back then. After our local Cupertino movie theater raised the price of a ticket north of $20, my wife and I almost entirely stopped going. That meant we watched everything at home. Sadly, though, the software, hardware, and bandwidth just wasn’t capable of supporting home media like we have now. But, a Mac mini running a combination of VLC and early builds of Plex hooked up to our HDTV meant we could solve that problem ourselves.

And for four years it worked wonderfully. But with the rise of Netflix and more capable streaming boxes, the UX of watching video legally finally got close enough to what we pirates had cobbled together ourselves years earlier to where we (and many of our friends) gave up our trusty HTPCs and went legit.

From 2012 until 2019 it all mostly worked fine. My wife and I were happy, paying customers. Sure, there was the whole Amazon Prime on iOS / tvOS debacle. And no way to find out if you didn’t remember which of the dozen streaming services carried Masha and the Bear when your three year old was melting down in the living room. And, of course, Apple kept fucking around with the the TV.app, adding more friction, up-sells, and making the whole experience pushier. But as long as your internet connection didn’t go out and you were confident you were under the residential data cap given to you by the internet company who also happens to own the streaming video platform you’re trying to watch, everything was great.

But one night last June we managed to get the kids to bed early and decided to rent a movie from iTunes. About forty-five minutes in, our youngest throws up, the oldest starts screaming because of the smell, and all hell breaks loose. Movie night over.

Amazingly, somehow, two nights later we again found ourselves with a quiet house again, ready to finish the movie we rented. But if you’ve made it this far into my story, you know exactly what happened next. We clicked play, and were informed our 48 hour rental period had expired.

For me, for us, that’s when the spell broke. For seven years we played by the rules. So I walked from the couch to my office iMac, visited an old favorite website of ill repute, and ten minutes later streamed the move in 4K to our TV.

That one evening re-opened the piracy floodgates for us, and we haven’t bought or rented another TV show or movie since. (Music, yes.)

Can I justify what we (and so many of my friends) are back to doing? Of course not. But am I OK with it? Yep. Here’s why.

The fragmentation of the streaming market into a different service for every IP holder means we’re headed back to the days of bundled cable packages. Instead of paying Comcast an exorbitant price for 200 channels to watch the five shows we care about, we’re now paying five (or more) streaming providers a smaller amount, individually, to watch the one show on each service we care about, which they use to finance production of a thousand other show we don’t want to watch. And added together we’re approaching if not exceeding what we were previously paying the single cable company.

But costs aside, the whole industry is a UX nightmare. Every service has their own awful, bespoke app. For my wife and I, we can mostly deal with that. But our parents? They simply cannot navigate so many contradictory options and ways of going about doing the same thing just because a different media conglomerate owns their three favorite shows. And good luck trying to explain the difference between HBO Now, HBO Go, and HBO Max.

Collectively, we’ve reached subscription fatigue – because of both cost and the hoops involved. Families like mine will pay for one or two services and then share passwords with or create guest accounts for other friends and family who then share their own subscriptions with us.

Some companies like HBO get it.

“It’s not that we’re unmindful of it, it just has no impact on the business,” HBO CEO Richard Plepler said. It is, in many ways, a “terrific marketing vehicle for the next generation of viewers,” he said, noting that it could potentially lead to more subscribers in the future.

Well, they used to, it now seems.

Anyway. That’s fine. It’s their content. But I view this as a market failure.

I want to pay for my content – I really do. I want to support the writers, actors, and workers making the media I enjoy. I don’t want to have to setup and maintain some wired-together, fragile pirating system. But when these media companies put onerous restrictions in place and refuse to agree upon terms that make sense to consumers – like the music industry finally did – for people with the know-how, we’re going to go back to stealing content.

And I use the word “stealing” deliberately because it absolutely is stealing. If you skim through any of the many piracy forums or subreddits, you’ll find tons of folks using twisted logic to justify that pirating content isn’t actually wrong or (worse) is somehow their right. But I have no illusions about it. When I illegally download a movie to watch one time because the studio insists I should outright purchase it for $20 instead of renting for $5, well, what I’m doing is stealing. It absolutely is and it’s wrong. But it’s also a crime that I would prefer not to commit if they would just come to the table and negotiate in good faith and try and understand what consumers want and are willing to pay for.

I’d like to make two final points.

The first is that there’s an argument to make against me which says I don’t have the right to their content just because I’m not willing to pay their price. I understand that.

But it’s not just about the cost.

Even in cases where I am willing (and happy!) to pay what they ask – and actually buy the content vs renting it – with the transition to digital / streaming, they’ve taken away my rights by denying me the ability to actually own the content I’m paying for.

As an adult, when I watch a movie, I typically just want to rent it one time unless it’s something special or a favorite. But my kids will watch the same few movies over and over and over again. So it makes perfect sense to buy their movies instead of renting them each time.

But if I buy them a movie on our Apple TV, it’s not mine. Every time they watch it the movie streams from Apple’s servers. And that means we’re dependent on a working network connection, which isn’t always guaranteed and certainly isn’t a thing on road trips. (Please don’t bring up syncing purchased videos from iTunes to iOS. Apple abandoned that workflow years ago.)

Even if I were to go old school and buy a movie through iTunes and download it to my computer, that file is encrypted. At any point Apple could revoke my ability to watch the film. Or I could lose access to my Apple ID. Or the studio could simply decide to remove the video from Apple’s platform. In any of those cases, through no fault of my own, I lose access to something I’ve paid for.

And there’s no alternative. I could buy a physical DVD or Blu-ray, but the media companies lobbied Congress two decades ago to make it illegal to backup those discs either for safe-keeping or to just make it easier to watch.

My point is: If these companies were willing to meet me in the middle, to give back the rights to the content I purchase instead of just licensing it to me, then I’d be willing to respect their rights, too.

Steve agreed with this back in 2007

Why would the big four music companies agree to let Apple and others distribute their music without using DRM systems to protect it? The simplest answer is because DRMs haven’t worked, and may never work, to halt music piracy. Though the big four music companies require that all their music sold online be protected with DRMs, these same music companies continue to sell billions of CDs a year which contain completely unprotected music. That’s right! No DRM system was ever developed for the CD, so all the music distributed on CDs can be easily uploaded to the Internet, then (illegally) downloaded and played on any computer or player.

Until then, I’ll keep paying for my music. And everything else? 🤷‍♀️

Very Simple

I’ll keep this post short because there’s really nothing more of substance I can add to this argument that many developers and pundits way smarter than myself haven’t already said.

But I suppose it’s flaring up again in the community because of the hey.com controversy, the recent developer survey Apple sent out (my less polite response from last year), and WWDC looming next week.

From my point of view this is all very simple:

The App Store opened eleven years, eleven months, and seven days ago. It is not a game. It is literally the livelihood of millions of people.

The 30% shakedown has never been justified other than “we can”.

The capricious and inconsistent review process has never been explained other than “no comment”.

With all the awfulness and urgency in the world right now; and with all the good Apple truly is doing, it feels like a waste of precious attention and resources to complain about the App Store. But, hey, that’s business.

Antitrust.

Now.

GrannySmith

Update: Take a look at Iris

Inspired by a post I wrote last year, I’ve built something new that I’m ready to share and get feedback from the community.

After upgrading to Catalina I noted

Back in April I wrote a quick post about how I was backing up the shared iCloud Photo albums that my friends and family all use to send pictures and videos of our kids back and forth. A reader emailed me today to ask if I knew where that folder had been moved to after upgrading to 10.15. So, I looked, and, sure enough, that sharedstreams folder was gone.

And with it, my ability to keep backups of thousands of photos and videos of my children that our friends and family (and their grandparents) had taken and shared with us.

Why does that matter? Scott said it best…

When I look on my Mac, I find these pictures of my kids that, to me, are absolutely priceless. In fact, I have thousands of these photos. If I were to lose a single one of these photos, it would be awful. But if I were to lose all of these photos because my hard drive died, I’d be devastated.

I never, ever want to lose these photos.

And even before the upgrade to Catalina, sure, I could backup the items themselves. But there was no way to backup the six and a half years of thousands of comments and likes that our family had posted to those albums. My family uses Apple’s shared photo albums more than Facebook or Instagram. If all that historical data was lost? We’d be devastated.

And if I can go off on an even more personal tanget for just a moment…

I’m typing this after getting my kids (finally) to sleep by myself this evening because my wife is spending the night at her grandmother’s house – my kids’ great-grandmother. Thelma, a kind and generous woman, is going to leave us in the next day or two. And my wife volunteered to take the night shift tonight so she could be there with her.

When my son was born six and a half years ago – her first great-grandchild – Thelma taught herself how to use an iPad in her 80s. She read books, the news, and was quite possibly the most active commenter and “liker” of all the photos and videos of the kids we’d share using iCloud. Whenever I posted a new picture of the kids being silly, I knew, could almost time it to the minute, when I’d get a notification back that Thelma, home alone in her big house with coffee in hand, had tapped the like button or commented with a ?? emoji.

And so now I think about not just all the photos and videos – but the 65,234 comments across 16,752 items we’ve shared. (How do I know those exact numbers? I’ll tell you in a minute.) Each one may be insignificant by itself. But combined? They represent 2,596 days of shared family history.

And when I think about losing the post she made about our newborn son in the hospital? Or the one she commented on last week? Only because there’s no way to get access to that trove of data? It breaks my heart.

Fast forward to a few weeks ago, a reader emailed me to say

Hello,

I really like reading your blog (are we still calling them that?). In particular, your posts on backups always give me better ideas on how I want to organize and save my family’s data.

Your blog, more than any other source I can find on the web, talks about backing up iOS photos and Apple’s iCloud Shared Albums. In our case, we use the Shared Albums as the exclusive place for posting photos of our 3-year-old (turning 4 on Saturday) daughter for our family and close friends. It’s a great way to share photos with family that’s completely outside of the typical social media engines.

So, while we have a backup (well, multiple backups) of the originals, my wife pointed out that we don’t have a backup of that feed and, most importantly, our and our family’s comments. We’ve chronicled the last four years of our life via the photos and comments and had our family comment with lots of stories and encouragement that have been a great way to stay connected.

I hadn’t thought about it until my wife mentioned it, but I have no backup of those photo/comment pairings. It would take one mistake by Apple (I admit not likely) or a misclick on our part to accidentally delete that album and irretrievably lose all of that content.

Are you using your Shared Albums in that manner? If so, do you have any thoughts on backing that up or exporting everything? I’ll admit I don’t really have an idea of what that backup would look like.

I’ve even thought about taking screenshots of the photos with the comments turned on (though doing that several thousand times doesn’t sound fun). I could try to automate that process, but so far I’ve not found any way to get Automator to interact with the Shared Albums and their comments, though I admit I’m a novice at it.

I hope this finds you and your family well and healthy.

Best,

Chris

So I thought about the problem again, and remembered a throw-away idea I mentioned near the end of my original blog post.

At the top level is a Core Data database. I thought I might get clever and explore that to see if I could extract out the metadata of the shared items and use it to help me write a “smart” backup script (that perhaps imports other people’s photos directly into Photos.app) instead of just taking the brute-force approach and backing up the entire album as a dumb blob, but I haven’t had enough time yet to investigate.

Enough was enough. I built it.

The app is called GrannySmith (for now) and it reaches into your Photos.app library and provides a fast, clean, native interface for browsing, sorting, filtering, and exporting all of your shared photos and videos, comments and likes. You can view a combined stream of all your shared albums, or just a single album, or even filter and see posts made by specific people.

GrannySmith screenshot

Your images can be exported directly to disk in a date-based folder structure for easy backup.

GrannySmith screenshot

And if Photos.app doesn’t have the full-resolution versions cached locally, GrannySmith will download the originals from iCloud – even your videos. You can also generate a JSON file with all of their comments and likes – neatly tied together for you to do what you want.

One more thing.

I realize that as incredibly helpful as I find archiving my photos and videos and having all of that meta data available to me in JSON format, I’m not most people. And most people don’t speak JSON.

Two months ago I released Roland – a static website generator written in Swift. Well, Roland is now embedded in GrannySmith. And that allows the app to build an actual static HTML blog out of your shared photo history.

GrannySmith website screenshot

Just like your typical WordPress website, you can browse your chronological timeline of posts – sorted by date and category. And all the original comments that friends and family posted to your shared albums are reproduced as blog comments.

GrannySmith website with comments screenshot

You can keep the exported website as an offline copy. Or you can upload it and host it yourself. There are no dependencies – no PHP, nothing. Just plain, vanilla HTML. It even comes with RSS and JSON feeds, so your geeky friends can subscribe and get updates outside of Apple’s ecosystem.

And the entire website is backed by a completely customizable template system written in PHP. So you’re free to make your exported website look and feel however you want.

It’s still very early days, but GrannySmith is coming along nicely. Here’s a four minute preview video that walks through everything – including a full website export. It’s best if you watch it in fullscreen.

Current Status and How to Download

GrannySmith works but is missing some key features I plan on adding and is also completely untested on anything earlier than 10.15.4. I’d love to know how it works for you on earlier macOS versions.

Known Bugs and Limitations

  • Most egregiously, while you can export a website of your content, you can’t currently export that JSON backup I mentioned. (Key feature, I know.) Mainly because I haven’t settled on a final data structure for it.
  • The “Dates” filter button doesn’t work yet.
  • Switching between albums is way slower than I want it to be.
  • The website templates are currently buried in ~/Application Support/. They can be customized, but this current release will overwrite them on launch to make my debugging process easier. You’ll need to live with the default theme for now.
  • I happen to like using GrannySmith as a lightweight UI to view new items that friends share with me. And since it’s pulling directly from your Photos.app database, it updates in real time, too. That said, to keep from destorying your bandwidth, the app will not automatically pull originals from iCloud when just browsing. You’ll need to choose “Download Originals” if you want those cached locally to view. Otherwise, GrannySmith will fallback to displaying the lower-res versions that Photos.app already has.
  • Building a website will build all of your albums. Ideally you need to be able to build from only the selected ones.
  • Building a website will not automatically download originals. Instead, it will use your low-res cached versions. If you want orignials included in the website export, you can select and download all first, then build the website.
  • Videos do not currently play in the app. But you can export and view them.
  • I also want to add support for scripting the app via the command line or some other type of built-in automated task so you can have GrannySmith automatically do a backup of your latest items every night, etc.

I also want to point out that GrannySmith does not store or transmit your photos, videos, comments, etc. off your Mac. Everything is done 100% locally. I see none of your data and don’t want to see any of your data. Keep all those cute kid pictures to yourself.

Download GrannySmith

You can download the latest preview release of GrannySmith from here. The app will check on launch with my web server for updates and to submit crash reports.

As with all the dumb things I post to this blog, any and all feedback is very much welcome – especially on this project.

Do You Hear That?

Shortly into quarantine at the beginning of March, I realized I had a problem. My iMac has too many audio devices, and managing them was becoming a pain in the ass. And it was all because working full-time at home again, in this new age of frequent work video meetings, Slack and Discord calls, and dealing with two young, screaming kids with no school to attend, created a perfect storm of audio requirements.

Prior to being stuck at home, I would take all of my standup and other phone calls in my car on the way to work and then handoff to my AirPods to wrap up. And because my coworkers are nice people and we all typically leave each other alone to get work done, I was happy to sit in my quiet office all day and do my thing.

I don’t typically listen to music at work, so my AirPods only got intermittent use throughout the day which worked great.

But I soon found that working at home posed two new problems:

  1. Way more phone calls and video meetings. I was on so many that my AirPods battery life was precariously low at times.
  2. My kids are insane noise monsters. And getting any kind of deep, focused work was nearly impossible without some sort of music playing in my ears. The AirPods ended up getting way more use than normal, and battery life really became a gating factor.

So, I bought a decent pair of noise cancelling, over-the-ear Bluetooth headphones that can also connect to my iMac with a wired audio cable. They’re awesome. The battery life is 40+ hours on a single charge, and they block out my kids so well that my wife gets mad at me because I can’t hear their actual screaming anymore.

But here’s the problem. My iMac now has:

  • Built-in speakers
  • Audio cable line-out
  • AirPods audio out
  • Noise cancelling headphones audio out

And also

  • Built-in microphone
  • AirPods audio in
  • Noise cancelling headphones audio in

But it’s actually slightly more complicated than that. I mentioned above that my new headphones can be wired-in in case their battery dies. That’s great! But, when wired, the microphone doesn’t work. It’s only available while wireless.

Also, if you’ve used combined Bluetooth input/output devices like AirPods before, you’ll know that when the microphone is active, there isn’t enough bandwidth to do high quality audio out at the same time. So when my AirPods are connected listening to music, and I take a call, the audio out degrades. That’s fine. But then when the call is over, my music starts playing again and sounds like crap until I manually switch my iMac’s audio input to another device.

Add to that my new work from home requirements where I frequently bounce between music, Slack calls, Discord video chats, RingCentral meetings, actual phone calls, etc. Basically, it just became incredibly annoying to keep digging into the Sound panel of System Preferences or option-clicking the volume icon in the menubar to make fiddly adjustments.

And, oh my god, don’t even get me started on the nightmare that is sharing AirPods between an iPhone and Mac that are within range of each other. (As a stupid joke, I very nearly bought www.haveifactoryresetmyairpodstoday.com and filled it with a giant YES just to put into this blog post.)

Anyway, all I wanted was a super-simple, fast audio input/output switcher app. I swear there used to be something out there that did this, but my googling failed me.

I already own SoundSource from the amazing (incredible?) software wizards over at Rogue Amoeba. (Seriously. Go buy it.) And while it will totally perform the audio adjustments I want and then some, it’s a mouse-required type of app. As readers of this blog will know, I’m a keyboard junkie. So if I’m going to be forced to use a mouse, I might as well just go ahead and use the native macOS volume menubar icon.

So I did what I always end up doing, and wrote the app I wanted for myself. It’s called Ears. And you can have it, too.

Ears for macOS app icon

The idea is simple. Press a hotkey and Ears opens. And still without touching a mouse, pick a new audio output or input (or both!) device, and be done. That’s it.

Here’s Ears in action.

In that video you can see me summon Ears with a hotkey, and then move up and down and between the two lists of input and output devices to select what I want, and then press return to dismiss. It’s that simple.

But it can be even faster than that. You don’t have to use the arrow keys to navigate up and down and between the lists. Your output devices are numbered 1 through 9. And your input devices are A through Z. Just type one of those keys and Ears will select each device.

So, if your global Ears hotkey is ^4 (that’s mine), then in this screenshot…

Ears audio device picker window

opening Ears and picking my headphones as output and internal iMac microphone as input is simply:

^4 3 a ↵

But, we can actually make it even faster than that. There’s a setting in Ears Preferences called “Change devices immediately”.

Ears Preferences window

If that’s enabled, then typing a device number/letter will instantly switch to it and dismiss the picker window. So, if I just want to switch to my headphones, my keystrokes become:

^4 3

Boom. Done. ?

Ok, but can we make it even easier still? You betcha.

This isn’t something I had initially planned to add into the app when I built it. My original goal was to make it purely a way to change audio devices. And so this extra feature was added just because it seemed to make sense – even though I feel bad about it because it treads so closely to the great work done in ToothFairy by Michael Tsai and AirBuddy by Guilherme Rambo. (I own both!)

If you enable Ears’s “Auto Connect” feature, you can mark Bluetooth audio devices as favorites. And then pressing the “Auto Connect” hotkey will instruct your Mac to search for a favorite device and attempt to connect.

Auto Connect is flexible, however. Your favorite input and output devices don’t have to be the same ones. You can set your AirPods as a favorite output device and auto connect to them, but your audio input can remain with whichever device was already selected. That way, your AirPods music won’t degrade in quality. You can set any combination of devices with any combination of inputs and outputs.

And, now, finally. One last incredibly nerdy feature of Ears that I’m hoping appeals to at least one other person than myself.

Ears is scriptable.

Both from the command line and via AppleScript.

> Ears --help
USAGE: ears [--input <input>] [--output <output>] [--list-outputs] [--list-inputs]

OPTIONS:
  -i, --input <input>     The audio input device to make current.
        The name must be an exact match.
  -o, --output <output>   The audio output device to make current.
        The name must be an exact match.
  --list-outputs          Show available output devices.
  --list-inputs           Show available input devices.
  -h, --help              Show help information.

> Ears --list-outputs
*Soundcore Life Q20
External Headphones
iMac Pro Speakers

> Ears --output "External Headphones"
> Ears --input "Tyler's AirPods"
tell application "Ears"
    set audio input "Soundcore Life Q20"
    set audio output "iMac Pro Speakers"
end tell

You can set your active audio devices and also query a list of available devices on the system and read which ones are active.

So that’s Ears. I built it to solve my own, dumb workflow problems and find it super useful every day. I hope you do, too.

Ears is completely free to use, but if you find the app helpful, I would love your support. You can make the nag screen that opens when the app launches go away forever with a one-time, pay-what-you-want purchase.