Inspiration
We wanted to solve the problem of missing fashion releases that match personal style. Existing platforms are generic and noisy. We built FastFit Radar to deliver personalized, AI-driven notifications that learn from user feedback, so users only see products that match their taste.
What it does
FastFit Radar monitors fashion brand RSS feeds (Adidas, HYPEBEAST, Luxury Daily) for new releases, stores products in Redis Memory with semantic embeddings, and matches them to individual user taste profiles. Users receive personalized email notifications with product recommendations. Clicking "good" or "bad" on products improves future matches. The system learns preferences over time, filtering out disliked items and prioritizing preferred brands.
How we built it
Backend: FastAPI (Python) with async polling that monitors RSS feeds every 10 minutes. Products are embedded using OpenAI's text-embedding-3-small and stored in Redis Agent Memory Server (RedisVL) for semantic search. User preferences are stored as semantic memories with taste profile embeddings derived from liked products.Frontend: Next.js with TailwindCSS for a minimal subscription interface.Architecture:
- Continuous RSS polling service runs in the background
- Semantic search matches products to user taste profiles
- Email notifications via Resend API with embedded feedback tracking
- Feedback loop updates user preferences in real-time
Key integrations:
- Redis Agent Memory Server for vector storage and semantic search
- OpenAI for embeddings
- Resend for transactional emails
- RSS feed parsing with
feedparser
Challenges we ran into
- Integrating Redis Agent Memory Server: Adapting the API to store products as semantic memories and extract metadata from entities required careful schema design.
- Building taste profiles: Averaging embeddings from liked products and ensuring semantic search accuracy needed iteration.
- RSS feed parsing: Inconsistent formats across brands required robust HTML stripping and image extraction.
- Real-time feedback loop: Tracking feedback from email clicks and updating preferences without blocking the notification flow.
- Duplicate detection: Preventing the same product from being stored multiple times across polling cycles.
Accomplishments that we're proud of
- End-to-end personalization: From RSS feed to personalized email notifications with a working feedback loop.
- Scalable architecture: Background polling service handles continuous feed monitoring without blocking API requests.
- Semantic matching: Vector search finds products similar to user preferences, not just keyword matches.
- Clean UI: Minimal, modern frontend focused on user experience.
- Production-ready error handling: Graceful degradation when feeds fail or emails can't be sent.
What we learned
- Semantic search power: Vector embeddings capture style preferences better than keyword matching.
- Agent Memory Server: RedisVL provides a solid foundation for building AI-driven applications with persistent memory.
- Feedback loops: Simple "good/bad" clicks can significantly improve recommendation quality.
- RSS limitations: RSS feeds vary in structure; robust parsing is essential for production use.
- Async architecture: Background services enable real-time features without blocking user-facing APIs.
What's next for Fastfit
- Enhanced taste profiles: Use product embeddings to build more accurate user taste profiles.
- Automatic notification loop: Scheduled matching and email sending based on user frequency preferences.
- More data sources: Integrate additional RSS feeds and potentially brand APIs for richer product data.
- Web dashboard: Expand the frontend to show matched products, preference management, and feedback history.
- Brand filtering: Let users explicitly select preferred brands in addition to learning from feedback.
- Price tracking: Monitor price changes and notify users when items go on sale.
- Social features: Share favorite finds with friends and see what others are discovering.
Built With
- fastapi
- nextjs
- redis
Log in or sign up for Devpost to join the conversation.