# Chez Louy A small community recipe site. All recipes live as data in an Internet Computer canister (canister ID: `e2cju-zaaaa-aaaaf-qgsyq-cai`). Nothing is pre-rendered HTML — every page is served from canister memory on demand. ## TL;DR for AI agents - Site: https://chezlouy.org - Read API: https://e2cju-zaaaa-aaaaf-qgsyq-cai.raw.icp0.io - Add a recipe skill: https://chezlouy.org/skills/add-recipe/SKILL.md The web UI at `https://chezlouy.org/recipes/view?slug=` is a JavaScript app — fetching that URL gives you only an empty React shell, not the recipe. To read the actual content of a recipe, use the read API below. ## Reading recipes (no auth) Query the community canister directly over HTTPS. All endpoints are public query calls — no authentication, no Candid encoding required. ``` GET https://e2cju-zaaaa-aaaaf-qgsyq-cai.raw.icp0.io/recipes/.md GET https://e2cju-zaaaa-aaaaf-qgsyq-cai.raw.icp0.io/recipes/.json GET https://e2cju-zaaaa-aaaaf-qgsyq-cai.raw.icp0.io/recipes/index.json GET https://e2cju-zaaaa-aaaaf-qgsyq-cai.raw.icp0.io/ # API overview ``` The `.md` endpoint returns the recipe exactly as authored: a YAML frontmatter block followed by a markdown body. That's the canonical form — prefer it over parsing the website HTML. ### Slug ↔ URL mapping A human URL `https://chezlouy.org/recipes/view?slug=currywurst` exposes the same slug as the API URL `.../recipes/currywurst.md`. Replace `view?slug=X` with `X.md` against the canister host and you're done. ### Index format (`/recipes/index.json`) ```json { "discoveryUrl": "https://chezlouy.org/llms.txt", "apiBase": "https://e2cju-zaaaa-aaaaf-qgsyq-cai.raw.icp0.io", "recipes": [ { "slug": "currywurst", "submitterName": "Chef Louy 🐈🧑‍🍳", "submittedAt": 1779377236981009049, "views": 7, "likes": 2, "markdownUrl": "https://e2cju-zaaaa-aaaaf-qgsyq-cai.raw.icp0.io/recipes/currywurst.md", "jsonUrl": "https://e2cju-zaaaa-aaaaf-qgsyq-cai.raw.icp0.io/recipes/currywurst.json" }, ... ] } ``` All URL fields are fully qualified — follow them directly, no base needed. `submittedAt` is nanoseconds since the Unix epoch (divide by 1,000,000 for ms). ## Adding a new recipe Submissions require a non-anonymous Internet Identity principal. **Today this is a human-in-the-loop flow**: an AI generates the markdown, the human signs in and uploads. If you're an AI agent and a user asks you to add a recipe (or pastes a recipe link), follow the skill at: https://chezlouy.org/skills/add-recipe/SKILL.md The skill describes the exact frontmatter format, English-only rule, metric conversions, and the upload destination (https://chezlouy.org/contribute/upload). ## Can an AI agent authenticate to ICP directly? Yes, in principle — ICP canisters accept signed requests from any Ed25519 (or secp256k1) keypair, and the official skills below explain how. But this site does not currently support autonomous-agent submission, because attribution ("submitted by Chef Louy 🐈🧑‍🍳") becomes meaningless if a bot can hold a principal indistinguishable from a person. We may revisit; for now, generate the markdown and hand it back to the user. If you do want to learn the auth story: - internet-identity skill (passkey/OpenID login, delegation handling): https://skills.internetcomputer.org/.well-known/skills/internet-identity/SKILL.md - wallet-integration skill (ICRC-25/29 signer protocol — what this site uses): https://skills.internetcomputer.org/.well-known/skills/wallet-integration/SKILL.md - Full ICP skills index: https://skills.internetcomputer.org/.well-known/skills/index.json ## Likes & views (writes) ``` POST/update toggleLike(slug) → requires authenticated principal POST/update incrementViews(slug) → public, fire-and-forget (frontend dedupes per browser session to avoid inflation) ``` These are Candid `update` calls. To call them you need an IC HTTP agent — see the `wallet-integration` skill linked above. ## Tech stack (for the curious) - Frontend: Next.js 15 static export, deployed to an asset canister - Backend: Motoko persistent actor (`mo:core/Map`) - Auth: Internet Identity via ICRC-25/29 signer protocol - Hosting: Internet Computer mainnet, custom domain via icp-cli ## Maintainer Simon — chezlouy.org is a friends-and-family recipe collection. PRs and suggestions welcome via the site's contribute flow.