all repos — momix @ 9f32f2cdcf6da96968a218122ffa5a5a9150d36a

A CLI tool to manage recipes for Thermomix

docs: 📝 Add doc
Tim Izzo tim@5ika.ch
Sat, 03 Jan 2026 15:46:30 +0100
commit

9f32f2cdcf6da96968a218122ffa5a5a9150d36a

parent

a8fe8b4539e1497ca40aa37d7535160fba38df61

4 files changed, 77 insertions(+), 6 deletions(-)

jump to
A README.md

@@ -0,0 +1,63 @@

+# Momix + +**Momix** est une webapp et un outil en ligne de commande permettant d'enregistrer des recettes de cuisine et de générer des listes de course à partir de celles-ci. +Dans cette première version, il a été développé pour une utilisation avec un Thermomix® ainsi que le site [Cookidoo](https://cookidoo.fr/) pour la récupération des recettes +bien que la logique fonctionne pour tout site de recette proposant un [format de recette standardisé (schema JSON-LD)](https://schema.org/Recipe) facilement accessible dans la page HTML. + +L'app est minimaliste et le code frontend fonctionne sans Javascript, uniquement du HTML et du CSS. + +## Prérequis + +- [Deno](https://deno.land/) +- [Token API Mistral](https://docs.mistral.ai/getting-started/quickstart) + +## Configuration + +Afin de structurer correctement les ingrédients, l'outil utilise un LLM (Large Language Model) pour analyser les ingrédients et les convertir en un format structuré en séparant le nom, la quantité et l'unité. Actuellement, seul Mistral est supporté (l'offre gratuite est suffisante). + +Pour configurer l'outil, créez un fichier `.env` à la racine du projet avec le contenu suivant : + +``` +MISTRAL_APIKEY=mistral_api_key +``` + +## Webapp + +Pour lancer la webapp, exécutez la commande suivante : + +```bash +deno task web +``` + +Le serveur se lance en écoute sur le port `8000`. + +### Authentification + +Par défaut, les pages sont publiquement accessibles. +Il est possible de mettre une authentification HTTP basic en ajoutant les variables suivantes dans le fichier `.env` : + +``` +HTTP_USER=user +HTTP_PASS=pass +``` + +## CLI + +Pour lancer la CLI, exécutez la commande suivante : + +```bash +deno task cli +``` + +Exemples d'utilisation : + +```bash +# Enregistrer une nouvelle recette +deno task cli store https://cookidoo.fr/recipes/recipe/fr-FR/r80783 + +# Lister les recettes enregistrées +deno task cli list + +# Sélectionner des recettes pour créer une liste de course +deno task cli grocery +```
M server.tsxserver.tsx

@@ -38,10 +38,10 @@ const url = new URL(c.req.url);

const recipeIds = url.searchParams.get("recipeIds")?.split(",").map(Number) || []; const recipes = getRecipesList(db, recipeIds); - console.log({ recipes }); const ingredients = getGroceryList(db, recipeIds); return c.html( <Layout url={c.req.url}> + <a href="/">Retour</a> <GroceryList recipes={recipes} ingredients={ingredients} /> </Layout> );

@@ -52,12 +52,11 @@ const body = await c.req.formData();

const recipeId = body.get("recipeId"); if (!recipeId) return c.redirect("/"); try { - const result = await storeRecipe(db, recipeId as string); - console.log(result); - return c.redirect("/?msg=Recipe added successfully"); + await storeRecipe(db, recipeId as string); + return c.redirect("/?msg=La recette a bien été ajoutée"); } catch (error) { console.error(error); - return c.redirect("/?error=An error occured"); + return c.redirect("/?error=Erreur lors de l'ajout de la recette"); } });
M web/tsx/components.tsxweb/tsx/components.tsx

@@ -13,11 +13,19 @@ export const AddRecipe: FC = () => {

return ( <form method="post" action="/add-recipe"> <h2>Ajouter une recette</h2> - <label> + <p> + Découvrez des recettes sur{" "} + <a href="https://cookidoo.fr/search/fr-FR?languages=fr" target="_blank"> + Cookidoo + </a> + . + </p> + <label style="display:flex;width:100%;"> <input type="text" name="recipeId" placeholder="URL ou ID de la recette Cookidoo" + style="flex-grow:1;" /> <button type="submit">Ajouter</button> </label>
M web/tsx/layout.tsxweb/tsx/layout.tsx

@@ -15,6 +15,7 @@ <html>

<head> <meta name="viewport" content="width=device-width,initial-scale=1" /> <link href="/style.css" rel="stylesheet" /> + <meta charset="utf-8" /> </head> <body> <main>