Recipe Box
Recipe box API with ingredient counts and quick-meal search as computed columns and queries
One app.py with 1 table, 3 computed columns, 4 HTTP routes. Needs pixeltable[serve]>=0.7.14. Updated 2026-09-23.
app.py
"""Recipe Box API built with Pixeltable.pxt schema update app.py recipespxt service run app.py recipes"""import pixeltable as pxtimport pixeltable.functions as pxtffrom pixeltable.serving import FastAPIRouterfrom udfs import ingredient_count, teaser# ---- tables ----TableModel = pxt.model_base()class Recipes(TableModel, name='recipes'):id = pxt.Column(value=pxtf.uuid.uuid7(), primary_key=True)title: pxt.Stringingredients: pxt.Stringminutes: pxt.Int | Nonenotes: pxt.String | Nonen_ingredients = ingredient_count(ingredients)title_upper = pxtf.string.upper(title)title_blurb = teaser(title, minutes)# ---- queries ----@pxt.querydef quick_recipes(max_minutes: int):"""Recipes that fit a time budget, fastest first."""return Recipes.where(Recipes.minutes <= max_minutes).select(Recipes.id, Recipes.title_blurb, Recipes.n_ingredients).order_by(Recipes.minutes)# ---- routes ----recipes_api = FastAPIRouter(name='recipes_api')recipes_api.add_insert_route(Recipes, path='/recipes',inputs=[Recipes.title, Recipes.ingredients, Recipes.minutes, Recipes.notes],outputs=[Recipes.id, Recipes.n_ingredients, Recipes.title_upper, Recipes.title_blurb],)recipes_api.add_update_route(Recipes, path='/recipes/update',inputs=[Recipes.title, Recipes.ingredients, Recipes.minutes, Recipes.notes],outputs=[Recipes.id, Recipes.n_ingredients, Recipes.title_upper, Recipes.title_blurb],)recipes_api.add_compute_route(Recipes, path='/ingredient-count', inputs=[Recipes.ingredients],outputs=[Recipes.n_ingredients])recipes_api.add_query_route(path='/recipes/quick', query=quick_recipes, method='get')
What app.py declares
Each row links to its line.
- runs on insert
- stored
- index
- route
serves recipes_api
- POST/recipesinsert, recipestakes title, ingredients, minutes, notes; returns id, n_ingredients, title_upper, title_blurbL39
- POST/recipes/updateupdate, recipestakes title, ingredients, minutes, notes; returns id, n_ingredients, title_upper, title_blurbL44
- POST/ingredient-countcompute, recipestakes ingredients; returns n_ingredientsL49
- GET/recipes/quickquery, quick_recipestakes max_minutesL51
Run it
Needs uv. The routes then answer on port 8000.
terminal
git clone https://github.com/pierrebrunelle/pixeltable-recipe-boxcd pixeltable-recipe-boxuv syncuv run pxt schema update app.py recipesuv run python seed.py recipesuv run pxt service run app.py recipes --port 8000
Related apps
- Forge Heat CyclesForge heat-cycle registry API: B-tree indexes, chained risk UDFs, and parallel shop-floor writersShares: UDFs
- Climbing Route ToposClimbing-route topo registry API: photo uploads with thumbnails, grayscale copies, grade bands and index-backed crag lookupsShares: UDFs
- Warehouse Pick ListsWarehouse pick-list REST API: units, pick zones, waves and tote labels as incremental computed columns over Json order linesShares: UDFs