Selected Work · Case 04

Qualfita, AI Music-Taste Mapper

My role: Founder, designer, builder. Research, brand, visual identity, frontend, and the recommendation engine, built by directing AI agents. Live at: qualfita.com.br (still testable). Status: Launched, then paused, my sharpest craft work, and an honest post-mortem.

Span2026
DomainConsumer Music · AI
DataEvery Noise · Ishkur · Last.fm
TeamSolo
TL;DR

Qualfita reads your Spotify library and hands you "tapes", recommendations for what your shelf is missing, each one with the reason behind it, wrapped in an 80s cassette visual language.

The craft is the strongest thing I've built, this very portfolio is qualfita-inspired. But the entry barrier strangled conversion, and reading that signal honestly is why it's paused. This case is about both.

Status
PAUSED
Connected users
21
Rec feedbacks
149
Genres indexed
6,291

Context

Streaming algorithms are optimized to keep you listening, not to widen you. Over time they flatten taste into a comfortable loop. Qualfita does the opposite: it reads what you already like and shows you what's missing next to it, with an explanation you can actually trust.

The premise: real discovery starts from what you already are. So the product doesn't hand you a generic playlist, it reads your shelf, maps the shape of it, and pulls the adjacent things you haven't heard, each with the why.

Qualfita full analysis page, the shape of your taste
Fig. 01 / The full analysis. Diagnostic, four tapes, and "what your shelf is missing", each recommendation carrying the reason it was picked.

The design problem

Recommending music is easy. Recommending it with a trustworthy reason, without the model inventing artists or genres that don't exist, is the hard part.

An LLM asked "what should this person listen to?" will happily hallucinate a plausible-sounding band that never existed. In a discovery product, that quietly destroys trust: one fake recommendation and the user stops believing the real ones. The bottleneck was never taste, it was grounding.

That's the same trust problem I design around everywhere: the system has to show where each answer comes from, and refuse to guess when it can't.

How it works

Three public music datasets feed a language model that recommends in four modes, with anti-hallucination baked in.

Layer 01

Data sources

Every Noise at Once (6,291 genres with coordinates + anchor artists), Ishkur's Guide for electronic-music positioning, and Last.fm for enrichment, not direction.

Layer 02

Recommendation engine

Your library is bucketed head / mid / tail, seeds go to an LLM with grounded context, and every returned artist is fuzzy-matched against the real index to reject anything invented.

Layer 03

The four tapes

What's missing, what goes deeper (B-sides, side projects), what's adjacent (one scene over), and what connects (the story between artists you already love).

Grounding, so it doesn't lie to you

Every recommendation is checked against a real catalogue before it reaches you:

EVERY NOISE ISHKUR LAST.FM LLM

The model proposes, but a fuzzy-match / Levenshtein pass and an anchor quorum reject anything that doesn't exist in the index. It's the same discipline as source-tagging in my other work: the LLM is a material with its own failure mode, and the design exists to catch it.

The design, cassette as a system

The visual identity is built on an 80s cassette language, BASF-tape blues, reds and yellows, mono type, the physical metaphor of Side A / Side B. It's the most complete visual system I've made, to the point that this portfolio you're reading is itself qualfita-inspired.

The "tape" isn't decoration: it's the mental model. A tape is a curated, finite, personal object, which is exactly what a good recommendation set should feel like, against the infinite, impersonal scroll of a streaming feed.

Qualfita cassette visual identity
Fig. 02 / The cassette system. Side A to begin, Side B to discover, the physical object as the interface metaphor.

Launch, and the hard truth

A launch video pulled roughly 4,000 views and drove around 100 people to the site. Of those, 21 actually connected their Spotify and synced their library, that's the real conversion number.

The gap between ~100 visits and 21 syncs is the entry barrier in one line: to get a single recommendation, a user needed a Spotify account and a manual library sync (a bookmarklet that only runs on desktop). That's a heavy door before any value.

But here's the other half: those 21 users left 149 recommendation feedbacks, around seven each. Whoever crossed the barrier, engaged. The product worked; the door was too heavy. I built a no-login "hero moment", one artist in, three grounded recommendations with the why, no signup, to soften that door. It helped. It wasn't enough.

The honest decision to pause

Qualfita was meant to be a portfolio project. It ended up taking more energy than a portfolio piece should, chasing a conversion that a convenience war against Spotify was never going to win, Spotify copies fast and owns the account you'd have to connect through.

So I paused it. Not because the craft failed, the base is strong and it's still standing, but because reading that signal and stopping is the product call I'm proud of, more than any launch metric. It's sleeping, with a solid foundation, in case a lighter entry path shows up later.

What I'd flag in an interview

The entry barrier is the whole lesson. A product can be beautifully built, engaging for the people who reach it, and still fail on the one thing that happens before the first taste of value. Reading that in the numbers, and choosing to stop rather than pour more energy in, is product judgment, not failure.

I build by directing AI. The engine, the grounding, the pipeline, all built by directing AI agents rather than hand-coding, with the design carrying the trust load the model can't. That's how I ship end-to-end, solo.

MADE-WITH-AIQualfita was built by directing AI agents; the direction, the design, and the honest reads were mine. Same principle the product itself runs on.

Next case
Piná, AI for Urban-Code Compliance
Let's Talk Let's Talk Let's Talk Let's Talk