-
-
Exact serving preview: four to six servings, with unresolved quantities kept visible until review.
-
Live OpenAI substitution proposal through Strands and MCP, including instruction changes and explicit approval.
-
Alexa+ browser concept: recipe shelf, cooking workspace, and companion. Recorded live Strands/OpenAI demo.
-
Saved cooking progress and approved substitutions recovered after restart; a fresh conversation retrieves the session.
Project name
SavaPlate Kitchen Companion
Short description
A cooking companion that previews exact serving changes, saves your place and recovers safely after interruptions, using real MCP tools and a separate database.
Inspiration
Cooking rarely happens without interruptions. Someone asks a question, an ingredient is missing, or dinner changes from four people to six. A recipe can stay on screen while the context that matters—where I stopped and which changes I approved—gets lost.
I built SavaPlate Kitchen Companion to preserve that context. Building on my existing SavaPlate mobile product, I wanted a conversational kitchen experience where saved progress belongs to the application rather than depending on a chat transcript.
An Alexa device with a screen felt like a natural fit. For someone who already keeps one in the kitchen, the companion could be available right where cooking happens. Its larger display could make instructions, ingredient quantities, and proposed changes easier to glance at than a phone screen. Voice and visual interaction could complement each other: ask for help, inspect the result, and confirm a change before continuing.
What it does
The companion helps users find a recipe, start cooking, adjust servings, review ingredient substitutions, and save their place.
Serving changes show an exact quantity preview before approval. AI substitutions are proposals that require confirmation before they affect the cooking session. The original recipe stays intact, and quantities that cannot be calculated remain visibly unresolved.
Users can pause, reload, and return to their saved progress. If a connection drops, the interface asks them to check the saved state before continuing, avoiding automatic replay of an interrupted action. Selected missing ingredients can also become a companion shopping list.
The current experience is a browser prototype of an Alexa+ concept, backed by a working MCP service. Judges can try a keyless guided sample at https://alexa.goggans.me: it uses real MCP tools and saved progress, with clearly labeled scripted substitution responses and no live AI calls. The video shows the separately recorded live Strands/OpenAI experience and a summary of bounded Edge/Gemini verification. Integration with a consumer Alexa device remains future work.
How I built it
I built the standalone companion with TypeScript, React, Vite, Express, and PostgreSQL. Nine tools exposed through the Model Context Protocol over Streamable HTTP connect the interface and conversational agent to the same cooking operations.
Strands Agents SDK provides orchestration, with OpenAI Responses supplying inference. The agent calls real MCP tools to retrieve and update cooking context. PostgreSQL stores progress, approved adaptations, and command receipts independently of conversation history.
An optional guarded adapter reuses SavaPlate’s authenticated dietary Edge Function. In a separate bounded live check, Strands/OpenAI called this service through MCP and Gemini 3.8 Flash supplied the substitution assessment. The companion validated quantities and cautions before creating a proposal; explicit host approval was still required. Cooking progress remained in the separate companion database. This is a non-production test integration, not deployed account linking.
Exact fraction arithmetic handles serving changes. Schema validation, ownership checks, session versions, and explicit confirmations constrain changes to saved state. Deterministic controls remain usable without an AI provider.
This project adds a separate companion application, MCP server, persistence layer, and recipe-export adapter. The existing SavaPlate application was kept read-only.
Challenges I ran into
The hardest problem was making interruptions safe. A request can succeed even when its response never reaches the browser. Repeating it could apply a change twice; trusting an old screen could overwrite newer progress. Transactional command receipts, version checks, and explicit reconciliation help the companion recover consistently.
AI quantity interpretation was another challenge. An early evaluation exposed substitutions whose written quantities contradicted their numeric ratios. I clarified the ratio contract, added validation, and moved final quantity calculations into deterministic code so users can inspect the actual change before approving it.
A significant external challenge was obtaining usable access to Amazon Nova. Although my AWS project was paid and active and Nova Lite was authorized, Amazon had not provided usable inference capacity: the applied daily quota remained zero. That blocked successful Nova inference and prevented me from validating the original Bedrock-backed experience.
I had to pivot to Strands Agents SDK with OpenAI Responses. Strands became the orchestration layer, while OpenAI supplied the model inference. Because the cooking operations and saved state were already independent of the model provider, I could make that change while preserving the MCP tools, approval controls, and recovery behavior. The pivot allowed me to test a real conversational cooking journey instead of stopping at a guided demonstration.
Accomplishments that I’m proud of
A bounded live test exercised OpenAI, Strands, MCP, and PostgreSQL together. Approved changes persisted across a real server-process restart, and a fresh conversation recovered the paused session and resumed it.
A later Strands/OpenAI → MCP → Edge Function/Gemini continuation passed 44 checks, including explicit approval, idempotent application, immutable source recipes, and saved state across two server processes. Its navigation and resume used direct MCP controls to remain within the cumulative request budget. This verification is separate from the native OpenAI application footage in the video.
After the quantity fixes, an unchanged 20-case synthetic evaluation produced 13 consistent proposals and seven appropriate declines under assistant review. Independent human culinary review remains pending.
I’m also proud that the project remained useful through the infrastructure setback. The provider changed, while the cooking workflow and its safeguards continued to work.
What I learned
A fluent answer is only one part of a useful assistant. Reliable cooking support also needs clear quantities, durable state, visible uncertainty, and user control over changes.
I learned to evaluate model output, tool execution, persistence, and device behavior separately. A successful model call does not prove culinary suitability, and automated browser checks do not establish that voice works well in a noisy kitchen.
The Nova access challenge also reinforced the value of keeping the cooking domain independent of any one model provider. That architectural choice made the Strands/OpenAI pivot practical.
What’s next
Next steps include testing an actual owner-created SavaPlate recipe export, completing physical voice and accessibility checks, and obtaining human culinary review of substitution behavior.
I also want to validate the experience on a kitchen display: readable instructions at a distance, clear confirmation screens, and voice interaction under real cooking conditions.
The longer-term goal is to bring the same durable cooking context to Alexa+ and other interfaces, making the companion readily available wherever someone cooks.
Built with
TypeScript; Node.js; React; Vite; Express; PostgreSQL; Strands Agents SDK; OpenAI Responses; MCP TypeScript SDK; fraction.js; Zod; optional AWS SDK for JavaScript v3 / Amazon Bedrock Converse; Vitest; Playwright; authenticated Supabase Edge Function integration; Gemini 3.8 Flash; ElevenLabs; FFmpeg. The current 2:59 video uses ElevenLabs Chris MB editorial narration, corrected to pronounce SavaPlate as Save-A-Plate, and English captions. It shows genuine Strands/OpenAI footage followed by a clearly labeled summary of the separate Edge/Gemini verification. Synthetic narration is not microphone or consumer Alexa audio.
Built With
- express.js
- openai
- postgresql
- react
- strands
- typescript
- vite
Log in or sign up for Devpost to join the conversation.