April 18, 2021

Stingy, with in-app purchases

When I started writing this text, I had just submitted a version of Podcast Chapters which would revert the app to be paid up-front, removing the in-app purchase.


Because, for some reason, fewer people are willing to pay to unlock a free version than are willing to pay before even trying the app. Significantly less willing, despite an experimental one-week sale. Podcast Chapters has never made a lot of money, but sales were quite steady, and that income was a great motivation to keep working on the app. Since people are unfortunately not likely to get in touch to tell me why they are not buying my app, I am left to speculate wildly about reasons.

My own thinking got as far as realizing that the purchase psychology must be a lot different for in-app purchases than for straight up paid apps. I asked around a bit and heard an interesting second-hand theory:

In short, in the Mac app store, being paid up-front and having regular updates are seen as quality markers. People who look for utility apps look at paid and free options separately, trying multiple free options before settling on one. And if a free app is limited by an in-app purchase, people are more likely to move on to check out the next free option rather than making the purchase.

Hence, Podcast Chapters made a good impression as a paid app, but fared poorly when free with a relatively expensive-looking in-app purchase required for full functionality.

Then what happened?

As I looked this text over, writing paused mid-sentence, I realized there was one rather large elephant relaxing over on the couch:

A severely limited free app is no fun.

My original reaction to the in-app purchase not selling was to lower the number of chapters you could add for free, making it darn near impossible to get a feel for using the app as intended. How was anyone supposed to get a good impression and make a fair evaluation of the app with that?

Before I go back to paid up-front, surely it is worth trying giving people a fair ability to truly use the app as intended? It is not like I need to convince a lot of people after all, a pretty modest conversion rate would easily bring sales back to what they were before. Surely, the added eyes on the app should be good for me if I just give them a fair trial version?

The end, for now

I rejected the version myself and quickly submitted a new one raising the chapter limit to a magnificent ten chapters. Suddenly, I have gone from feeling frustrated at the state of things to carefully optimistic. Perhaps this type of utility is best served as a paid up-front thing, but it must be worth experimenting a little more before settling back in familiar territory.


I think this is the first time I have sat down to write about a decision, changed my mind midway and gone in a new direction by the end. I knew already how good writing is for my thinking, but this is a new and exciting level.

March 24, 2021

A brief love letter

It started with


"Wow, I never downloaded the database for my old site! It should still be around untouched, but I have no idea when I even made a backup of it."

First discovery

Phew, the database looks intact and unchanged! As it should be, but you never know.

Second discovery

Oh look, there is a convenient export menu. And JSON is an option.


How many lines of Javascript it takes to parse that one JSON blob and generate individual HTML pages plus an index?


Operations like this make it clear how outrageously fast and powerful modern computers are. Parsing just over 6 megabytes of JSON, looping through 1810 elements, wrapping their content in the barest HTML, and writing them all plus the index to disk - using freaking Node.js - takes literally no time at all.

Moving 1811 files to trash, however, is outrageously slow by comparison, taking multiple seconds. What exactly is Macos doing there?

Anyway, great fun!

March 19, 2021

VR immersion

I have dreamed of working in VR since … when? Since at least when I first heard of Oculus rift. It seemed so natural, and such a useful thing to aim for: simply make everything good enough - resolution high enough, performance high enough, controls good enough - to plain work on your PC using huge virtual monitors. A show of VR advantages both immediate, obvious, and very down to earth.

Because of this, one of the first things I did after getting my Oculus quest was to start looking for VR desktop apps. The correctly named Virtual desktop seemed to be the most popular option, but it sadly had no Mac support (but it is in beta now!). I did find another option the name of which escapes me (it might even have been an early version of Immersed), but to the surprise of no-one my tiny Macbook almost but not quite completely lacked the horsepower to drive the experience. As I recall, the experience was promising in that it actually worked, but it was also much too slow and buggy to be of actual use. It was also clear that the resolution of the quest was a bit too low to provide nicely readable and sharp text.

Fast forward a little over a year, and my hardware situation was markedly different. The Quest has been replaced by a Quest 2: more powerful, higher resolution, and with an extra battery pack to boot. And my beloved but increasingly frail Macbook had been replaced by the laid back and cool powerhouse M1 Mac mini. It was clearly time to look at the options again.

To my delight, Immersed had evolved the software side to keep up with the hardware. I am writing this on my Mac in VR, and while there is still definitely room for improvement, things look and work so nicely that I believe those who say they can work like this all day.

So, how does it all work? Immersed simply (?) installs a driver and control app on your computer, which streams your displays into VR and allows VR controls to interact with your computer GUI. I usually turn that functionality off, though, and stick to using my keyboard and pointing devices as normal.

Displays in VR

The first fun feature is of course the displays suddenly being detached and free to be placed and sized anywhere you like around you. Immersed not only stream your physical displays (and offers to dim the hardware devices while doing so), it also supports adding completely virtual displays (many of them if you pay for the app, one if you do not).

Resolution is still something of a limitation though. When I have placed my main display to be in a nice central position and comfortably readable, it occupies enough of my view that any secondary display needs a pretty large head movement to come into view.

I also wish I had a lot more options when it comes to resolutions and aspect ratios. I asked in Immersed's Discord about this, and they refered me to Mac utilities for getting more resolution options - like Switchresx. I subsequently came across a tweet explaining that the M1 Mac graphics drivers limit your options rather severely. Sad trombone, and perhaps another point in favor of Windows boxes for VR.

So which options do I have? The physical displays are limited to their "real" resolution options, and virtual displays offer options from 1280x720 to 1920x1200. That means no playing with 4K or retina resolutions (not that I know that concept would make sense in VR), but also no playing with ultra-wide displays. I would have loved to try a curved screen 4 or 5K wide, but I guess that stays on the wishlist at least for now.

