Cosmicast 2.0: This Post Should’ve Been a Podcast Episode Shihab Follow Apr 7 · 9 min read

Cosmicast

Intro

I make apps. Small apps, big apps, notes apps, utility apps, social network apps, you name it. I also happen to make a small podcast player called Cosmicast, and this week I updated it to 2.0.

This wasn’t a 2.0 like any other. This was a complete rewrite from the ground up. It was essentially its own new app. I already had a podcast app on the App Store, so it made sense to launch it on top of that one. One of the most prominent questions I kept receiving was whether it was built using SwiftUI. No. It was built using pure Swift, and entirely atop UIKit.

SwiftUI may be great and all, but it’s still too young for me to dabble with, uhh phrasing. I’ve personally been using Swift for the past five years since its launch (also the amount of time I’ve been making apps), and it’s something I’ve grown quite fond of, and dare I say, experienced in. The animations I sprinkle throughout my apps may feel like something easily achieved with SwiftUI, but instead it’s something not-so-easily achieved with Swift. I’ve also made a small developer utility app called Fabula which allows you to craft and play with animations, and a color utility called Aurora which lets you get extensive information about tints from palettes and the real world (just to show how serious I am about animation and design).

You may ask what sets this app apart from the myriad of other podcast apps out there, and I would struggle to come up with a definite answer. It could be the great UI and animations, or it could be its simplicity and ease of use. Maybe it’s even the way it feels like a callback to fonder times when skeuomorphism reigned and the world was a better place. Either way, you have to use it to understand what sets it apart, and the joy it sparks.

Cosmicast Development

Ever since version 1.0, I’ve always wanted my podcast app to tick three specific boxes. I wanted it to be able to play podcasts (duh), discover podcasts without any fuss or complex parameters, and look beautiful whilst doing so. Without the first one, it wouldn’t be a podcast player. But without the last one, it wouldn’t be a podcast player by me.

The new Cosmicast (including the iPhone app, iPad layout, Watch app, and Mac app) was created from scratch in about a week. That may sound ridiculous, but it’s very achievable. I started on Thursday March 26th with an urge to make something that people would enjoy using. After all, that’s what apps should be, right? A little bundle of joy that inspires awe. Otherwise people would just use websites (shudders) or Siri Shortcuts to achieve what they needed to. I would like to say I started by drawing some wireframes or throwing together some dirty mockups in Sketch, but that would be a lie. I’m personally not a fan of planning out an idea as I find that unnecessarily restricts the vision to a very concrete set of steps. Instead, I dive straight in to coding my vision. That way, I have parts of a working app at the end of it. This is not to say that mocking up and planning ideas is bad, it’s just not for me.

The first thing I wanted to create with my new podcast app was a playful skeuomorphic element, and what better place to incorporate this than in the player view. The notion of vinyls on a turntable came to mind almost instantly and I didn’t second guess it at all. In hindsight, I probably should have, as it’s been pointed out to me many times since then that no podcast has ever come in vinyl format. This was coded in a way where tapping the play button spun the vinyl, and tapping pause would stop it rotating, which I enhanced further by increasing the scale of the vinyl too when played, and adding an arm that rotates in when it’s playing. I needed to add a discover section, a library, and a categories/topics section somewhere in the app, and seeing as I had given a lot of emphasis to the player view, it made sense to me to have that as the central view, with all other views revolving around that in some way or form.

I’m not a huge fan of modal presentation views, and tend to use them sparingly. And so, I made the podcast lists accessible in the same view as the player, a button tap (and an animation) away at all times. I also added a gesture to this later on in the week to make it even easier to access and dismiss. I did end up using modal views for accessing podcasts and episodes, as I found that was a different context altogether, and needed a separate visual dissonance. Podcast views had their own little whimsical addition. A vinyl animating out of its sleeve, almost as though it was being opened and slid out. This again tied in to the approach my app was taking with using skeuomorphic elements where applicable. By the end of the first day I had the layout of the app and various moving parts sorted (along with real data being fetched).

Day two began with tidying up the visuals throughout the app to make it look as clean and professional as I could, and posting a tweet about what I had been up to. To my surprise, this ended up getting a lot of interest and traction, suggesting that what I was working on was something people wanted to use, and something I should probably get to finishing soon. This gave me the much-needed motivation to further refine the app and add in more features at the request of my Twitter followers. I also went on to add iPad support, which involved a different layout for landscape to make the most of the space available on larger-screened devcies. Just inflating the app wasn’t an option for me as I knew how annoying it was to use an iPad app that felt like an iPhone app.

Cosmicast on iPad

