Explore
01

Toss

Final Year Project · University of Greenwich
ProjectAI web app that closes the gap between "I have ingredients" and "I know what to cook". Submitted as a core MVP inside a fixed 126-hour final year project timebox, then carried past the deadline into the deployed product running today
TypeFinal Year Project · 29,000-word dissertation · DSDM Agile · MVP shipped, then extended post-submission
Year2026
TeamSolo
My Role

Full-Stack Developer & Product Designer

Responsibilities
  • Sole developer and designer: system architecture through to pixel-level UI. Every Must and Should requirement shipped inside a fixed 126-hour DSDM timebox, with scope held to that agreed set
  • Ran MoSCoW prioritisation across 6 timeboxes, turning the food waste problem into a backlog with measurable acceptance criteria, with 2 features agreed as Won’t at the outset and held there rather than letting scope drift
  • Evaluated the build against Nielsen’s 10 usability heuristics and benchmarked against 2 established recipe apps, then kept going after submission, rebuilding both the input and recommendation models in response to what that evaluation exposed
Key decisions
  • Ranked by expiry rather than keyword relevance; the product had to act on the decision to cook, not the recipe lookup, so the ingredient closest to spoiling drives everything downstream
  • Shipped a single recommendation in the MVP to kill choice paralysis, then replaced it after evaluation showed the opposite failure: with nothing to compare against, one suggestion reads as arbitrary rather than confident. The deployed product offers three, each pre-assigned a role, so the user picks a posture instead of auditing a list
  • Collapsed structured ingredient entry into one natural-language field backed by voice and camera capture: the cost of telling the system what you have, not the size of the recipe corpus, was what stood between a full fridge and a decision
  • Chose Google Gemini over OpenAI on cost, latency and API stability, holding generation under 1.8 seconds so the recommendation arrived while the user was still standing at the fridge
Layer 01

Strategic Impact

/ for the strategist

A UK household of four throws away food worth around £1,000 a year (WRAP, 2025), not because they buy too much, but because they can't decide what to make with what they already have. Toss attacks the decision gap, not the shopping list.

13
Functional requirements with measurable acceptance criteria, delivered across 6 DSDM timeboxes inside a tracked 126-hour build budget
6
MoSCoW-managed timeboxes, with scope held to the agreed Must and Should set
3
Ranked suggestions per session, each pre-assigned a role (most urgent, balanced, stretch) so the choice stays bounded
Layer 02

Process

/ how it was built
01
Discover

Framed the problem as decision friction rather than recipe discovery, through competitive benchmarking against 2 established recipe apps and informal conversations with prospective users. The gap was never a lack of recipes; it was the moment of standing at an open fridge with no answer

02
Define

Applied MoSCoW across ingredient capture, recommendation output and expiry ranking as the algorithm’s primary sort key. Wrote functional and non-functional requirements with measurable acceptance criteria so "done" was arguable against evidence, not taste

03
Build

6 DSDM timeboxes inside a fixed 126-hour window. All Must and Should requirements shipped on schedule, with 2 features agreed as Won’t at the outset and held there as a deliberate product call

04
Validate

Evaluated against Nielsen’s 10 usability heuristics. The most useful finding worked against my own design: a single recommendation did remove choice paralysis, but with nothing to compare it to, users had no way to judge whether the system had actually understood them

05
Extend

Carried the product past the submission deadline and acted on that finding. Rebuilt the output as three role-labelled options, collapsed ingredient capture into a single natural-language field with voice and photo input, and added an explicit transparency layer

06
Ship

Deployed to production and still live. The MVP proved the thesis under a hard constraint; the deployed version is what the evaluation said it needed to become

Layer 03

Interface & Friction

/ for the UX director
HoverTap a feature to X-ray the system beneath

The MVP bet everything on removing choice. The deployed product makes a sharper bet: keep the decision small, but never make it opaque. The system still does the ranking; it just shows its working, and lets you argue with it in plain English.

Layer 04

Visuals

/ screens & frames
Pantry dashboard
Tonight's Big Three
Recipe detail
Why this recipe
Expiry-sorted pantry
Expiry timeline & preferences
Layer 05

System Architecture

/ for the engineering lead
./toss · stack manifestBUILD live
FrontendReact 18 · Vite · CSS3: responsive, component-driven UI
BackendNode.js · Express · REST API · JWT Bearer token auth
AI LayerGoogle Gemini 2.5 Flash · expiry-prioritised prompt engineering
DataPostgreSQL · recipe corpus · user pantry schema
Schemausers · pantry_items · recipes · expiry_dates (fk: user_id)
MethodologyDSDM · 6 timeboxes · MoSCoW · 126h fixed window
What worked

The DSDM timebox did more for the product than for the schedule. A hard 126 hours forced MoSCoW to be honest: 2 features agreed as Won’t at the outset and held there cost less than half-building them would have. The expiry-first ranking was the right core bet; it survived every later rewrite untouched.

What I'd do differently

I built before I validated. All of the input handling was finished before I had evidence about what capture actually cost people, and the recommendation model was settled before heuristic evaluation told me a lone suggestion reads as arbitrary. Both findings arrived late enough that acting on them meant rebuilding after submission rather than iterating inside a timebox. I would now spend an early timebox on evaluation and treat its output as a requirement.

What's next

Mobile-first rebuild with a shared household pantry, so the person who buys the food and the person who cooks it are looking at the same list. Impact tracking that reports items rescued and spend recovered per week; the product currently asks users to take the food waste benefit on faith. Longer term, supermarket loyalty integration to seed the pantry automatically and remove the last of the input cost.