{"id":"0853bc79-9a94-49f2-aac9-9f09316b51a6","entityType":"agent","slug":"clawhub-occupythemilkyway-plutus-lite","name":"Plutus Lite — Quick Expense Summary","canonicalUrl":"https://www.xpersona.co/agent/clawhub-occupythemilkyway-plutus-lite","canonicalPath":"/agent/clawhub-occupythemilkyway-plutus-lite","generatedAt":"2026-10-12T05:21:08.861Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-12T01:29:58.239Z","emptyReason":null},"description":"Plutus Lite — Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full... Skill: Plutus Lite — Quick Expense Summary Owner: occupythemilkyway Summary: Plutus Lite — Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full... Tags: budget:1.0.0, expenses:1.0.0, finance:1.0.0, free:1.0.0, latest:1.0.4, lite:1.0.0, plutus:1.0.0, tracker:1.0.0 Version history: v1.0.4 | 2026-05-24T18:53:38.276Z | user - Fixed","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 961 downloads reported by the source. Last updated 10/12/2026.","installCommand":"clawhub skill install s1757zbbgb226m951fdfmj4s6s860nkn:plutus-lite","sourceUrl":"https://clawhub.ai/occupythemilkyway/plutus-lite","homepage":"https://clawhub.ai/occupythemilkyway/skills/plutus-lite","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/occupythemilkyway/plutus-lite","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/occupythemilkyway/skills/plutus-lite","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Plutus Lite — Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full... "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:29:58.239Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:29:58.239Z","emptyReason":null},"stars":null,"forks":null,"downloads":961,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.0.4","tractionLabel":"961 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-12T01:29:58.227Z","emptyReason":null},"lastUpdatedAt":"2026-10-12T01:29:58.239Z","lastCrawledAt":"2026-10-12T01:29:58.227Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-13T01:29:58.227Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.4","createdAt":"2026-05-24T18:53:38.276Z","changelog":"- Fixed all text encoding issues (replaced garbled characters with correct symbols and emojis) - Updated Pro upgrade link with new URL and added bundle offer info - Clarified upgrade messaging and emoji usage throughout documentation - Incremented version to 1.0.4","fileCount":3,"zipByteSize":4658},{"version":"1.0.1","createdAt":"2026-05-17T00:16:18.671Z","changelog":"- Version bump from 1.0.0 to 1.0.1. - No file or feature changes detected; internal version update only.","fileCount":2,"zipByteSize":3417},{"version":"1.0.0","createdAt":"2026-05-10T15:58:46.326Z","changelog":"Initial Lite release: 15 transaction limit, category breakdown, Pro upsell","fileCount":2,"zipByteSize":3419}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1757zbbgb226m951fdfmj4s6s860nkn:plutus-lite","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T05:21:08.860Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-occupythemilkyway-plutus-lite/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-12T01:29:58.239Z","emptyReason":null},"readme":"Skill: Plutus Lite — Quick Expense Summary\n\nOwner: occupythemilkyway\n\nSummary: Plutus Lite — Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full...\n\nTags: budget:1.0.0, expenses:1.0.0, finance:1.0.0, free:1.0.0, latest:1.0.4, lite:1.0.0, plutus:1.0.0, tracker:1.0.0\n\nVersion history:\n\nv1.0.4 | 2026-05-24T18:53:38.276Z | user\n\n- Fixed all text encoding issues (replaced garbled characters with correct symbols and emojis)\n- Updated Pro upgrade link with new URL and added bundle offer info\n- Clarified upgrade messaging and emoji usage throughout documentation\n- Incremented version to 1.0.4\n\nv1.0.1 | 2026-05-17T00:16:18.671Z | user\n\n- Version bump from 1.0.0 to 1.0.1.\n- No file or feature changes detected; internal version update only.\n\nv1.0.0 | 2026-05-10T15:58:46.326Z | user\n\nInitial Lite release: 15 transaction limit, category breakdown, Pro upsell\n\nArchive index:\n\nArchive v1.0.4: 3 files, 4658 bytes\n\nFiles: skill-card.md (2094b), SKILL.md (7072b), _meta.json (130b)\n\nFile v1.0.4:SKILL.md\n\n---\nname: plutus-lite\ndescription: \"Plutus Lite — Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full financial picture.\"\nversion: \"1.0.4\"\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: [python3, pip3]\n    primaryEnv: \"EXPENSES_TEXT\"\n    homepage: https://clawhub.ai/occupythemilkyway/plutus-lite\n    emoji: \"💰\"\n    tags: [finance, expenses, budget, tracker, plutus, free, lite]\n    envVars:\n      - name: EXPENSES_TEXT\n        required: false\n        description: \"Paste up to 15 expenses, one per line: 'Jan 5 Coffee 4.50' or 'Amazon 34.99'\"\n        default: \"\"\n      - name: CURRENCY\n        required: false\n        description: \"Currency: USD, EUR, GBP\"\n        default: \"USD\"\n---\n\n# Plutus Lite — Free Expense Preview\n\nPaste up to 15 expenses and get a quick category breakdown.\n\n## Free vs Pro\n\n| Feature | Plutus Lite (Free) | Plutus Pro |\n|---------|-------------------|-----------|\n| Transactions | **15 max** | Unlimited |\n| CSV file input | ❌ | ✅ |\n| Budget comparison | ❌ | ✅ |\n| Monthly trends | ❌ | ✅ |\n| Tax deduction tracking | ❌ | ✅ |\n| Savings rate analysis | ❌ | ✅ |\n| Spending forecast | ❌ | ✅ 1-12 months |\n| Export (CSV + JSON) | ❌ | ✅ |\n\n👉 **Upgrade:** `openclaw skills install plutus-pro` — key at **ko-fi.com/s/83c662001e**\n\n💰 **Bundle deal:** all 5 Pro skills for **$29** → **ko-fi.com/s/7625accf3f** (save $16)\n\n---\n\n## Step 1 — Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 — Quick expense scan (Lite)\n\n```python\nimport os, re\nfrom datetime import date\nfrom collections import defaultdict\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nEXPENSES_TEXT = os.environ.get(\"EXPENSES_TEXT\",\"\").strip()\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"€\",\"GBP\":\"£\"}.get(CURRENCY,\"$\")\nTODAY         = date.today()\nTX_LIMIT      = 15\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\n\ndef parse_amount(raw):\n    c = re.sub(r\"[^0-9.]\",\"\",str(raw)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else None\n    except: return None\n\nCATEGORIES = {\n    \"Food & Dining\":  [\"coffee\",\"starbucks\",\"restaurant\",\"pizza\",\"burger\",\"cafe\",\"food\",\"doordash\",\"grubhub\",\"grocery\",\"walmart\",\"whole foods\"],\n    \"Transport\":      [\"uber\",\"lyft\",\"taxi\",\"gas\",\"fuel\",\"parking\",\"transit\",\"bus\",\"train\",\"flight\"],\n    \"Shopping\":       [\"amazon\",\"ebay\",\"etsy\",\"target\",\"bestbuy\",\"clothing\",\"shoes\"],\n    \"Subscriptions\":  [\"netflix\",\"spotify\",\"hulu\",\"disney\",\"prime\",\"subscription\",\"membership\",\"software\"],\n    \"Utilities\":      [\"electric\",\"water\",\"internet\",\"phone\",\"mobile\",\"utility\",\"bill\"],\n    \"Health\":         [\"pharmacy\",\"doctor\",\"dentist\",\"medical\",\"gym\",\"fitness\",\"cvs\",\"walgreens\"],\n    \"Entertainment\":  [\"movie\",\"cinema\",\"concert\",\"ticket\",\"game\",\"gaming\",\"book\"],\n    \"Other\":          [],\n}\n\ndef categorise(desc):\n    dl = desc.lower()\n    for cat, kws in CATEGORIES.items():\n        if cat == \"Other\": continue\n        if any(k in dl for k in kws): return cat\n    return \"Other\"\n\ntransactions = []\n\nif EXPENSES_TEXT:\n    for line in EXPENSES_TEXT.strip().splitlines():\n        if len(transactions) >= TX_LIMIT:\n            console.print(f\"[yellow]⚠️  Lite limit: showing first {TX_LIMIT} transactions. Upgrade to Pro for unlimited.[/yellow]\")\n            break\n        line = line.strip()\n        if not line: continue\n        tokens = line.split()\n        amt = None\n        for tok in reversed(tokens):\n            a = parse_amount(tok)\n            if a is not None: amt = a; break\n        if amt is None: continue\n        desc_tokens = tokens[:-1] if tokens[-1] == str(amt) else [t for t in tokens if parse_amount(t) != amt]\n        # Strip leading date tokens (simple heuristic)\n        if len(desc_tokens) >= 2:\n            try:\n                int(desc_tokens[0]); desc_tokens = desc_tokens[1:]\n            except ValueError:\n                pass\n        description = \" \".join(desc_tokens) or \"Expense\"\n        transactions.append({\"description\": description, \"amount\": amt, \"category\": categorise(description)})\nelse:\n    # Demo data\n    console.print(\"[yellow]ℹ️  No EXPENSES_TEXT set — running with demo data.[/yellow]\")\n    console.print(\"[dim]Set EXPENSES_TEXT='Coffee 4.50\\\\nAmazon 34.99\\\\nUber 18.30' to use your own.\\n[/dim]\")\n    demo = [\n        (\"Starbucks coffee\",5.50),(\"Uber ride\",18.30),(\"Netflix\",15.99),\n        (\"Groceries Walmart\",87.45),(\"Amazon order\",34.99),(\"Restaurant dinner\",62.00),\n        (\"Gas station\",55.00),(\"Spotify premium\",9.99),(\"CVS pharmacy\",22.10),(\"Gym membership\",45.00),\n    ]\n    for desc,amt in demo:\n        transactions.append({\"description\":desc,\"amount\":amt,\"category\":categorise(desc)})\n\nif not transactions:\n    console.print(\"[yellow]No transactions found.[/yellow]\")\n    raise SystemExit(0)\n\ntotal_spend = sum(t[\"amount\"] for t in transactions)\n\nconsole.print()\nconsole.print(Panel.fit(\n    f\"[bold green]💰 Plutus Lite — Expense Snapshot[/bold green]\\n\"\n    f\"Transactions: [yellow]{len(transactions)}/{TX_LIMIT}[/yellow]  Total: [red]{fmt(total_spend)}[/red]\\n\"\n    f\"[dim]Lite: {TX_LIMIT} transactions max — upgrade to Pro for unlimited + full analytics[/dim]\",\n    border_style=\"green\"\n))\n\n# Category totals\ncat_totals = defaultdict(float)\nfor t in transactions: cat_totals[t[\"category\"]] += t[\"amount\"]\n\nconsole.print()\ntbl = Table(title=\"Spend by Category\", box=box.ROUNDED, border_style=\"green\")\ntbl.add_column(\"Category\", width=20, style=\"cyan\")\ntbl.add_column(f\"Total ({CURRENCY})\", width=14, justify=\"right\", style=\"red\")\ntbl.add_column(\"% of spend\", width=12, justify=\"right\", style=\"yellow\")\n\nfor cat,total in sorted(cat_totals.items(),key=lambda x:-x[1]):\n    pct = total/total_spend*100 if total_spend else 0\n    tbl.add_row(cat, fmt(total), f\"{pct:.1f}%\")\nconsole.print(tbl)\n\n# Transaction list\nconsole.print()\ntx_tbl = Table(title=\"Transactions\", box=box.SIMPLE, border_style=\"dim\")\ntx_tbl.add_column(\"#\",           width=4,  style=\"dim\")\ntx_tbl.add_column(\"Description\", width=28, style=\"white\")\ntx_tbl.add_column(\"Category\",    width=18, style=\"cyan\")\ntx_tbl.add_column(\"Amount\",      width=12, justify=\"right\", style=\"red\")\nfor i,t in enumerate(transactions,1):\n    tx_tbl.add_row(str(i), t[\"description\"][:26], t[\"category\"], fmt(t[\"amount\"]))\nconsole.print(tx_tbl)\n\nconsole.print()\nconsole.print(Panel(\n    f\"[bold yellow]🔓 Want your full financial picture?[/bold yellow]\\n\\n\"\n    f\"Plutus Pro handles [bold]unlimited transactions[/bold] from any bank CSV, tracks \"\n    f\"[bold]tax-deductible expenses[/bold], shows [bold]monthly trends[/bold], \"\n    f\"calculates your [bold]savings rate[/bold], and forecasts spending up to 12 months ahead.\\n\\n\"\n    f\"[bold cyan]openclaw skills install plutus-pro[/bold cyan]\\n\"\n    f\"Get your key → [bold]ko-fi.com/s/83c662001e[/bold]\",\n    title=\"Upgrade to Plutus Pro\",\n    border_style=\"cyan\"\n))\n```\n\nFile v1.0.4:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"plutus-lite\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1779648818276\n}\n\nFile v1.0.4:skill-card.md\n\n## Description:\n\nPlutus Lite summarizes up to 15 pasted expenses into categories and a basic spend breakdown, serving as a free preview of Plutus Pro.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[occupythemilkyway](https://clawhub.ai/user/occupythemilkyway)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users can paste a small list of expenses and ask an agent to run a quick categorization and spend summary. The skill is useful for lightweight personal expense review, not full budgeting, tax, or forecasting workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The documented install command uses a system-package override.\n\nMitigation: Install dependencies inside a virtual environment or remove the --break-system-packages option before running the command.\n\nRisk: Expense text can contain personal, merchant, account, or financial details.\n\nMitigation: Redact unnecessary sensitive details before placing expenses in EXPENSES_TEXT.\n\nRisk: The skill includes paid Pro upgrade prompts and external purchase links.\n\nMitigation: Review those links and treat the paid products as separately trusted external offerings.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/occupythemilkyway/skills/plutus-lite)\n- [Plutus Lite homepage](https://clawhub.ai/occupythemilkyway/plutus-lite)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, guidance]\n\n**Output Format:** [Markdown instructions with bash and Python code blocks; runtime output is terminal tables and panels.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Processes up to 15 pasted transactions and supports USD, EUR, and GBP currency symbols.]\n\n## Skill Version(s):\n\n1.0.4 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.0.1: 2 files, 3417 bytes\n\nFiles: SKILL.md (7090b), _meta.json (130b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: plutus-lite\ndescription: \"Plutus Lite â Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full financial picture.\"\nversion: \"1.0.1\"\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: [python3, pip3]\n    primaryEnv: \"EXPENSES_TEXT\"\n    homepage: https://clawhub.ai/occupythemilkyway/plutus-lite\n    emoji: \"ð°\"\n    tags: [finance, expenses, budget, tracker, plutus, free, lite]\n    envVars:\n      - name: EXPENSES_TEXT\n        required: false\n        description: \"Paste up to 15 expenses, one per line: 'Jan 5 Coffee 4.50' or 'Amazon 34.99'\"\n        default: \"\"\n      - name: CURRENCY\n        required: false\n        description: \"Currency: USD, EUR, GBP\"\n        default: \"USD\"\n---\n\n# Plutus Lite â Free Expense Preview\n\nPaste up to 15 expenses and get a quick category breakdown.\n\n## Free vs Pro\n\n| Feature | Plutus Lite (Free) | Plutus Pro |\n|---------|-------------------|-----------|\n| Transactions | **15 max** | Unlimited |\n| CSV file input | â | â |\n| Budget comparison | â | â |\n| Monthly trends | â | â |\n| Tax deduction tracking | â | â |\n| Savings rate analysis | â | â |\n| Spending forecast | â | â 1-12 months |\n| Export (CSV + JSON) | â | â |\n\nð **Upgrade:** `openclaw skills install plutus-pro` â key at **ko-fi.com/occupythemilkyway**\n\n---\n\n## Step 1 â Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 â Quick expense scan (Lite)\n\n```python\nimport os, re\nfrom datetime import date\nfrom collections import defaultdict\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nEXPENSES_TEXT = os.environ.get(\"EXPENSES_TEXT\",\"\").strip()\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"â¬\",\"GBP\":\"Â£\"}.get(CURRENCY,\"$\")\nTODAY         = date.today()\nTX_LIMIT      = 15\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\n\ndef parse_amount(raw):\n    c = re.sub(r\"[^0-9.]\",\"\",str(raw)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else None\n    except: return None\n\nCATEGORIES = {\n    \"Food & Dining\":  [\"coffee\",\"starbucks\",\"restaurant\",\"pizza\",\"burger\",\"cafe\",\"food\",\"doordash\",\"grubhub\",\"grocery\",\"walmart\",\"whole foods\"],\n    \"Transport\":      [\"uber\",\"lyft\",\"taxi\",\"gas\",\"fuel\",\"parking\",\"transit\",\"bus\",\"train\",\"flight\"],\n    \"Shopping\":       [\"amazon\",\"ebay\",\"etsy\",\"target\",\"bestbuy\",\"clothing\",\"shoes\"],\n    \"Subscriptions\":  [\"netflix\",\"spotify\",\"hulu\",\"disney\",\"prime\",\"subscription\",\"membership\",\"software\"],\n    \"Utilities\":      [\"electric\",\"water\",\"internet\",\"phone\",\"mobile\",\"utility\",\"bill\"],\n    \"Health\":         [\"pharmacy\",\"doctor\",\"dentist\",\"medical\",\"gym\",\"fitness\",\"cvs\",\"walgreens\"],\n    \"Entertainment\":  [\"movie\",\"cinema\",\"concert\",\"ticket\",\"game\",\"gaming\",\"book\"],\n    \"Other\":          [],\n}\n\ndef categorise(desc):\n    dl = desc.lower()\n    for cat, kws in CATEGORIES.items():\n        if cat == \"Other\": continue\n        if any(k in dl for k in kws): return cat\n    return \"Other\"\n\ntransactions = []\n\nif EXPENSES_TEXT:\n    for line in EXPENSES_TEXT.strip().splitlines():\n        if len(transactions) >= TX_LIMIT:\n            console.print(f\"[yellow]â ï¸  Lite limit: showing first {TX_LIMIT} transactions. Upgrade to Pro for unlimited.[/yellow]\")\n            break\n        line = line.strip()\n        if not line: continue\n        tokens = line.split()\n        amt = None\n        for tok in reversed(tokens):\n            a = parse_amount(tok)\n            if a is not None: amt = a; break\n        if amt is None: continue\n        desc_tokens = tokens[:-1] if tokens[-1] == str(amt) else [t for t in tokens if parse_amount(t) != amt]\n        # Strip leading date tokens (simple heuristic)\n        if len(desc_tokens) >= 2:\n            try:\n                int(desc_tokens[0]); desc_tokens = desc_tokens[1:]\n            except ValueError:\n                pass\n        description = \" \".join(desc_tokens) or \"Expense\"\n        transactions.append({\"description\": description, \"amount\": amt, \"category\": categorise(description)})\nelse:\n    # Demo data\n    console.print(\"[yellow]â¹ï¸  No EXPENSES_TEXT set â running with demo data.[/yellow]\")\n    console.print(\"[dim]Set EXPENSES_TEXT='Coffee 4.50\\\\nAmazon 34.99\\\\nUber 18.30' to use your own.\\n[/dim]\")\n    demo = [\n        (\"Starbucks coffee\",5.50),(\"Uber ride\",18.30),(\"Netflix\",15.99),\n        (\"Groceries Walmart\",87.45),(\"Amazon order\",34.99),(\"Restaurant dinner\",62.00),\n        (\"Gas station\",55.00),(\"Spotify premium\",9.99),(\"CVS pharmacy\",22.10),(\"Gym membership\",45.00),\n    ]\n    for desc,amt in demo:\n        transactions.append({\"description\":desc,\"amount\":amt,\"category\":categorise(desc)})\n\nif not transactions:\n    console.print(\"[yellow]No transactions found.[/yellow]\")\n    raise SystemExit(0)\n\ntotal_spend = sum(t[\"amount\"] for t in transactions)\n\nconsole.print()\nconsole.print(Panel.fit(\n    f\"[bold green]ð° Plutus Lite â Expense Snapshot[/bold green]\\n\"\n    f\"Transactions: [yellow]{len(transactions)}/{TX_LIMIT}[/yellow]  Total: [red]{fmt(total_spend)}[/red]\\n\"\n    f\"[dim]Lite: {TX_LIMIT} transactions max â upgrade to Pro for unlimited + full analytics[/dim]\",\n    border_style=\"green\"\n))\n\n# Category totals\ncat_totals = defaultdict(float)\nfor t in transactions: cat_totals[t[\"category\"]] += t[\"amount\"]\n\nconsole.print()\ntbl = Table(title=\"Spend by Category\", box=box.ROUNDED, border_style=\"green\")\ntbl.add_column(\"Category\", width=20, style=\"cyan\")\ntbl.add_column(f\"Total ({CURRENCY})\", width=14, justify=\"right\", style=\"red\")\ntbl.add_column(\"% of spend\", width=12, justify=\"right\", style=\"yellow\")\n\nfor cat,total in sorted(cat_totals.items(),key=lambda x:-x[1]):\n    pct = total/total_spend*100 if total_spend else 0\n    tbl.add_row(cat, fmt(total), f\"{pct:.1f}%\")\nconsole.print(tbl)\n\n# Transaction list\nconsole.print()\ntx_tbl = Table(title=\"Transactions\", box=box.SIMPLE, border_style=\"dim\")\ntx_tbl.add_column(\"#\",           width=4,  style=\"dim\")\ntx_tbl.add_column(\"Description\", width=28, style=\"white\")\ntx_tbl.add_column(\"Category\",    width=18, style=\"cyan\")\ntx_tbl.add_column(\"Amount\",      width=12, justify=\"right\", style=\"red\")\nfor i,t in enumerate(transactions,1):\n    tx_tbl.add_row(str(i), t[\"description\"][:26], t[\"category\"], fmt(t[\"amount\"]))\nconsole.print(tx_tbl)\n\nconsole.print()\nconsole.print(Panel(\n    f\"[bold yellow]ð Want your full financial picture?[/bold yellow]\\n\\n\"\n    f\"Plutus Pro handles [bold]unlimited transactions[/bold] from any bank CSV, tracks \"\n    f\"[bold]tax-deductible expenses[/bold], shows [bold]monthly trends[/bold], \"\n    f\"calculates your [bold]savings rate[/bold], and forecasts spending up to 12 months ahead.\\n\\n\"\n    f\"[bold cyan]openclaw skills install plutus-pro[/bold cyan]\\n\"\n    f\"Get your key â [bold]ko-fi.com/occupythemilkyway[/bold]\",\n    title=\"Upgrade to Plutus Pro\",\n    border_style=\"cyan\"\n))\n```\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"plutus-lite\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1778976978671\n}\n\nArchive v1.0.0: 2 files, 3419 bytes\n\nFiles: SKILL.md (7090b), _meta.json (130b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: plutus-lite\ndescription: \"Plutus Lite â Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full financial picture.\"\nversion: \"1.0.0\"\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: [python3, pip3]\n    primaryEnv: \"EXPENSES_TEXT\"\n    homepage: https://clawhub.ai/occupythemilkyway/plutus-lite\n    emoji: \"ð°\"\n    tags: [finance, expenses, budget, tracker, plutus, free, lite]\n    envVars:\n      - name: EXPENSES_TEXT\n        required: false\n        description: \"Paste up to 15 expenses, one per line: 'Jan 5 Coffee 4.50' or 'Amazon 34.99'\"\n        default: \"\"\n      - name: CURRENCY\n        required: false\n        description: \"Currency: USD, EUR, GBP\"\n        default: \"USD\"\n---\n\n# Plutus Lite â Free Expense Preview\n\nPaste up to 15 expenses and get a quick category breakdown.\n\n## Free vs Pro\n\n| Feature | Plutus Lite (Free) | Plutus Pro |\n|---------|-------------------|-----------|\n| Transactions | **15 max** | Unlimited |\n| CSV file input | â | â |\n| Budget comparison | â | â |\n| Monthly trends | â | â |\n| Tax deduction tracking | â | â |\n| Savings rate analysis | â | â |\n| Spending forecast | â | â 1-12 months |\n| Export (CSV + JSON) | â | â |\n\nð **Upgrade:** `openclaw skills install plutus-pro` â key at **ko-fi.com/occupythemilkyway**\n\n---\n\n## Step 1 â Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 â Quick expense scan (Lite)\n\n```python\nimport os, re\nfrom datetime import date\nfrom collections import defaultdict\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nEXPENSES_TEXT = os.environ.get(\"EXPENSES_TEXT\",\"\").strip()\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"â¬\",\"GBP\":\"Â£\"}.get(CURRENCY,\"$\")\nTODAY         = date.today()\nTX_LIMIT      = 15\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\n\ndef parse_amount(raw):\n    c = re.sub(r\"[^0-9.]\",\"\",str(raw)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else None\n    except: return None\n\nCATEGORIES = {\n    \"Food & Dining\":  [\"coffee\",\"starbucks\",\"restaurant\",\"pizza\",\"burger\",\"cafe\",\"food\",\"doordash\",\"grubhub\",\"grocery\",\"walmart\",\"whole foods\"],\n    \"Transport\":      [\"uber\",\"lyft\",\"taxi\",\"gas\",\"fuel\",\"parking\",\"transit\",\"bus\",\"train\",\"flight\"],\n    \"Shopping\":       [\"amazon\",\"ebay\",\"etsy\",\"target\",\"bestbuy\",\"clothing\",\"shoes\"],\n    \"Subscriptions\":  [\"netflix\",\"spotify\",\"hulu\",\"disney\",\"prime\",\"subscription\",\"membership\",\"software\"],\n    \"Utilities\":      [\"electric\",\"water\",\"internet\",\"phone\",\"mobile\",\"utility\",\"bill\"],\n    \"Health\":         [\"pharmacy\",\"doctor\",\"dentist\",\"medical\",\"gym\",\"fitness\",\"cvs\",\"walgreens\"],\n    \"Entertainment\":  [\"movie\",\"cinema\",\"concert\",\"ticket\",\"game\",\"gaming\",\"book\"],\n    \"Other\":          [],\n}\n\ndef categorise(desc):\n    dl = desc.lower()\n    for cat, kws in CATEGORIES.items():\n        if cat == \"Other\": continue\n        if any(k in dl for k in kws): return cat\n    return \"Other\"\n\ntransactions = []\n\nif EXPENSES_TEXT:\n    for line in EXPENSES_TEXT.strip().splitlines():\n        if len(transactions) >= TX_LIMIT:\n            console.print(f\"[yellow]â ï¸  Lite limit: showing first {TX_LIMIT} transactions. Upgrade to Pro for unlimited.[/yellow]\")\n            break\n        line = line.strip()\n        if not line: continue\n        tokens = line.split()\n        amt = None\n        for tok in reversed(tokens):\n            a = parse_amount(tok)\n            if a is not None: amt = a; break\n        if amt is None: continue\n        desc_tokens = tokens[:-1] if tokens[-1] == str(amt) else [t for t in tokens if parse_amount(t) != amt]\n        # Strip leading date tokens (simple heuristic)\n        if len(desc_tokens) >= 2:\n            try:\n                int(desc_tokens[0]); desc_tokens = desc_tokens[1:]\n            except ValueError:\n                pass\n        description = \" \".join(desc_tokens) or \"Expense\"\n        transactions.append({\"description\": description, \"amount\": amt, \"category\": categorise(description)})\nelse:\n    # Demo data\n    console.print(\"[yellow]â¹ï¸  No EXPENSES_TEXT set â running with demo data.[/yellow]\")\n    console.print(\"[dim]Set EXPENSES_TEXT='Coffee 4.50\\\\nAmazon 34.99\\\\nUber 18.30' to use your own.\\n[/dim]\")\n    demo = [\n        (\"Starbucks coffee\",5.50),(\"Uber ride\",18.30),(\"Netflix\",15.99),\n        (\"Groceries Walmart\",87.45),(\"Amazon order\",34.99),(\"Restaurant dinner\",62.00),\n        (\"Gas station\",55.00),(\"Spotify premium\",9.99),(\"CVS pharmacy\",22.10),(\"Gym membership\",45.00),\n    ]\n    for desc,amt in demo:\n        transactions.append({\"description\":desc,\"amount\":amt,\"category\":categorise(desc)})\n\nif not transactions:\n    console.print(\"[yellow]No transactions found.[/yellow]\")\n    raise SystemExit(0)\n\ntotal_spend = sum(t[\"amount\"] for t in transactions)\n\nconsole.print()\nconsole.print(Panel.fit(\n    f\"[bold green]ð° Plutus Lite â Expense Snapshot[/bold green]\\n\"\n    f\"Transactions: [yellow]{len(transactions)}/{TX_LIMIT}[/yellow]  Total: [red]{fmt(total_spend)}[/red]\\n\"\n    f\"[dim]Lite: {TX_LIMIT} transactions max â upgrade to Pro for unlimited + full analytics[/dim]\",\n    border_style=\"green\"\n))\n\n# Category totals\ncat_totals = defaultdict(float)\nfor t in transactions: cat_totals[t[\"category\"]] += t[\"amount\"]\n\nconsole.print()\ntbl = Table(title=\"Spend by Category\", box=box.ROUNDED, border_style=\"green\")\ntbl.add_column(\"Category\", width=20, style=\"cyan\")\ntbl.add_column(f\"Total ({CURRENCY})\", width=14, justify=\"right\", style=\"red\")\ntbl.add_column(\"% of spend\", width=12, justify=\"right\", style=\"yellow\")\n\nfor cat,total in sorted(cat_totals.items(),key=lambda x:-x[1]):\n    pct = total/total_spend*100 if total_spend else 0\n    tbl.add_row(cat, fmt(total), f\"{pct:.1f}%\")\nconsole.print(tbl)\n\n# Transaction list\nconsole.print()\ntx_tbl = Table(title=\"Transactions\", box=box.SIMPLE, border_style=\"dim\")\ntx_tbl.add_column(\"#\",           width=4,  style=\"dim\")\ntx_tbl.add_column(\"Description\", width=28, style=\"white\")\ntx_tbl.add_column(\"Category\",    width=18, style=\"cyan\")\ntx_tbl.add_column(\"Amount\",      width=12, justify=\"right\", style=\"red\")\nfor i,t in enumerate(transactions,1):\n    tx_tbl.add_row(str(i), t[\"description\"][:26], t[\"category\"], fmt(t[\"amount\"]))\nconsole.print(tx_tbl)\n\nconsole.print()\nconsole.print(Panel(\n    f\"[bold yellow]ð Want your full financial picture?[/bold yellow]\\n\\n\"\n    f\"Plutus Pro handles [bold]unlimited transactions[/bold] from any bank CSV, tracks \"\n    f\"[bold]tax-deductible expenses[/bold], shows [bold]monthly trends[/bold], \"\n    f\"calculates your [bold]savings rate[/bold], and forecasts spending up to 12 months ahead.\\n\\n\"\n    f\"[bold cyan]openclaw skills install plutus-pro[/bold cyan]\\n\"\n    f\"Get your key â [bold]ko-fi.com/occupythemilkyway[/bold]\",\n    title=\"Upgrade to Plutus Pro\",\n    border_style=\"cyan\"\n))\n```\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"plutus-lite\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1778428726326\n}","readmeExcerpt":"Skill: Plutus Lite — Quick Expense Summary Owner: occupythemilkyway Summary: Plutus Lite — Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full... Tags: budget:1.0.0, expenses:1.0.0, finance:1.0.0, free:1.0.0, latest:1.0.4, lite:1.0.0, plutus:1.0.0, tracker:1.0.0 Version history: v1.0.4 | 2026-05-24T18:53:38.276Z | user - Fixed ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"pip3 install rich --break-system-packages --quiet"},{"language":"python","snippet":"import os, re\nfrom datetime import date\nfrom collections import defaultdict\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nEXPENSES_TEXT = os.environ.get(\"EXPENSES_TEXT\",\"\").strip()\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"€\",\"GBP\":\"£\"}.get(CURRENCY,\"$\")\nTODAY         = date.today()\nTX_LIMIT      = 15\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\n\ndef parse_amount(raw):\n    c = re.sub(r\"[^0-9.]\",\"\",str(raw)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else None\n    except: return None\n\nCATEGORIES = {\n    \"Food & Dining\":  [\"coffee\",\"starbucks\",\"restaurant\",\"pizza\",\"burger\",\"cafe\",\"food\",\"doordash\",\"grubhub\",\"grocery\",\"walmart\",\"whole foods\"],\n    \"Transport\":      [\"uber\",\"lyft\",\"taxi\",\"gas\",\"fuel\",\"parking\",\"transit\",\"bus\",\"train\",\"flight\"],\n    \"Shopping\":       [\"amazon\",\"ebay\",\"etsy\",\"target\",\"bestbuy\",\"clothing\",\"shoes\"],\n    \"Subscriptions\":  [\"netflix\",\"spotify\",\"hulu\",\"disney\",\"prime\",\"subscription\",\"membership\",\"software\"],\n    \"Utilities\":      [\"electric\",\"water\",\"internet\",\"phone\",\"mobile\",\"utility\",\"bill\"],\n    \"Health\":         [\"pharmacy\",\"doctor\",\"dentist\",\"medical\",\"gym\",\"fitness\",\"cvs\",\"walgreens\"],\n    \"Entertainment\":  [\"movie\",\"cinema\",\"concert\",\"ticket\",\"game\",\"gaming\",\"book\"],\n    \"Other\":          [],\n}\n\ndef categorise(desc):\n    dl = desc.lower()\n    for cat, kws in CATEGORIES.items():\n        if cat == \"Other\": continue\n        if any(k in dl for k in kws): return cat\n    return \"Other\"\n\ntransactions = []\n\nif EXPENSES_TEXT:\n    for line in EXPENSES_TEXT.strip().splitlines():\n        if len(transactions) >= TX_LIMIT:\n            console.print(f\"[yellow]⚠️  Lite limit: showing first {TX_LIMIT} transactions. Upgrade to Pro for unlimited.[/yellow]\")\n            break\n        line = line.strip()\n        if not line: continue\n        tokens = line.split()\n        amt = None\n        for tok in reversed(tokens):\n   "},{"language":"bash","snippet":"pip3 install rich --break-system-packages --quiet"},{"language":"python","snippet":"import os, re\nfrom datetime import date\nfrom collections import defaultdict\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nEXPENSES_TEXT = os.environ.get(\"EXPENSES_TEXT\",\"\").strip()\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"â¬\",\"GBP\":\"Â£\"}.get(CURRENCY,\"$\")\nTODAY         = date.today()\nTX_LIMIT      = 15\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\n\ndef parse_amount(raw):\n    c = re.sub(r\"[^0-9.]\",\"\",str(raw)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else None\n    except: return None\n\nCATEGORIES = {\n    \"Food & Dining\":  [\"coffee\",\"starbucks\",\"restaurant\",\"pizza\",\"burger\",\"cafe\",\"food\",\"doordash\",\"grubhub\",\"grocery\",\"walmart\",\"whole foods\"],\n    \"Transport\":      [\"uber\",\"lyft\",\"taxi\",\"gas\",\"fuel\",\"parking\",\"transit\",\"bus\",\"train\",\"flight\"],\n    \"Shopping\":       [\"amazon\",\"ebay\",\"etsy\",\"target\",\"bestbuy\",\"clothing\",\"shoes\"],\n    \"Subscriptions\":  [\"netflix\",\"spotify\",\"hulu\",\"disney\",\"prime\",\"subscription\",\"membership\",\"software\"],\n    \"Utilities\":      [\"electric\",\"water\",\"internet\",\"phone\",\"mobile\",\"utility\",\"bill\"],\n    \"Health\":         [\"pharmacy\",\"doctor\",\"dentist\",\"medical\",\"gym\",\"fitness\",\"cvs\",\"walgreens\"],\n    \"Entertainment\":  [\"movie\",\"cinema\",\"concert\",\"ticket\",\"game\",\"gaming\",\"book\"],\n    \"Other\":          [],\n}\n\ndef categorise(desc):\n    dl = desc.lower()\n    for cat, kws in CATEGORIES.items():\n        if cat == \"Other\": continue\n        if any(k in dl for k in kws): return cat\n    return \"Other\"\n\ntransactions = []\n\nif EXPENSES_TEXT:\n    for line in EXPENSES_TEXT.strip().splitlines():\n        if len(transactions) >= TX_LIMIT:\n            console.print(f\"[yellow]â ï¸  Lite limit: showing first {TX_LIMIT} transactions. Upgrade to Pro for unlimited.[/yellow]\")\n            break\n        line = line.strip()\n        if not line: continue\n        tokens = line.split()\n        amt = None\n        for tok in reversed(token"},{"language":"bash","snippet":"pip3 install rich --break-system-packages --quiet"},{"language":"python","snippet":"import os, re\nfrom datetime import date\nfrom collections import defaultdict\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nEXPENSES_TEXT = os.environ.get(\"EXPENSES_TEXT\",\"\").strip()\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"â¬\",\"GBP\":\"Â£\"}.get(CURRENCY,\"$\")\nTODAY         = date.today()\nTX_LIMIT      = 15\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\n\ndef parse_amount(raw):\n    c = re.sub(r\"[^0-9.]\",\"\",str(raw)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else None\n    except: return None\n\nCATEGORIES = {\n    \"Food & Dining\":  [\"coffee\",\"starbucks\",\"restaurant\",\"pizza\",\"burger\",\"cafe\",\"food\",\"doordash\",\"grubhub\",\"grocery\",\"walmart\",\"whole foods\"],\n    \"Transport\":      [\"uber\",\"lyft\",\"taxi\",\"gas\",\"fuel\",\"parking\",\"transit\",\"bus\",\"train\",\"flight\"],\n    \"Shopping\":       [\"amazon\",\"ebay\",\"etsy\",\"target\",\"bestbuy\",\"clothing\",\"shoes\"],\n    \"Subscriptions\":  [\"netflix\",\"spotify\",\"hulu\",\"disney\",\"prime\",\"subscription\",\"membership\",\"software\"],\n    \"Utilities\":      [\"electric\",\"water\",\"internet\",\"phone\",\"mobile\",\"utility\",\"bill\"],\n    \"Health\":         [\"pharmacy\",\"doctor\",\"dentist\",\"medical\",\"gym\",\"fitness\",\"cvs\",\"walgreens\"],\n    \"Entertainment\":  [\"movie\",\"cinema\",\"concert\",\"ticket\",\"game\",\"gaming\",\"book\"],\n    \"Other\":          [],\n}\n\ndef categorise(desc):\n    dl = desc.lower()\n    for cat, kws in CATEGORIES.items():\n        if cat == \"Other\": continue\n        if any(k in dl for k in kws): return cat\n    return \"Other\"\n\ntransactions = []\n\nif EXPENSES_TEXT:\n    for line in EXPENSES_TEXT.strip().splitlines():\n        if len(transactions) >= TX_LIMIT:\n            console.print(f\"[yellow]â ï¸  Lite limit: showing first {TX_LIMIT} transactions. Upgrade to Pro for unlimited.[/yellow]\")\n            break\n        line = line.strip()\n        if not line: continue\n        tokens = line.split()\n        amt = None\n        for tok in reversed(token"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: plutus-lite\ndescription: \"Plutus Lite — Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full financial picture.\"\nversion: \"1.0.4\"\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: [python3, pip3]\n    primaryEnv: \"EXPENSES_TEXT\"\n    homepage: https://clawhub.ai/occupythemilkyway/plutus-lite\n    emoji: \"💰\"\n    tags: [finance, expenses, budget, tracker, plutus, free, lite]\n    envVars:\n      - name: EXPENSES_TEXT\n        required: false\n        description: \"Paste up to 15 expenses, one per line: 'Jan 5 Coffee 4.50' or 'Amazon 34.99'\"\n        default: \"\"\n      - name: CURRENCY\n        required: false\n        description: \"Currency: USD, EUR, GBP\"\n        default: \"USD\"\n---\n\n# Plutus Lite — Free Expense Preview\n\nPaste up to 15 expenses and get a quick category breakdown.\n\n## Free vs Pro\n\n| Feature | Plutus Lite (Free) | Plutus Pro |\n|---------|-------------------|-----------|\n| Transactions | **15 max** | Unlimited |\n| CSV file input | ❌ | ✅ |\n| Budget comparison | ❌ | ✅ |\n| Monthly trends | ❌ | ✅ |\n| Tax deduction tracking | ❌ | ✅ |\n| Savings rate analysis | ❌ | ✅ |\n| Spending forecast | ❌ | ✅ 1-12 months |\n| Export (CSV + JSON) | ❌ | ✅ |\n\n👉 **Upgrade:** `openclaw skills install plutus-pro` — key at **ko-fi.com/s/83c662001e**\n\n💰 **Bundle deal:** all 5 Pro skills for **$29** → **ko-fi.com/s/7625accf3f** (save $16)\n\n---\n\n## Step 1 — Install\n\n```bash\npip3 install rich --break-system-packages --quiet\n```\n\n---\n\n## Step 2 — Quick expense scan (Lite)\n\n```python\nimport os, re\nfrom datetime import date\nfrom collections import defaultdict\nfrom rich.console import Console\nfrom rich.table import Table\nfrom rich.panel import Panel\nfrom rich import box\n\nconsole = Console()\n\nEXPENSES_TEXT = os.environ.get(\"EXPENSES_TEXT\",\"\").strip()\nCURRENCY      = os.environ.get(\"CURRENCY\",\"USD\").upper()\nSYM           = {\"USD\":\"$\",\"EUR\":\"€\",\"GBP\":\"£\"}.get(CURRENCY,\"$\")\nTODAY         = date.today()\nTX_LIMIT      = 15\n\ndef fmt(a): return f\"{SYM}{a:,.2f}\"\n\ndef parse_amount(raw):\n    c = re.sub(r\"[^0-9.]\",\"\",str(raw)) or \"0\"\n    try: return float(c) if c.count(\".\")<=1 else None\n    except: return None\n\nCATEGORIES = {\n    \"Food & Dining\":  [\"coffee\",\"starbucks\",\"restaurant\",\"pizza\",\"burger\",\"cafe\",\"food\",\"doordash\",\"grubhub\",\"grocery\",\"walmart\",\"whole foods\"],\n    \"Transport\":      [\"uber\",\"lyft\",\"taxi\",\"gas\",\"fuel\",\"parking\",\"transit\",\"bus\",\"train\",\"flight\"],\n    \"Shopping\":       [\"amazon\",\"ebay\",\"etsy\",\"target\",\"bestbuy\",\"clothing\",\"shoes\"],\n    \"Subscriptions\":  [\"netflix\",\"spotify\",\"hulu\",\"disney\",\"prime\",\"subscription\",\"membership\",\"software\"],\n    \"Utilities\":      [\"electric\",\"water\",\"internet\",\"phone\",\"mobile\",\"utility\",\"bill\"],\n    \"Health\":         [\"pharmacy\",\"doctor\",\"dentist\",\"medical\",\"gym\",\"fitness\",\"cvs\",\"walgreens\"],\n    \"Entertainment\":  [\"movie\",\"cinema\",\"concert\",\"ticket\",\"game\",\"gaming\",\"book\"],\n    \"Other\":          [],\n}\n\ndef categorise(desc):\n    "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7474wrtsjp988869sw7mygz1860n2v\",\n  \"slug\": \"plutus-lite\",\n  \"version\": \"1.0.4\",\n  \"publishedAt\": 1779648818276\n}"},{"path":"skill-card.md","content":"## Description:\n\nPlutus Lite summarizes up to 15 pasted expenses into categories and a basic spend breakdown, serving as a free preview of Plutus Pro.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[occupythemilkyway](https://clawhub.ai/user/occupythemilkyway)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users can paste a small list of expenses and ask an agent to run a quick categorization and spend summary. The skill is useful for lightweight personal expense review, not full budgeting, tax, or forecasting workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The documented install command uses a system-package override.\n\nMitigation: Install dependencies inside a virtual environment or remove the --break-system-packages option before running the command.\n\nRisk: Expense text can contain personal, merchant, account, or financial details.\n\nMitigation: Redact unnecessary sensitive details before placing expenses in EXPENSES_TEXT.\n\nRisk: The skill includes paid Pro upgrade prompts and external purchase links.\n\nMitigation: Review those links and treat the paid products as separately trusted external offerings.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/occupythemilkyway/skills/plutus-lite)\n- [Plutus Lite homepage](https://clawhub.ai/occupythemilkyway/plutus-lite)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, guidance]\n\n**Output Format:** [Markdown instructions with bash and Python code blocks; runtime output is terminal tables and panels.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Processes up to 15 pasted transactions and supports USD, EUR, and GBP currency symbols.]\n\n## Skill Version(s):\n\n1.0.4 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Plutus Lite — Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full... Skill: Plutus Lite — Quick Expense Summary Owner: occupythemilkyway Summary: Plutus Lite — Expense Tracker (Free). Categorise up to 15 transactions and see a basic spend breakdown. A free preview of what Plutus Pro does for your full... Tags: budget:1.0.0, expenses:1.0.0, finance:1.0.0, free:1.0.0, latest:1.0.4, lite:1.0.0, plutus:1.0.0, tracker:1.0.0 Version history: v1.0.4 | 2026-05-24T18:53:38.276Z | user - Fixed","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1069,"uniquenessScore":59,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-12T01:29:58.239Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-12T01:29:58.239Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T05:21:08.861Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}