Building an AI-Powered Worship Song Recommender with Rust, Qdrant, and Voyage AI
Sometimes the best side projects aren’t the ones with thousands of users.
Sometimes they’re the ones that solve a problem you’ve personally struggled with for years.
As a worship leader, one of my recurring responsibilities is preparing a set list around a sermon theme. If the sermon is about faith despite uncertainty, I need songs that reinforce that message. If it’s about grace, surrender, or hope, the songs should naturally support the same narrative.
The problem isn’t that I don’t know enough songs.
The problem is that I know too many.
After years of serving, my playlist has grown to hundreds of worship songs from different churches, languages, and generations. Remembering which songs fit a particular theme is surprisingly difficult.
Why not just use ChatGPT?
That was actually my first attempt.
I tried ChatGPT, Gemini, and Grok.
While they could recommend popular worship songs, I found two limitations for my workflow.
First, the recommendations didn’t always align with the songs commonly sung in my church or with my own repertoire. General-purpose LLMs have an enormous knowledge base, but they don’t know my library.
Second, they don’t naturally consider musical constraints such as BPM and key, both of which are important when arranging a medley. Even if two songs share a similar theme, they may transition poorly if they’re musically incompatible.
I wanted something that searched my collection instead of the internet’s collective knowledge.
So I built one.
Introducing Medley Recommender
Medley Recommender is a personal recommendation engine that searches worship songs based on semantic similarity.
See here: https://medley.marchell.xyz
Instead of asking:
“Does this song contain the word faith?”
it answers:
“Which songs communicate the same idea?”
The project indexes each song using:
- Lyrics
- BPM
- Musical key
- Other metadata
Given a theme or an explanation of the theme, it recommends songs that are semantically similar while also exposing musical information useful for building a medley.
The Tech Stack
I wanted this project to be an excuse to explore technologies I hadn’t used before.
The current stack is:
- Rust for the application
- Qdrant as the vector database
- Voyage AI for text embeddings
I chose Voyage AI primarily because of its generous free tier—200 million embedding tokens—which makes hobby projects like this essentially free.
Rust was simply an excuse to get more hands-on experience with the ecosystem, while Qdrant turned out to be a pleasure to work with for vector search.
How It Works
The pipeline is fairly straightforward.
- Collect worship youtube urls and lyrics.
- Store lyrics and metadata.
- Generate embeddings from the lyrics using Voyage AI.
- Store the vectors in Qdrant.
- Perform nearest-neighbor search to recommend similar songs.
The interesting part is that recommendations are driven primarily by semantic meaning rather than keyword matching.
Searching for “walking by faith” doesn’t require those exact words to appear in the lyrics. Songs that express the same idea naturally cluster together in embedding space.
What Worked Surprisingly Well
The semantic search.
I expected reasonable results.
Instead, I found recommendations that often felt much closer to how I personally think about worship themes.
Instead of searching my memory, I can now search by meaning.
That has made preparing worship sets significantly easier.
What Didn’t
The weakest part of the system isn’t the AI.
It’s the musical metadata.
Automatically extracting BPM and key from real-world recordings is much harder than I expected. Live recordings, tempo changes, intros, and modulations all make the analysis less reliable.
The current metadata is usable but still needs improvement before I’d fully trust it when arranging medleys.
Ironically, the AI portion ended up being easier than the digital signal processing.
What’s Next
There are plenty of improvements I’d like to explore:
- Improve BPM and key extraction accuracy.
- Better ranking by combining semantic similarity with musical compatibility.
- Smarter medley suggestions instead of individual song recommendations.
- Playlist optimization based on energy progression.
Final Thoughts
This isn’t a product.
I have no plans to commercialize it or make it into a SaaS.
It’s simply a personal tool that solves a problem I’ve had for years, while giving me an excuse to learn Rust, vector databases, and modern embedding models.
I think that’s one of the best reasons to build software.
Not because the world needs another startup, but because sometimes the best way to learn a technology is to apply it to a problem you genuinely care about.
If you’re interested in the implementation, feel free to check out the (GitHub repository)[https://github.com/marchellll/medley-recommender]. Feedback, ideas, and suggestions are always welcome.