# Top Up Lunch

> Check school lunch account balances and top up if below threshold. Supports MySchoolBucks, SchoolPay, and generic portals via browser automation. Usage: /top-up-lunch [child name or 'all'] [--threshold 15] [--add 50]

- Skill: `weizhengzhou/top-up-lunch` (Agent Skill)
- Install (CLI): `npx skillmds@latest add weizhengzhou/top-up-lunch`
- Raw SKILL.md: https://api.skillmd.com/api/skills/weizhengzhou/top-up-lunch/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: WeizhengZhou (https://skillmd.com/u/weizhengzhou)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/weizhengzhou/top-up-lunch

---


You help parents keep school lunch accounts funded so kids never go hungry due to a low balance.

## Step 1: Get configuration

Look for lunch account config in `CLAUDE.md` or ask:
- **Platform**: MySchoolBucks | SchoolPay | Other
- **Child name(s)**: who to check
- **Low-balance threshold**: default $15
- **Top-up amount**: default $50
- **Auto top-up**: just check and report, or actually add funds if low?

> **Important**: Never add funds without confirming with the user, unless `auto_topup: true` is explicitly set in CLAUDE.md.

## Step 2: Check balance

### MySchoolBucks (most common)

MySchoolBucks exposes balance data on the account page. Use browser automation to check:

```javascript
// Uses existing Chrome session (Tier 1) — you're already logged in
const { chromium } = require('playwright');

const browser = await chromium.connectOverCDP('http://localhost:9222');
const context = browser.contexts()[0];
const page = await context.newPage();

await page.goto('https://www.myschoolbucks.com/ver2/getmybalance/display');
await page.waitForSelector('.account-balance', { timeout: 10000 });

const balances = await page.$$eval('.student-balance-row', rows =>
  rows.map(row => ({
    name: row.querySelector('.student-name')?.textContent?.trim(),
    balance: parseFloat(row.querySelector('.balance-amount')?.textContent?.replace(/[^0-9.]/g, '') || '0')
  }))
);

console.log(JSON.stringify(balances));
await browser.close();
```

**Alternative — MySchoolBucks auto-replenishment (recommended):**
Set up auto-replenishment directly in the MySchoolBucks web UI:
- Log in → Account Settings → Auto Replenish
- Set threshold: $10, add: $50
- This is more reliable than scripted top-ups for most families

### SchoolPay

SchoolPay has no API. Browser automation required:

```javascript
// Connect to existing Chrome session
await page.goto('https://www.schoolpay.com/parent/account/balance');
// Extract balance from .account-balance or similar selector
```

### Generic portals

For district-specific lunch portals, use `/browser-automate` with Tier 1 (existing Chrome session) to navigate to the balance page and extract the number.

## Step 3: Report and optionally top up

```markdown
## Lunch Account Balances
**Checked**: [timestamp]

| Child | Balance | Status | Days Remaining* |
|-------|---------|--------|----------------|
| [Child1] | $23.50 | ✓ OK | ~12 days |
| [Child2] | $8.50 | ⚠️ LOW | ~4 days |

*Estimated at ~$2/day average

## Action Needed
- [Child2]'s balance is below the $15 threshold.
  Add $50 to bring balance to ~$58.50?
  [Yes, top up now] — or run /top-up-lunch Child2 --confirm
```

## Step 4: Update family-state.json

```json
{
  "children": {
    "[child_name]": {
      "lunch_balance": 8.50,
      "lunch_last_checked": "2026-03-31T07:00:00Z",
      "lunch_platform": "myschoolbucks"
    }
  }
}
```

## Step 5: Send alert if low

```bash
curl -s \
  -H "Title: Lunch Balance Alert" \
  -H "Priority: default" \
  -d "[Child2]'s lunch balance is low: \$8.50 (~4 days left). Top up at myschoolbucks.com" \
  https://ntfy.sh/YOUR_TOPIC
```

## Scheduling

Add to your daily morning check via `/mac-cron-job create`:
```
# Every weekday at 7 AM
0 7 * * 1-5  /usr/local/bin/claude -p "/top-up-lunch all" >> ~/Library/Logs/family-automation/lunch.log 2>&1
```

## Safety note

Topping up a lunch account makes a real financial transaction. This skill will **always confirm** with the user before adding funds unless `auto_topup: true` is explicitly set in CLAUDE.md. When in doubt, report the balance and let the parent decide.

