All projects
Mobile App

Random FOOD — Recipe Discovery App

"Let the world decide what's for dinner — one tap, one real dish."

A playful iOS app that answers "what should I cook tonight?" with one tap. Pick a meal type and a continent, and Random Food serves a real dish from that corner of the world — already filtered around your allergies and the ingredients you never want to see.

Role: UX/UI DesignerCompleteFoodDiscoveryiOS
Splash
View screen

Splash

OVERVIEW

Problem

Recipe apps solve discovery with search, which assumes the user already knows what they want. For the far more common case — genuine indecision — a library is no help, and generic randomisers ignore allergies and taste, so their suggestions are unusable or unsafe.

Goal

Design and build an iOS app that turns "I don't know what to cook" into a real dish in a single tap, respecting dietary constraints without ever asking about them twice.

Outcome

A shipped React Native (Expo) app: a three-step onboarding, a two-decision home screen, a full recipe result with ingredients and numbered steps, saved favourites, and a settings area for profile, language and food preferences.

PROBLEM & STRATEGY

Problem

Deciding what to cook is a daily micro-decision that quietly exhausts people. Recipe apps answer it with an endless searchable library — which is the same blank page in a different shape. The user still has to know what they want before the app helps, and most "random" generators hand back the same safe chicken-and-rice suggestions.

UX Challenge

Designing a decision app, not a browsing app. The whole product has to resolve in a single tap, which means every filter has to be either invisible or answered once during onboarding. Dietary constraints are the hard part: allergies are non-negotiable and must never surface in a result, while dislikes are softer preferences — and asking about either at generation time would reintroduce the friction the app exists to remove.

Strategy

Onboarding collects allergies and dislikes once, then disappears; every later result is silently filtered against them. The home screen is reduced to two decisions — meal type, and an optional continent — with "Surprise me" as the default so the app works with zero input. Visually I committed to a dark charcoal base with a warm cream ink ramp, one ocean-blue for selection state and one burnt-orange gradient reserved for the single primary action on each screen. Rounded Baloo 2 display type over geometric Quicksand keeps it playful without turning childish.

Outcome

A shipped iOS app where the distance from opening to a real, constraint-safe recipe is one tap — with 504 dishes across six continents, full step-by-step instructions, saved favourites and English/Romanian localisation.

KEY METRICS
504

recipes across six continents

1 tap

from opening the app to a real dish

2

languages — English and Romanian

iOS

native, built with React Native + Expo

TARGET USERS

The undecided cook

Someone standing in their kitchen at 6pm with no plan. Wants a decision made for them, not a catalogue to browse — and wants it to be something they'd actually eat.

The constrained eater

Has a real allergy or a short list of ingredients they refuse. Needs those filtered silently on every result, without re-declaring them each time.

The bored-of-the-rotation cook

Cooks the same six meals on a loop. Uses the continent filter to deliberately land somewhere unfamiliar.

DESIGNED PAGES
UI DIRECTION
DESIGN PRINCIPLES
  • One tap to an answer — the product fails if the user has to think before it helps
  • Ask once, never again — allergies and dislikes are collected in onboarding and applied silently forever after
  • Dark charcoal base, warm cream ink — never cold grey, never clinical white
  • One orange gradient per screen — the burnt-orange CTA is the single primary action, never decoration
  • Blue means selected — ocean blue is reserved for active state, so selection is never ambiguous
  • Rounded and generous — large radii, big tap targets, everything centred
  • Playful, not childish — Baloo 2 display over Quicksand body carries warmth without cartoon
  • Real dishes, real places — every result names its country and continent, never a generic fusion
  • Filters are invisible — the constraint work happens off-screen, not in the user's way
  • Emoji as texture, icons as chrome — food emoji warm the light surfaces, SVG line icons handle real UI

Colour palette

Surface — Dark

#1F1F1FCharcoal
#2A2A2ASurface
#333330Surface Muted
#2E2E2BChip

Accent — Action

#C96E3DBurnt Orange
#F0932BCTA Start
#E8503ACTA End
#3A86E6Ocean Blue

Ink & Support

#F7F2D8Warm Cream
#A8A89CMuted Warm Grey
#7BAAAFEarth Green
#2B63ACBlue Pressed
TYPOGRAPHY & TECHNICAL SPECS

Random

Display / Headings · Rounded Sans

Baloo 2

500 Medium600 SemiBold700 Bold800 ExtraBold

Screen headings, recipe titles, logo and every button label

Screen heading30 / 800
Result title25 / 800
Section title18 / 600
Button label16–17 / 800

Aa

UI / Body · Geometric Sans

Quicksand

400 Regular500 Medium600 SemiBold700 Bold

Body copy, inputs, chip labels, meta rows and hints

Body14–15 / 400
Chip label13–14 / 600
Input16 / 400
Micro / hint12 / 400

Platform

iOS

