FamilyHub now has a shared cookbook

FamilyHub Team

FamilyHub now has a shared cookbook

Most weeks my wife asks me what we should cook, I say "I don't know, you pick", and we end up making the same three things. The problem isn't that we don't know recipes — it's that they live scattered: bookmarks in one phone, a screenshot in the other, three Instagram saves, a paper note stuck to the fridge from someone's aunt. Never in one place. Never searchable. Never trusted to be there when you actually need them on a Tuesday evening at 17:45 with two hungry kids.

The new Recipes tab is the fix. A shared family cookbook that lives next to your shopping lists and calendar, syncs to every device, and works on the kitchen tablet.

What's in it

  • A Recipes tab in the main navigation, next to Calendar.
  • Manual entry with the familiar form: title, summary, servings, prep/cook/total time, ingredients, ordered steps, tags, notes.
  • Import from URL — paste a link to any recipe page on the web. FamilyHub fetches it server-side, strips the HTML, and sends the text to the AI.
  • Import from pasted text — works the same, minus the fetch. Useful for Instagram captions, WhatsApp messages, or whatever ended up in your clipboard.
  • Search across your cookbook by title, summary, or tag.
  • Edit, delete, and of course view.

Imports always land in the editor first. You see what the AI extracted, tweak anything, then save. Nothing is persisted until you hit Save.

The part I care about: the AI can't go off-script

I wanted this feature to exist, but I didn't want yet another "paste your data into an AI and hope" flow. LLMs are chatty, they summarize when you don't ask them to, they invent units, they translate when you want them not to. So the import pipeline is deliberately strict:

  1. FamilyHub fetches the URL from the server, not the browser. The fetcher rejects loopback, link-local, and site-local addresses so the server can't be tricked into reaching your internal network. Response size is capped at 2 MB.
  2. The HTML is parsed with jsoup, scripts/nav/ads are dropped, and only the text remains.
  3. The text is sent to Claude (or OpenAI, if you're on BYOK) with a system prompt that says: return exactly one JSON object matching this schema, no prose, no markdown, no questions. Required fields: title, ingredients (≥1), steps (≥1).
  4. The response is parsed into a typed RecipeDraft. Unknown fields are silently dropped. Missing required fields → the request fails with a clean 422 error. Non-JSON → fails the same way.
  5. What you see in the editor is the typed object, not raw AI output.

The same "intents" pattern that powers the voice assistant, applied to a bigger schema. No free-form LLM output ever touches your database.

Who can use it

Manual entry works on every plan, including Free. AI import (URL + text) needs AI access, so it's on:

  • Cloud BYOK — bring your own Anthropic/OpenAI key.
  • Cloud Full — hosted by me, no setup.
  • Self-hosted — bring your own key.

If you're on Free and try to import, you'll get a subscription-required error. Upgrade, or switch to self-hosting and bring a key.

What's next for recipes

This is v1. Things we punted on intentionally and will come back to:

  • Add to shopping list — one tap to send all ingredients from a recipe to Boodschappen.
  • Scaling servings — recipe is for 4, you're cooking for 2, the quantities halve themselves.
  • Cook mode — a full-screen, step-by-step view optimized for the kitchen tablet.
  • Photos — one image per recipe.

If one of those is a must-have for your family, say so in the GitLab issue tracker and I'll prioritise accordingly.

Try it out. Paste in a favorite recipe URL and see what comes back.