tidy

Triggered by "tidy up", "clean up transactions", "categorize uncategorized", "organize my transactions"

2,707 stars

Best use case

tidy is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Triggered by "tidy up", "clean up transactions", "categorize uncategorized", "organize my transactions"

Teams using tidy should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/tidy/SKILL.md --create-dirs "https://raw.githubusercontent.com/davepoon/buildwithclaude/main/plugins/cashflow/skills/tidy/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/tidy/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How tidy Compares

Feature / AgenttidyStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Triggered by "tidy up", "clean up transactions", "categorize uncategorized", "organize my transactions"

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

Related Guides

SKILL.md Source

# Tidy Up Uncategorized Transactions

Batch-categorize uncategorized transactions by clustering similar ones and applying categories in bulk.

## Workflow

1. **Fetch uncategorized transactions.** Call the `query` MCP tool:
   ```json
   { "detail": true, "is_uncategorized": true, "period": "last_90d", "limit": 200, "sort": "-amount" }
   ```
   If `$ARGUMENTS` contains a time period (e.g. "this month", "last 30 days"), use that instead of `last_90d`.

2. **Research unknown transactions.** For transactions you can't identify from the description alone:
   - **Web search first** (if available): Search for the merchant name, any phone numbers or domains in the description, or the raw description itself. This often reveals the business behind cryptic processor names.
   - **Search the user's email** (if available): Search for the party/merchant name to find order confirmations or receipts. If that doesn't match, search for the exact dollar amount (e.g. "$47.23") to find receipts that way.

3. **Cluster by pattern.** Group the results by normalized description or party name. For each cluster, note the count and total amount.

4. **Suggest categorization.** For each cluster, propose:
   - A **category** (pick from the user's existing categories)
   - A **party** name (the clean merchant/counterparty name)

5. **Present to the user.** Show a table or list of clusters with:
   - Pattern / merchant name
   - Count of transactions
   - Total amount
   - Suggested category
   - Whether you recommend creating a rule

   Ask the user to approve, modify, or skip each cluster.

6. **Prefer rules over one-off annotations.** If a cluster has more than one transaction, or the merchant is likely to appear again (subscriptions, regular stores, utilities, etc.), create a rule rather than annotating individual transactions. Rules automatically categorize future transactions too.
   - Preview first: `admin { "entity": "rule", "action": "preview", ... }`
   - Show the preview (how many existing transactions would match)
   - If user confirms, create: `admin { "entity": "rule", "action": "create", ... }`

7. **Annotate the rest.** For truly one-off transactions where a rule wouldn't help, apply directly:
   ```json
   { "action": "categorize", "filter": { "search": "<pattern>" }, "category_name": "<approved_category>" }
   ```
   Also set the party if one was approved:
   ```json
   { "action": "set_party", "filter": { "search": "<pattern>" }, "party_name": "<approved_party>" }
   ```

8. **Summarize.** Report how many transactions were categorized, how many rules were created, and how many uncategorized transactions remain.

## Tone

Stick to the facts. Present findings and suggestions without judgement — no commentary on spending habits. Just clear, plain-language observations and actionable options.

Related Skills

tiktok-automation

2707
from davepoon/buildwithclaude

Automate TikTok tasks via Rube MCP (Composio): upload/publish videos, post photos, manage content, and view user profiles/stats. Always search tools first for current schemas.

theme-factory

2707
from davepoon/buildwithclaude

Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.

telegram-automation

2707
from davepoon/buildwithclaude

Automate Telegram tasks via Rube MCP (Composio): send messages, manage chats, share photos/documents, and handle bot commands. Always search tools first for current schemas.

tailored-resume-generator

2707
from davepoon/buildwithclaude

Analyzes job descriptions and generates tailored resumes that highlight relevant experience, skills, and achievements to maximize interview chances

supabase-automation

2707
from davepoon/buildwithclaude

Automate Supabase database queries, table management, project administration, storage, edge functions, and SQL execution via Rube MCP (Composio). Always search tools first for current schemas.

stripe-automation

2707
from davepoon/buildwithclaude

Automate Stripe tasks via Rube MCP (Composio): customers, charges, subscriptions, invoices, products, refunds. Always search tools first for current schemas.

square-automation

2707
from davepoon/buildwithclaude

Automate Square tasks via Rube MCP (Composio): payments, orders, invoices, locations. Always search tools first for current schemas.

slack-message-formatter

2707
from davepoon/buildwithclaude

Format messages for Slack with pixel-perfect accuracy. Converts Markdown to rich HTML (for copy-paste into Slack) or Slack mrkdwn (for API/webhook). Use when the user asks to write a Slack message, announcement, or notification, format something "for Slack", preview how content looks in Slack, or send a message via Slack webhook. Also trigger when user mentions Slack formatting, mrkdwn, or wants to share Markdown content in Slack channels.

slack-gif-creator

2707
from davepoon/buildwithclaude

Toolkit for creating animated GIFs optimized for Slack, with validators for size constraints and composable animation primitives. This skill applies when users request animated GIFs or emoji animations for Slack from descriptions like "make me a GIF for Slack of X doing Y".

slack-automation

2707
from davepoon/buildwithclaude

Automate Slack messaging, channel management, search, reactions, and threads via Rube MCP (Composio). Send messages, search conversations, manage channels/users, and react to messages programmatically.

skill-share

2707
from davepoon/buildwithclaude

A skill that creates new Claude skills and automatically shares them on Slack using Rube for seamless team collaboration and skill discovery.

skill-creator

2707
from davepoon/buildwithclaude

Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.