Inspiration
I have a large home music collection built up over decades that includes a lot of music not (yet) found on streaming services. I wanted a way to access that music online and take it with me on my iPhone, while still listening to the audio in its full, original quality.
A Synology NAS makes a fine home server for your music, but to access it on your phone, you're left to "enjoy" a mobile app that doesn’t get a lot of love or updates, or pay a significant sum for some quality media management software, which requires an additional ongoing investment to configure and maintain.
Those other apps, like streaming service alternatives, have all sorts of annoyances, first and foremost in that they're primarily built to keep you constantly consuming more, for people who "just want to listen to some music" or are largely motivated to replace FM radio, with new artist discovery and an endless, wandering playlist.
I just wanted to listen to albums of my purchased music, where even if I want to start with a particular song that's been stuck in my head all day, I want to hear it in context, starting with that track and then playing the rest of the album or a shuffle of the tracks.
There are a lot of good services designed to provide you with a never-ending mix of tracks curated by AI. I wanted an app that would play my music when I knew what I wanted to hear.
What it does
Aux was designed to put you in control of your music with a carefully crafted and optimized experience for quick interactions. The Aux app works with the free Audio Station server running on your Synology NAS to stream or download any audio file compatible with iOS, including lossless, high resolution, and spatial audio formats.
Aux is a fast and feature-rich app with a lot of customization options that connects directly to your NAS. Since Aux uses no servers of its own, your username, password, and all your other data are exchanged securely and directly with your NAS. If you've chosen not to expose your NAS directly to the internet, Aux also works with Synology's own QuickConnect service to relay the connection through Synology's secure servers.
See the App Store app description for a rundown of the features and benefits of Aux.
How I built it
Aux is designed as an iOS app, so I used Xcode to write the code in Swift, design the UI in Interface Builder, test, and iterate. I applied rigorous engineering practices, using Git for source control, using feature branches for experimental ideas, writing unit tests, reviewing my own code before merging, and tracking bugs, features, and ideas on a Kanban board.
The origins of Aux started as a personal passion project that wasn't intended for sale back in 2020. My primary use case was for an audio player that was designed for one-handed use while cycling. I quickly developed an MVP using undocumented backend APIs and the core features I wanted on the frontend. Apple had just released SwiftUI and I wanted to use a project to learn its new capabilities. So, I developed the app almost entirely with the new UI framework, dropping into UIKit only in a couple spots where APIs haven't been exposed to SwiftUI.
Then the app sat for years. I left Aux unattended for long periods and returned to it occasionally to rip things apart or add polish as I iterated through features and functionality. When I finally had what felt like a project that had turned into a product, I decided to share Aux with others who might appreciate the same affordances and attention to detail.
Challenges I ran into
SwiftUI wasn't ready for primetime upon its first release, and has required many changes since its initial release to add capabilities and iterate on its approach. As evidenced by many basic pieces of functionality available in UIKit that simply weren't available in SwiftUI (e.g., in a UITableView or UICollectionView), the framework was originally built for very narrow use cases and only over time has it built up more capabilities, included its own fundamental controls (e.g., a List that no longer wraps a UITableView), and exposed more APIs to become more flexible.
SwiftUI has changed significantly in its short years of existence, where approaches have changed with each new release. There were challenges building custom functionality that existed by default or was easy to accomplish in UIKit but wasn't yet available in SwiftUI, and then rewriting that same code multiple times as the path forward changed. There were challenges writing the code using new or existing technologies and frameworks (ObservableObject, StateObject, EnvironmentObject, Core Data, Combine), only to rewrite and refactor the code using yet newer technologies and frameworks (Observable and Observation, SwiftData, Swift Concurrency).
There were many Feedbacks filed for Apple and many discussions with Apple engineers at WWDC lab consultations, on the deceptively complex fundamentals of audio playback and networking, as well as the new Swift frameworks.
Accomplishments
I'm proud of building an app with brand new technologies and frameworks while keeping the focus on craftsmanship and a balance between control and simplicity — in the app architecture and in the UI, both of which I've continued to refine.
What I learned
Aside from the lessons taken from the challenges of a fast-paced ecosystem mentioned above, this was my first foray into a subscription app, so I enjoyed diving deep into StoreKit 2 and the enhancements offered by RevenueCat. I'm running no backend servers or services for this app, so it's a major benefit to have a platform to run experiments and dynamically change my paywall without an app deployment, as well as to visualize and analyze the growth of my user base and revenue.
What's next for Aux
Bug fixes, performance improvements, and marketing!
Log in or sign up for Devpost to join the conversation.