Dear Reader,
You join me one month after the launch of Music Library Tracker v2.0 and I hopefully have an interesting read for you in the form of a retrospective of the post-launch period. It details how much the app made in the past 4 weeks along with my strategy for media promotion and how that went. I’d love to hear your thoughts, especially if you’re an iOS developer that has had the same struggles with self-promotion.
That aside, I received an email about my Return to Dark Tower Assistant app that absolutely made my day. I originally said when I published the app that “it will likely only get single-digit downloads” and was pleasantly surprised when it ended up comfortably in the double-digits 😆. The app only received one review on the App Store and unfortunately it got 3 out of 5 stars as “the expansion characters are not available to select”. I did not have a copy of the Alliances expansion so I posted a reply essentially saying that I couldn’t add the expansion content until I received it which wouldn’t be until June or July this year1… that was unless some kind person sent me photos of all the cards.
I literally could not believe it when someone named Michelle did exactly that and sent me high resolution photos of all of the components as they had “noticed that someone left you a middle star review because you don’t have the alliance cards yet”.
A few things about this really cheered me:
I love getting emails about any of my apps but I really love it when my niche apps get some attention.
People actually read the App Store reviews and their replies! Rather than being turned away by a middling review they downloaded the app anyway and then helped make it better.
It’s just a lovely thing to do and restored my faith in humanity 😇
It took a little while to get everything programmed in (as there is a tricky new mechanic around Guilds) but yesterday v1.1 of Return to Dark Tower Assistant was approved and made available on the App Store with full support for the Alliances expansion including the option to use the 2 new heroes with the base game.
Again, I know the vast majority of you will have no interest in that app but hopefully the takeaway from this story is that you should go and support the creators you like. You don’t need to spend money or loudly promote something on social media (although those are both gratefully received); a small kindness can go a long way to improving someone’s wellbeing and keep them going. Thank you Michelle 🙏🏻
— Ben
Contents
Music Library Tracker v2.0 Postmortem
Focus Modes & Shortcuts
Darkest Dungeon Board Game App
Dolby Audio
Recommended Links
Roadmap
Music Library Tracker v2.0 Postmortem
It’s been 4 weeks since the v2.0 update for Music Library Tracker launched so I thought now was a good time for a retrospective to detail how I promoted the app and how well it performed.
By way of a bit of background, the app originally launched back in January 2016 at a $0.99 price point making $1368 in it’s first month before dropping off significantly to roughly $20 a month. In January 2021, I was accepted into the App Store Small Business Program which meant the amount Apple took from sales fell from 30% to 15%; I had also increased the price and released a few more updates so the average profit for the half year prior to the v2.0 update in February was sitting at around $80 a month2. This is by no means an income (especially as I have to pay corporation tax on it in the UK and then if I want to actually take the money for myself rather than my business I’ll have to pay some more tax) but it was fine for an app that didn’t have any running costs nor require much maintenance.
v2.0 was released on 13th February 2023 after a 9 month development period, 3 months of which was open development in this very newsletter. It was reported on by a couple of tech sites (I’ll detail how shortly) and ended up being the #8 Paid app in the US!
So how much money does an app need to make to be in the Top 10 of all paid apps on the App Store?
Not as much as you might think! You can download a full breakdown but the key figures are:
Profit of $82 on 13th Feb (launch day), $1449 on 14th Feb, $1534 on 15th Feb, and $414 on 16th Feb
Total profit of $5351 over 28 days
An average daily profit of $191
Only a single sale on March 6th 😭
I use Daily Sales Email to find out how much I’ve made each day but the figures typically arrive around lunchtime on the following day. That meant I could see the app in the Top 10 of all paid apps but had no idea what that would translate into3 until the next day. I’ll confess that whilst I was pleased with the numbers, I was a little disappointed that I’d made less than what I charge for working 2 days as a freelance iOS developer.
That said, the app has settled down into making roughly $40 per day which works out at around $1200 per month, not bad for something that will hopefully only need minor maintenance.
With the financial breakdown out of the way, I thought it might be interesting to detail exactly how I promoted the app. I will be completely honest and say it is not my strong suit at all. I hate doing app promotion work; it is abhorrent to me. I’m not sure if it’s the Englishman in me or something else but I absolutely hate having to email people saying “please look at my app” followed by the waiting and hoping that somebody will feature it. However, that’s what I had to do as an app of this nature likely isn’t going to generate enough revenue to make hiring a marketing person cost effective.
Reviews
The key thing for an app like this is for it to be written about by a tech site. I’ve had a couple articles in the past from sites like 9to5mac and MacRumors so my first port of call was to send them an email. As previously mentioned, I hate doing this stuff but I felt on slightly firmer ground with these sites as they’d written about the app before so that seemed like a good “in”:
Hello,
Back in 2016 you were kind enough to review an app of mine, Music Library Tracker (https://9to5mac.com/2016/03/15/music-tracker-large-libraries/).
I’m getting in touch as I’ve just released a large v2.0 update to the app which includes some features around Spatial Audio. In short, the app can quickly scan your library and show you exactly which songs have been upgraded to Spatial Audio and generate a playlist containing just those tracks; it will then run in the background periodically and notify you as and when tracks are upgraded and keep that playlist up to date.
This is all possible due to a database of Dolby Atmos and Dolby Audio tracks I’ve created over the past 9 months to run my Spatial Audio Finder website (https://bendodson.com/projects/spatial-audio-finder/) and the @NewSpatialAudio Twitter account (https://twitter.com/NewSpatialAudio) which tweets whenever a new track is upgraded. This database is sourced from a minor update to the Apple Music API at WWDC 22 - you can see how this all works in a blog post I wrote last year (https://bendodson.com/weblog/2022/06/27/spatial-audio-finder/) but suffice to say I do not believe there is anyone outside of Apple with a dataset such as this.
Apple Music does not yet have a clear strategy for displaying Spatial Audio tracks. Whilst they have some playlists and collections that get updated weekly, the only way to tell which tracks in your own library are upgraded is to play them and see. This is obviously not ideal and not a great way to showcase what is a genuine leap in musical quality and the hundreds of thousands of tracks that have been upgraded. I created this feature as I was determined to find a way to see which tracks had been updated. From the response I’ve received via @NewSpatialAudio it seems I’m not alone!
The app is still a single cost download (25% off for the next week) with no in-app purchases, subscriptions, or adverts so anybody who downloaded the app in the past 7 years will get this new feature for free. I’ve provided a few promo codes below in case you or anyone at the MacRumors team are interested in taking a look:
CODE1
CODE2
CODE3You can see some more information about the app at https://dodoapps.io/music-library-tracker/ and there is a full media kit with screenshots, etc, at https://dodoapps.io/music-library-tracker/media-kit/
The update is available now on the App Store at https://apple.co/3XtdAga
If you have any questions at all about the app, my Spatial Audio database, or anything else relating to Spatial Audio then just let me know.
All the best,
Ben
I sent this email on the 13th February to the reviews@9to5mac.com address (as my previous contact had since moved elsewhere) and a very similar version with a different link directly to the Senior Editor at MacRumors who wrote a previous article. I got a very strange bounceback email from 9to5mac and I didn’t get a reply at all from MacRumors. As the bounceback was so odd, I waited a day and then sent a follow up email to tips@9to5mac.com; it was a good thing I did as Chance Miller got in touch within 30 minutes and shortly afterwards there was an article published. This is undoubtedly what led to the spike in sales on the 14th and afterwards.
In addition to those two outlets, I sent similar emails to:
TechRadar (via news@techradar.com): their Entertainment Editor replied after a couple of hours and we had a few emails back and forth discussing various aspects of Spatial Audio such as how Apple bans AI upscaling. They published an article the next day but it didn’t show up in their RSS feed and is not visible on their website unless you follow the direct link (which was tweeted but had practically zero engagement)
AppleInsider (direct to one of their writers who had written a recent article about Spatial Audio): I didn’t get a reply and there hasn’t been an article
MacStories (direct email to John and Federico): I didn’t get a reply but it was listed in the “App Debuts” section of the Club MacStories newsletter for paid subscribers
The following week I sent an email to iMore as I’d noticed an interesting article relating to Spatial Audio. I couldn’t find an email address for the author, Tammy Rogers, so instead sent an email direct to the Features Editor, Daryl Baxter, who was listed as a contributor:
Hi Daryl,
I came across a recent article you contributed to, “Apple Music is showcasing non-Spatial Audio albums in it’s Spatial Audio page”, and had two things that may be of interest to you and Tammy (I couldn’t find an email address for her so my apologies for not including her as well).
First of all, the reason that those albums are being listed within Apple Music’s Spatial Audio playlists is because they have some tracks on them that are available in Spatial Audio. The referenced No Pressure by Logic has two tracks that have been upgraded (GP4 and Perfect) whilst McCartney (2011) remaster has the first 13 tracks available in Spatial Audio. I know this because I created something called the Spatial Audio Finder which lets you find which tracks have been updated for a particular artist (I’ve got a blog post at https://bendodson.com/weblog/2022/06/27/spatial-audio-finder/ which explains how that all works). I also publish when tracks are upgraded to the @NewSpatialAudio Twitter feed.
You also mentioned in the article that it’s quite hard to find Spatial Audio tracks within Apple Music. This is a huge bugbear of mine and so I recently updated an app of mine, Music Library Tracker, with some new features around Spatial Audio. The app was originally designed to help notify you when Apple changes your music (i.e. if a song is deleted due to licensing changes, etc) but it can now scan your library and show you which tracks you have that are available in Spatial Audio along with creating a playlist in Apple Music containing only those tracks. It can then keep monitoring your library and send you notifications as and when new tracks are updated.
The rest of the email is similar to the initial one above
I received a reply a few days later and then after 2 weeks an article appeared.
In addition to the sites I reached out to, a few sites published articles organically including:
I’d like to give a big thank you to all of the people who did get back to me or wrote about the app - I’m very grateful! However, the experience of doing this is easily the worst part of being an independent app developer. I absolutely hate having to hawk the app around and then have the long period of waiting and hoping for an article to appear. I always try and craft my emails to be very specific to something the site has covered before or to provide some kind of story so it’s a bit easier to form a narrative other than “please talk about my app”. It’s incredibly disappointing when you don’t even get an email back. As I hated doing it, I’d typically send an email and then think “that’ll do” and by the time I realised a site wasn’t going to pick it up the launch window had passed and it felt even more awkward to email in (especially as it had already been covered by 9to5mac so other sites could have potentially already seen that article and not wanted to cover something which is now old news).
A few things I should have done differently:
I should have contacted people before the launch of the app rather than afterward. I don’t like contacting anyone before Apple have approved an app as that can lead to all sorts of problems. I’d already public committed to a release date and didn’t give myself much room between approval and release so I just sent the messages out post-launch. In an ideal world, I should have had a week or even two with the app approved within which I could have sent out promo codes or TestFlight invites so the app could be reviewed and embargoed. That would lead to a much bigger “splash” and also avoids the issue of sites potentially not wanting to promote an app that has already been promoted elsewhere.
I should have written to more sites rather than just the ones I typically read. I did do some research to find sites that had talked about Spatial Audio (as I wanted some kind of an “in” when writing to someone who’d never heard of me before) but I probably should have just gone with a scattergun approach to anybody that is even vaguely app adjacent.
I had no idea if the promo codes I was sending out were being used so couldn’t really tell if my emails were getting through. Once you’ve generated a promo code within App Store Connect, the only way to see if it has been redeemed or not is to try and redeem it (which is obviously not a good idea). I could easily just provide a link to my site which, when accessed, gives out a promo code and can then tell me that has happened but it just doesn’t sit right with me and I’d be afraid it would be something that would put people off.
I should have followed up with the sites that didn’t reply to me. I did that with 9to5mac which definitely paid off but I felt more comfortable doing that as it seemed clear there was a technical error; sending a “sorry but did you get my email?” shouldn’t really be anxiety inducing but I couldn’t bring myself to do it.
If you are a writer for a tech site with any insight or a developer that has had any success stories with this then I’d absolutely love to hear from you!
Getting Featured on the App Store Form
When you’re looking at ways to promote an app, getting featured by Apple on the App Store is obviously a high priority goal. There have been several articles recently about using the dedicated form on the Apple Developer website with the key takeaway being to submit the form for every app update.
I have never used this form before, mostly because my apps tend to either be very niche or are something like this app which I’m always somewhat surprised makes it through App Review in one piece 😆. However I did it use it and something unexpected happened… I got an email from the Apple Services Performance Partnership Team4:
We are currently recruiting new partners to promote the latest of Apple’s products to join the programme: Apple MusicKit.
MusicKit lets users play Apple Music and their local music library from your app or website. So, when your users provide permission to access their Apple Music account, they can use your app or website to create playlists, add songs to their library, and play any of the millions of songs in the Apple Music catalog! If your app detects that the user is not yet an Apple Music member, you can offer a trial membership from within your app. The Apple Music Affiliate Program allows you to earn a commission on eligible referred Music memberships (new sign-ups only)! You can find more detailed information here as well as in the document attached.
We have noticed that you already use the Apple Music API and we believe adding in MusicKit would be an easy process for you and a great benefit! We offer generous compensation models and would like to talk you through this opportunity in more detail.
Please let us know your avails, so we can go ahead and schedule a call with you. 😊
I did take the call5 and it is effectively outreach to try and get developers to promote Apple Music within their apps in exchange for a commission on any new subscriptions. You can already apply for this directly but I guess Apple saw that I was using MusicKit on the form I filled out and so set this up. Unfortunately it’s not really a good fit for this app (you’re likely not using it if you don’t have Apple Music already) but it may be useful for another app I have in the pipeline in which I’d already added the “Subscribe to Apple Music” interstitial that this hooks into.
Going back to the form, the app has not been featured anywhere on the App Store but I had very little expectation of that happening.
App Store Ads
I took a look at promoting the app using Apple Search Ads and found that it was recommending a suggested “Cost-per-Install” of £5.61. This is not ideal bearing in mind the app cost £2.49 at the time 🤣
After I posted that on Twitter the developer of the excellent Marvis Pro music app, Aditya Rajveer, reached out and said “It almost never reached the suggested amount per install for my app, not even close”. That pushed me to give it a try and they were right! I’ve had it running for a few weeks now and have had 22 installs on an average Cost-Per-Install of £0.89. That’s not exactly setting my sales alight but it’s better than nothing. On a more positive note, I’m not actually being charged for these installs as I have a promotional balance apparently. I seem to remember I claimed a free $100 of advertising years and years ago so evidently that is still in use 🤷🏻♂
App Store In-App Events
I created an In-App Event on the App Store to coincide with the release of the update which ran for 1 week:
This had 4700 impressions leading to 9 downloads and 24 app opens. Again, not terribly exciting but extra sales are extra sales.
Other Promotions
I obviously promoted the app on my own Mastodon and Twitter accounts but I also tweeted about it on the @NewSpatialAudio account which I believe led to the article on Tom’s Guide. There’s also my newsletter (this one you’re reading!) and my website which mentioned the app. Finally, it was mentioned in both the Indie Dev Monday and SwiftlyRush newsletters.
So what actually worked?
App Store Connect provides a metrics panel which roughly details where your downloads have come from. Rather astonishingly, it turns out that 43.4% of all my downloads in the past month came from “App Store Browse”. This is followed by “Web Referer” at 28.3%, “App Store Search” at 13.4%, and “App Referer” at 12.8%.
If I dig into that a little more I can see that most of the app referer traffic was either Facebook, Google, or Google Chrome (so likely clicking on links from one of the published articles). With web referer, the vast majority is 9to5mac.com followed by my own Dodo Apps website. Everything else is single digits.
My assumption is that the 9to5mac article created enough downloads to catapult the app up the Paid App charts and it was there that it was discovered by those just browsing the App Store who then made up the majority of my sales. This seems incredibly backwards to me as I’d assume the technical readership for whom this app is more likely aimed at would be the majority of downloaders but I suspect that with the billions of iOS devices in the world even a fractional percentage of users browsing the App Store is going to be magnitudes larger than the number of followers that the tech sites have.
In terms of next steps, I’m at a slight loss as to what to do as I don’t have any big splashy features in the pipeline that would merit the coverage that is clearly key to increasing the number of downloads. Having looked at what other developers are doing, it looks like I should try finding an influencer on TikTok but I know absolutely nothing about that world. I could also look at direct advertising on some of the tech sites or podcasts that would be relevant but doing so is likely going to be thousands of pounds worth of investment and feels like a bit of a gamble given this is a low-cost paid app rather than a subscription based service that can recoup large advertising costs over months of later usage.
If you’ve got any thoughts or insights then I’d love to hear from you. I’d also love it if you downloaded the app 😉
Focus Modes & Shortcuts
The Shortcuts app is one of those things I always feel like I should use more but never seem to have the use case. This is partly because, as a programmer, I can usually join things together outside of the app ecosystem. Similarly I’ve not really delved into focus modes as I’ve not had the need. This changed on my recent holiday where I decided to create a “Family Time” focus mode and I’ve found I can now solve a few problems with both features.
It all goes back to an Apple TV app I built for myself called Stoutness6 which was designed as a morning routine app that would show me my various vitals and trends whilst I did my chiropractic stretches. I won't go into great detail about it here (as this issue is quite long enough and there's a post on my website that shows it off) but the important part is that I have data on my iPhone that needs to get sent to my server each morning; things like how many steps I walked, how much water I drank, how long I slept for, and so on. This is all done using a shortcut called “Update Logs” but the problem is that I have to run it every morning and sometimes I forget. You may think “just set it to run on a schedule” but as I’m accessing data from HealthKit the phone has to be unlocked; any shortcut that runs whilst the phone isn’t in use will fail.
A potential solution to this came to me whilst reading an article by John Voorhees and I noticed that there was a “when I wake up” trigger within Shortcuts. My plan was to use this to run my shortcut as I always turn the Sleep focus mode off on my phone which meant it would be unlocked and thus there would be no issues with Health access.
It turns out there were two problems with this:
Whilst you can activate shortcut triggers when focus modes are enabled or disabled, for some reason this does not extend to the Sleep focus mode. There are triggers for “Sleep” that include “wind down begins”, “bedtime begins” and “waking up” but these only work if you’re using the full bedtime functionality. I don’t use this as a) I track my sleep with AutoSleep rather than the native Apple Watch tracking, b) I don’t have a consistent bedtime, and c) my children act as an alarm clock and they are unpredictable with their timings.
Even if I were to run my shortcut straight after waking, this sometimes led to the AutoSleep shortcut integration returning 0 for my sleeping hours as it hadn’t yet had time to process that I’d woken up.
To solve the first problem, I removed the Sleep focus mode entirely and created a new one named “Bedtime”. I set it up so that when this is activated my iPhone wallpaper is turned to black and Cinema Mode is enabled on my Apple Watch7. I then reverse this when Bedtime is deactivated and rather than having my shortcut run at that point I instead set the automation to open the AutoSleep app; I then have an automation for when AutoSleep is closed which runs my shortcut.
This works great as now when I wake up I turn off the Bedtime focus mode which immediately opens AutoSleep, I refresh the app so the data is all up to date, and then I swipe back to the home screen at which point my shortcut runs in the Dynamic Island and sends everything to my server. Perfect!
As I mentioned earlier, I’ve been experimenting with a “Family Time” focus mode that effectively turns off notifications for everything I shouldn’t be dealing with at the weekend and switches to the Mickey watch face8. I originally set this to run on a schedule which used to work fine but once I removed the Sleep focus mode the schedule started overwriting my Bedtime focus mode. It seems that Sleep has a few special edge cases of which this is one. I typically get a lie-in on Sunday so wasn’t too keen on my Bedtime focus being turned off at 6am 😂
To resolve this, I needed to use some calendar trickery in my previous automation that runs when Bedtime is disabled. Essentially it formats the current date into a string format like “Mon” or “Wed”, compares that against a list comprised of “Sat” and “Sun”, and then it sets the Family Time focus mode if that’s true (otherwise nothing happens so it reverts to no focus mode at all):
This now works automatically so if I turn off my Bedtime focus at the weekend I’ll automatically be piped into my Family Time focus mode.
One final focus mode I set up was “Photos”. This was inspired by a recent comment on Connected by Stephen Hackett and effectively activates a custom focus mode whilst the Photos app is active so people don’t see your alerts when you’re handing them your phone to show them photos, a common occurrence with small children. The issue here was that if it was the weekend I didn’t want my Family Time focus mode to be deactivated when I left the Photos focus mode. To fix this I needed a way to save state and the best way to do that in Shortcuts is with the Data Jar app.
Data Jar exposes itself within shortcuts and lets you store and retrieve variable content. Think of it like NSUserDefaults
in an app. With this, I’m able to save my current focus mode as a string into Data Jar when I open the Photos app and then when I close the Photos app I can check Data Jar to see if there is a string and if so use it to switch back to the correct focus mode.
The “Save Current Focus” shortcut is nice and straightforward but the “Return to Last Focus” shortcut is a little cumbersome.
To start with, it is not possible to activate a focus mode using a variable. For example, I can’t use the string “Family Time” as an input to the “Set Focus” action; it lets you provide a variable but it will always just active Do Not Disturb. Hopefully this is just a bug that will be fixed at some point but for now I have to manually specify each focus mode I have which means this will break if I ever rename them 🤦🏻♂
The second issue is a lack of control flow options in Shortcuts. Ideally you’d want to use a switch to loop through each possible string option and fallback to a default but there is no concept of a switch. There is also no concept of an if-else-if loop so you either need to do a lot of nesting (no thanks) or have a long list of “if value is x” commands which is what I ended up doing. It’s not pretty but it gets the job done.
I’ve only been using this for a couple of weeks but it’s working well so far and I suspect it will only get better as more options are added to Shortcuts in future!
Darkest Dungeon
In the last issue I said of my Darkest Dungeon app “it’s going to be a fun diversion for me over the next couple of weeks, a palate cleanser before I dive back into some proper apps for release later in the year”. I may have been wrong 😂
It wouldn’t be fair to say it’s been un-fun but it has taken a lot more work than I had initially planned and it’s an app that will never see the light of day on the App Store due to the amount of artwork I’ve used from the game.
As a very brief recap, Darkest Dungeon is a board game adaptation of the video game by the same name. It has a ton of components that make it quite cumbersome for solo play so I decided to make a companion app in a similar vein to my Return to Dark Tower Assistant. I have a deadline on this one as I’m due to start the campaign in-person with a good friend next week so I’d very much like this to be working!
For the purposes of this issue, I thought I’d run through a few things I’ve created in the app that I’m particularly pleased with. It’s a bit of a hodgepodge but hopefully there will be something of interest.
SwiftUI and ObservableObjects and Enums, oh my!
To start with, I wanted to mention that this is another one of my experiments with SwiftUI. It’s an entirely native SwiftUI app currently designed only for the 12.9” iPad (as that’s the model we’re going to be using and gives me the largest canvas to work with). The thing that is slightly different with this app to my previous dabblings with SwiftUI is that I’m fully embracing @ObservableObject
, a way to have a single source of truth that then filters down to any other composed views via @EnvironmentObject
.
For example, I have a “game” object which contains a party property that is an array of my four adventurers. An adventurer has a multitude of properties for things like health, stance, and tokens. On the interface side I have a hero board which represents the currently active adventurer. With the game being an @ObservableObject
it means that if the adventurers health changes then my hero board is automatically re-rendered. This is very cool especially when you’re using view compositions to break up a single SwiftUI view into individual components, each of which can easily respond when the data changes. In the UIKit world I would have had to have fired an NSNotification
when something changed so that subviews could respond but this is much more straightforward.
Another thing that I’ve been dabbling with are enums with associated values. For example, here is my list of possible hero types within the game:
enum Hero: Codable {
case arbalest(level: Int)
case bountyHunter(level: Int)
case crusader(level: Int)
case graveRobber(level: Int)
case hellion(level: Int)
case highwayman(level: Int)
case jester(level: Int)
case occultist(level: Int)
case plagueDoctor(level: Int)
case vestal(level: Int)
var name: String {
switch self {
case .arbalest:
return "Arbalest"
case .bountyHunter:
return "Bounty Hunter"
case .crusader:
return "Crusader"
case .graveRobber:
return "Grave Robber"
case .hellion:
return "Hellion"
case .highwayman:
return "Highwayman"
case .jester:
return "Jester"
case .occultist:
return "Occultist"
case .plagueDoctor:
return "Plague Doctor"
case .vestal:
return "Vestal"
}
}
var level: Int {
switch self {
case .arbalest(let level), .bountyHunter(let level), .crusader(let level), .graveRobber(let level), .hellion(let level), .highwayman(let level), .jester(let level), .occultist(let level), .plagueDoctor(let level), .vestal(let level):
return level
}
}
}
extension Hero: Equatable {
static func == (lhs: Hero, rhs: Hero) -> Bool {
return lhs.name == rhs.name
}
}
The associated value of “level” means that I can specifically instantiate a lvl 2 crusader with .crusader(level: 2)
but when I interrogate the value I can choose to ignore the level property entirely, for example when switching through all the cases to return the hero name. This is by no means a new feature in Swift but isn’t something I’ve really used before; now I can’t stop using it!
Hero Board
One of the key components I wanted to remove and have solely in the app is the hero board. There are four of these in the game (regardless of number of players) that comprise of a hero card onto which stacks of tokens can be placed, and a square tile which has spaces for skill cards and a stress tracker along the top:
There is also a slot on the left for trinket cards, and slots on the right hand side for diseases and curios so you can see how this can fill a lot of space on the table when you have four of them.
My version is a lot more compact:
The first thing I wanted to do was to create an exact replica of the hero card. This consisted of taking an image from the manual and using my photoshop skills to patch it up and remove everything aside from the border and static elements. I then created a replica of the background using artwork from within the Darkest Dungeon video game files to put behind the transparent frame. I also went through the video game files to find the exact artwork that was used for each character both for their avatar in the top left hand corner and their main body pose. Finally, I used WhatTheFont to determine that they were using Dwarven Axe, picked out the correct colours from the manual with Color Picker, and overlaid the text on top.
It was only after doing all this that I remembered there was a demo of the board game on Tabletop Simulator and I could have just taken some high resolution artwork out of that 🤦🏻♂
The next thing to determine was how to display tokens on the card. In the game, the heroes are often afflicted by a variety of conditions each represented by tokens that are stacked together. At the start of their turn, you remove one token from each stack which can lead to an effect. For example, if I get afflicted by 2 bleed for 3 turns that means I need to place a stack of three “2 Bleed” tokens; at the start of each turn, I’ll take one of those off the stack and take 2 damage to represent them slowly bleeding.
My original thought was to have the tokens animate in and be placed at slightly random degree angles so they’d look more realistic as a stack but after testing it I quickly realised you couldn’t see how many items were in the stack. This is crucial information as knowing how many tokens are in the stack may change your decision as to whether you want to use an item to remove the stack or not. Instead I decided to take some inspiration from the iOS home screen and instead show a badge in the top right hand corner with the number of tokens in the stack.
The final thing to change was the stress tracker. In the original game this is placed at the top of the side board but the colours are such that it is very hard to see how many points of stress you have taken. I decided to put this at the bottom of the card instead and then have the stress tracker fill in rather than moving a single token. This makes it much clearer at a glance how much stress your hero has taken on.
You may notice that the “Hamlet Skill” text is missing from my version of the card. This is only used in a small section of the game so I display this in a different UI during that phase.
There are a few other items that can appear on the board:
Skills: These are the main actions your hero takes in battle and will nearly always require you to roll a die to resolve them. For that reason, I have not digitised these but will keep them physically in front of the player. This is also for brevity as there are 100s of cards I’d need to type in; there are 8 for each hero that you can swap between quests and each one has three variants depending on their level.
Trinkets: These are randomly rewarded to you at certain interaction points so made a good candidate for digitisation but their effects are nearly entirely down to dice rolls that the app would not perform so these will also remain physically in front of the player.
Diseases, Quirks, Virtues, and Afflictions: Each of these cards are randomly provided from their respective decks and have some form of passive effect that changes things in the game. I have bought all of these into the app and they can interact with one another. For example, I can tell the app my hero needs a negative quirk and it may randomly assign “Fragile”. This has an effect whereby every time the hero takes damage, they take 1 additional damage. This is all handled automagically by the app so if I tell it to add 2 damage it will actually add 3 as it is aware of this rule. These effects can stack in particularly nasty ways into something I’ve coined “the tree of cascading s**t that has befallen you”.
The Light
One of the key components of the game is the light tracker. Various actions will affect the level of light in a dungeon and the current brightness will have passive effects that are easy to forget about.
Rather than having a tracker, I decided to have a small torch in the top left hand corner of the screen which would show the current level along with the passive effect:
As the light goes down, I dim the glow around the torch and change it red. You may also notice that the number representing the current level also fades from a bright white at level 5 (the maximum brightness) to a faded grey.
Another minor detail is that the light is actually gently pulsating. You can’t really see it in the gif above but the surrounding light does randomly breathe in and out as if it were a burning torch. Unnecessary, but I like that it’s there 😆
The Cascading Tree
The most complex piece of this app has been dealing with the number of effects that can stack up and how the app will then process them. For example, when I say my hero has taken 2 damage from an enemy then that could lead to an extra piece of damage being applied due to the “Fragile” quirk as I mentioned earlier. However, I might also have the “Spotted Fever” disease which applies 1 blight for 2 turns every time I take damage so that needs to be added on as well. If I have the “Clumsy” quirk as well then that would apply a debuff token to me every time I take damage. If stress is applied, then I might need to test their resolve and roll a die to see if they then gain a virtue or an affliction; this would interrupt the cascade (as there may be more conditions to follow) so I’ll need to handle that. Another potential interruption would be if my life was at 0 and I took more damage so I’d need to roll the deathblow die to see if I survive or if the hero is done.
All that is to say that it wasn’t enough to simply build up a list of effects and then run through them one by one. I needed to continuously check every effect that takes place to see if that added yet more to the tree. I also needed to build in an interruption system so if something happened that required the players input then the cascade could be temporarily put on hold until that interruption was resolved. Finally, I needed a way to manipulate values but have them not apply the tree just in case something went wrong and we needed to reset something to a specific value without having all the ancillary effects take place.
This is mostly done but it is the area that I expect will collapse under the weight of actual play. For that reason I’ll be taking my MacBook Air and a lightning cable with me so I can tweak the app on the fly when we start playing 😂
That is my Darkest Dungeon app so far. I still have quite a list of tasks to complete before next Thursday including:
Completing the cascading tree
Adding custom UI for the various interruptions
Adding a UI to change the torch level
Creating the UI for the other phases of the game (so far I’ve been focussed on the battle interface as this is 90% of the game but I do need an interface for “The Hamlet” and the exploration phase)
Adding a way to change the stance of heroes and a way to replace a dead hero with a new one from the stagecoach
Adding in music and narration from the video game
Lots to do, not much time to do it. I’ll let you know how it went next issue!
Dolby Audio
Last issue I said “It will likely be a few days until the existing tracks in the database are updated as new tracks take priority for my scanning engine; as of right now, there are just under 2 million tracks that have been added thanks to the new app update 😅”. This was incredibly optimistic. It took nearly 3 weeks to clear the backlog in the scanning engine as the thousands of app downloads led to almost 12 million tracks being added to the database!
I’m happy to say that this has all cleared out now and there have been a number of Dolby Audio tracks published over the past two weeks! As always you can see what tracks have been upgraded via @NewSpatialAudio or by using the Music Library Tracker app.
Recommended Links
Video Games
PowerWash Simulator - I’d heard about this game on a number of podcasts and avoided it as it sounded like the sort of thing I’d get addicted to. I was right to be cautious! It’s a very chill game in which you clean a variety of environments and can upgrade your equipment to deal with more stubborn dirt. I really enjoyed the skateboard park and playground levels and am now packing the Prime Vista PRO which has a very pleasing purr with the 15° nozzle. It’s stolen 25 hours of my life and will no doubt steal a lot more given the free Tomb Raider and Final Fantasy VII DLC that have recently been released. Available on GamePass.
Hitman III - I really got into the first game in the reboot Hitman series but didn’t play too much of Hitman II. I’ve been meaning to try Hitman III for a while though if only for the second level which is a very Knives Out style murder mystery. I’ve only been through the level a few times but it’s definitely something I’m going to rinse and repeat many more times (I’d highly recommend this video by Game Maker’s Toolkit about the art of repetition within Hitman). Available on GamePass; a single download of the game also gives you all the content from the first two games in the trilogy.
Apps
Bandbreite - I love Apple Watch bands (in fact I picked up two new ones from the Spring collection that launched last week) and as you likely know I love keeping track of everything! Enter Bandbreite, the best app for detailing your band collection. I’ve been using it for a long time but a recent update which adds logging has meant I now use it every day. They also have a nice stats export for showcasing a collection.
Music
Diamonds & Dancefloors by Ava Max - I’ve been a secret fan of Ava Max ever since I heard her in Clap Your Hands on the Forza Horizon 5 soundtrack. Ironically, given this issue’s game recommendation, I also usually listen to her albums whilst pressure washing the patio. In any case, this new album is excellent (and available in Spatial Audio 😉). Every track is catchy but I’m particularly fond of Sleepwalker, Hold Up (Wait A Minute), and Cold As Ice.
TV Shows
What We Do in the Shadows - A Taika Waititi / Jermaine Clement created mockumentary comedy series about a group of vampires that have shared a house together for centuries. One of those vampires is Matt Berry. Need I say more? Need. I. Say. More.
Roadmap
The roadmap is my way of committing to what I’m going to do before the next issue:
16th February - 15th March
Complete the Darkest Dungeon app ❌
Get back into working on my Board Game Lists app ❌
Oof, not ideal! The Darkest Dungeon app has taken a lot longer than I expected and some client work kept me away from jumping back into Board Game Lists but it’s definitely something I want to work on.
I’ve still got a lot of client bits to work on, a brief trip to Sweden, and the Easter holidays with my children so it’s going to be another case of “1 month until the next issue”:
16th March - 12th April (Issue #8)
Complete the Darkest Dungeon app. For realsies.
Work on the Board Game Lists app
Have Music Library Tracker v2.1 ready for submission to the App Store
I’ve treated myself to something I’ve wanted for a long time… a receipt printer. I don’t know why but I love the idea of being able to print out reminders or widget type content on a little tearable piece of paper. My aim is to get to grips with the ZPL language the printer uses and build a basic Mac Catalyst app that can send some automated print commands.
That wraps it up for this issue. I hope you found something of interest and that you’ll be able to recommend the newsletter to your friends, family, and colleagues. You can always comment on this issue or email me directly via ben@bendodson.com
I ordered the Alliances expansion alongside the recently revealed Covenant expansion but unfortunately it’ll all ship together when that is released. At least I should be one of the first to get Covenant so it won’t take long to get it into the app!
You can download my historic monthly breakdown if you’re interested. With the change from a 70/30 split to an 85/15 split for the last 2 years, the actual amount I’ve given to Apple over the past 7 years has been around 26% leaving an average monthly profit of $59.83.
I don’t use any analytics in my apps so I couldn’t see any realtime usage information.
It definitely came as a result of submitting that form as the email was sent to my personal address which I’d used on the form, not my Apple Developer account email address.
I nearly didn’t as they inexplicably used Microsoft Teams 🤣
After the “Stoutness Exercises” performed by Winnie-the-Pooh which I resemble when I do my chiropractic stretches.
This is as close as I can get to mimicking the Sleep focus mode currently although I should be able to turn off the Always On display on the iPhone 14 Pro when iOS 16.4 is released later this month.
It’s been 8 years Apple. Why isn’t there a Donald Duck version yet 😭