Cookstash — Bring all those cooking ideas into one place

Case study focus

The Cookstash project explored how a product idea could be transformed into a usable experience through an end-to-end product design process—from ideation and concept development through interaction design and coded prototyping.

This case study focuses on how I translated an initial product opportunity into a structured product experience, exploring ideas quickly, defining the interaction model, and iterating from design concepts to a functional prototype.

Cookstash — Bring all those cooking ideas into one place

ROLE AND CONTRIBUTION

Product Designer

Problem Framing · Ideation · Information Architecture

Interaction Design · Code-based Prototyping

Build & Deploy

PLATFORMS

Web App

INDUSTRY

Consumer Food & Meal Planning

Try the live demo

What is Cookstash?

Cookstash is a personal cooking content hub that brings recipes from social platforms into one organized place. Users can save cooking videos, organize them in their recipe library, and turn them into meal or occasion plans.

From inspiration to meals, Cookstash connects the journey:

Save → Organize → Plan → Shop → Share.

Frame the opportunity

The Opportunity

Short-form video has transformed how people consume information. A simple, engaging cooking video can make a recipe easier to understand than long, text-heavy instructions, making cooking feel more accessible, natural, and enjoyable.

This creates an opportunity to turn everyday inspiration into healthier, more intentional cooking habits.

Problem

The problem wasn't discovery anymore—it was turning inspiration into action. Cooking inspirations are scattered across social platforms, making it difficult to organize, revisit it later.

Hypothesis

By connecting recipe discovery, personal collection, meal planning, grocery preparation, and sharing in one continuous experience, Cookstash can turn scattered cooking inspiration into something people can organize, plan, and act on in their everyday lives.

Opportunity Validation

" Is this hypothesis worth pursuing? "

Competitive analysis, quickly validate the opportunity

Goal

Understand how existing products help people discover, save, organize, and act on cooking inspiration, and identify where Cookstash could differentiate.

Process

Reviewed a focused set of products across the cooking journey — social platforms, recipe libraries, and meal-planning tools — comparing how each supports discovery → saving → organizing → planning → shopping → sharing.

Findings

Similar flows across products — Most follow a familiar journey from recipe saving to planning and grocery management, with only minor differences in feature support.

Similar recipe experience — Most rely on structured, text-based recipes and in-product libraries, creating a largely similar experience across the category.

Opportunity

Discovered incidentally. Saved intentionally. Cookstash turns spontaneous cooking inspiration into a personal, video-first recipe collection.

Competitive analysis, quickly validate the opportunity

Define the product

Information model

Recipe is the core object. Collections help users organize recipes, while Plans turn them into actionable meals and Grocery Lists support preparation.

Information model

Scope & Prioritization

MVP Experience

I focused the MVP on Capture, Library, Plan, and Shop because together they form the minimum end-to-end journey from discovering a recipe to turning it into an actionable meal plan and shopping list.

Trade-off

Ingredient generation was intentionally deferred from the MVP: Automatic ingredient extraction was deferred because social-media content is often incomplete or unstructured. Instead, the MVP uses a lightweight Note capability to capture missing information.

V1: Generate consolidated ingredients from recipes selected in a meal plan, using more reliable recipe data.

Scope & Prioritization

User journey

Where does the painpoints come from?

Mapping the journey from "sees a recipe" to "shops ingredients" surfaced two moments where existing tools typically lose people: the save itself, and the transition from inspiration to a usable plan. Those two moments became the critical decisions the design had to get right.

Save a recipe for later cook

The spontaneous save. One recipe, found on social, cooked another day.

01 · Discover

Scrolling Facebook, TikTok, or Instagram, she finds a recipe with clear, easy-to-follow steps.

Inspired — "this looks doable."

02 · Save

Taps save on the reel, assuming she'll make it soon.

Confident, low effort.

03 · AccumulateFriction

Saves pile up across Facebook, TikTok, and Instagram with no shared home.

Unaware the pile is forming.

04 · Recall

On the weekend she wants the beef salad she saved on a Facebook reel.

Motivated, ready to cook.

05 · RetrieveFriction

Opens Facebook, searches the author's name, goes to their page, then searches again inside their reels to re-find it.

Frustrated — a multi-step hunt for one dish.

06 · Cook

Follows the instructions and makes the meal.

Satisfied — but the path there was the hard part.

Plan a meal

The deliberate planner. Existing apps rejected, so she built her own workaround.

01 · Reject appsFriction

Skips meal-prep apps — they suggest recipes that don't match her taste, ingredients, or cooking culture.

Distrustful — "this isn't food I'd actually make."

02 · DIY in Notes

Opens the Notes app on iPhone — the fastest tool — starts a new note for the week.

Resourceful, pragmatic.

03 · PlanFriction

Names the plan, uses table format to schedule dishes. Create a checklist, list out every grocery item, sort by category.

In control — but it's all manual typing.

04 · Shop & prep

Shops from the checklist on the weekend, comes home, and preps the meals.

Accomplished.

05 · RepeatFriction

Next week she starts a brand-new note and create a new plan — no history, no saved preferences, no single source.

Resigned to redoing it all.

06 · DisconnectedFriction

Her Notes lists pipe up, each list contain long plain text, more days plan, more type.

Unmotivated to keep doing.

What the map revealed

01

Saves live in silos. The same recipe library is scattered across Facebook, TikTok, and Instagram with no shared home — so nothing is ever a single source of truth.

02

Retrieval is the real cost. The pain isn't saving or cooking — it's the manual hunt in between. Every re-find is a multi-step search that taxes the intent until it dies.

03

Personalization is non-negotiable. Maya rejects suggestion-based apps outright; she trusts her own taste. The library has to be user-curated, never algorithm-pushed.

04

