โ† Projects
LiveRailway ยท PostgreSQL ยท Paprika v1 API

KusinAI

Family kitchen assistant with 1,200 recipes, a 174-item pantry, and dinner-party menus that sync to Paprika.

PythonTelegram Bot APIClaude SonnetPostgreSQL
๐Ÿณ
โ—โ—โ—โ—โ—โ—โ—โ—
Saveโ†’ Paprika

The problem

We have two cooking problems living in one household. On weekdays our maid needs simple, healthy meal suggestions that use whatever's already in the pantry, with as little decision-making as possible. On weekends I want to brainstorm dinner-party menus across cuisines, vet them for flow, and save them somewhere durable. No off-the-shelf recipe app solves either of those well, and none of them solve both.

The solution

KusinAI is a Telegram bot that runs in two modes from the same codebase. In group mode it's maid-accessible, and it draws only from a curated 93-item daily pantry. In one-on-one mode I get the full library โ€” 1,210 recipes across my collection and my Lola's, plus the 81-item special pantry full of premium ingredients and travel finds, plus Paprika menu generation. You can take a photo of a single recipe page and Sonnet will transcribe and save it; you can take a photo of a multi-page spread and the bot will infer where one recipe ends and the next one begins, saving each separately. The `save_recipe` tool is atomic on purpose โ€” the database row and the Paprika upload happen in one step, so the two never drift apart.

Features

  • โ€”1,210 recipes searchable from chat with full-text search
  • โ€”Two pantries: a 93-item daily list for the maid, an 81-item special list for me
  • โ€”Photo a recipe page and the bot transcribes and saves it
  • โ€”Photo a multi-page spread and the bot splits it into separate recipes
  • โ€”Dinner-party menu generation with mise en place
  • โ€”Atomic save: database row and Paprika upload happen in one step
  • โ€”Two-mode access: a group mode the maid can use, and a private mode with the full library

Architecture

  • โ€”PostgreSQL with full-text search across 1,210 recipes
  • โ€”Pantry split between a 93-item daily list the maid can see and an 81-item special list reserved for me
  • โ€”Telegram media groups are buffered for two seconds by `media_group_id`, and then Sonnet decides whether it's looking at one multi-page recipe or several distinct ones
  • โ€”Tool-use loop runs for up to 20 iterations with 8,192 max tokens per response, which leaves enough room for a single turn to save several recipes in a row
  • โ€”Paprika v1 API handles recipes, menus and menu items, all written alongside the database row
  • โ€”Operations go through the Railway GraphQL API directly, because the Railway CLI's auth flow doesn't work in non-interactive terminals