Most fragrance apps want you to buy more. Prefume is built on the opposite premise: your collection is already full of things you love and forgot about. Use them. Remember them.
Product Lead · iOS · SwiftUI
01 · The Journal
Prefume began with one shelf. In early 2025, I found a decant at the studio but could not remember how it had worn. That afternoon, I sketched the first timeline view in a SwiftUI file. Fragrantica, Parfumo, and fragrance forums are discovery tools built around the next purchase: new releases, new houses, trending notes, and community wishlists. They are good at suggesting what to smell next, but not at helping with the forty scents already on your shelf: bottles worn twice and forgotten, a six-month-old sample with no memory attached, and a collection growing faster than the attention it receives.
The goal was not to help you find more but to help you remember what you already have.
Prefume follows the natural rhythm of fragrance testing. Its journal records the full process from first spray to collection decision. Each fragrance has a timeline: first test, 2-hour check-in, end-of-day impression, a compliment in November, and the decision to buy again. Impressions no longer fade or change without a record.
02 · Today
The Today view answers a simple question: based on your collection, the weather, and what you wore recently, what should you wear this morning? It recommends only bottles you already own. This deliberate limit keeps the focus on using your collection rather than growing it. The design question was not how to find the best new scent, but how to rediscover one you already bought.
The first recommendation system was too complex too soon. It used nine scoring dimensions that needed months of journal data to become useful. For a new user with twenty fragrances, nine signals were just noise. The rebuild used three reliable inputs: collection status, weather fit, and overall preference patterns. We added complexity only when it had a clear purpose, such as hiding fragrances you rated poorly yesterday and extending the repeat window as your collection grows. The system became simpler and more useful.
Reducing the system to three inputs did not lower its quality. It made honest use of the data that was available.
Each fragrance in the reference catalogue has pre-computed context affinities for weather, time of day, and season. Recommendations can fit the context without pretending to know you better than your journal does. The catalogue contains 40,593 fragrances from 1,671 brands, but coverage is still the main gap. In a niche this deep, even forty thousand entries may not include a regional house or obscure extrait.
03 · Craft
Fragrance collecting is sensory, so the app needed to match both the practice and its feeling. One principle guided every detail: the interface should feel like the activity it supports, turning physical rituals into digital interactions that collectors recognise at once.
Getting the mist right took longer than the rest of the logging flow combined. I tuned the emitter values against slow-motion footage of a real atomiser filmed on a desk, and I am still refining it. Logging a wear triggers a SpriteKit dual-emitter spray animation from the bottom of the screen, with droplets and mist fading at the edges. It reflects the physical act of applying fragrance. Collectors noticed it immediately because it shows that the app understands the ritual, not only the data model. It became one of the details users mentioned most.
Each view has a background that responds to your collection. Colours drawn from perfume notes blend into ambient gradients: warm amber after a morning wear, cool blue after fresh citrus, and deep purple after a patchouli-heavy evening. The app's visual temperature changes with the day's fragrances, connecting the interface to its content instead of treating it as a static container.
The spray animation, gradient backgrounds, and paper-like entry cards are parts of one design language built on the journal's data. Every screen presents the collection, wear history, and preferences in the same way because the system is consistent. The design decisions support each other instead of competing for attention.
04 · Model
Most collectors regularly wear fewer than fifteen fragrances. The free tier reflects that: up to twelve fragrances in the collection, twelve on the wishlist, and full access to the journal, recommendation engine, and catalogue search. Everything that makes the app useful is free. Collectors who commit to the practice can pay to remove limits, not to unlock core features. As with the missing discovery feed, the app earns trust by not pressuring users to spend.
Extract is a one-time lifetime purchase with no subscription. It removes the collection limit and supports larger CSV imports for people moving from spreadsheets. The name is deliberate: in perfumery, extract is the highest concentration. It suggests purity, not simply more features. Revenue is modest so far, about $300 at $25 per user. That may be fair pricing for a niche tool, or it may show that the market is smaller than the product's depth suggests.
Outcomes
Engagement: 5 sessions per day comes naturally from how collectors already assess a fragrance. The structured workflow (first spray, 2h, 4h, end of day) supports an existing practice instead of inventing a new habit.
Positioning: users said the lack of commercial pressure was the main reason they trusted the app. This confirmed that rejecting discovery and ads was the defining product decision. A daily public build log on TikTok tested that belief: users watched features develop and responded in real time. Their feedback about complexity in the first two weeks also sped up the recommendation engine's move from nine scoring dimensions to three reliable inputs.
Onboarding lesson: the testing workflow, recommendation system, and wrapped review each work well on their own, but together they can overwhelm new users. Collectors who continue become devoted users, but some leave before seeing the value that appears after a few weeks of journaling. Depth is both the product's strength and its onboarding problem.
Scope: 390 commits across SwiftUI, SwiftData, and GRDB. The work includes a SpriteKit spray animation, three versions of the recommendation engine's architecture, and a reference catalogue of 40,593 entries from 1,671 brands. The most important changes were design decisions: reducing nine scoring inputs to three, replacing discovery with journaling, and helping people use what they own instead of buying more.
View on App Store