Inspiration

Trying to lose weight while eating at Truman's dining halls is honestly a struggle. The food is fine, but since it's all-you-can-eat, I find it way too hard to control myself, especially when I’m not sure what’s actually healthy. They post the macros and nutrients online, but manually tracking and calculating everything for every single meal is a total headache. That’s why I want to build TruMeals. It’s a Discord bot that would check the daily menu at the cafeterias and tell me exactly what to eat based on my goals. It would take all the guesswork out of hitting my calories and make it way easier to actually stay on track.

What it does

TruMeals is a Discord bot designed to simplify healthy eating at the university dining halls. Rather than manually checking the menu and calculating macros every day, the bot automatically analyzes the daily offerings based on your specific fitness goals and dietary restrictions. It essentially acts as a personalized nutrition guide that knows exactly what’s being served, removing the guesswork and helping you stay on track with your caloric needs without the constant overhead of manual tracking.

How we built it

We used a few different tools to get TruMeals running. For the data, we’re actually hooking into the dining hall website's internal API to get the menu in a clean JSON format instead of dealing with messy web scraping. We’re using Supabase (Postgres) to keep track of everyone’s sign up info and fitness goals. The actual logic is a Python script that first filters out any "automatic no" foods based on a user's allergies or dietary restrictions. Then, we take the remaining menu items, turn them into Markdown, and feed them to an Gemini API along with the user’s body goals. The LLM spits back a recommendation which we send straight to Discord. We’re basically using Discord as our entire front-end, so users can do everything, from signing up to getting their meal plan right through chats.

Challenges we ran into

Accomplishments that we're proud of

One of the things we’re most proud of is getting the Sodexo internal API to cooperate, especially since it wasn’t exactly built for public use. We had to develop a custom algorithm to parse that raw JSON into clean objects and then convert it all to Markdown so the LLM could actually make sense of the data. Also, getting the discord API working in itself was quite challenging, specially the nuances regarding all the different kinds of views and modals so we are glad we managed to have it put together in time.

What we learned

We learned a ton about AI-driven applications and what they’re capable of, especially since this was our first time working on a project like this. Figuring out how to use internal APIs to get data in JSON format, rather than having to scrape a webpage when there’s no public API available, was also a huge takeaway for us. On the technical side, we got a lot more familiar with Python concurrency. It wasn't just basic async and await; we had to dive into things like aiohttp for requests and Supabase’s AsyncClient to keep everything running smoothly. Finally, even though we already knew a bit about the discord.py ecosystem, we learned a lot more about its UI components, like the fact that Modals are strictly for text boxes while Views handle things like dropdowns.

What's next for TruMeals

Right now, TruMeals only covers a bit more than half of the food served at Missouri and Ryle Hall. The main issue is that we haven’t been able to find official data for the salad bar, the deli section, or the drink and dessert stations. I’ve been able to manually add some of those items based on my own experience working there, but obviously, that’s not the most reliable way to keep things updated. The next big step for us is to collaborate directly with the dining services team at Truman to properly document every single food option available. Getting that data into TruMeals would give students a way more diverse range of meals to choose from and make the recommendations much more accurate.

Built With

Share this project:

Updates