Track
Health for All.
Inspiration
Dietary restrictions and food allergies shouldn't mean giving up your favorite recipes. Most substitution advice online is generic — "just swap in almond flour" — without explaining why it works or what else needs to change to make the recipe actually turn out right. I wanted to build something that treats substitutions like a science problem, not a guessing game.
What it does
SafePlate takes any recipe you paste in, along with one or more dietary restrictions (vegan, gluten-free, dairy-free, and more — combinable, so you can select vegan and gluten-free together), and rewrites the entire recipe — ingredients and instructions — to fit. For every substitution it makes, it explains the reasoning behind it in a full sentence, so you understand not just what changed but why it still works.
How I built it
The frontend is vanilla HTML, CSS, and JavaScript — a form where users paste a recipe and toggle one or more restriction buttons. On submit, it sends the data to a Node/Express backend, which builds a structured prompt and calls the Featherless.ai API (running DeepSeek-V3) to generate the rewritten recipe. The AI returns structured JSON — ingredients, instructions, and a list of substitutions with reasons — which the frontend renders dynamically into the page, complete with a loading state and a one-click copy button for the finished recipe.
Challenges I ran into
This project turned into a real lesson in how unreliable LLM output can be under the hood, even when it looks fine at a glance. I hit several distinct issues: a frontend/backend key-name mismatch that silently sent undefined instead of the actual recipe (causing the AI to hallucinate an unrelated one); a smaller model missing non-compliant ingredients entirely, like leaving eggs untouched in a "vegan" rewrite; substitutions being listed without the replacement actually appearing in the ingredients list, making the recipe impossible to follow; and one run inventing a flatly false claim that all-purpose flour is "naturally gluten-free." I addressed these with a combination of tighter, more explicit prompting (an internal consistency rule, a required self-check step), a lower temperature, and switching to a larger model — and added a visible disclaimer so users know to double-check results themselves, since I couldn't fully eliminate the inconsistency.
Accomplishments that I'm proud of
Getting a full AI pipeline working end-to-end — from a plain HTML form, through a custom Express API, to a real LLM call, and back into a clean rendered UI — in a short timeframe. I'm most proud of not stopping at "it looks like it works": I actively stress-tested the output against multiple recipes and restriction combinations, caught several subtle correctness bugs a casual glance would've missed, and chose to be transparent about the system's remaining limitations rather than hide them.
What I learned
How much prompt design affects reliability — explicit consistency rules, self-check instructions, and temperature all made a measurable difference in output quality, but none of them fully eliminated run-to-run variance, which was a good real-world lesson in the current limits of LLM reliability for tasks with real-world stakes. I also got hands-on practice debugging the full request/response chain between frontend and backend, including tracking down a bug where two ends of an API contract had silently drifted out of sync.
What's next for SafePlate
Adding a nutrition delta (e.g. "23% less sodium") so users can see the impact of a rewrite at a glance, building an automated validation layer that catches inconsistencies (like a missing ingredient quantity) before showing results to the user, and eventually a browser extension that rewrites recipes directly on any site you're browsing.
Built With
- express.js
- featherless.ai
- javascript
- node.js

Log in or sign up for Devpost to join the conversation.