{
  "markdown": "# Recipe Library\n\nA mobile-first personal library for recipes worth making again: capture recipes, plan dinners, shop from a\ngenerated list, cook step by step, and ask grounded questions about saved recipes.\n\n## Local development\n\n```powershell\nnpm ci\nnpm run cf-typegen\nnpm run dev\n```\n\nThe Worker and its D1/R2 bindings run locally by default; Cloudflare credentials are not needed for local work.\n\nAt the local address shown by Vite, you can create, edit, favorite, search, filter, and deliberately\ndelete recipes. Recipes may start as a manual entry or an unsaved draft imported from a public URL,\npasted recipe text, a PDF (with an explicit one-time OCR fallback for scans), an image or screenshot,\nor TheMealDB. Every import preserves its provenance, requires review, and only creates a library recipe\nafter **Review and save**.\n\nSaved recipes can be opened in read-only Cooking Mode, assigned to a Sunday-based weekly dinner plan,\nand used to generate an editable persistent grocery checklist. **Recipe Chat** answers bounded,\nread-only questions against saved recipes and links its citations to their recipe detail pages. The\nowner-facing **Usage & Costs** page shows application activity and, only when separately configured,\nsafe Cloudflare and OpenAI reporting summaries.\n\nText, OCR, image extraction, and Recipe Chat use Worker-only OpenAI credentials. Local automated tests\nuse controlled doubles and make no OpenAI requests. Keep `OPENAI_API_KEY` only in an ignored local `.env`\nvariant; use `OPENAI_MODEL=gpt-5-mini` unless deliberately evaluating another model. Never use a\nbrowser-prefixed variable or commit a credential.\n\n## Validation\n\n```powershell\nnpm run typecheck\nnpm run cf-typecheck\nnpm run build\nnpm test\nnpm run test:worker\nnpm run test:integration\nnpm run test:e2e\nnpm run eval:recipe-chat:dry\n```\n\nCloudflare resource provisioning and deployment are separate account-changing steps.\n\n## Remote deployment\n\nProduction is configured only for `https://recipes.merkavaenterprises.com`; the provider-assigned Worker\naddress is disabled. Before deployment, make sure `merkavaenterprises.com` is an active Cloudflare zone\nand the `recipes` hostname has no conflicting CNAME record.\n\nSet up a Cloudflare Access self-hosted application for the exact hostname with one Allow policy for the\nowner's approved email. Keep the email out of Git and do not use an Everyone, all-valid-email, domain-wide,\nor bypass policy. Confirm that the chosen Access sign-in method works for the owner before release.\n\nKeep `OPENAI_API_KEY` in Cloudflare Worker secret management only. Review and explicitly confirm remote\nD1 migrations against the existing `recipeapp-db`; do not recreate the database or the private\n`recipeapp-sources` R2 bucket. After deployment, verify unauthenticated Access denial, authorized health,\nmanual save/search, text-import review/save, meal-plan and grocery-list behavior, Recipe Chat, and the\ndata-preserving rollback procedure described in\n`specs/008-secure-deployment/quickstart.md`. Every Cloudflare, DNS, database, secret, and deployment action\nrequires separate owner approval at the time it runs.\n\nRecord deployment evidence and the current recovery version in the feature quickstart only; do not place\nowner identities, API keys, session data, or private source material in Git.\n",
  "bytes": 3320,
  "sha": "18c6f58a5ad96dcd5105bf8e8efd9c615b762fba12291ca1e1b5abe41a2a24cc",
  "repo_slug": "jonc613/recipeapp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_jonc613_recipeapp_sdd_memory_index_md_19a81c82/readme"
}