# Food Tracker

> Track daily phosphorus (ฟอสฟอรัส) and potassium (โพแทสเซียม) intake from food for kidney disease management. Use this skill whenever the user mentions food they ate, wants to log meals, check daily/monthly intake, or asks for nutrient reports. Trigger on: "กินข้าว", "กิน...มื้อเช้า/เที่ยง/เย็น", "บันทึกอาหาร", "สรุปวันนี้", "สรุปเดือน", "รายงานอาหาร", "ฟอสฟอรัส", "โพแทสเซียม", "log food", "food tracker", "what did I eat", any Thai or English food name followed by a meal context, or when the user sends a photo/image of food. Also trigger when the user asks which foods contributed most to their mineral intake.

- Skill: `witooh/food-tracker` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add witooh/food-tracker`
- Raw SKILL.md: https://api.skillmd.com/api/skills/witooh/food-tracker/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: witooh (https://skillmd.com/u/witooh)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/witooh/food-tracker

---


# Food Tracker

ติดตามฟอสฟอรัสและโพแทสเซียมจากอาหาร สำหรับผู้ที่ต้องควบคุมแร่ธาตุ (เช่น ผู้ป่วยโรคไต)

For state management, read and follow the protocol in `skills/state-db/SKILL.md`

## State Schema (via state-db)

skill_name: `food-tracker`

| key1 | key2 | key3 | purpose | data fields |
|------|------|------|---------|-------------|
| entry | date (YYYY-MM-DD) | meal_period | individual food log | `{food_name, meal_time, phosphorus_mg, potassium_mg, serving_size, source, notes}` |

- **key2** = date (`2026-03-14`) — enables daily/monthly queries via index
- **key3** = meal_period (`เช้า` / `กลางวัน` / `เย็น` / `ก่อนนอน`) — enables per-meal filtering via index

Each food item the user eats becomes one `entry` row. Reports are generated by querying entries and aggregating in-memory.

### Data Field Reference

| Field | Type | Example | Note |
|-------|------|---------|------|
| food_name | string | "ข้าวมันไก่" | required |
| meal_time | string | "2026-03-14T12:00:00" | ISO datetime, Asia/Bangkok |
| phosphorus_mg | number | 250 | required |
| potassium_mg | number | 300 | required |
| serving_size | string | "1 จาน" | optional |
| source | string | "web" | "web" or "ai_estimate" |
| notes | string | null | optional |

## Operations

### Log a food entry

```bash
curl -s -X POST "$DB_URL" "${DB_AUTH[@]}" "${DB_JSON[@]}" "${DB_RETURN[@]}" \
  -d '{
    "skill_name": "food-tracker",
    "key1": "entry",
    "key2": "2026-03-14",
    "key3": "กลางวัน",
    "data": {
      "food_name": "ข้าวมันไก่",
      "meal_time": "2026-03-14T12:00:00",
      "phosphorus_mg": 280,
      "potassium_mg": 350,
      "serving_size": "1 จาน",
      "source": "web",
      "notes": null
    }
  }'
```

### Search for similar food (duplicate check)

Use `ilike` to search food names:

```bash
curl -s "$DB_URL?skill_name=eq.food-tracker&key1=eq.entry&data->>food_name=ilike.*ข้าวมัน*&order=key2.desc&limit=5" \
  "${DB_AUTH[@]}"
```

### Query entries for a date (daily report data)

```bash
curl -s "$DB_URL?skill_name=eq.food-tracker&key1=eq.entry&key2=eq.2026-03-14&order=created_at.asc" \
  "${DB_AUTH[@]}"
```

### Query entries for a month (monthly report data)

Use `like` to match year-month prefix in key2:

```bash
curl -s "$DB_URL?skill_name=eq.food-tracker&key1=eq.entry&key2=like.2026-03*&order=created_at.asc" \
  "${DB_AUTH[@]}"
```

### Delete entry by id

```bash
curl -s -X DELETE "$DB_URL?id=eq.42" "${DB_AUTH[@]}" "${DB_RETURN[@]}"
```

### List entries for a date (with id for deletion)

```bash
curl -s "$DB_URL?skill_name=eq.food-tracker&key1=eq.entry&key2=eq.2026-03-14&select=id,key2,key3,data,created_at&order=created_at.asc" \
  "${DB_AUTH[@]}"