Considering many people have spent a lot more time than I working in VR, it could well be that the options present right now are actually much better for getting actual stuff done as opposed to just dreaming stuff up. I did find some use for a second display laying table-like below the primary one, so there are a lot of options to explore.


Using your hands or controllers to place stuff and use menus is always delightful, but not always precise. Immersed uses the Quest's hand tracking to great effect, always showing your hands as you type, point, and click, and incorporating a bunch of smart gesture shortcuts. For example, on your left wrist is a Fitbit-like black band. Lift your arm a bit palm-up, and a clock-like round display appears below your wrist with battery level, clock, and session time. Tapping that display with your other hand brings up a quick options menu. Very nice. But my favourite gesture lets you enable or disable hand interactions (both moving and resizing displays, and using them as pointing devices on the displays): you simply press the thumb of each hand to the ring finger for a second. The hands light up and become more solid when in interaction mode, and fade away and dim when not.


Another small bonus: There is no way I can cheat and look at my keyboard while typing in VR. Immersed does offer some cool mapping wher you can try and place a virtual keyboard where your real keyboard is, but they wisely chose to stick to an option somehwat more common than a Kyria. So, I now have to type by feel and proper positioning, and I think it helps a lot. I notice how many keys I can find and reach easily when I pay attention to my positioning, and I appreciate how the shape and size of the keyboard makes it easy to locate many rarely used keys by feel.

The way of the future?

The future, as is so often the case, may not be quite here. It is surprisingly close though. The headset is still a noticeable weight, and it generates some heat. There are batteries to consider, interactions to figure out, and of course the resolution could increase quite a bit. But it is already a unique and enjoyable way to work, and it provides a very nice sense of focus and calm.

In that nice down-to-earth yet cool way, it is easy to see that everything about computer work in VR will only become better as technology improves.

Hopefully AR glasses and the like will take over before too long, letting us all work without physical screens without being quite so shut off from our surroundings. Until they do, though, I will be very happy working in increasingly sharp VR settings.

February 28, 2021

Brütal M1

I love Brütal legend. Perhaps more as an experience than as a game. I got frustrated with the game and eventually gave up at a stage battle where the challenge just did not feel fun anymore. But I love everything else: the world, the characters, the design, the attitude, and of course all the awesome music.

So when I got my M1 Mac mini and fired up Steam, I was excited and surprised to find out that the game seemed to be compatible. Brütal legend is getting old, but there it was, listed as playable.

I installed, launched, and was greeted by less than one frame per second, even in the introduction video, accompanied by impossibly choppy sound. No point in even launching the game proper when even the menu is unplayable.

Tonight, a couple of OS and Steam updates later, I for some reason decided to give it another go. I am not sure what, but something has clearly changed. The game now runs, smoothly (even if I could bring it down by cranking up the visuals), and it looks and sounds just as fantastic as always.

All I needed now was worthy equipment.

The Gods of Metal do not take kindly to trackpads, let me tell you. And that fancy-schmanzy little heavily customized keyboard? We do not pay much attention to those.

The trackpad embarrassment was quickly redeemed. I knew exactly where my trusty Intellimouse was. Keyboards where harder though. I dug through some drawers and boxes finding nothing truly worthy.

Then I looked up and saw it, patiently waiting like a beige Excalibur on its stand on the top shelf.


Brütal legend, on M1 Mac mini with Intellimouse and Apple extended keyboard Brütal legend, on M1 Mac mini with Intellimouse and Apple extended keyboard

February 21, 2021

Free with in-app purchases

It happened. Podcast Chapters can, finally, be tried before you actually buy it.

Getting there was not actually all that tricky. The slightly nerve-wracking part was to provide the new in-app purchase solution while at the same time ensuring that anyone who had already bought the app did not need to pay again. Technically, it was just a matter of checking the app receipts, unlocking full functionality if the app was originally purchased before the free version. Mentally, though, it was kind of hard to convince myself that I had not missed some detail which would lock everyone out. Testing purchases and receipts seems to have become a lot easier over time, but as a first time developer of the functionality it was not always obvious what was developer error and what was correct behaviour that I simply did not grasp the details of just yet.

It was with some trepidation I finally pushed the version live last night, updated on all machines I could think of and settled into quite frequent checking of email and Twitter, hoping to not discover I had broken the world for all paying users.

Then, the Scare happened.

The Scare

A user reported on Twitter that he did not get the app unlocked, that restoring purchases did nothing, and that his only option seemed to be paying again.

Oh no.

I got in touch, and prepared a build without any purchase checks, wondering whether I should pull the version or hope to fix it quickly.

The turnaround

Fortunately, I got some quick responses, and the situation rapidly started looking better. The problem did not seem to be the actual purchase validation code, but rather the much more garden-variety code which was supposed to update the user interface to show that the user is on the unlocked version. Suddenly, I had a problem which could be worked around and which felt nice and familiar, rather than a new and complex one which I had no idea how to rapidly reproduce and debug.

I went to bed (it was … late-ish at this point) feeling rather relieved (and not having received any more problem reports). Today, I have submitted a small update which should resolve the user interface update problems as well.

What comes next?

Good question. The list of possible new features is as long as ever, but it feels really good to have got this out of the way. Not only can people try the app in a good way before paying, I now know I can handle in-app purchases in a reasonable (you can take some fun shortcuts when you only have a single purchase to worry about) manner. It is not my intention to make anything else another purchase, but it is good to know I can handle the option if I were to, for instance, add a feature which meant recurring costs for me.

I mean to start playing with Swiftui too, any day now.