Lana Nguyen. OPEN TO NEW ROLES →
← WORK / № 02 · PROTOTYPE · iOS

Morsel — eat with your eyes

A self-directed concept: keep photo-first discovery immediate, and be blunt about what the app knows. In one line, safety context follows the dish, from discovery through ordering.

ROLEProduct design, interaction design, prototyping
SCOPE0→1 mobile product concept
STATUSFunctional interactive prototype · not shipped
TEAM · YEARIndependent · 2026
BUILDHTML/CSS/JavaScript prototype · AI‑assisted with Claude Design and Fable
The betA photo-first app should earn more trust, not less, for being blunt about what's in a dish, how good the evidence is, and where coverage ends. A hypothesis, not a research finding.
The principlesLead with appetite: the photo is the interface; metadata earns its way in. Preferences rank; allergies protect: taste re-ranks, lifestyle filters, allergies exclude and flag. Never imply more certainty than the evidence supports.
StatusFunctional prototype · v3.1 · not shipped Not evaluated with users; restaurants, diner identities, quotes, order counts, and trust scores are illustrative prototype data.

HOW TO READ THIS PAGE — FUNCTIONAL works in the prototype · SIMULATED illustrative prototype data · PROPOSED a plan or model, never a result. Every screen below is the source project's own markup, rendered live on this page — not a screenshot. The dietary model is deliberately allergy‑aware, never “allergy‑safe” — every warning tells the diner to confirm with the restaurant, because menu data can lag and kitchens share surfaces. No score appears without a disclosed method. No usability sessions have been run.

Morsel portfolio card, labeled 'v3.1 concept prototype · illustrative data': the saves screen with two conflicting saves kept and flagged with Nuts chips, a photo-led dish page with a Location-off chip, and the Allergy Gate order sheet — 'Contains nuts, an allergy you flagged. Ordering stays locked until you confirm below' with an unchecked acknowledgement and Uber Eats shown locked
TRY THE PROTOTYPEV3 BUILD · ILLUSTRATIVE DATA
MORSEL V3 · FULL FLOW OPEN FULL PROTOTYPE ↗
Poster: the Morsel v3 prototype welcome screen — 'Eat with your eyes' over a dish photo grid, with Show me what's good and Continue without location
SANDBOXED EMBED · FLAG A NUT ALLERGY IN ONBOARDING, THEN TRY TO ORDER A CONFLICTING DISH · ILLUSTRATIVE DATA

Fully interactive version ships with the deployed site (v2/morsel-proto/).

THE SHAPE OF THE PROJECTHONEST NUMBERS ONLY
3
TIERS IN THE DIETARY MODEL: TASTE, LIFESTYLE, ALLERGY
16
AUDITED V3.1 STATES, RENDERED LIVE FROM THE PROTOTYPE
0
USABILITY SESSIONS RUN; TWO-ROUND PLAN BELOW

APPETITE IS EMOTIONAL.
CHOOSING SAFELY IS NOT.

Food apps optimize for the scroll. Give a diner a real constraint (an allergy, a vegetarian kitchen, an uncovered city) and most photo feeds go quiet or quietly lie. The feed was the easy part. The system around it was the work.

DECISION 1 ·
PREFERENCE VS
PROTECTION

v1 had one flat “dietary needs” list, with Vegetarian and Nut allergy as equivalent chips. That's a category error: one is a preference, the other a hazard. In v3.1 I split the model into tiers. Lifestyle choices filter the feed and loosen in one tap; allergies are a hard rule everywhere the dish travels. No reset or “clear filters” path ever touches allergy settings.

v1 onboarding: a single flat 'dietary needs' chip list where Nut allergy sits beside Vegetarian and other preferences as visually equal choices
Before · v1One flat list: a nut allergy modeled like a lifestyle choice.
After · v3.1Lifestyle filters; allergies exclude, flag, and follow the dish.