React Native + Expo

Expo Router · Reanimated · Skia · AsyncStorage · expo-image-picker

Recipes

504

Six continents

84 dishes per continent · localised EN / RO · allergy and dislike filtering

Radii

18px

Default button radius

16–20 chips and inputs · 18–26 buttons · 24–30 cards · fully round avatars

Depth

Glow

One coloured lift

Soft shadows on dark cards · orange glow reserved for the primary CTA

FINAL SCREENS
THE ONE-TAP LOOP

Random Food is built around a single loop — declare your constraints once, then tap for a dish as many times as you like. Each pillar removes a different reason the user might have to stop and think.

Ask Once

A three-step onboarding collects allergies, dislikes and a profile, then gets out of the way. Every result afterwards is filtered against those answers without ever mentioning them again.

Two Decisions

Meal type, and an optional continent. "Surprise me" is pre-selected so the app is usable with zero input — the orange CTA is always the only thing left to press.

A Real Dish

The result is a named dish from a named country — full-bleed photo, time, difficulty, servings, ingredients in two columns and numbered steps. Save it, or tap Random again.

DESIGN PROCESS
01

Discover

  • User interviews
  • Competitor audit
  • Problem framing
02

Define

  • Personas
  • User flows
  • Information architecture
03

Design

  • Wireframes
  • Visual design
  • Prototype
04

Validate

  • Usability testing
  • Iteration
  • Handoff
RESEARCH INSIGHTS

Key findings

Daily

the "what should I cook" decision recurs every single day, which makes even small friction compound into abandonment.

Search ≠ help

a searchable recipe library only serves users who already know what they want — the opposite of the indecisive case.

Safety first

allergies are absolute, not preferences; a suggestion containing one is worse than no suggestion at all.

User voices

"I open a recipe app, scroll for ten minutes, close it, and make pasta again. I don't want options — I want someone to just tell me."

Cook, 31

"Every app makes me re-tick "no seafood" every time. I've told you already."

Cook with a shellfish allergy

LEARNINGS & NEXT STEPS

Key takeaways

  • A decision app and a browsing app are opposite products — adding search would have quietly destroyed the premise
  • Splitting dietary input into "allergies" and "dislikes" matters more than it looks: one is a safety filter, the other a preference weight, and collapsing them would make the app either unsafe or annoying
  • Committing to one accent gradient per screen made hierarchy obvious without a single extra layout rule

Next steps

  • Usability testing with 5–8 cooks in a real kitchen at a real dinner hour
  • Shopping-list export from a recipe's ingredient list
  • Weekly meal planning built on the same one-tap primitive
  • Android build and Play Store submission
IMPACT & SUCCESS METRICS

A shipped App Store product — these are the outcomes the one-tap loop was designed to drive.

Time to Dish

< 5s

From opening the app to a full recipe on screen

Taps to Result

1

With defaults, no input required before generating

Recipe Library

504

Real dishes across six continents

Constraint Safety

100%

Declared allergies filtered from every result

ACCESSIBILITY AUDIT

The app runs on a dark charcoal base with a warm cream ink ramp, so every pairing was checked against the dark surfaces — and selection state is never carried by colour alone.

Contrast ratios

Aa

Cream text on charcoal

#F7F2D8 on #1F1F1F

15.1:1

AAA
Aa

Secondary text on charcoal

#A8A89C on #1F1F1F

8.2:1

AAA
Aa

Cream text on raised surface

#F7F2D8 on #2A2A2A

12.9:1

AAA
Aa

Ocean blue on charcoal

#3A86E6 on #1F1F1F

4.6:1

AA
Aa

Cream on burnt orange CTA

#F7F2D8 on #C96E3D

4.1:1

AA

Accessibility checklist

Tap targets at least 44×44 across chips, cards and buttons

Selected chips carry a check icon, not just a fill colour

Every screen has exactly one primary action

Full English and Romanian localisation

Dynamic Type / font scaling support

VoiceOver pass across the generate-and-save loop

Dynamic Type and a full VoiceOver pass are the next accessibility items, alongside a reduced-motion path for the plating animation.

DESIGNER'S REFLECTION

"Random Food started as a joke about my own dinner paralysis, and the discipline turned out to be subtraction. Every feature I wanted to add — search, filters on the result screen, a favourites taxonomy — was a way of handing the decision back to the user.

The part I'd defend hardest is splitting allergies from dislikes in onboarding. It looks like a small copy distinction, but it's the difference between a filter that protects someone and a filter that merely flatters their taste. If I did it again I'd test the continent picker earlier — I suspect most people never touch it, and 'Surprise me' is the real product."

— Raluca Indrecan, UX/UI Designer

What I'd do differently

Subtract features until one tap is the whole product

Separate safety constraints from taste preferences

Give every screen exactly one primary action

Test whether optional filters are used at all

Want to discuss this project?

Get in touch
All projects