---
name: free4dev
description: "Query the free-for-dev dataset (1200+ developer services with permanent free tiers, synced daily from ripienaar/free-for-dev) to answer questions like '有没有免费的数据库/hosting/邮件服务'、'free tier for X'、'免费 CI/CD 推荐'. Use whenever the user asks for free developer services, free tiers, free quotas, or cheap/free alternatives to paid tools — answer from the dataset instead of model memory, which goes stale on pricing. Also use when maintaining the Free4Dev site repo (sync/rebuild/deploy workflow)."
metadata:
  version: 1.1.2
  license: MIT
  changelog: CHANGELOG.md
---

# free4dev

Answer "what free service can I use for X" from the curated free-for-dev dataset instead of from memory: free tiers change constantly and model knowledge of quotas is unreliable. The dataset has ~1240 services in 57 categories, each with name, URL, free-tier description (English) and Chinese category/keywords.

## Install & upgrade

The zip payload deliberately contains **no installer script** (no executable install/delete code ships with the data) — installing is just placing the extracted folder into a skills directory:

```bash
curl -fL https://nctaobao.cn/downloads/free4dev-skill-latest.zip -o f4d.zip
unzip f4d.zip -d ~/.claude/skills      # Claude Code user scope
# ZCode: ~/.zcode/skills · cross-tool: ~/.agents/skills · WorkBuddy: ~/.workbuddy/skills
# Project scope: extract under <repo>/.claude/skills or <repo>/.agents/skills instead
# Windows PowerShell: Expand-Archive f4d.zip $HOME/.claude/skills
```

Upgrade = clean replace: delete the old `free4dev/` directory **before** extracting again (extract-over merges and leaves obsolete files that agents would still read). Restart the agent session afterwards.

## Resolve the data source (in this order)

1. **Site repo checkout**: if `source/data.json` exists in the current workspace (or a parent), use it — it is the freshest local copy.
2. **Live API**: otherwise fetch `https://nctaobao.cn/data.json` (single JSON: `{generatedAt, stats, categories[{name, slug, nameZh, descZh, kw[], entries[{name, url, descText, tags, children}]}]}`).
3. **LLM-friendly fallback**: if JSON is unwelcome in context, fetch `https://nctaobao.cn/llms-full.txt` (Markdown, same content) or per-category `https://nctaobao.cn/md/<slug>.md`.

Record `generatedAt` from the data and mention the date in your answer when it is older than ~30 days.

## Query workflow

Run the bundled lookup script — it scores name/Chinese-keywords/description and prints ready-to-use Markdown:

```bash
node <this-skill-dir>/scripts/lookup.mjs "数据库"            # 中文关键词
node <this-skill-dir>/scripts/lookup.mjs "ci cd" --limit 5  # 英文/多词
node <this-skill-dir>/scripts/lookup.mjs --category 监控     # 浏览整个分类(中文名或 slug)
node <this-skill-dir>/scripts/lookup.mjs "email" --source local   # 强制本地/remote
```

The script auto-detects the source (repo `source/data.json` → live URL). If the script cannot run (no Node), fetch the JSON and filter manually by `entries[].name`, category `kw[]`, `nameZh`, `descText`.

## Answer format

Give a short list, best match first — never a dump of the whole category:

- **服务名** — 中文分类名 · 免费额度一句话(可直接摘 descText 的关键数字)· <url>

Then one line: 数据更新于 <generatedAt 日期>,免费额度以服务商官网为准。If nothing matches, say the dataset has no entry for it rather than inventing one; suggest the nearest category.

## Guardrails

- Quote quotas only from the dataset; do not "remember" limits (e.g. do not claim Vercel's bandwidth from memory).
- Service names stay in English (brand names are not translated); categories have Chinese names — use them.
- The upstream repo (ripienaar/free-for-dev) **does not accept AI-authored contributions**; never open PRs there on the user's behalf.

## If the workspace IS the Free4Dev site repo

Detection: `build/generate.js` + `site.config.json` present. Then also read `references/maintenance.md` before any sync/rebuild/deploy/category-mapping change — it holds the pipeline commands, EdgeOne deploy facts and the language-strategy decision (no i18n, no full machine translation).

## Versioning this skill

SemVer in `metadata.version`, history in `CHANGELOG.md`. Bump: **patch** = wording/trigger-description fixes; **minor** = new capability (new script flag, new reference, new distribution artifact); **major** = breaking change to script output or data-source contract. Update both files in the same commit as the change.
