Inspiration
Certain songs bring back more than a moment — they bring back a place. A track can remind you of the street you walked down, the café where you first heard it, or a city you were discovering for the first time.
I wanted a simple way to preserve that connection without turning it into another public profile or social feed. Dejamu began as the idea of a private map that slowly fills with music tied to real places.
What it does
Dejamu is a local-first iOS journal for musical memories.
You can search for a song, listen to its preview, add a short note and date, and optionally attach your current location. Dejamu then places the song on your map using its artwork as the pin.
From there, you can:
- revisit entries from the map, weekly strip, list, or calendar
- edit or delete past memories
- generate a shareable card for a single entry
- see today’s song or a resurfaced memory in a home screen widget
- optionally receive a recall notification when returning near a saved place
There are no accounts, friends, or feeds. Entries are stored locally on the device.
How I built it
Dejamu is built entirely with SwiftUI for iOS 17 and later.
SwiftData stores each entry locally, while MapKit and Core Location capture and display its location. Song search uses the iTunes Search API, and AVPlayer handles 30-second previews. The widget uses WidgetKit and reads from the same SwiftData store through a shared App Group.
RevenueCat manages the dejamu_pro entitlement and presents a remotely configured paywall through RevenueCatUI. Pro unlocks the complete map experience, calendar browsing, and optional recall notifications.
I deliberately kept the architecture small: there is no backend, login, or synchronization layer. This makes the app more private and keeps the code focused on its core interaction.
Product and monetization thinking
The product principle behind Dejamu is:
Writing is free. Looking back is paid.
Creating memories and browsing them as a list remain free and unlimited. New users can also experience their first pins landing on the map before encountering the paywall. Dejamu Pro charges for the richer ways of revisiting a growing collection rather than limiting the act of recording it.
This felt more respectful than placing a cap on the number of memories a person could save, while still giving the subscription a clear and relevant purpose.
Challenges
One challenge was combining an interactive MapKit screen with a persistent, draggable SwiftUI bottom sheet without creating conflicting presentation states.
Sharing data with the widget also required moving the SwiftData store into an App Group container so that both targets could read the same entries.
Location introduced another set of decisions. I wanted it to be useful without making it mandatory, so every entry can be saved without coordinates. Reverse geocoding, denied permissions, unavailable song previews, and empty search results all needed graceful fallback states.
I also had to design the paywall around the product’s value instead of simply locking entry creation. That led to the free-writing, paid-reflection model.
What I learned
Building Dejamu taught me to work in complete vertical slices: first making one entry appear on a map, then adding search, location, browsing, sharing, monetization, and finally the widget and recall experience.
I also learned how boundaries between an app and its extensions affect storage, how entitlement state should flow through a SwiftUI app, and how much product design is involved in deciding what should remain free.
What’s next
My next focus would be reliability testing on more devices, accessibility improvements, and refining the onboarding and paywall based on feedback from real users.
Built With
- avfoundation
- core-location
- ios
- itunes-search-api
- mapkit
- revenuecat
- swift
- swiftdata
- swiftui
- usernotifications
- widgetkit
- xcode
Log in or sign up for Devpost to join the conversation.