← All Projects

Flagship Product

BeatMap

An iOS music journaling system with hardened Spotify auth, durable local data, and location-aware entries.

SwiftSwiftUICore DataMapKitShazamKitSpotify APIOAuth 2.0 PKCEAVFoundationCryptoKitiOS Keychain

Problem

Combine music recognition, journaling, and Spotify connectivity without compromising auth reliability or on-device persistence.

System

SwiftUI app with OAuth 2.0 PKCE, CryptoKit hashing, Keychain token storage, Core Data, and ShazamKit integration.

Result

A working v1.1.0 app with background refresh, Core Data migration, and stable third-party API integration.

BeatMap placeholder showing the map and capture flow BeatMap placeholder showing the journal and insights flow

Problem

BeatMap lets you create diary entries linked to songs, your location, and personal metrics — mood, nostalgia, energy. It pulls live data from Spotify, identifies songs via ShazamKit, and builds an insights dashboard that surfaces patterns in your listening history over time.

The idea came from wanting a way to remember not just what I listened to, but where I was and how I felt. Spotify Wrapped gives you stats once a year. BeatMap gives you a living map of your music and your life.

What shipped — v1.1.0

The core loop is fully functional: create entries, tag songs (via Shazam or Spotify search), pin locations on a map, rate your mood/nostalgia/energy, and browse your history. The insights dashboard shows patterns over time.

v1.1.0 shipped Core Data migration (moved off UserDefaults), AirDrop sharing between devices, and proper Spotify integration with background token refresh.

System design challenges

Competing audio sessions. ShazamKit needs microphone access and runs its own audio session. Spotify playback preview uses AVFoundation. Getting them to coexist without one killing the other — and without the user ever noticing — took longer than the rest of the Spotify integration combined.

OAuth 2.0 PKCE from scratch. Spotify’s auth flow on iOS meant building the full PKCE dance: generating code verifiers, SHA256 hashing with CryptoKit, handling redirects, storing tokens in Keychain, and silently refreshing them before they expire. No third-party libraries.

Core Data migration. Moving from UserDefaults to Core Data mid-project meant writing a migration layer that preserved every existing entry. Lightweight migrations handled the schema, but the data transform was manual.

Result

BeatMap moved from an idea to a functioning product with a hardened auth pipeline, persistent local storage, and a clear product loop. The interesting part is not that it uses Spotify, but that the integration is designed to survive real-world token expiry, schema changes, and app lifecycle interruptions.

What’s next

  • Apple Music support as an alternative to Spotify
  • Widget for quick entry creation
  • Share cards — exportable images of your entries for social media
  • TestFlight beta, then App Store submission