iOS · SwiftUI

Aria

A native iOS music player built from scratch — a real 10-band parametric EQ, streaming and local playback, 157 tests, and zero third-party dependencies.

157tests across 19 files
0third-party deps
6audio formats
The problem

A player I’d actually use, owned end to end

I wanted one app that streams from YouTube and plays my local high-quality files, with an equalizer good enough to matter — and I wanted to understand every line of it. So: no third-party packages, and a test suite that lets me refactor audio code without fear.

YouTube can’t be embedded cleanly on iOS, and local audio needs careful file handling, so the hard parts were stream resolution, a real EQ signal path, and never losing a user’s library.

  • Zero dependencies — everything on Apple frameworks, so the app ages well.
  • iOS 16.6+, Swift 5, testable managers on @MainActor.
  • No API keys in the app — YouTube is resolved by a backend I control.
Architecture

Managers, a dual audio path, and a thin backend

SwiftUI views observe @MainActor managers. A dual playback path routes local files through an AVAudioEngine EQ and streams through AVPlayer; a small Python service resolves YouTube so the app holds no keys.

Key decisions

What I chose, and why

Decision

Zero third-party dependencies

over Swift Package Manager libraries

Everything sits on AVFoundation and SwiftUI, so there’s no supply chain to audit and nothing breaks on an iOS update.

Decision

A dual playback path

over one player for everything

Local files run through an AVAudioEngine EQ graph; streams use AVPlayer. Splitting them keeps the equalizer honest without breaking streaming.

Decision

Backend-mediated YouTube

over an embedded API key

A tiny Python service resolves stream URLs, so the shipped app carries no secret and the resolver can change without an app update.

Decision

157 tests across 19 files

over manual QA

Import, orphan cleanup, EQ transitions, and missing-track routing are all covered, so I can refactor the audio path without regressions.

Measured outcomes

The results

157Automated tests19 files
10-bandParametric EQ8 presets + per-band
0Dependencies
6Local formats
iOS 16.6+Deployment target