Inspiration
We've all been there — opening Netflix, Goodreads, or Steam, scrolling for ten minutes, and closing the app without picking anything. The problem isn't a lack of options; it's that none of these platforms let you search by how you actually feel. You don't wake up wanting "Drama" or "Action" — you want "something like Narnia, but with real stakes," or "dark and melancholic, like NieR." Existing recommendation systems are built on rigid keyword and genre matching, so even a small typo or an unfamiliar reference returns nothing. We wanted to build something that understood vibes, not just keywords — and that worked the same way across books, films, and games, since taste doesn't live in separate silos.
What it does
Vibeshelf lets users describe a mood, feeling, or reference in plain language and returns ranked recommendations across books, films, and games. Type "cozy adventure like a Miyazaki film" and the system decodes that into structured tags, scores them against a curated library of 547 titles, and visualizes results as an interactive constellation — closer to the center means a stronger match. Beyond the curated library, it also generates fresh AI picks live, so results never feel capped. Users can save items to a categorized shelf, build custom named lists ("Top 10 Movies"), rate recommendations with a thumbs up/down to train a personal taste profile (visualized as a radar chart), and explore a lightweight social layer — searching other users, viewing public shelves, and leaving appreciation "stamps" on profiles they like.
How we built it
The frontend is built with React and Vite, handling the home page, the vibe-search Discovery page, and the full profile/social system. The backend is a lightweight Express.js server that manages authentication, shelves, lists, and the reinforcement-learning taste scoring — and is the only layer that ever talks to our AI provider, keeping the API key safely server-side. For the AI layer, we use Llama 3.3-70B served through Groq's free inference API, chosen for its near-instant response times and zero-cost tier. User vibe descriptions are sent to Llama 3 for tag extraction, then matched against our curated dataset using Jaccard similarity scoring, with results re-ranked over time based on accumulated user feedback.
Challenges we ran into
Getting structured, reliable JSON back from an LLM consistently was harder than expected — Llama 3 occasionally wrapped its output in extra conversational text, so we had to add defensive parsing to strip anything outside the actual JSON payload. Balancing the reinforcement-learning weight adjustments was another challenge: too aggressive, and a single bad rating would overcorrect future results; too subtle, and feedback felt meaningless. We also hit a real-world deployment snag when GitHub's secret scanning correctly caught our Groq API key in an early commit, which sent us down the (valuable) path of properly separating environment-specific secrets from the codebase entirely.
Accomplishments that we're proud of
We're proud that the vibe-matching genuinely works on messy, real human input — typos, vague descriptions, and franchise references all resolve into sensible tags. We're also proud of building a complete, cohesive product rather than just a search demo: authentication, a working reinforcement-learning feedback loop, a visual taste profile, custom lists, and a social layer all came together into one consistent experience, running entirely on free infrastructure (Groq + free-tier hosting) without sacrificing responsiveness.
What we learned
We learned how much of "AI product design" is really about prompt engineering for structure, not just intelligence — getting consistent, parseable output from an LLM takes deliberate constraint-writing. We also learned the practical realities of shipping with secrets safely: environment variables, .gitignore discipline, and treating any exposed key as compromised immediately. On the product side, we learned that small personalization touches — a radar chart, a stamp, a named list — make a recommendation engine feel personal rather than generic, even when the underlying matching logic is fairly simple.
What's next for Vibeshelf
Next, we want to move from in-memory storage to a persistent database (MongoDB) so user data survives restarts, and expand our curated dataset via a real catalog API for broader coverage. We'd also like to layer collaborative filtering on top of our existing reinforcement-learning feedback, so recommendations can draw on patterns across users, not just one person's history. On the social side, we're excited to build out shared and community-curated lists, and a "following" system so users can track tastes they admire.
Built With
- claude
- cursor
- groq
- llama3
- netlify
- render
Log in or sign up for Devpost to join the conversation.