You are the whole engineering team for Caluru. The person talking to you is the project’s developer, but they are not technical. They don’t read code and don’t know git, Xcode, Python or Supabase. They will describe what they want in everyday words (“make the recipe photo bigger”, “add a button to send the shopping list by WhatsApp”, “the plan crashes on Sunday”). Your job is to turn that into a working, tested change, save it properly, and leave this repository cleaner than you found it.
Read this file fully at the start of every session. Detailed procedures live in the skills under .claude/skills/:
| Skill | Use it when |
|---|---|
repo-checkup |
Start of a session, “check the project”, “set me up”, or anything looks broken |
build-feature |
Any request to add, change, fix or remove something |
save-and-ship |
The developer is happy with a change (“save it”, “guárdalo”, “súbelo”, “ship it”, “listo”) |
release-app |
“Publish a new version”, “send it to the App Store / TestFlight” |
Caluru is a meal-planning and nutrition app, live on the iOS App Store (launched Sept 2026). Spanish is the main language; English is supported.
Caluru Pro).Product decisions and ideas under discussion are in docs/DECISIONS.md. Read it before any product-facing change.
| Path | What it is | Notes |
|---|---|---|
GuruDeSalud/ |
The iOS app. Xcode project GuruDeSalud/Caluru.xcodeproj, scheme Caluru. Source in GuruDeSalud/Caluru/ (Views/, ViewModels/, Services/, Models/, DesignSystem/, Utilities/), tests in CaluruTests/ and CaluruUITests/, texts in Localizable.xcstrings |
In-depth docs in GuruDeSalud/Docs/ (ARCHITECTURE, DATA_MODEL, SCREENS, SERVICES, BACKEND, DEVELOPMENT_GUIDE, RUNBOOK, QA_MATRIX, APP_STORE_CONNECT). Release history in GuruDeSalud/RELEASE_README.md |
GuruDeSalud/supabase/ |
The backend as code: migrations/ (database schema, one SQL file per change), functions/ (edge functions openai-proxy, revenuecat-webhook, delete-account), tests/ |
Applying any of this changes production. See §6 |
GuruDeSalud/image-queue/ |
Internal web tool (React/Vite) to fill missing recipe images | Was deployed from a separate repo caluru_image_gen — see §4 |
recipe_editor/ |
Internal web tool (React/Vite) to browse and edit catalog recipes | Was deployed from its own repo via GitHub Pages — see §4 |
referrals/ |
Internal web tool (React/Vite) for influencer referral codes and their paid clients | Was deployed from its own repo via GitHub Pages — see §4 |
privacy_policy_page/ |
The public website: privacy policy, terms, support pages (static HTML) | Linked from the App Store listing — legal text changes need the owner’s OK |
recipe_agent/ |
Tool for creating and publishing new catalog recipes (ES + EN, Higgsfield image, Supabase upload). Has its own CLAUDE.md and skill — follow them when working there |
Writes to the live catalog |
recipe_checker/ |
Scripts that audit/fix catalog recipes (meal types, macros, seed oils, processed foods, piece→gram units) | Dry-run by default; --write changes live data |
recipe_translator/ |
Scripts that translate recipes ES→EN and fix leftover English in Spanish rows | Dry-run by default; --write changes live data |
ImageGen/ |
Scripts that generate and backfill recipe images (Flux, blurhash, image variants) | Write to live storage |
recipe_generator/ |
Older bulk generator/uploader (350-recipe batch) | Legacy; prefer recipe_agent/ for new recipes |
android/PORT.md |
Spec for the future Android port (Kotlin, Room, Google sign-in, RevenueCat). Source of truth for any Android work | No Android code exists yet |
supabase/ (root) |
Only the Supabase CLI link to project opxqcnxiqbitezragpch |
The real backend code is in GuruDeSalud/supabase/ |
recipes.jsonl, food_items.jsonl |
Old data exports | Don’t edit. The live catalog is in Supabase |
docs/CHANGELOG.md |
Plain-language log of every change | Update on every ship |
docs/DECISIONS.md |
Product and process decisions | Update whenever the developer decides something |
START_HERE.md |
Short guide for the human developer | Keep it in sync with how you actually work |
When working inside a folder that has its own README.md or CLAUDE.md, read it first and follow it.
The team used Linear (linear.app/caluru) to track issues before the handover; GuruDeSalud/RELEASE_README.md links to it. If the developer has Linear access and a Linear connector, you may use it; otherwise docs/CHANGELOG.md and docs/DECISIONS.md are the record.
testopenai.py and recipe_generator/recipe_generator/.env (OpenAI + Supabase service-role keys) was committed. Both are fixed in the current files, but the keys stay in GitHub’s history. Until the owner confirms they rotated them (OpenAI dashboard → API keys; Supabase → Project settings → API), remind the developer at the start of a session. When confirmed, delete this item.recipe_agent.zip (old copy of recipe_agent/), empty recipe.txt, stray package-lock.json, Caluru.mobileprovision, testopenai.py, AppLogo.jpeg. Offer to tidy it on a chore/cleanup branch the first time the developer says “check the project” (delete files only with their yes).recipe_editor/, referrals/ and GuruDeSalud/image-queue/ each have a GitHub Pages workflow inside their own folder. GitHub only runs workflows in the repo’s top-level .github/workflows/, and they were deployed from separate repos (e.g. caluru_image_gen). So editing them here does not update the live tool. Before changing one, tell the developer and ask the owner how it should be deployed now.GuruDeSalud/Config.xcconfig (copied from Config.xcconfig.example, values from the owner). It’s git-ignored, so a fresh copy of the repo won’t have it and the app won’t run until it’s created.When you fix one of these, delete it from this list in the same commit.
Use the build-feature skill. In short:
git status, make sure you’re on an up-to-date main with nothing half-finished. If there is leftover work, explain it and ask what to do.feature/…, fix/…, change/… or docs/… — never work directly on main.git diff.save-and-ship once they say it works: changelog + docs + commit + push + pull request + merge.To undo: if not shipped yet, discard the branch’s changes (confirm first). If already shipped, create a new branch with git revert <commit> and ship that. Never rewrite history.
“What did we do last time?” → read docs/CHANGELOG.md and git log --oneline -15, answer in plain words.
Secrets
GuruDeSalud/Config.xcconfig (iOS, made from Config.xcconfig.example), .env / .env.local in each tool folder (made from its .env.example), local config for Android..env files or Config.xcconfig. To check one exists, use ls. If a key is missing, ask the developer to get it from the owner and paste it into the file themselves (tell them exactly which file and line).openai-proxy.Live data
--write, any upload/publish, any database or edge-function change affects live users. Always run the dry-run first, show the developer a plain summary of what will change, and get an explicit “yes” before writing.user_subscriptions or openai_rate_limit tables or their security policies. The app checks Pro status only via the is_user_pro RPC.GuruDeSalud/supabase/migrations/ (YYYYMMDDHHMMSS_short_name.sql, following the existing ones) — never edit an old migration. Edge-function changes are made in GuruDeSalud/supabase/functions/. Explain the impact in plain words, get an explicit yes, then apply/deploy (Supabase CLI or the Supabase connector), and record it in docs/DECISIONS.md. Changes must be backwards-compatible: users on older app versions still call the same tables and functions.User data on phones (SwiftData + CloudKit)
Money and identity
com.agarcia.caluru, iCloud container iCloud.com.agarcia.caluru, RevenueCat entitlement Caluru Pro, product IDs in Utilities/PaywallPricing.swift, signing/team settings — unless the developer explicitly asks and understands the consequence.docs/DECISIONS.md); confirm before changing them.Git
main; everything goes through a branch and a pull request.git reset --hard, git clean or delete files with uncommitted work in them without asking.Releases
release-app skill.es) is the default; English (en) must always be provided too. All user-facing text goes through String(appLocalized: "key") and the key must be added to GuruDeSalud/Localizable.xcstrings with both es and en values — follow how existing screens do it. No hard-coded user-facing strings.piece/unidad), macros calculated from ingredients — never guessed. Full rules: recipe_agent/.claude/skills/create-caluru-recipe/SKILL.md.DesignSystem/ — AppColors, AppTypography, AppSpacing, AppMotion, shared components). No hard-coded colors, fonts or spacing. Must look right in light and dark mode.@Observable ViewModel + Service. Put logic in services/view models, not in views. Match the folder structure in GuruDeSalud/Docs/ARCHITECTURE.md and the recipes in GuruDeSalud/Docs/DEVELOPMENT_GUIDE.md.android/PORT.md exactly (slice by slice). Don’t edit the iOS app while porting.docs/; scripts go in the tool folder they belong to; app code goes in the app..env files, keys, .DS_Store, .venv/, __pycache__/, xcuserdata/, DerivedData/, build outputs, .zip archives, generated reports, provisioning profiles, large data dumps. Check git status before every commit and add files by name, not with a blind git add -A.*_old.swift, copy of …). Delete code you replaced.recipe_translator/: README.md, requirements.txt, .env.example, .gitignore, dry-run by default with a --write flag.docs/CHANGELOG.md — every shipped change, in plain language.docs/DECISIONS.md — whenever the developer decides something about the product or the process.GuruDeSalud/Docs/* — when screens, models, services or backend change.README.md — when its scripts or setup change.CLAUDE.md — when the repo layout, rules or known problems change.docs/DECISIONS.md (product/process) or this file (how to work), and ship it.iOS (needs a Mac with Xcode)
GuruDeSalud/Caluru.xcodeproj, scheme Caluru. Pick a simulator from xcrun simctl list devices available.xcodebuild -project GuruDeSalud/Caluru.xcodeproj -scheme Caluru -destination 'platform=iOS Simulator,name=<installed iPhone>' buildtest (see GuruDeSalud/QA_RESULTS.md for the last full run).GuruDeSalud/Config.xcconfig holds the Supabase and RevenueCat keys and is git-ignored. If it’s missing, ask the developer to create it from Config.xcconfig.example with values from the owner — never invent values.xcodebuild isn’t available in your session (you’re not running on the Mac), say so plainly: you can still write the change, but the developer must press ▶ in Xcode to check it compiles, and tell you any red error message.GuruDeSalud/Caluru.xcodeproj in Xcode, pick an iPhone simulator at the top, press ▶ (Cmd+R), then which tab and what to tap.CaluruProducts.storekit can simulate purchases in the simulator). Say so when a feature can’t be checked in the simulator.Web tools (recipe_editor/, referrals/, GuruDeSalud/image-queue/)
npm install then npm run dev inside the folder; npm run build must pass before shipping. Env values go in .env.local from .env.example. Read §4 item 3 before promising anything is “live”.Python tools
cd <folder> && python3 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt.--write only after the developer’s explicit yes (see section 6).Android
./gradlew test once the project exists (see android/PORT.md).