Saved recipes: save, notes, star rating, manual style tags (Free tier) #24

Closed
opened 2026-04-07 21:53:06 -07:00 by pyr0ball · 0 comments
Owner

Summary

Allow users to bookmark any recipe from search results or the browser. Free tier feature.

DB Changes

  • Migration 018: saved_recipes table — id, recipe_id (FK to recipes), saved_at, notes (text), rating (0–5 integer, nullable), style_tags (JSON array), UNIQUE on recipe_id (one save per recipe per user per-user SQLite)

Store Methods

  • save_recipe(recipe_id, notes, rating) -> dict
  • unsave_recipe(recipe_id) -> None
  • is_recipe_saved(recipe_id) -> bool
  • update_saved_recipe(recipe_id, notes, rating, style_tags) -> dict
  • get_saved_recipes(sort_by="saved_at", collection_id=None) -> list[dict]
    • sort_by options: saved_at, rating, title

API Endpoints

New file: app/api/endpoints/saved_recipes.py

  • POST /recipes/saved{recipe_id, notes?, rating?}
  • DELETE /recipes/saved/{recipe_id}
  • PATCH /recipes/saved/{recipe_id} — update notes/rating/style_tags
  • GET /recipes/saved?sort_by=&collection_id=

Schema

New file: app/models/schemas/saved_recipe.pySaveRecipeRequest, UpdateSavedRecipeRequest, SavedRecipeSummary

Frontend

  • Save button on RecipeDetailPanel.vue
  • SaveRecipeModal.vue — notes textarea, 0–5 star rating widget, style tag chips (free-text, Enter/comma to add)
  • SavedRecipesPanel.vue — flat list with sort controls, recipe cards showing rating + tags + notes preview
  • New Saved tab in RecipesView.vue (tab bar: Find / Browse / Saved)

Also consider

  • Show saved star ratings in pantry-search results view (JOIN on saved_recipes) — low effort, same pass
  • Include saved recipes in CSV export (app/services/export/spreadsheet_export.py)

Spec

circuitforge-plans/kiwi/superpowers/specs/2026-04-07-saved-recipes-browser-design.md section 3

## Summary Allow users to bookmark any recipe from search results or the browser. Free tier feature. ## DB Changes - Migration 018: `saved_recipes` table — `id`, `recipe_id` (FK to recipes), `saved_at`, `notes` (text), `rating` (0–5 integer, nullable), `style_tags` (JSON array), UNIQUE on `recipe_id` (one save per recipe per user per-user SQLite) ## Store Methods - `save_recipe(recipe_id, notes, rating) -> dict` - `unsave_recipe(recipe_id) -> None` - `is_recipe_saved(recipe_id) -> bool` - `update_saved_recipe(recipe_id, notes, rating, style_tags) -> dict` - `get_saved_recipes(sort_by="saved_at", collection_id=None) -> list[dict]` - sort_by options: `saved_at`, `rating`, `title` ## API Endpoints New file: `app/api/endpoints/saved_recipes.py` - `POST /recipes/saved` — `{recipe_id, notes?, rating?}` - `DELETE /recipes/saved/{recipe_id}` - `PATCH /recipes/saved/{recipe_id}` — update notes/rating/style_tags - `GET /recipes/saved?sort_by=&collection_id=` ## Schema New file: `app/models/schemas/saved_recipe.py` — `SaveRecipeRequest`, `UpdateSavedRecipeRequest`, `SavedRecipeSummary` ## Frontend - Save button on `RecipeDetailPanel.vue` - `SaveRecipeModal.vue` — notes textarea, 0–5 star rating widget, style tag chips (free-text, Enter/comma to add) - `SavedRecipesPanel.vue` — flat list with sort controls, recipe cards showing rating + tags + notes preview - New **Saved** tab in `RecipesView.vue` (tab bar: Find / Browse / Saved) ## Also consider - Show saved star ratings in pantry-search results view (JOIN on `saved_recipes`) — low effort, same pass - Include saved recipes in CSV export (`app/services/export/spreadsheet_export.py`) ## Spec `circuitforge-plans/kiwi/superpowers/specs/2026-04-07-saved-recipes-browser-design.md` section 3
pyr0ball added the
enhancement
label 2026-04-07 21:53:06 -07:00
pyr0ball added this to the Beta — Recipe Suggestions milestone 2026-04-07 22:09:31 -07:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/kiwi#24
No description provided.