Inspiration
Cooking is supposed to be enjoyable, but many people get stuck before they even start. Deciding what to make, checking whether the ingredients are available, understanding unfamiliar instructions, setting timers, and constantly touching a phone while cooking can make the experience feel more complicated than it needs to be.
I wanted to build a cooking companion that stays with the user throughout the entire process. Stir was inspired by the idea that AI should not replace the cook. It should reduce friction, provide useful context, and help the cook feel more confident and in control.
What it does
Stir is a recipe app with an AI Cooking Copilot.
Users can discover recipes based on their ingredients, cravings, dietary preferences, available time, and cooking experience. Stir can also help identify ingredients through fridge scanning and use that information to guide recipe discovery.
Once a recipe is selected, the user can enter Now Cooking mode. Stir presents the instructions step by step and can provide hands-free help through voice. Users can ask questions, request substitutions, move between steps, start timers, pause timers, and recover their cooking session without constantly touching their phone.
The Copilot supports typed chat, recorded voice, and real-time voice conversation. It also supports multiple languages, so recipe ingredients, instructions, chat responses, and voice guidance stay consistent with the language selected by the user.
How we built it
I built Stir as a cross-platform Expo and React Native application using TypeScript and Expo Router. The app uses a shared recipe catalog so recommendations, ingredients, cooking times, and instructions stay grounded in real recipe data.
The backend handles recipe data, translations, AI requests, usage tracking, and durable chat jobs. Gemini is used for natural-language understanding, recipe discovery, substitutions, and real-time cooking conversations. The app keeps the recipe’s original identity, step order, timer durations, and cooking state authoritative even when AI is involved.
For the hands-free experience, I integrated native audio recording and playback with Expo’s audio tools and added safeguards for interruptions, microphone recovery, backgrounding, delayed responses, and audio route changes. Cooking sessions and pending conversations are persisted locally or on the server so users can leave the app and return without losing their place.
Challenges we ran into
One of the biggest challenges was making real-time voice interaction feel reliable. Audio can arrive asynchronously, users can interrupt the assistant, the app can move into the background, and the microphone route can change unexpectedly. We had to carefully coordinate playback, recording, interruptions, and cleanup so that stale audio or delayed responses could not interfere with the next cooking step.
Another challenge was deciding which parts of cooking should belong to the AI and which parts should remain controlled by the app. Gemini can interpret what the user means, but the app must remain authoritative for timers, step navigation, recipe identity, and whether a cooking action is actually allowed.
Localization also required more than translating visible labels. The selected language needed to flow through recipe instructions, ingredients, typed conversations, voice prompts, and Live context without changing the underlying recipe state.
Accomplishments that we're proud of
I am proud that Stir is more than a recipe search screen. It provides a complete path from discovering a meal to actively cooking it.
Some of the accomplishments include:
- Building a hands-free Cooking Copilot with real-time voice interaction.
- Supporting typed chat, recorded voice, and Live voice experiences.
- Adding reliable step navigation and cooking timers.
- Preserving cooking sessions across navigation, backgrounding, and app relaunches.
- Grounding AI responses in the selected recipe and the app’s recipe catalog.
- Supporting substitutions and natural cooking questions without losing context.
- Carrying selected-language content through the entire Now Cooking experience.
- Adding fridge-based ingredient discovery as a supporting feature.
- Creating safeguards for interrupted audio, stale responses, microphone recovery, and duplicate actions.
What we learned
I learned that building an AI product is not only about generating good responses. The surrounding application needs to provide clear boundaries, reliable state, and predictable recovery when something goes wrong.
Real-time audio also requires much more lifecycle management than a normal chat interface. Playback, recording, interruptions, permissions, backgrounding, and device routes all need to be handled explicitly.
Most importantly, I learned that AI works best when it is placed inside a focused user flow. Stir is a recipe app first, and the Copilot becomes useful because it is connected to a specific recipe and a real cooking session.
What's next for Stir
The next step for Stir is expanding the recipe and personalization experience while continuing to improve the Cooking Copilot.
Planned improvements include:
- A larger and more personalized recipe catalog.
- Better ingredient recognition and fridge-based recommendations.
- Shopping lists generated from selected recipes.
- More dietary, allergy, and preference controls.
- Improved support for cooking substitutions and ingredient availability.
- More natural multilingual voice conversations.
- Continued testing and refinement of the native iOS cooking experience.
The long-term goal is for Stir to become a calm, dependable cooking companion that helps people decide what to make, understand what to do, and enjoy the process of cooking.
Built With
- android
- asyncstorage
- computer-vision
- eas-build
- expo-audio
- expo-camera
- expo-notifications
- expo-router
- expo.io
- gemini-api
- gemini-live
- generative-ai
- google-gemini
- ios
- javascript
- multimodal-ai
- node.js
- react
- react-native
- replit
- rest-api
- revenuecat
- stir-vision
- typescript
- voice-ai


Log in or sign up for Devpost to join the conversation.