Household stack on the "AI-Recipe-Book" LXC: Mealie (recipes), Grocy (groceries/ERP), Karakeep (bookmarks/read-later, AI-tagging capable).
| Guest | LXC 112 "AI-Recipe-Book" on M910q |
| IP | 192.168.86.209 |
| Tailscale | ai-recipe-book / 100.81.122.40 |
| Resources | 3 vCPU / 8.8 GB |
| Rootfs | 150G ceph-storage (6% used — oversized) |
| Port | App |
|---|---|
| 9000 | Mealie |
| 9283 | Grocy |
| 3000 | Karakeep |
/opt/kitchen-ai/docker-compose.yml; data ./data/<app>⚠️ Not in vzdump job — recipes/household data would be lost. Add 112. Now more important than before: the recipe router (below) writes state (import tags) directly onto Karakeep bookmarks, so this LXC holds automation state, not just recipes.
cd /opt/kitchen-ai && docker compose pull && docker compose up -d && docker image prune -f
None in Kuma yet → add three HTTP monitors.
Goal: one standardized pipeline every recipe source (website, TikTok, YouTube, Instagram, Pinterest) flows through — Karakeep → n8n classify → dedicated branch → Mealie → meal plan → Grocy. Built 2026-07-15. Only the website branch is implemented so far; the rest are stubbed but the framework doesn't need redesigning to add them.
Full technical writeup (endpoint shapes, exact API auth quirks, every node) lives at /opt/kitchen-ai/docs/README.md on the container — this section is the operational summary.
Three n8n workflows (n8n LXC 105, .200):
Recipe Router - Core (id UxkE7Uukup5d8IWL) — the actual logic, called as a sub-workflow. Skips non-link and already-processed bookmarks, classifies source type from the URL, routes via a Switch node. Website branch calls Mealie's import API; the other four source types fan into a shared "pending" stub tag (recipe-pending-<type>) until their real pipelines are built.Recipe Router - Webhook (id Fc0NpWPKd9ht9VdT) — fast path. Karakeep webhook (subscribed to its created event, webhook id mgb6ze40yk19pqcju176l2u7) hits http://192.168.86.200:5678/webhook/karakeep-recipe-router, which checks list membership then calls Core.Recipe Router - Poll Fallback (id HIAs5tb2c6GpEza2) — safety net, checks the Recipes list every 20 minutes. Needed, not just redundant: Karakeep fires no webhook at all when a bookmark is added to a list after creation (checked the source — no such event exists), so a webhook-only design would silently miss anything organized into Recipes after the fact.Karakeep bookmarks get tagged as they're processed instead of moved/deleted, so nothing saved is ever lost: recipe-imported (+ mealie:<slug>), recipe-import-failed, or recipe-pending-<type>.
Known limitation: Mealie's import endpoint returns a generic, useless error body on failure — the real reason (e.g. no parseable recipe schema on the page, or the site 403s the scraper as a bot — confirmed happening on allrecipes.com) only shows in docker logs mealie, not in the API response n8n sees.
Per the credential-handling convention already used for Agent Hub, Claude generates the API tokens but Cody creates the n8n credentials himself rather than having them injected directly. Two Header Auth credentials needed in n8n:
| Credential name | Header | Value | Attach to |
|---|---|---|---|
Mealie API |
Authorization |
Bearer <mealie n8n-integration token> |
Core → Import To Mealie (1 node) |
Karakeep API |
Authorization |
Bearer <karakeep n8n-integration key> |
Core → Tag As Pending, Tag As Imported, Tag As Import Failed; Webhook → Get Bookmark Lists, Get Bookmark Tags; Poll → Get Recipes List Bookmarks (6 nodes) |
Steps:
Recipe Router - Webhook and Recipe Router - Poll Fallback (top-right toggle in each workflow). Recipe Router - Core does not get activated — it's only ever invoked by the other two.Status: all three workflows are active and verified end-to-end (2026-07-15) — a saved recipe URL now flows all the way to a Mealie recipe automatically. Domains mealie.codycodez.com / grocy.codycodez.com are also live via NPM.
Recipe Router - Poll Fallback in the n8n editor and click Execute workflow. It should run immediately (no need to wait for the 20-minute schedule), pull the pancakes bookmark, and hand it to Core.recipe-imported and mealie:pancakes tags.Recipe Router - Poll Fallback and Recipe Router - Core.Recipe Router - Webhook should appear within a few seconds (not 20 minutes) if the webhook delivery works.recipe-import-failed tag rather than a crash.tiktok.com or youtube.com link into Recipes. Expect recipe-pending-tiktok / recipe-pending-youtube — confirms the router correctly defers unimplemented source types instead of misrouting them to the website importer.3 vCPU / 9 GB / 150G is a lot for three light apps — likely sized for future AI features (Karakeep tagging, Mealie parsing). Fine on M910q for now.