Install
openclaw skills install nicholasrae-expense-trackerJust say what you spent — your AI logs it, categorizes it, and tracks it against your budget. No apps, no forms, no friction. Supports natural language like...
openclaw skills install nicholasrae-expense-trackerTrack, categorize, and budget personal expenses through natural conversation. Users text expenses in plain language and the AI logs them, tracks budgets, and generates reports.
skills/expense-tracker/
├── SKILL.md # This file — AI instructions
├── references/
│ ├── categories.json # Category definitions + keyword matching
│ └── budgets.json # Monthly budget limits (user-editable)
├── scripts/
│ ├── add-expense.sh # Add expense to ledger
│ ├── query.sh # Query/filter expenses
│ └── budget-check.sh # Check spending vs budget
├── templates/
│ ├── weekly-report.md # Weekly report template
│ └── monthly-report.md # Monthly report template
└── expenses/
└── ledger.json # Transaction data (auto-created)
When a user mentions spending money, extract these fields:
| Field | Required | How to Extract |
|---|---|---|
| amount | Yes | Dollar amounts: "$45", "45 dollars", "forty-five bucks", "45.99" |
| vendor | Yes | Named entity after "at", "from", "to", or contextual merchant name |
| category | Auto | Match vendor/context against references/categories.json keywords |
| date | Default today | "today", "yesterday", "last Tuesday", "on 2/14", explicit dates |
| notes | Optional | Anything extra the user adds — "for the party", "work expense" |
| User Says | amount | vendor | category | date | notes |
|---|---|---|---|---|---|
| "spent $45 at Costco" | 45 | Costco | Groceries | today | |
| "grabbed lunch for $18 at Chipotle yesterday" | 18 | Chipotle | Dining | yesterday | |
| "$120 electric bill" | 120 | Electric company | Utilities | today | |
| "filled up the tank, 55 bucks at Shell" | 55 | Shell | Gas/Transport | today | |
| "Netflix $15.99" | 15.99 | Netflix | Subscriptions | today | |
| "dropped $200 at Target for birthday stuff" | 200 | Target | Shopping | today | birthday stuff |
| "refund from Amazon $35" | -35 | Amazon | Shopping | today | refund |
| "paid rent $2000" | 2000 | Rent/Landlord | Housing | today | |
| "spent $5.50 at starbucks yesterday" | 5.50 | Starbucks | Dining | yesterday | |
| "vet visit for the dog, $280" | 280 | Vet | Pets | today | |
| "car insurance $180" | 180 | Car insurance | Insurance | today | |
| "groceries and some clothes at Target $150" | 150 | Target | Shopping | today | groceries and clothes (ask user to split or pick) |
| "got reimbursed $45 for work lunch" | -45 | Work | Dining | today | reimbursement |
When a vendor could match multiple categories (e.g., "Walmart" could be Groceries or Shopping):
When no category matches at all, use Miscellaneous and tell the user: "Logged under Miscellaneous — want me to put this in a specific category?"
/add — Log an ExpenseLog an expense explicitly.
Usage: /add <amount> <vendor> [category] [date] [notes]
Implementation: Run the add-expense script:
bash skills/expense-tracker/scripts/add-expense.sh <amount> "<category>" "<vendor>" "<date>" "<notes>"
Examples:
/add 45 Costco → logs $45 at Costco, auto-categorized, today's date/add 18.50 Chipotle Dining yesterday → $18.50 dining, yesterday/add -35 Amazon Shopping 2026-02-10 "refund for headphones" → refundMost of the time, users won't use /add — they'll just say "spent $45 at Costco" and you parse it.
/spending — View SpendingQuery expenses with optional filters.
Usage: /spending [period] [category]
Implementation: Run the query script:
bash skills/expense-tracker/scripts/query.sh [--from DATE] [--to DATE] [--category CAT] [--format summary|detail|json]
Examples:
/spending → current month summary/spending this week → this week's expenses/spending Dining → all dining expenses this month/spending February detail → detailed February breakdown--category GroceriesFormat options:
summary (default) — totals by categorydetail — itemized list with all fieldsjson — raw JSON output/budget — Budget StatusCheck spending against budget limits.
Usage: /budget [month]
Implementation: Run the budget check script:
bash skills/expense-tracker/scripts/budget-check.sh [YYYY-MM]
Examples:
/budget → current month budget status/budget 2026-01 → January budget reviewAlso supports adjusting budgets:
references/budgets.json using jq --arg (never interpolate user values into jq code directly)/categories — View/Manage CategoriesShow available categories or recategorize expenses.
Examples:
/categories → list all categories/categories Dining → show Dining keywords and recent expensesUse references/categories.json to match vendors to categories. The matching algorithm:
Groceries, Dining, Gas/Transport, Subscriptions, Health/Fitness, Entertainment, Shopping, Utilities, Housing, Personal Care, Education, Gifts, Travel, Insurance, Pets, Miscellaneous.
Budget configuration lives in references/budgets.json. The user edits this to set their limits.
| Threshold | Emoji | Action |
|---|---|---|
| < 50% | ⚪ | No alert |
| 50–79% | 🟢 | Informational only |
| 80–99% | 🟡 | Proactive warning: "Heads up — Dining is at 85% of your $300 budget" |
| ≥ 100% | 🔴 | Alert: "You've exceeded your Dining budget ($312 / $300)" |
/budget command: Show full breakdown with all categories.After logging an expense that pushes a category past 80%, add a note:
✅ Expense #24: $45.00 at Olive Garden (Dining) on 2026-02-17 ⚠️ Heads up — Dining is now at $275 / $300 (92%) for February.
After exceeding 100%:
✅ Expense #25: $38.00 at Thai Palace (Dining) on 2026-02-19 🔴 Dining has exceeded your February budget: $313 / $300 (104%)
Use templates/weekly-report.md as a guide. Generate when the user asks "weekly report", "how'd I do this week", etc.
To generate, run query.sh for the week's date range, then format the results using the template structure:
# Get this week's data
bash skills/expense-tracker/scripts/query.sh --from 2026-02-10 --to 2026-02-16 --format json
# Get last week for comparison
bash skills/expense-tracker/scripts/query.sh --from 2026-02-03 --to 2026-02-09 --format json
# Get budget status
bash skills/expense-tracker/scripts/budget-check.sh
Include: category breakdown, top expenses, budget status, week-over-week trend.
Use templates/monthly-report.md as a guide. Generate for "monthly report", "how'd February go", end-of-month reviews.
# Current month data
bash skills/expense-tracker/scripts/query.sh --from 2026-02-01 --to 2026-02-28 --format json
# Previous month for comparison
bash skills/expense-tracker/scripts/query.sh --from 2026-01-01 --to 2026-01-31 --format json
# Budget check
bash skills/expense-tracker/scripts/budget-check.sh 2026-02
Include: full category breakdown, top expenses, weekly breakdown, month-over-month comparison, savings rate (if income is set in budgets.json).
add-expense.sh -35 "Shopping" "Amazon" "2026-02-15" "refund"add-expense.sh 55 "Travel" "Paris restaurant" "2026-02-15" "€50 EUR"jq --argjson id 12 'map(select(.id != $id))' — always use --arg/--argjson, never interpolate IDs into filter stringsThe AI should handle these naturally without requiring commands:
| User Says | AI Action |
|---|---|
| "spent $45 at Costco" | Parse → add expense → confirm → check budget |
| "how much have I spent this month?" | Run query.sh for current month → format summary |
| "am I over budget?" | Run budget-check.sh → report status |
| "weekly report" | Generate weekly report from template |
| "what did I spend on food?" | Query Groceries + Dining categories |
| "I got a $20 refund from Amazon" | Log negative amount → confirm |
| "split a $90 dinner with Jake" | Calculate half → log $45 → confirm |
| "that last one should be Entertainment, not Shopping" | Update most recent entry's category |
| "set grocery budget to $700" | Update budgets.json |
| "how much is left in my dining budget?" | Calculate: limit - spent this month |
| "show me everything from last week" | Query with date range, detail format |
| "what's my biggest expense this month?" | Query + sort by amount |
| "cancel that last expense" | Delete most recent ledger entry |
| "spent $5.50 at starbucks yesterday" | Parse date as yesterday → add expense |
| "vet bill was $280" | Log as Pets category |
| "car insurance came out, $180" | Log as Insurance category |
| "I spent like 50 bucks at Target" | Log $50, confirm amount approximation |
| "got reimbursed $45 from work" | Log as negative (reimbursement) |
| "how much did I spend on food this month?" | Query Groceries + Dining combined |
| "compare this month to last month" | Generate month-over-month comparison |
User: spent $45 at Costco
AI: ✅ Expense #1: $45.00 at Costco (Groceries) on 2026-02-17
User: grabbed lunch at Chipotle for $12.50
AI: ✅ Expense #2: $12.50 at Chipotle (Dining) on 2026-02-17
User: $150 at Target yesterday
AI: I logged $150 at Target as **Shopping** — was this groceries or more of a general shopping trip?
User: shopping
AI: ✅ Expense #3: $150.00 at Target (Shopping) on 2026-02-16
User: how's my budget looking?
AI:
=== Budget Check: 2026-02 ===
🟢 OK Groceries $345 / $600 (58%)
🟡 WARN Dining $248 / $300 (83%)
🟢 OK Shopping $280 / $300 (93%)
⚪ LOW Gas/Transport $85 / $250 (34%)
...
TOTAL: $1,245.00 / $4,950 (25%)
⚠️ Heads up — Dining is at 83% and Shopping is at 93% of your February budget.
User: I got a refund from Amazon for $35
AI: ✅ Refund #4: $35.00 from Amazon (Shopping) on 2026-02-17
Shopping is now at $245 / $300 (82%) for February.
User: weekly report
AI: [generates formatted weekly report from template]
User: set my dining budget to $400
AI: Updated Dining budget: $300 → $400 for this month. You're now at $248 / $400 (62%) — much more breathing room! 🟢
[
{
"id": 1,
"amount": 45.00,
"category": "Groceries",
"vendor": "Costco",
"date": "2026-02-17",
"notes": "",
"created_at": "2026-02-17T23:32:00Z"
},
{
"id": 2,
"amount": -35.00,
"category": "Shopping",
"vendor": "Amazon",
"date": "2026-02-17",
"notes": "refund for headphones",
"created_at": "2026-02-17T23:45:00Z"
}
]
YYYY-MM-DDreferences/categories.jsonAll scripts are in skills/expense-tracker/scripts/ and must be run with bash:
# Add an expense
bash skills/expense-tracker/scripts/add-expense.sh 45 "Groceries" "Costco" "2026-02-17" "weekly groceries"
# Query expenses
bash skills/expense-tracker/scripts/query.sh --from 2026-02-01 --to 2026-02-28 --category Dining --format summary
# Check budget
bash skills/expense-tracker/scripts/budget-check.sh 2026-02
add-expense.sh <amount> <category> <vendor> [date] [notes]
amount — number (negative for refunds)category — category name from categories.jsonvendor — merchant namedate — YYYY-MM-DD (default: today)notes — optional descriptionquery.sh [--from DATE] [--to DATE] [--category CAT] [--vendor TEXT] [--format FMT]
--from — start date (inclusive)--to — end date (inclusive)--category — filter by category name--vendor — filter by vendor (partial match, case-insensitive)--format — summary (default), detail, or jsonbudget-check.sh [YYYY-MM]