Her workaround reveals the spec. Notes works because it's fast and hers — but it's ephemeral, manual, and disconnected from the recipes. That gap is the exact product to build.

05

Planning has no memory. Every week restarts from zero. Without persistent history and preferences, effort never compounds.

Design

Decision 1 — Make saving effortless, and safe

One-step capture

Users paste a link and the system automatically fetches the title, thumbnail, platform, and other metadata—no manual entry.

Safe link fetching

Server-side validation blocks internal/private addresses and suspicious destinations before fetching external content.

Fast failure

A 5-second timeout prevents slow or unresponsive links from blocking the experience.

Recipe validation

Trusted recipe sources are imported directly; unfamiliar links are checked for recipe metadata or cooking-specific content before being accepted.

Decision 1 — Make saving effortless, and safe

Decision 2 — Two planner modes, one type-safe store

Different planning contexts require different structures

Calendar mode supports recurring weekly meal planning with dates and meal slots, while Freeform mode supports date-independent occasions such as Thanksgiving or a camping trip

Rather than treating them as separate products, I modeled both through a single type-safe planning system, allowing each mode to have only the information and interactions it needs.

Key interaction

Copy-week maps meals by day of week and merges them non-destructively, preventing existing plans from being silently overwritten.

Result

Two distinct planning experiences without duplicating the underlying system—keeping the product flexible while maintaining a consistent architecture.

Decision 2 — Two planner modes, one type-safe store

Development

Tech stack & setup — Built to prototype fast

Stack

Next.js 16 · React 19 · TypeScript · Tailwind v4 · Zustand · Design System · Monorepo

Real components from day one

The design system was integrated as a workspace dependency, so the prototype was built with real, interactive components instead of static mocks. This shortened the gap between design and implementation and made rapid iteration possible.

Lightweight, domain-based state

Five focused Zustand stores manage recipes, planning, groceries, categories, and authentication. Keeping state separated by domain makes the prototype easier to evolve without changes in one area cascading into another.

Backend-ready data model

Domain types follow a database-friendly structure—UUIDs, ISO dates, and nullable fields—so the prototype can move from localStorage to a real backend without requiring a major UI rewrite.

Tech stack & setup — Built to prototype fast

Turning the design concept into a working prototype — From foundation to working features

I used Claude Code to translate the defined design patterns, information architecture, and interaction flows into a reusable React foundation. I built the product progressively—from shared components and domain models to feature experiences—then iterated as the flows came together.

Turning the design concept into a working prototype — From foundation to working features
01 — Establish the product foundation
Click to zoom

01 — Establish the product foundation

I first established the reusable foundation: design-system components, domain types, routing, and state structure.

The codebase was organized around product domains rather than individual screens, allowing the implementation to mirror the product architecture.

02 — Build features from reusable components
Click to zoom

02 — Build features from reusable components

Features were composed from these domain components rather than built as one-off screens.

This kept the implementation consistent with the product's information architecture and made patterns reusable across flows.

03 — Connect components into real interactions
Click to zoom

03 — Connect components into real interactions

I connected the components through domain-scoped state using Zustand, allowing actions such as saving a recipe, assigning dishes to a planner, generating a grocery list, and sharing a plan to work across the product.

04 — Persist the experience
Click to zoom

04 — Persist the experience

I persisted domain state locally so recipes, plans, and grocery lists survive page reloads, giving the prototype a realistic product experience without requiring a backend.

05 — Iterate as the product took shape
Click to zoom

05 — Iterate as the product took shape

As the flows became interactive, I used the working prototype to identify duplicated patterns, unclear interactions, and inconsistencies between features.

I refactored shared components, tightened type definitions, and consolidated recurring interaction patterns as the product evolved.

Outcomes

The MVP highlights

4Product pillarsLibrary, Planner, Grocery, Sharing — the full loop, end to end
38Feature componentsComposed on top of @jasmine/design-system
5Zustand storesDomain-split, localStorage-persisted: recipes, planner, grocery, categories, auth
19Typed domain modelsWritten to mirror a future DB schema for zero-rewrite V2 wiring
2Planner modes, 1 storeCalendar + Freeform via a discriminated union
1Responsive codebaseMobile to desktop (768px breakpoint) — bottom nav and sidebar from one source

Highlighted features

Zero-typing recipe capture

Paste a link and the recipe lands in the library in about a second — no form. A server-side route resolves Open Graph metadata, blocks internal/private addresses (SSRF protection), and times out at 5 seconds. Unknown domains get a two-tier content check — Schema.org Recipe data, then 3+ cooking-keyword matches — before being accepted.

No-backend sharing

A shared grocery list needs no account and no server round-trip: the list is serialized to JSON, base64url-encoded, and embedded directly in the share URL. The recipient decodes it client-side.

Deduped, aisle-grouped grocery lists

Items are deduplicated by name + category as they’re added, so the same ingredient from two recipes merges into one line instead of listing twice.

Local data that survives schema changes

Recipes, planner, and category state are each on their own versioned migration path (v3–v5) — real users’ existing local data upgrades in place across releases instead of getting wiped.

Click to zoom

Save a recipe

simple and quick save with a link, auto fetching recipe metadata.

Click to zoom

Library

Every save in one searchable home, filterable by ingredient and source.

Click to zoom

Category

Mangage collections according to your interests.

Click to zoom

Planner

Pre-structured day slots remove the blank-page decision; copy-week carries a plan forward.

Click to zoom

Grocery

Auto-generated, grouped by aisle, duplicates deduped, shareable by one link.

Click to zoom

Add Ingredients

Categorized ingredients, easy select and add.

Try the live demo

The full loop is live and interactive — save a recipe, plan a week, create a grocery list, and share it in one link. Open the running app from the "Try the live demo" button at the top of this page.