Inspiration
We were extremely inspired by the idea of a human-centered design which exists to make daily life easier. Originally, our team wanted to make a Cal Poly Campus meal-plan creator, but we decided to keep brainstorming because we wanted to make a project with a broader impact. Then, we had the idea of making a website where people can still decide what to eat, but rather than it being because of nutrition, it would be to cater to the preferences of multiple people with their own tastes.
What it does
Our project takes in the location of the user (either picks up the location of the computer or is entered manually by the user), prompts the user for the vibe for the meal (sit-down meal, casual dining, takeout etc.) as well as an optional choice of cuisine, and then allows the user to create multiple profiles of people with specific preferences (allergies, avoiding red-meat, spicy craving, along with an other option with additional preferences), and finally returns a list of restaurant nearby that find a middle ground where the maximum amount of people have their needs met. Results call a backend that pulls live Yelp listings (with open-now filtering when configured) and uses an LLM to rank spots for the whole group, respecting hard dietary constraints in the prompt logic. The UI shows distance, open/closed, price, rating, group match counts, optional per-person notes, and a “View on Yelp” link. Users can sort by best match, distance, or rating.
How we built it
This is a broad overview of how we built the website: Frontend: React 18 + Vite, React Router for Home / How It Works, Tailwind CSS for design. Flow: A linear onboarding (Start → Location → Vibe → People → loading → Results). Backend: Node + Express (server/) exposing POST /api/rank: it calls the Yelp Fusion API with vibe/cuisine-derived categories, then OpenAI (gpt-4o-mini) with JSON output to rank restaurants, attach scores, satisfaction counts, and short reasoning. Integration: The client uses VITE_API_URL (default http://localhost:3001) and shows a clear empty state if the API is down.
Challenges we ran into
Two moving parts here are Yelp results and LLM ranking. This introduces practical issues like latency, occasional timeouts, and partial failures such as missing API keys, rate limits, or empty search results. We had to account for these cases so the system could still return a useful response even when one part of the pipeline fails. Another challenge was grounding the model correctly. The prompt needed to consistently follow strict dietary rules while still producing clean, structured JSON that can be reliably parsed. This was especially difficult because real-world restaurant data is often messy, incomplete, or inconsistent, so the model had to stay accurate and structured even when the input data was not.
Accomplishments that we're proud of AND what we learned:
We are extremely proud of:
- learning how to use OPENAI_API_KEY and YELP_API_KEY
- building our first project from the ground up
- learning the importance of UI/UX design for accessibility
- mastering the use of Kiro and taking advantage of student access
- creating an idea that solves a real-world problem
What's next for NoBeef
We want to expand the website to reach more users, possibly through making an app. We also want to showcase results on a live map that users can visualize distance on. We want the results page to also recommend a personalized meal for each person at each restaurant option!
Built With
- css3
- javascript
- json
- jsx
- open-ai
- tailwind
- tsx
- yelp
Log in or sign up for Devpost to join the conversation.