Your AI sous-chef that lives in your pocket.
Chefness is a mobile-first, offline-first Progressive Web App (PWA) that helps you cook using AI. Chat with a knowledgeable cooking guru that remembers your dietary restrictions, recent cooking history, and preferences — and helps you plan meals, discover recipes, and cook step-by-step. Save recipes to a personal collection, log what you've cooked, and let the AI suggest variety based on your history. It runs entirely in the browser with no backend server — you bring your own LLM API key.
![]() |
![]() |
![]() |
![]() |
![]() |
- 💬 AI Chat — Streaming conversations with a cooking guru persona
- 📷 Vision Prompts — take or attach photos when the selected model supports image input
- ⚙️ OpenRouter Integration — connect with OpenRouter OAuth and filter the live model catalog by free, vision, and tool support
- 🍳 Meal Planning — Meal type (breakfast / lunch / dinner / snack / dessert) and serving size selectors
- 📱 Mobile-First PWA — Installable, offline-capable, designed for kitchen use
- 💾 Save Recipe from Chat — One-tap save with LLM-powered structured extraction via native tool calling
- 📖 Recipe Collection — Browse, view, edit, and delete saved recipes
- 📋 Share as Markdown — Copy recipes to clipboard in clean Markdown format
- 🍽 "I Cooked This!" — Log meals from chat
- 📅 History Tab — Chronological cooking log with ratings and notes
- 🧠 AI Context — Recent cooking history injected into the AI's system prompt
# Clone
git clone https://github.com/maxpaulus43/chefness.git
cd chefness
# Install dependencies
bun install
# Start dev server
bun run dev
# Build for production
bun run build
# Preview production build
bun run previewOpen the app, go to Settings, connect your OpenRouter account, and select a model. Start chatting!
| Concern | Technology |
|---|---|
| Framework | React 19 |
| Language | TypeScript 6 (strict) |
| Bundler | Vite 8 |
| RPC Layer | tRPC 11 (in-browser, no server) |
| Server State | TanStack React Query 5 |
| Validation | Zod 4 |
| LLM Integration | OpenRouter OAuth + live model catalog + custom fetch-based streaming client |
| PWA | vite-plugin-pwa |
| Package Manager | Bun |
Chefness uses a strict four-layer architecture. Data flows downward; dependencies point downward.
┌─────────────────────────────────────────────┐
│ Components (UI, presentation only) │
├─────────────────────────────────────────────┤
│ Hooks (business logic, tRPC calls) │
├─────────────────────────────────────────────┤
│ tRPC Router (procedures, validation) │
├─────────────────────────────────────────────┤
│ Storage (localStorage repositories) │
└─────────────────────────────────────────────┘
All data operations run in-browser via tRPC with local persistence. No application backend server. LLM requests are sent to OpenRouter.
👉 See ARCHITECTURE.md for full details.
src/
components/ UI components (ChatView, RecipeListView, SettingsView, etc.)
hooks/ Business logic hooks (useChat, useRecipes, useCookingLog, etc.)
lib/ Utilities (llm-stream, recipe-extractor, recipe-markdown, etc.)
storage/ Persistence layer (localStorage repositories)
trpc/ In-browser tRPC setup (router, client, provider)
types/ Zod schemas and TypeScript types
- All data stays on-device in localStorage
- No accounts, no server, no tracking
- LLM network calls are sent only to OpenRouter
- The OpenRouter OAuth key is stored locally and sent only to OpenRouter
- Phase 4: Personalization — dietary restrictions, AI memory
- Phase 5: Conversation management — session persistence, history
👉 See PRD.md for the full roadmap.
MIT




