Inspiration
Good food deals in Singapore are everywhere — and nowhere. They're buried across a dozen different Telegram channels, scattered Instagram stories, and hawker centre signboards you only notice if you happen to walk past at the right time. There's no way to just ask "what's a cheap Thai place near Clementi open this weekend?" and get an actual answer. We wanted to build the thing we kept wishing existed: a search bar that understands what you're craving, not just keywords you have to guess correctly.
What it does
MakanRadar takes a plain-language query — "1-for-1 sushi," "cheap dinner near Orchard this weekend," or just "fried chicken" — and returns real deals ranked by how well they actually match, with a plain-English explanation of why each one was surfaced. No dropdowns to configure before you can search; the dropdowns are there if you want to narrow things down, but the search bar is the whole point.
How we built it
- Frontend: React + Vite + TypeScript + Tailwind, built from a Figma design. Native View Transitions animate between Home → Search → Deal Detail, a typing effect reveals the logo on load, and a hand-drawn SVG "burger being bitten" animation covers loading states instead of a generic spinner.
- Backend: FastAPI, backed by Postgres (Supabase) with
pgvector. Each deal is embedded once with BGE-M3 and stored as a vector; a search query gets embedded the same way and ranked by cosine similarity. - Ranking: pure semantic similarity is the primary signal, with small additive boosts (+0.10 cuisine match, +0.10 location, +0.05 price, +0.10 date overlap) layered on top when the query contains those signals — a soft-boost model rather than hard filters, so a great semantic match never gets excluded just because it didn't literally say "Thai."
- Match explanations: computed after search, per result, never stored on the deal itself — because "why this matched" only means something in the context of a specific query. A deal doesn't have an inherent match percentage; it gets one when you search for something.
- Photos: sourced from Pexels' API, keyed off dish-specific keywords extracted from each deal's restaurant name and title, with cuisine-level fallback for anything without an obvious dish match.
- Voice search: the Web Speech API, so you can just talk instead of type.
-> Note: MakanRadar currently uses a realistic mock dataset of food promotions to demonstrate the full search and ranking flow.
Built With
- bge-m3
- cloudflare
- fastapi
- pgvector
- postgresql
- react
- supabase
- tailwindcss
- typescript
- webspeechapi
Log in or sign up for Devpost to join the conversation.