How allergy context follows a dish. Conflicting dishes leave feed and search; saves are kept and flagged; a dish opened directly from a save or shared link explains why it's still visible; and the order sheet locks every delivery and pickup option until the diner explicitly acknowledges the conflict.

Saves kept and flagged, never auto-deleted
Direct open: warned and explained, still reachable
Order sheet locked; acknowledgement never pre-checked
After an explicit yes: unlocked, warning still present
v1 order sheet: delivery providers listed with no allergy context at all — the dish's nut conflict is invisible at the moment of ordering
Before · v1The order sheet carried zero safety context.
Why a gate, not a bannerThe order handoff is where Morsel can do real harm. A banner treats the hazard as information; the gate treats it as a decision: “we told you” versus “you decided.”

DECISION 2 ·
EVIDENCE WITHOUT
MANUFACTURED CERTAINTY

Star ratings compress bias, self-selection, and revenge reviews into one unfalsifiable number. Morsel proposes “X% would order again,” counted from repeat orders through the app's own handoffs. Too new for honest math? The design abstains: “New on Morsel — no score yet.”

v3.1 · the method, disclosedPercentage + sample size, always visible; method one tap away. PROPOSED model: it needs carrier integration, order attribution, diner consent, and privacy plumbing that don't exist yet, plus defenses against gaming.
v3.1 · cold startToo new for honest math → abstain.

DECISION 3 ·
APPETITE VS
INFORMATION SCENT

A photo-only feed maximizes appetite but hides price, distance, and name behind a tap. After exploring labeled cards, hybrid density, and a split model, I kept the grazing feed photo-only and gave search results full labels: searchers compare, browsers graze. The tradeoff is untested; it's the first task in the plan.

v3.1 · the grazing feedPhoto-only by choice; the appetite surface stays quiet.
v3.1 · search, labeled and honestThe empty state distinguishes “doesn't exist here” from “excluded by your settings.”

RESILIENCE —
THE UNGLAMOROUS
PATHS

Honest states for the paths most concepts skip. Location off relabels the feed to “For you,” discloses that distances are from a demo neighborhood, and disables “Nearest” sort. No-coverage never shows one city's dishes under another city's name.

Unsupported city, named plainly
Zero results: names each active limit; allergies untouchable
Offline: the cause, said plainly
Image failure: the photo-first app without photos
Handoff failure: names the cause, keeps safety context
Taste tier: re-ranks only, lowest stakes of the three

ACCESSIBILITY —
AS IMPLEMENTED

Semantic controls with aria-pressed/aria-selected/role="alert" where state matters; no nested interactive elements; a keyboard-only pass on the critical order path (saved tile → detail → save toggle → order → acknowledgement → provider); the order sheet as a named modal dialog (focus trapped, Escape closes, focus returns to the trigger); a live region for saves; ≥44px touch targets; and 140% text scale that reflows without loss. Not claimed: WCAG conformance or an assistive-technology audit. Screen-reader evaluation with real users is still owed.

140% text scale: reflow without loss

APPENDIX —
PROCESS ARTIFACTS

The full v3.1 state set and four process documents ship with this site:

Wireflow + assumption mapopen the full artifact →

WHAT REMAINS
UNKNOWN

PROPOSED No sessions run, so no results. The plan is two rounds: five discovery sessions, then a safety round with participants who manage real food allergies plus a domain reviewer, where any misreading of the allergy promise is a fix-first finding.

  • Does photo-only browsing survive real decision pressure, or do users bounce to details to check price?
  • Does the trust metric read as evidence or as decoration?
  • Does the acknowledgement gate read as care or as friction?
Testing plan · unexecutedopen the full artifact →
REFLECTION

The hard part was deciding when the interface stays quiet, when it explains itself, and when it interrupts momentum. Appetite gets silence; evidence gets a visible method; a flagged allergen gets a full stop.

Allergy promiseaware, never “safe”: confirm with the kitchen
Evidence ruleno score without a disclosed method
Research runnone; two-round plan, safety round included
NEXT PROJECT — № 03Hey Period — a brand women would trust