A fast, self-hosted recipe manager built with Rust, Axum, and Askama. Designed for home cooks and BBQ enthusiasts.
Desktop Home
|
Integrated Timer
|
Mobile Experience
|
Smart Filtering (Mobile)
|
- Mobile-First UI — Tabbed recipe view, Wake Lock API for cooking, responsive hamburger menu, and card-based admin panel on small screens.
- Cooking Timer — Quick-access floating timer with smart suggestions extracted from recipe text, sound/vibration alerts, and browser notifications.
- Cooking Temperatures & USDA Log 7 — Built-in meat temp reference and an interactive hold-time calculator for safe poultry lethality at lower temps.
- Multi-Tag Filtering — Apply multiple tags with AND logic; the filter menu dynamically updates to only show relevant tags.
- Favorites — Mark recipes as favorites from cards or detail pages; filter by favorites on the home screen.
- Ingredient Scaling & Unit Conversion — Scale yields (0.5x–3x) and convert between Original, Metric, and Imperial inline.
- Baker's Percentage Mode — Auto-activates for
bread/doughtagged recipes, showing hydration and ratios relative to flour weight. - Combustion Inc. Integration — Upload thermometer CSV exports to visualize core, surface, and ambient temps with Chart.js.
- Fermentation Calculator — Estimates proofing times based on yeast/starter amounts and kitchen temperature.
- Smart Import — Scrape recipes from URLs (LD+JSON or Gemini AI fallback), import Paprika archives, or snap a photo of a cookbook page with AI Vision.
- YouTube Import — Paste a YouTube URL to generate a recipe from the transcript via Gemini AI, with an embedded player for follow-along.
- Shopping Lists — Select multiple recipes, scale portions, and generate a combined ingredient list. Lists are persisted server-side with check-off state and can be cleared.
- Multi-User & Access Control — Self-service registration, bcrypt passwords, Google OAuth 2.0, per-user recipe ownership, and public/private visibility toggles.
- Admin Panel — Manage users, reset passwords, and delete accounts from a responsive admin interface.
- REST API — Full CRUD API (
/api/v1) with token auth for programmatic access. Built-in interactive API guide at/api.
Base URL: /api/v1 — [Interactive docs at /api]
| Endpoint | Method | Description |
|---|---|---|
/recipes |
GET |
List all recipes. |
/recipes |
POST |
Create a recipe. |
/recipes/{id} |
GET |
Get a recipe (supports unit/scale query params). |
/recipes/{id} |
PUT |
Update a recipe. |
/recipes/{id} |
DELETE |
Delete a recipe. |
/temps |
GET |
Internal meat temperature reference. |
/log7 |
GET |
USDA Log 7 hold-time calculator. |
/ferment |
GET |
Fermentation time estimator. |
/import |
POST |
Import a recipe from a URL via AI. |
/shopping-list |
POST |
Generate a shopping list from selected recipes. |
/shopping-list |
GET |
Retrieve the saved shopping list. |
/shopping-list |
PUT |
Save/update shopping list state. |
/shopping-list |
DELETE |
Clear the saved shopping list. |
Mutable endpoints require an API_TOKEN via Authorization: Bearer <token>.
# With Rust installed locally
cargo run --bin hash_password "my_secure_password"
# Or via Docker
docker run --rm dnewsholme/recipemanager:latest ./hash_password "my_secure_password"Copy the output (e.g., $2y$12$...) and use it as ADMIN_PASSWORD_HASH.
Environment Variables:
| Variable | Required | Description |
|---|---|---|
ADMIN_EMAIL |
Yes | Email address of the admin account. The application will not start if this is unset. |
ADMIN_PASSWORD_HASH |
Yes | Bcrypt hash for admin login. Default password is "admin" if omitted. |
API_TOKEN |
Yes | Token for API write access. |
SESSION_SECRET |
Recommended | Signs session cookies. Sessions reset on restart if omitted. |
GEMINI_API_KEY |
No | Enables AI photo/video/URL import via Google AI Studio. |
GOOGLE_CLIENT_ID |
No | Google OAuth 2.0 Client ID. |
GOOGLE_CLIENT_SECRET |
No | Google OAuth 2.0 Client Secret. |
GOOGLE_REDIRECT_URI |
No | OAuth callback URL (defaults to <app_base>/login/google/callback). |
APP_BASE |
No | Subpath prefix for reverse proxy setups (e.g., /recipes). |
git clone https://github.com/dnewsholme/recipemanager.git
cd recipemanager
export ADMIN_PASSWORD_HASH='<your_generated_hash>'
export API_TOKEN='your_api_token_here'
export SESSION_SECRET='your_random_secret_string'
cargo runAvailable at http://localhost:3000.
docker run -d \
--name recipemanager \
-p 3000:3000 \
-e ADMIN_PASSWORD_HASH='<your_generated_hash>' \
-e API_TOKEN='your_api_token_here' \
-e SESSION_SECRET='your_random_secret_string' \
-v /path/to/your/data:/app/data \
dnewsholme/recipemanager:latestrecipes.db— SQLite database (users, recipes, meal plans).uploads/— Cover images and Combustion CSV files.recipes/— (Legacy) Place old.mdfiles here; they'll be auto-migrated on startup.



