


Designing Interaction Paradigms
For (Non) Deterministic Actions
COMPANY
Sift
MODEL
B2C
ROLE
Cofounder, Design Engineer
DEVICE
Mobile
TECH STACK
Cursor, Swift UI, Open Router, Python, Firebase, Linear, Figma
Introduction
Home cooking is inefficient; for your time, your money, and your consumption. Sift reimagines how we discover and plan meals, shop, and cook, through AI-powered meal planning. By building menus from the ingredients-up, rather than from recipes-down, Sift optimizes value while maintaining flexibility.
My cofounder and I have been exploring this concept for some time, and it is just about ready for beta launch. Although I started by designing and developing the full platform from scratch, I've recently been leaning on a backend developer to level up our AI architecture while I design and develop the product experience.
Optimized Ingredients
Sift plans around Minimal Purchasable Quantities (MPQs)* to make the most of every ingredient.
No more leftover herbs.
Integrated Planning
Natural language meal discovery and planning keeps grocery lists and recipes adaptable and in sync.
No more cross-referencing.
Personalized to You
Sift learns your preferences and cookbook over time, turning Sunday planning into "that's just what I wanted!"
No more starting from scratch.
*We define the Minimal Purchasable Quantity (MPQ) as the smallest unit of an ingredient that you can purchase at a typical grocery store (i.e., 1 bunch parsley, 1 dozen eggs).
Designing an Efficient Meal Planning Workflow
The magic lies in Sift's AI-powered meal planning. We've developed an LLM architecture that generates meals optimized across minimal purchasable quantities (MPQs), while factoring in variety, user preferences, and any preset recipes.
Basic
"GENERATE MEAL PLAN"
1 dinner
Steak with Chimichurri
2 lunches
Bean Salad with Parsley
No leftover parsley
Variety
Preset Recipe
"USE MY SAVED RECIPE"
1 dinner
My saved Lasagna recipe
1 breakfast
Southwestern Scramble
No leftover onion
Uses preset recipe
User Preferences
"MAKE SIMPLE & CHEAP"
4 lunches
Weeknight Gyro
4 breakfasts
Yogurt Bowl
No leftover yogurt
Cost-effective
Ultimately, the goal is for this system to get so good that the user accepts a meal plan on first try. But in the meantime, the editing workflow is paramount. The user needs to quickly finalize their plan while editing in ways like, "let's make this cheffy-er."
The question becomes…
How can we make meal planning (drafting, editing) efficient, while remaining non-deterministic?
Favoring Natural Language Inputs with Chat
Unsurprisingly, we started with a simple chat interface. We figured this would allow the user to create their meal plan in any which way, tapping into the power of natural language.
To provide some helpful UI without limiting the user, we parsed recipe data from the LLM into card components that the user could expand and scroll to peruse their meals.
Let's just say, we thought we nailed it! The recipe components made it easier to review plans, while the chat interface enabled users to edit and provide feedback in freeform ways.
However, as we started to use the platform more, we found even ourselves dreading the tedium of getting to a final meal plan. Editing required scrolling up and down to recall recipes, waiting for responses, and frequent context loss from the LLM.
Pros
No restrictions on inputs
No restrictions on editing requests
Dynamic request changes (i.e., generate 4 dinners → show me Italian recipes)
Cons
Redundant typing of starting inputs
Unclear data points attached to edits (i.e., change salmon recipe → which one?)
Context loss when trying to integrate new recipes into plans across multiple messages
While prioritizing natural language editing, we made the actual back-and-forth workflow clunky and frustrating.
Natural Language
Workflow Efficiency
Differentiating Deterministic and Non-Deterministic Actions
As we took a step back, we realized that we actually were requiring certain starting inputs in order to generate a meal plan. The user needed to send the number of meals, and then they could add their own preferences. With this in mind, we started to tease out the deterministic actions from the non-deterministic.
Non-Deterministic Actions
INITIAL GENERATION
Misc. Preferences
Ingredients
Other
Diet
Cuisines
Cost
Culinary Level
EDITING
Misc. Preferences
Other
vs
Deterministic Actions
INITIAL GENERATION
# Breakfasts
# Lunches
# Dinners
Serving Sizes
EDITING
Retry
Replace
Keep
= options that could arguably be made deterministic through sliders, selections, etc., albeit at the risk of limiting the user.
Based on this set of actions, we needed to bring the user efficiently and creatively to their meal plan by balancing natural language for non-deterministic actions with UI components for the deterministic actions.
Call it luck or too many hours on Mobbin, but as we scribbled different ideas, we gradually arrived at something that looked quite like the Canvas-Chat paradigm used on many desktop AI applications (i.e., Lovable, Cursor, Flora AI).


Canvas
The main output
Deterministic
Actions
Chat
The editing function
Non-Deterministic
Actions
AI-Powered Meal Planning in a Canvas-Chat Interface
Using a double-pane layout inspired by Amie, we achieved a Canvas-Chat pattern on mobile. For Plan, the top pane represents the working meal plan, while the chat is always accessible and works on the Canvas as appropriate.
Users can perform determinate actions on the Canvas so they always retain agency. Importantly, having a single source of truth supports our backend LLM architecture, eliminating issues with context loss across messages.



… There's More!
We are really excited about this paradigm and the sub-patterns that have emerged as we adapt it across the app. Please let us know if you have any thoughts, questions, or want to learn more!