Inspiration
We were inspired by the way apps like Tinder make discovery simple and engaging through swiping. At the same time, choosing what movie to watch, what music to listen to, or what book to read can be overwhelming because there are so many options across different platforms. We wanted to combine the simplicity of swiping with personalized media discovery.
That idea became "Taste Twins": an app that learns what users like through quick swipe decisions and turns those choices into recommendations, taste communities, and compatibility scores with friends.
What it does
Taste Twins is a swipe-based discovery app for movies, music, and books.
Users swipe right on content they like and left on content they are not interested in. Their swipe history is then used to build a personal taste profile.
From this profile, Taste Twins can:
- Recommend new movies, albums, and books based on previous likes.
- Place users into a "Taste Community" with people who have similar interests.
- Show popular content within that community.
- Allow friends to create or join a "Taste Twins Room" using a shareable code.
- Calculate a percentage score showing how similar two users' tastes are.
Instead of matching people based on profiles, Taste Twins matches people through the media they genuinely enjoy.
How we built it
We built Taste Twins as a full-stack web application using a monorepo structure.
The frontend was created with React, TypeScript, Vite, Tailwind CSS, Framer Motion, and React Query. Framer Motion was especially useful for creating the swipe-card animations and making the experience feel interactive and mobile-friendly.
The backend uses Node.js, Express, and TypeScript, with PostgreSQL and Prisma ORM for storing users, media items, swipe history, rooms, and taste information.
For media content, we integrated several external APIs:
- TMDB API for movies
- Spotify Web API for music
- Open Library API for books
We created one common media format so that content from all three APIs could be displayed in the same swipe deck.
Authentication is handled using JWT access and refresh tokens stored in httpOnly cookies.
For recommendations, we compare genres and categories from the user's liked content. Taste Twin percentages are calculated by comparing the items two users have liked, while Taste Communities use a lightweight clustering approach based on genre preferences.
We also added Docker support so the frontend, backend, and PostgreSQL database can be launched together.
Challenges we ran into
One of the biggest challenges was combining data from three completely different media APIs. Movies, music, and books all return different fields and structures, so we needed to normalize them into one consistent MediaItem format.
Another challenge was making personalization useful without building a complicated machine-learning system. Because this is a hackathon project, we focused on simple and explainable algorithms using genre overlap, preference vectors, and similarity scores.
Authentication and database setup also required careful coordination between the frontend and backend, particularly when working with JWT cookies and protected API routes.
We also had to consider what happens when external API credentials are missing. To make the project easier to demonstrate, we added local seeded media and demo users as a fallback.
Finally, creating a swipe interface that felt smooth rather than just functional required experimenting with animations, drag gestures, card movement, and responsive design.
Accomplishments that we're proud of
We are proud that Taste Twins is more than just a swipe interface. Swipes actually contribute to a user's taste profile and are reused across multiple features.
We successfully created an end-to-end experience that connects:
authentication → swiping → recommendations → taste communities → Taste Twins matching
We are also proud of integrating three different types of entertainment into one consistent experience.
Another accomplishment was designing the app so that it remains usable even without external API keys through seeded fallback data. This makes the project much easier to demonstrate and test.
The Taste Twins Room feature is also one of our favourite parts because it turns individual media preferences into a fun social experience that friends can compare together.
What we learned
This project taught us how important it is to design the structure of a full-stack application before building individual features.
We learned how to normalize data from multiple external APIs so the frontend can work with one predictable format rather than handling every provider separately.
We also gained experience with React Query, Prisma, PostgreSQL, Express middleware, JWT authentication, Docker, TypeScript, and external API integration.
From a product-design perspective, we learned that recommendation systems do not always need complex AI models to create an interesting experience. Even relatively simple preference scoring can become useful when combined with good interaction design.
Most importantly, we learned how different technical features can work together to create one connected user experience rather than feeling like separate parts of an application.
What's next for Taste Twins
The next step would be making the recommendation system more intelligent as the number of users and swipes grows.
Future improvements could include collaborative filtering so recommendations consider users with similar taste, rather than only genres.
We would also like to add:
- Friend profiles and friend lists
- Persistent group Taste Twins rooms
- More detailed taste statistics and visualizations
- Spotify playlist generation based on liked music
- Movie watchlists and book reading lists
- Social sharing of Taste Twin scores
- More advanced taste-community clustering
- Notifications when friends discover something you may like
- Additional media platforms and providers
- AI-generated explanations for why an item matches a user's taste
Our long-term goal is for Taste Twins to become a single place where people can discover entertainment, understand their own taste, and connect with others through the things they love.
Built With
- express.js
- framer-motion
- node.js
- postgresql
- prisma-orm
- react
- react-query
- tailwing-css
- typescript
- vite
Log in or sign up for Devpost to join the conversation.