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.
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
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
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.
npx skills add https://github.com/sonichi/sutando --skill "skills/subscription-scanner"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
- 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. - 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) - 03
State schema
Review the “State schema” section in the pinned source before continuing.
Review and apply the “State schema” source section. - 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
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 passEvidence record
Why each signal appears
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 66/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 359 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated 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 thefrom: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": "a.kunte@gmail.com 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:
- Reads
skills/subscription-scanner/state/subscriptions.json - Renders a sortable table with vendor, amount, frequency, account, status, last/next charge
- Highlights diffs from the previous snapshot (
scan_history[-1].addedin green,removedin strikethrough red) - Shows last-scan timestamp at the top
- Provides a "Scan now" button that POSTs to
/paidsubscriptions/scan— that endpoint writes a task file totasks/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.