Rejections, Redesigns, and the Marketing Mountain
The last few weeks have been a blur of code, coffee, and the occasional existential crisis about whether Apple will ever approve my app. BillKit is finally done and submitted, AudiBar got a substantial facelift, Chronode is ticking along nicely in the background, and I'm still pretending I'll make a decision about Kanodo any day now.
BillKit: Complete (Eventually)
If you've been following along, you might remember me mentioning the 123 invoices sitting in my expenses folder, mocking me. That frustration turned into an intense build sprint at the end of October, and BillKit went from "I really should deal with those invoices" to a functioning native app with AI processing in about a week. Scratching your own itch really does focus the mind.
The core came together quickly, but the polishing took considerably longer than planned. Not because I kept adding features, as I was actually quite disciplined about that, but because real-world usage throws up edge cases you'd never think of while building in isolation. Every time I thought "right, that's it," I'd discover another scenario where the app would cheerfully do something stupid.
One week was spent finishing the app itself. Another week went into the website and documentation, which felt about as exciting as filling out tax forms. Necessary, but tedious. By the end of last week, everything was polished and ready, so I submitted to the App Store and waited.
Sunday morning: rejected.
Missing terms and privacy policies in the upgrade panel. Fair enough, really. This was my first subscription-based app rather than a one-time purchase, so I half-expected something to go wrong. I'd have been more surprised if it sailed through first time.
Fixed the issues, resubmitted. Monday: rejected again.
This time I was genuinely surprised. Not because of the rejection itself, but because these were completely different issues. Apparently the first reviewer just didn't mention them. The problems were twofold. China was included in my availability regions, which is a no-go because the app can connect to OpenAI's ChatGPT. I had absolutely no idea this was even a thing. You learn something new every rejection, I suppose.
They also wanted a restore purchases button. There's a certain irony here, as BillKit already checks licence status on launch and listens for subscription changes automatically, a lesson I learned from AudiBar. The button will almost certainly never be used. But rules are rules.
So I disabled Mainland China, added the restore button, and submitted for a third time. Fingers firmly crossed.
BillKit is also my first subscription-based app rather than a one-time purchase. AudiBar and Chronode both use the traditional "pay once, own forever" model, but I wanted to test whether subscriptions were worth pursuing for future apps. I've long suspected people are fed up with subscriptions for everything, but then I occasionally see discussions on Reddit where people actually prefer them. Time will tell which model works better. At least now I'll have real data to compare.
Speaking of App Store economics, I mentioned in my last post that I'd applied for Apple's Small Business Program after discovering I was only keeping about 56% of each sale. Good news: I was finally accepted. That drops Apple's commission from 30% to 15%, which makes the numbers considerably less painful.
AudiBar Gets a Makeover
With BillKit out the door (sort of), I turned my attention to AudiBar. The app had been using standard dark and light modes, and I wanted to move away from that. Partly aesthetic, as I really liked how Chronode looked with its consistent colour scheme rather than adapting to system appearance. But also practical. Supporting both modes properly is more work than you'd think, and let's be honest: light mode makes most apps look a bit rubbish.
The new UI uses AudiBar's signature lime-to-leaf green throughout. It looks more intentional now, like a proper app rather than a collection of components that happen to be in the same window.
New Track Controls
While I was rebuilding the interface, I swapped out the text-and-icon buttons for icon-only buttons with tooltips. This freed up space for something I'd wanted for ages: a proper track seeker. You can now scrub through whatever you're listening to instead of being stuck with play and pause. I also added previous and next track buttons, which probably should have been there from the start.
The Playlist Window
The playlist panel is now a proper window rather than a fixed panel with a close button. You can resize it, minimise it, fullscreen it. All the standard window controls Mac users expect. This sounds like a small change, but it matters for localisation. German and French translations are invariably longer than English, and a fixed-size panel would have forced me to either truncate text or cram things in awkwardly. A resizable window sidesteps the problem entirely.
Streaming Audio
This was the big addition. I'd wanted streaming support for a while, and it turned out to be easier than expected. Getting audio streams to actually play through AVPlayer took about a day. The fiddlier part was parsing playlist formats. I had to work out which formats people actually use and build parsers for each one. A couple of days in total, and it works really well. The navbar needed some reworking to show whether you're listening to a stream or a local track, but that was straightforward enough.
The Kanodo Question
Ah, Kanodo . My most ambitious app. My most feature-rich app. My most "this really should be finished by now" app.
If you're not familiar with it, Kanodo is a native macOS kanban board with some features I haven't seen elsewhere. Cards open in actual windows rather than poky little modals. Mini-boards can be nested inside cards for breaking down complex tasks. A three-date system tracks start dates, work dates, and deadlines separately. It's the app I built because Trello kept irritating me and I wanted my data stored locally.
It's about 99% done. All the features work. What's left is an audit for memory leaks and performance issues, plus documentation. The documentation is the daunting part. There's a lot in this app, and writing it all up properly is a substantial undertaking.
Will I release it? Probably. Almost certainly. I've put too much work into it to leave it gathering dust. But I'm giving myself a few more weeks to decide. Another shelved project? Perhaps. We'll see.
Marketing: The Bit I'm Dreading
Three months. Four apps. Three released (well, two released and one in review purgatory). Zero marketing.
I've done absolutely nothing to let people know these apps exist. January is when I need to fix that, ideally on a budget of approximately nothing. Maybe £100 to £150 if I'm being generous with myself.
Here's my problem. I'm a developer, not a marketer, and I find the whole business genuinely stressful. I have no desire to be the person shoving things in people's faces shouting "Buy my shit!" I don't want to convince anyone to buy something they don't need or can't afford. I lean quite Buddhist in my approach to life. Minimal possessions, minimal attachment, minimal noise.
But that creates an obvious tension. I need to make money if this solo developer thing is going to work. I need people to know my apps exist. I can't just build things and hope the right people magically stumble across them.
So I'm trying to find the middle ground. Marketing that's honest. Letting people know what I've built without being obnoxious about it. If you've managed this balance yourself, or have ideas for marketing on a genuine shoestring with your conscience intact, I'd genuinely love to hear from you.
Looking Ahead to 2026
I mentioned a while back that I wanted to build an iOS app early next year. That hasn't materialised into any concrete ideas, so I've changed direction. I'm going back to Laravel for a bit.
My brain has been fully immersed in Swift for three months. That's not long in the grand scheme of things, but I already feel out of touch with the PHP community. Frameworks evolve, tools improve, best practices shift. If this solo venture doesn't work out and I need to return to employed work, I can't afford to be rusty in my primary language.
I've got a few web app ideas floating around, nothing decided yet. I'll nail down a direction by next month and share what I'm working on then. I'll also have some actual download and visitor stats to share by that point, so we can see whether anyone's actually finding these apps.
Until then, I'll be refreshing the App Store Connect page and hoping third time's the charm.