# Claude Skill Changes Tracker (`ianymu/claude-skill-changes-tracker`) Actor

Daily diff watcher for Claude Code SKILL.md files across a curated list of GitHub repos. Detects new, updated, and removed Skills by comparing each run's manifest against a cached baseline in the Actor's key-value store.

- **URL**: https://apify.com/ianymu/claude-skill-changes-tracker.md
- **Developed by:** [Yanlong Mu](https://apify.com/ianymu) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Claude Skill Changes Tracker

> **Daily diff watcher for Claude Code Skills across the official Anthropic repo and the top community repos. Find out — automatically, every day — which Skills were added, updated, or removed since yesterday.**

### What does Claude Skill Changes Tracker do?

The Claude Code Skills ecosystem moved from "interesting idea" to "production toolchain" in months. The [official Anthropic Skills repo](https://github.com/anthropics/skills) keeps growing, and dozens of community Skills repos publish their own SKILL.md files weekly. There is no central changelog.

This Actor solves that. It scans a configurable watchlist of GitHub repositories (default: the Anthropic-canonical + 4 top community Skills repos), finds every `SKILL.md` file in each repo's default branch, and **diffs the manifest against the previous run**. The result is a structured changelog: which Skills are brand new, which were updated (content hash or size changed), and which were removed.

It is the time-series companion to the point-in-time [`claude-code-skill-finder`](https://apify.com/) Actor (#13 in Ian Mu's 100-actor portfolio). When scheduled on the Apify platform, it gives you a daily changelog with zero infrastructure of your own — leveraging Apify's scheduling, key-value-store-backed snapshots, and API access.

### Why use Claude Skill Changes Tracker?

- **Skill maintainers**: get a notification when a competing Skill releases a new version, or when the Anthropic official repo bumps `design-html` or `frontend-design`
- **Developer-tools investors**: track the velocity of the Claude Code Skills ecosystem — is community contribution accelerating?
- **Tutorial creators**: spot brand-new Skills the day they land so your content is first
- **Product managers** at companies building on Claude Code: know the day a new official Skill changes your integration assumptions
- **Security teams**: audit removed Skills (deprecated for a reason?) and updated Skills (what changed?)

### How to use Claude Skill Changes Tracker

1. Open the **Input** tab. The default watchlist tracks 5 high-signal repos.
2. (Optional) Add a `githubToken` Apify secret to raise GitHub's anonymous rate limit (60/hour) to 5000/hour.
3. (Optional) Add or remove repos from `watchlist`.
4. Click **Start**. The first run has no baseline — every Skill is reported as `new` and the manifest is cached.
5. Schedule the Actor daily (e.g. 06:00 UTC). From the second run onward, the dataset returns only **deltas**: new, updated, removed.
6. Pipe the dataset into Slack, email, or a database via Apify's webhooks / integrations.

### Input

| Field | Type | Description |
|---|---|---|
| `watchlist` | string[] | Array of `owner/repo` GitHub paths to monitor. Defaults to 5 curated Skills repos. |
| `cacheKeyPrefix` | string | Prefix for per-repo manifests in the key-value store. Default `skill-cache-`. |
| `githubToken` | string (secret) | Optional GitHub PAT to raise the API rate limit. |
| `branchHint` | string | Force a non-default branch globally. Empty = auto-detect per repo. |

Example input:

```json
{
  "watchlist": [
    "anthropics/skills",
    "obra/superpowers",
    "wshobson/agents"
  ],
  "cacheKeyPrefix": "skill-cache-",
  "githubToken": "ghp_xxx"
}
````

### Output

Each dataset item:

```json
{
  "changeType": "updated",
  "skillName": "design-html",
  "skillPath": "skills/design-html/SKILL.md",
  "repo": "anthropics/skills",
  "branch": "main",
  "sizeBytes": 4200,
  "previousSizeBytes": 3850,
  "sizeDeltaBytes": 350,
  "sha": "3a7c2d1...",
  "previousSha": "1f9e8b4...",
  "url": "https://github.com/anthropics/skills/blob/main/skills/design-html/SKILL.md",
  "detectedAt": "2026-05-21T06:00:00.000Z"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel. A Markdown summary report (`skill-changes-report.md`) is also written to the key-value store after every run.

### Data table

| Field | Type | Meaning |
|---|---|---|
| `changeType` | string | `new`, `updated`, or `removed` |
| `skillName` | string | Directory name housing the SKILL.md (e.g. `design-html`) |
| `skillPath` | string | Full path inside the repo (e.g. `skills/design-html/SKILL.md`) |
| `repo` | string | `owner/repo` source |
| `branch` | string | Branch the diff was computed against |
| `sizeBytes` | number | Current SKILL.md byte size (null for removed) |
| `previousSizeBytes` | number | Prior-run byte size (null for new) |
| `sizeDeltaBytes` | number | Signed delta |
| `sha` | string | Git blob SHA — proxy for content hash |
| `url` | link | Direct GitHub link to the SKILL.md |
| `detectedAt` | date | Timestamp of this run |

### Pricing / Cost estimation

- **Free trial**: 5 daily runs, 5-repo watchlist (covers the default config)
- **Daily delta subscription**: $1.50/month for daily diffs of up to 10 repos
- **Wide watchlist**: $0.001 per repo scanned per run, so a 50-repo watchlist costs around $0.05/run

Each run uses around 0.001 Compute Units. The GitHub API is free up to 60 requests/hour anonymous and 5000/hour with a token.

### Tips and advanced options

- **First-run cost**: every Skill is reported `new` on run #1 because there is no baseline. Expect a one-time spike.
- **Pair with `vscode-ai-extension-popularity-tracker`** (sibling Actor in the 100-actor portfolio) to build an end-to-end "AI coding tool intelligence" pipeline
- **Add your own repo**: if you maintain a Skills repo, include it in `watchlist` for a free daily audit of your own changes
- **Use webhooks**: configure an Apify webhook on `RUN_SUCCEEDED` to push `changeType=new` rows directly into Slack
- **Forks vs upstream**: this Actor does not deduplicate Skills that exist in both a fork and its upstream. If you want a deduped global Skills view, use `claude-code-skill-finder` (the point-in-time companion).

### FAQ, disclaimers, and support

**Q: How does it detect "updated" vs "new"?**
Each run records a manifest of `{ skillPath → { sizeBytes, sha } }`. Next run compares the new manifest to the cached one. Any SHA or size change = `updated`. New path = `new`. Missing path = `removed`.

**Q: Why filename + size + SHA, not full content?**
Cost. Fetching every SKILL.md body across 50 repos every day wastes bandwidth. The Git blob SHA is a perfect content hash — same SHA means byte-identical content.

**Q: Will it miss content changes that don't change size?**
No. The Git blob SHA changes on any byte-level change, even ones that preserve size.

**Q: What if a repo has 100+ SKILL.md files in subdirectories?**
The tree API returns up to 100k entries. If `truncated=true` is reported, the Actor logs a warning. Practical Skills repos stay well under this cap.

**Q: Can I track private repos?**
Yes — pass a `githubToken` with appropriate scope via Apify secrets.

**Q: Legality?**
This Actor only reads public GitHub metadata (repo tree + file size + SHA), which is explicitly allowed by GitHub's ToS for both authenticated and anonymous use.

For issues, feature requests, or custom watchlists, open the **Issues** tab on this Actor.

Built by **Ian Mu** — [github.com/ianymu](https://github.com/ianymu), author of [`claude-verify-before-stop`](https://github.com/ianymu/claude-verify-before-stop). Part of a 100-Actor AI / dev-tools intelligence portfolio.

# Actor input Schema

## `watchlist` (type: `array`):

Array of 'owner/repo' strings to scan for SKILL.md files. The Actor walks each repo's default branch tree and looks for files matching SKILL.md. Add or remove repos to customize coverage.

## `cacheKeyPrefix` (type: `string`):

Prefix for the per-repo manifest stored in the Actor's default key-value store. The Actor reads the previous manifest, computes a diff, then overwrites it. Change this to maintain isolated baselines.

## `githubToken` (type: `string`):

Optional personal access token (PAT) to raise the GitHub API rate limit from 60 req/hour (anonymous) to 5000 req/hour. Read-only public-repo access is sufficient. Stored securely via Apify secrets.

## `branchHint` (type: `string`):

If set, scan this branch instead of the repo default. Leave empty to auto-detect the default branch per repo.

## Actor input object example

```json
{
  "watchlist": [
    "anthropics/claude-code",
    "anthropics/skills",
    "obra/superpowers",
    "malcolmocean/claude-code-skills",
    "wshobson/agents"
  ],
  "cacheKeyPrefix": "skill-cache-",
  "branchHint": ""
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("ianymu/claude-skill-changes-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("ianymu/claude-skill-changes-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call ianymu/claude-skill-changes-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=ianymu/claude-skill-changes-tracker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Claude Skill Changes Tracker",
        "description": "Daily diff watcher for Claude Code SKILL.md files across a curated list of GitHub repos. Detects new, updated, and removed Skills by comparing each run's manifest against a cached baseline in the Actor's key-value store.",
        "version": "0.0",
        "x-build-id": "AM4znkXhck9uBME0q"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/ianymu~claude-skill-changes-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-ianymu-claude-skill-changes-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/ianymu~claude-skill-changes-tracker/runs": {
            "post": {
                "operationId": "runs-sync-ianymu-claude-skill-changes-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/ianymu~claude-skill-changes-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-ianymu-claude-skill-changes-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "watchlist": {
                        "title": "Watchlist of GitHub repos",
                        "type": "array",
                        "description": "Array of 'owner/repo' strings to scan for SKILL.md files. The Actor walks each repo's default branch tree and looks for files matching SKILL.md. Add or remove repos to customize coverage.",
                        "default": [
                            "anthropics/claude-code",
                            "anthropics/skills",
                            "obra/superpowers",
                            "malcolmocean/claude-code-skills",
                            "wshobson/agents"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "cacheKeyPrefix": {
                        "title": "Cache key prefix",
                        "type": "string",
                        "description": "Prefix for the per-repo manifest stored in the Actor's default key-value store. The Actor reads the previous manifest, computes a diff, then overwrites it. Change this to maintain isolated baselines.",
                        "default": "skill-cache-"
                    },
                    "githubToken": {
                        "title": "GitHub token (optional)",
                        "type": "string",
                        "description": "Optional personal access token (PAT) to raise the GitHub API rate limit from 60 req/hour (anonymous) to 5000 req/hour. Read-only public-repo access is sufficient. Stored securely via Apify secrets."
                    },
                    "branchHint": {
                        "title": "Branch override (optional)",
                        "type": "string",
                        "description": "If set, scan this branch instead of the repo default. Leave empty to auto-detect the default branch per repo.",
                        "default": ""
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