```

---

## Workflow A: Log Food

When the user mentions food they ate (e.g. "กินข้าวมันไก่ มื้อเที่ยง") or sends a food photo:

### Step 1 - Parse input

**If the user sends an image/photo:**
1. Analyze the image to identify all food items visible in the photo
2. Estimate the serving size of each item from visual cues (plate size, portion)
3. List what you see and confirm with the user before proceeding, e.g.:
   "จากรูปเห็น: ข้าวสวย 1 จาน, แกงเขียวหวานไก่ 1 ชาม, ไข่เจียว 1 ชิ้น — ถูกต้องไหมครับ?"
4. Once confirmed (or corrected), continue to Step 2 with the identified food names

**If the user sends text:**

Extract from the user's message:
- **Food name(s)** — there may be multiple items
- **Meal period** — เช้า / กลางวัน / เย็น / ก่อนนอน
- **Meal time** — if user specifies a time, use it. Otherwise use current time (Asia/Bangkok, UTC+7)
- **Serving size** — if mentioned (e.g. "2 ถ้วย", "1 จาน")

### Step 2 - Look up nutrients

For each food item, use WebSearch:

```
Search: "{food_name} phosphorus potassium mg per serving nutrition facts"
Also try: "{food_name} ฟอสฟอรัส โพแทสเซียม ต่อหน่วย"
```

Extract phosphorus_mg and potassium_mg per serving. Prefer Thai food databases or credible sources (USDA, Thai nutrition databases).

If WebSearch returns no usable data, read `references/nutrients.md` for common Thai food values. If still not found, estimate using AI knowledge and mark `source` as `ai_estimate`.

### Step 3 - Check for duplicates

Before inserting, search for similar food names using the search operation above. If a match is found with different nutrient values, inform the user but still proceed with the new entry.

### Step 4 - Store the entry

Insert using the log operation above. Set `key2` to date (YYYY-MM-DD), `key3` to meal_period, and `meal_time` in data to full ISO datetime, all in Asia/Bangkok timezone.

### Step 5 - Show running total

Query today's entries using the daily query operation. Sum up `phosphorus_mg` and `potassium_mg` from all entries' `data` field, then calculate percentages against daily limits.

### Step 6 - Reply in Thai

Confirm what was logged and show today's running totals using the daily report format below.

## Workflow B: Reports

### Daily Report

1. Query all entries for the date
2. Sum `phosphorus_mg` and `potassium_mg` across all entries
3. Calculate percentage against daily limits
4. Format output as:

```
## รายงานประจำวัน - {date}

| # | อาหาร | มื้อ | ฟอสฟอรัส | โพแทสเซียม | ปริมาณ |
|---|-------|------|----------|-----------|--------|
| 1 | ข้าวสวย | เช้า | 68 mg | 55 mg | 1 ถ้วย |

### สรุปรวม
| แร่ธาตุ | รับไปแล้ว | เกณฑ์/วัน | สถานะ |
|---------|----------|----------|-------|
| ฟอสฟอรัส | 310 mg | 1,000 mg | 31% ✅ |
| โพแทสเซียม | 737 mg | 3,000 mg | 25% ✅ |
```

### Monthly Report

1. Query all entries for the month
2. Group by date to get daily breakdown
3. Group by food_name to get top foods and frequency
4. Identify exceeded days and foods to avoid
5. Format output as:

```
## รายงานประจำเดือน - {month}

### ภาพรวม
| แร่ธาตุ | รวมทั้งเดือน | เฉลี่ย/วัน | วันที่บันทึก |
|---------|------------|----------|------------|
| ฟอสฟอรัส | 8,432 mg | 843 mg | 10 วัน |
| โพแทสเซียม | 19,540 mg | 1,954 mg | 10 วัน |

### อาหารที่เป็นแหล่งฟอสฟอรัสสูงสุด
| อันดับ | อาหาร | รวม | ทานกี่ครั้ง | เฉลี่ย/ครั้ง |
|-------|-------|-----|----------|------------|
| 1 | นมวัว | 1,220 mg | 5 ครั้ง | 244 mg |

### อาหารที่เป็นแหล่งโพแทสเซียมสูงสุด
(same format)

### วันที่กินเกินเกณฑ์ต่อวัน
| วันที่ | ฟอสฟอรัส | สถานะ | โพแทสเซียม | สถานะ |
|-------|----------|-------|-----------|-------|
| 6 มี.ค. | 1,050 mg | 🔴 เกิน | 2,200 mg | ✅ |

(ถ้าไม่มีวันที่เกินเกณฑ์ แสดง "ไม่มีวันที่เกินเกณฑ์ในเดือนนี้ ✅")

### เมนูที่ควรหลีกเลี่ยง
อาหารที่ค่าต่อครั้งสูงกว่า 20% ของเกณฑ์ต่อวัน (P >200mg หรือ K >600mg):
| อาหาร | ค่าเฉลี่ย/ครั้ง | ทานกี่ครั้ง | รวมทั้งเดือน | ควรเลี่ยงเพราะ |
|-------|---------------|----------|------------|--------------|
| ไก่ทอด Bonchon | P: 300 mg | 3 ครั้ง | 900 mg | ฟอสฟอรัสสูง |
```

### Aggregation Logic for Monthly Report

From the raw entries array, compute:
- **Daily breakdown**: group by `key2` (date), sum `data.phosphorus_mg` and `data.potassium_mg` per day, count entries per day
- **Top phosphorus foods** (top 10): group by `data.food_name`, sum phosphorus_mg, count frequency, calculate avg = total / frequency
- **Top potassium foods** (top 10): same logic with potassium_mg
- **Exceeded days**: days where total phosphorus > 1000 or total potassium > 3000
- **Foods to avoid**: foods where avg per serving > 20% of daily limit (P >200mg or K >600mg)

### Status Indicators

- ✅ = < 70% of daily limit
- ⚠️ = 70-90% of daily limit
- 🔴 = > 90% of daily limit

## Nutrient Thresholds (CKD Reference)

| Mineral | Daily Limit |
|---------|------------|
| Phosphorus (ฟอสฟอรัส) | 800-1,000 mg |
| Potassium (โพแทสเซียม) | 2,000-3,000 mg |

These are general reference values. Always defer to the user's doctor.

## Important Notes

- All timestamps displayed as Asia/Bangkok (UTC+7)
- Nutrient values from web search are preferred over AI estimates
- When searching for duplicates, check both exact and similar names because Thai food names can vary (e.g. "ข้าวผัดกะเพรา" vs "ข้าวกะเพรา")
- This skill does NOT provide medical advice — data is for personal tracking only
- Always add the disclaimer in reports: "ข้อมูลนี้เป็นเพียงการติดตามส่วนตัว ไม่ใช่คำแนะนำทางการแพทย์"

