A personal recipe manager that works like a native app on your phone. Manage recipes, plan meals, build shopping lists, and use AI to discover new dishes — all from a fast, offline-capable PWA you fully own and control.
Free to host on Cloudflare's free tier. No coding required.
Contents: Features · Tech Stack · Self-Hosting · AI Setup · Household Sharing · Updates · Development · License
- Import from URL, Google Sheets, CSV, photos, or paste from anywhere
- Full-text search, tags, favorites, and category browsing
- Cook mode with step-by-step view, wake lock, text-to-speech, and timers
- Weekly calendar with configurable meal slots (breakfast, lunch, dinner, snack, dessert, extra)
- Quick-fill with smart suggestions or plan conversationally via the AI assistant
- Auto-generate from meal plans or build manually
- Scan handwritten lists with your camera
- Categorized by aisle
- Recipe suggestions, substitutions, cooking tips, and meal planning
- Streams responses in real time with tappable recipe cards
- Multi-provider: Groq, Gemini, OpenAI, Anthropic, Cerebras, xAI
- Browse trending recipes from configurable sources (add any recipe site)
- Auto-detects site framework (Next.js, Dotdash Meredith) for optimized scraping
- AI-tagged by cuisine, diet, and cook time
- Photo recognition — snap a dish, get the recipe
- Multi-user household sharing with simple password auth
- Offline-first — works without internet, syncs in background
- 11 seasonal accent themes that auto-switch for holidays
- PWA — install to your home screen for a native app feel
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript 5.9, Vite 7, Tailwind CSS 4 |
| Backend | Cloudflare Pages Functions (serverless, file-based routing) |
| Storage | Cloudflare KV (data) + R2 (photos) |
| Search | Cloudflare Vectorize + Workers AI (semantic recipe search) |
| AI | Groq (recommended), Gemini, Cerebras, OpenAI, Anthropic, xAI |
Whisk is fully self-hostable — no code changes needed. Fork the repository, follow the setup guide below, and deploy to your own Cloudflare Pages project.
- A GitHub account (free) — github.com/join
- A Cloudflare account (free) — dash.cloudflare.com/sign-up
- A Groq account (free, for AI features) — console.groq.com (recommended)
- About 15-20 minutes for the initial setup
No credit card is required for any of the above.
- Go to github.com/rsmedstad/whisk
- Click Fork > Create fork
- Note your fork URL:
github.com/YOUR-USERNAME/whisk
Pick a password for your recipe app (not your GitHub or Cloudflare password). This is what you and your household will use to log in.
- Go to console.groq.com and sign up (free, no credit card)
- Click API Keys > Create API Key
- Copy the key (starts with
gsk_)
- In the Cloudflare dashboard, go to Storage & Databases > KV > create a namespace called
whisk-data - Go to R2 Object Storage > create a bucket called
whisk-photos
- Go to Workers & Pages > Create > Pages > Connect to Git
- Select your
whiskfork - Configure the build:
- Build command:
bun install && bun run build - Build output directory:
dist
- Build command:
- Add environment variables:
| Variable | Value |
|---|---|
NODE_VERSION |
20 |
APP_SECRET |
your app password |
GROQ_API_KEY |
your Groq API key |
- Click Save and Deploy
- Go to your Pages project > Settings > Bindings
- Add KV namespace: variable
WHISK_KV→ selectwhisk-data - Add R2 bucket: variable
WHISK_R2→ selectwhisk-photos - Go to Deployments > retry the latest deployment
Open https://your-project.pages.dev, tap Join an Existing Book, enter your name and password.
Add to home screen for a native app experience:
- iPhone: Safari > Share > Add to Home Screen
- Android: Chrome > Menu > Install App
Groq is the recommended AI provider — free, fast, and supports both text and photo recognition. Configure your provider in Settings > AI.
Add API keys in Cloudflare (Workers & Pages > your project > Settings > Variables and Secrets):
| Variable | Provider | Free? |
|---|---|---|
GROQ_API_KEY |
Groq (recommended) | Yes |
CEREBRAS_API_KEY |
Cerebras | $5/mo credit |
OPENAI_API_KEY |
OpenAI | Paid |
GEMINI_API_KEY |
Google Gemini | Yes |
ANTHROPIC_API_KEY |
Anthropic | Paid |
XAI_API_KEY |
xAI Grok | Paid |
Some recipe sites block direct access. Browser Rendering uses a headless browser as a fallback.
- Find your Account ID in the Cloudflare dashboard URL
- Create an API token: My Profile > API Tokens > Custom token with Browser Rendering: Edit permission
- Add both as environment variables:
| Variable | Value |
|---|---|
CF_ACCOUNT_ID |
your Cloudflare account ID |
CF_BR_TOKEN |
the API token |
Check status in Settings > AI > Browser Rendering.
Import recipes from Instagram post captions using Apify.
- Create a free account at apify.com (includes $5/month credit)
- Copy your API token from Settings > Integrations
- Add as
APIFY_API_TOKENin Cloudflare environment variables
Share your app URL and password with family members. Each person picks their own display name. The first person to log in becomes the owner and can manage members in Settings > Account.
- Go to your fork on GitHub
- Click Sync fork > Update branch
- Cloudflare automatically rebuilds (1-2 minutes)
Update APP_SECRET in Cloudflare (Workers & Pages > your project > Settings > Variables and Secrets), then retry deployment. All members will need to log in again.
bun install # Install dependencies
bun run dev # Start dev server on :5173
bun run build # TypeScript check + production buildCreate a .dev.vars file:
APP_SECRET=your-password
GROQ_API_KEY=your-key-here
If you find Whisk useful, consider making a donation to the American Diabetes Association. This project is dedicated to the memory of a loved one.
Bug reports and suggestions are welcome — please open an issue. See CONTRIBUTING.md for code contribution guidelines.
AGPL-3.0 — free to self-host, modify, and share. Modified versions deployed as a network service must make source code available under the same license.