All this while, I had submitted a TestFlight build and was waiting for that to be approved (what’s up with TestFlight builds taking longer to review than App Store apps anyways?), which finally got approved on Monday March 30th, and I let it out in the wild for the first time. Scary. But also very rewarding, because the feedback was overwhelmingly positive. This also gave me a chance to find and squash any bugs I had with the app. And in the meantime, I added things like iMessage Stickers, Siri Shortcuts, custom app icons, home screen Quick Actions, and more.

On Wednesday April 1st I added Apple Watch app support, and on Thursday April 2nd I added Mac app support using Catalyst (which I also tweeted about). The Mac app included a toolbar and menubar items, along with slight restructuring and the lack of some areas like Siri Shortcuts and alternative app icons. This was done much quicker than I had anticipated, and it gave me time to let the app rest and marinate for a bit, to see whether any surprise bugs or issues popped up. Alongside this, I started making App Store screenshots (because if I left this to the last day, it would definitely get frustrating). With screenshots, I always try to make them look as clean and generic as I can, which includes setting the time to 9:41, battery levels to max charge, and network status to full bars in the simulator.

xcrun simctl status_bar BOOTED override — time “9:41” — batteryState charged — cellularBars 4 — batteryLevel 100

Also on Thursday April 2nd I submitted the app for review (which comprised of the iOS and macOS variants in a unified app bundle). These went into review in under an hour, and both got rejected in about another hour. Seeing a rejection message is terrifying, as it could be a number of things either wrong with your app or with the metadata in the app submission. This time, it was a metadata rejection, and the reason was odd. For the iOS app, the reviewer requested a video of the app running on a physical watchOS device, and made it clear that it could not be a simulator. Odd. Almost as though they’re aware of some bugs on the simulator that behaves differently to a physical device. And the Mac app got rejected due to screenshots containing podcast artwork for podcasts I hadn’t got explicit permission to use. Fair enough.

Cosmicast on Mac

I set about recording a video of the app running on the Apple Watch, and I encountered various bugs that I hadn’t come across on the simulator. Huh, I was glad they rejected it now. I rectified these and updated the screenshots with artwork I had permission to use, and then I realised I hadn’t made an app preview video. What better way to show animations and whimsy in an app than through a video? This was pretty quick, and something I have created a template for in iMovie already for many of the previous apps I’ve made. Similar to screenshots, I tend to set the status bar elements looking pretty, and start recording.

xcrun simctl io booted recordVideo clip.mov

The app was submitted again for review on Friday April 3rd, which got approved for the iOS counterpart almost immediately, but the macOS bundle got rejected again. This time for failing to provide read permission in the file manager when attempting to import podcasts, woops. This finally got approved on Monday April 6th (cutting it quite close), and launched on Tuesday April 7th. The app is available as a single unified purchase on the App Store, so you can get the iPhone, iPad, Apple Watch, and Mac app all in one go with no hidden IAP or extra costs.

In the meantime whilst the app was waiting for review and launch, I was busy working on the next update. This includes CarPlay support, chapter markers support, more Siri Shortcuts, more alternative app icons, more iPad keyboard shortcuts, and a variety of other additions and fixes that didn’t make it into the launch version of the app. Adding CarPlay support was entirely new to me, and involved filling out a quick form and sending it off to Apple to request special entitlements that would allow for it to be deployed on the App Store. Getting this entitlement took about two to three days, and the response involved a helpful link to a PDF detailing how to use the CarPlay-specific APIs and frameworks.

Cosmicast on CarPlay

There’s a lot more I plan to add with each subsequent update to Cosmicast, and I can’t wait to get it all out there. If you want access to a variety of the images/videos used here and on the App Store, I have a press kit available. You may also be asking why I chose to use a turntable vinyl metaphor for a podcast app, and to that I have no valid response apart from me wanting to try new things and play around with what a podcast app should be. I also plan to include music in this app in the future. But more importantly, Hello Internet has a vinyl episode so it’s only fitting.

Outro

If you’ve got this far through this wall of text, thank you for taking the time to read about my journey. If you enjoy using Cosmicast, please let me know and leave a review on the App Store. If you don’t enjoy using the app, please let me know so I can improve it through an update. I’m a solo independent developer who loves all things Apple. Creating apps like this in my spare time allows me to pour my creativity into something I can be proud of. Seeing support for the same apps inspires and motivates me to go further and do more.

I’m very grateful for the support I receive on Twitter and elsewhere from people I admire and look up to. These people create better products than I do, yet hype up my products like their own. A lot of what I do couldn’t be done without the insight they provide, the help they give, and the guidance they impart. Building an iOS app is made better by the community that consumes it, and I’m thankful for the great community I’ve started to become a part of.

Please let me know if you have any questions or feedback about my random ramblings through Twitter @JPEGuin.