Source profileQuality 66/100

sonichi/sutando/skills/subscription-scanner/SKILL.md

subscription-scanner

Scans Gmail for active paid subscriptions and tracks them over time. Surfaces additions / cancellations between scans.

Source repository stars
359
Declared platforms
0
Static risk flags
1
Last source update
2026-07-28
Source checked
2026-07-28

Decision brief

What it does—and where it fits

Scans Gmail for active paid subscriptions and tracks them over time. Surfaces additions / cancellations between scans.

Best for

    Not for

    • Tasks that require unconfirmed production actions or broad system permissions.
    • Environments where the pinned source and install steps cannot be inspected.

    Compatibility matrix

    Platform support, with evidence labels

    PlatformStatusEvidenceWhat to check
    CodexNot declaredNo explicit evidencePortability before use
    Claude CodeNot declaredNo explicit evidencePortability before use
    CursorNot declaredNo explicit evidencePortability before use
    Gemini CLINot declaredNo explicit evidencePortability before use
    Open the compatibility checker

    Installation

    Inspect first. Install second.

    The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

    Source-detected install commandSource
    npx skills add https://github.com/sonichi/sutando --skill "skills/subscription-scanner"
    Safe inspection promptEditorial

    Inspect the Agent Skill "subscription-scanner" from https://github.com/sonichi/sutando/blob/6a8f0fccd32e5aa620a3572c8885544f144bb6fe/skills/subscription-scanner/SKILL.md at commit 6a8f0fccd32e5aa620a3572c8885544f144bb6fe. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

    Workflow

    What the source asks the agent to do

    1. 01

      Usage

      The scan is agent-driven, not script-driven, because Gmail access lives in the Claude Code MCP layer (not in Python). The proactive-loop or owner-on-demand fires the scan via:

      The scan is agent-driven, not script-driven, because Gmail access lives in the Claude Code MCP layer (not in Python). The proactive-loop or owner-on-demand fires the scan via:…or the cron job below invokes the agent with the scan-prompt.md body verbatim.
    2. 02

      Files

      scan-prompt.md — the prompt text the agent runs to perform a scan. Updates here propagate via the cron config. Personalize this file before first use — the third Gmail-query line names specific senders tied to one user'…

      scan-prompt.md — the prompt text the agent runs to perform a scan. Updates here propagate via the cron config. Personalize this file before first use — the third Gmail-query line names specific senders tied to one user'…state/subscriptions.json — current list (gitignored — contains personal financial data)state/history/.json — snapshots, for diff (also gitignored)
    3. 03

      State schema

      Review the “State schema” section in the pinned source before continuing.

      Review and apply the “State schema” source section.
    4. 04

      How /paidsubscriptions reads this

      web-client.ts route at /paidsubscriptions: 1. Reads skills/subscription-scanner/state/subscriptions.json 2. Renders a sortable table with vendor, amount, frequency, account, status, last/next charge 3. Highlights diffs from the previous snapshot (scanhistory[-1].added in green,…

      Reads skills/subscription-scanner/state/subscriptions.jsonRenders a sortable table with vendor, amount, frequency, account, status, last/next chargeHighlights diffs from the previous snapshot (scanhistory[-1].added in green, removed in strikethrough red)

    Permission review

    Static risk signals and limitations

    Reads files

    low · line 60

    The documentation asks the agent to read local files, directories, or repositories.

    Provides a "Scan now" button that POSTs to `/paidsubscriptions/scan` — that endpoint writes a task file to `tasks/` triggering an out-of-cycle scan in the next loop pass

    Evidence record

    Why each signal appears

    EvidenceSourceComputedTestedEditorial
    SignalValueEvidence typeMeaning
    Quality score66/100ComputedDocumentation, specificity, maintenance, and trust rules
    Repository stars359SourceRepository attention, not individual Skill quality
    Compatibility0 platformsSourceDeclared in the catalog source record
    Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

    Pinned source

    Provenance and original SKILL.md

    Repository
    sonichi/sutando
    Skill path
    skills/subscription-scanner/SKILL.md
    Commit
    6a8f0fccd32e5aa620a3572c8885544f144bb6fe
    License
    MIT
    Collected
    2026-07-28
    Default branch
    main
    View the original SKILL.md

    Subscription Scanner

    Scans Gmail for active paid subscriptions and tracks them over time. Surfaces additions / cancellations between scans.

    Usage

    The scan is agent-driven, not script-driven, because Gmail access lives in the Claude Code MCP layer (not in Python). The proactive-loop or owner-on-demand fires the scan via:

    /scan-subscriptions
    

    …or the cron job below invokes the agent with the scan-prompt.md body verbatim.

    Files

    • scan-prompt.md — the prompt text the agent runs to perform a scan. Updates here propagate via the cron config. Personalize this file before first use — the third Gmail-query line names specific senders tied to one user's actual subscriptions (Apple, Spotify, Anthropic, OpenAI, Netflix, Adobe, GitHub, 1Password, NYT, WSJ, Disney+, Hulu, Tesla insurance, Xfinity, …). Edit the from: list to match your subscriptions, or the scan will miss vendors not on the default list.
    • state/subscriptions.json — current list (gitignored — contains personal financial data)
    • state/history/<YYYY-MM-DD>.json — snapshots, for diff (also gitignored)

    State schema

    {
      "last_scan": "ISO8601 timestamp",
      "subscriptions": [
        {
          "vendor": "Apple iCloud+ 2TB",
          "category": "Storage|Streaming|Connectivity|Insurance|Software|Membership|Other",
          "amount": 9.99,
          "currency": "USD",
          "frequency": "monthly|annual|other",
          "account": "[email protected] or family member name",
          "last_charged": "YYYY-MM-DD",
          "next_charge": "YYYY-MM-DD or null",
          "status": "active|cancelled|uncertain",
          "source_sender": "email From: address that established this",
          "notes": "free-form caveats / corrections"
        }
      ],
      "scan_history": [
        {
          "date": "ISO8601",
          "active_count": <int>,
          "added": ["vendor names"],
          "removed": ["vendor names"],
          "amount_changed": [{"vendor": "...", "from": <num>, "to": <num>}]
        }
      ]
    }
    

    How /paidsubscriptions reads this

    web-client.ts route at /paidsubscriptions:

    1. Reads skills/subscription-scanner/state/subscriptions.json
    2. Renders a sortable table with vendor, amount, frequency, account, status, last/next charge
    3. Highlights diffs from the previous snapshot (scan_history[-1].added in green, removed in strikethrough red)
    4. Shows last-scan timestamp at the top
    5. Provides a "Scan now" button that POSTs to /paidsubscriptions/scan — that endpoint writes a task file to tasks/ triggering an out-of-cycle scan in the next loop pass

    Cron

    Monthly: 1st of every month at 08:13 (off-peak minute) — see skills/schedule-crons/crons.json entry subscription-scan.

    crons.json is gitignored (per-user), so the entry isn't in this repo. Add it manually after cloning:

    {
      "name": "subscription-scan",
      "cron": "13 8 1 * *",
      "prompt": "Run the monthly paid-subscription scan. Read the full instructions in skills/subscription-scanner/scan-prompt.md and follow them verbatim. Update skills/subscription-scanner/state/subscriptions.json with the latest list, snapshot the previous version to state/history/, and write a proactive Telegram notification to results/proactive-{ts}.txt only if subscriptions were added, removed, or had price changes since the previous scan. Stay silent if nothing changed."
    }
    

    The cron expression 13 8 1 * * fires at 08:13 on the 1st of every month. Bump to */10 * * * * during development to trigger every 10 min.