Last updated: 2026-01-26
目标:把 agentskill.work 做成“可持续增长”的流量站,重点提升收录质量、长尾覆盖、分享转化(微信/社交卡片)和 LLM 可理解性。
- GitHub API 调用只允许在“定时任务”(Celery)里进行:前端分页/搜索只打自家 API,不准让用户端触发 GitHub API(避免把 GitHub 拉爆)。
- 术语约束:
Claude Skill保持原文,不要翻译成“claude 技能”。 - SEO 目标:每个可索引页面必须有稳定的 canonical、可读的 title/description、可用的 OG/Twitter 卡片、合理的结构化数据。
- GEO 目标:提供清晰、可引用、可机读的站点说明与 API 语义(llms.txt/llms-full.txt/openapi)。
- 全站基础 SEO:
robots.txt、sitemap.xml、canonical + hreflang(当前基于/zh//en) - Canonical Host:统一使用
agentskill.work,并在服务器 Nginx 做www->apex的 301 跳转(避免重复内容与“空站”误抓取) - 首页/详情页结构化数据:WebSite/FAQ/ItemList + SoftwareSourceCode/BreadcrumbList
- 全站 OG/Twitter 基础卡片:
/opengraph-image(默认分享图) - Site icon:
/favicon.ico、/apple-touch-icon.png - 微信校验文件:
/e5e588a3b46a049f7e2354fa3ba02fde.txt(可公网访问) - GEO 基础文件:
/llms.txt(已补充 usage/attribution) - Analytics:Umami script 已全站注入
- Ads:已集成 Google AdSense loader script(全站注入于
<head>,便于广告平台验证/投放) - Ads.txt:已添加
/ads.txt(AdSense 授权声明) - Ads meta:已添加
<meta name="google-adsense-account" ...>(AdSense 账号验证) - Site footer:© 2026 geyunfei · GitHub · MIT License(全站)
- 默认语言:访问
/(或 legacy 旧路由无 lang/hl)时按浏览器Accept-Language自动选择/zh或/en -
<html lang>:根据 URL 前缀(/en /zh)设置正确的 lang(避免英文页输出 zh-CN,影响 SEO/可访问性) - 首页列表可抓取分页入口:
/{lang}?offset=...(Load more 为<a>,无 JS/爬虫也可跟进) - 卡片描述截断:列表页卡片 description 做文本截断 + CSS 限高,避免超长描述导致整行变形
- 扩展
skills模型,新增 registry metadata:topics_json、skill_type、platforms、capabilities、install_methods、config_keys、source_files、readme_excerpt、quality_score、verification_status、last_verified_at - 增加 Alembic migration
0006_add_registry_metadata - 增加 Celery 离线仓库 inspection:读取 README 和根目录关键文件,只在后台任务中调用 GitHub API
- API / MCP / llms-full.txt 暴露结构化 registry 字段
- 详情页展示 registry 信息、验证状态、质量分、识别文件、配置键、README 摘要
- 移除详情页 404 fallback 中的前端 GitHub API 调用;找不到 skill 时仅站内重定向到搜索页
下一步建议:
- 增加 repo alias 表,由 Celery 离线维护 GitHub rename/redirect
- 增加 Submit / Claim / Report outdated 表单与人工审核流
- 增加 Compare / Alternatives 长尾页面
- 将
?lang=en|zh升级为路径型多语言(/en/...、/zh/...)- 现状:语言通过 query 传参;虽然有 hreflang,但 URL 不够“干净”,对收录与分享一致性不友好。
- 方案建议(Next.js App Router):
- 新增
frontend/src/app/[lang]/...路由结构(lang 仅允许en/zh) /308 到“默认语言”(按浏览器Accept-Language自动选择/zh或/en)- 旧链接兼容:
/?lang=en、/skills/x/y?lang=en统一重定向到/en/...
- 新增
- Canonical/hreflang 规则(必须明确):
- 每个语言页面 canonical 指向自己(/en 指向 /en,/zh 指向 /zh)
- 必须输出
hreflang:zh-CN、en-US、x-default
- 验收标准:
- 旧链接访问会被 301/308 到新链接(避免重复收录)
- 两种语言页面均可被 sitemap 收录(或至少收录 canonical 页并通过 hreflang 互链)
- 为每个 repo 生成动态 OG 图(微信/社交传播更强)
- 目标:分享出去的卡片包含:
owner/repo、stars、forks、language、top topics(以及“Claude Skill”标识) - 实现建议:
- 增加 route:
frontend/src/app/[lang]/skills/[owner]/[repo]/opengraph-image.tsx - OG 图生成时从自家 API 拉取 skill(绝不直连 GitHub)
- metadata 的 openGraph.images 改为该动态图片的绝对 URL(包含
metadataBase)
- 增加 route:
- 注意:
- Edge runtime 下取数要稳定(必要时走公网
https://agentskill.work/api) - 失败兜底:拉不到 skill 时 fallback 到全站默认
/opengraph-image
- Edge runtime 下取数要稳定(必要时走公网
- 验收标准:
- 分享任意详情页时,社交预览图能正确显示 repo 信息(至少 title 正确,图片不 404)
- 目标:分享出去的卡片包含:
- 将单一
sitemap.xml升级为 sitemap index(站点规模化必备)- 实现:
https://agentskill.work/sitemap-index.xml(sitemap index)https://agentskill.work/sitemap-pages.xml(静态页面)https://agentskill.work/sitemap-skills/{n}.xml(skills 分片,n从 1 开始)https://agentskill.work/sitemap.xml直接返回 sitemap index(200),便于兼容不跟随重定向的抓取器
- 目标:
- 提供
sitemap-index.xml,按分页输出sitemap-skills-{n}.xml - 每个 url 写
lastmod(优先last_pushed_at,fallbackfetched_at) - robots.txt 指向 sitemap index
- 提供
- 实现建议:
- 使用 Next Route Handlers 输出 XML(避免 Next 单 sitemap 限制)
- 生成时仅调用自家 API(分页获取 skills)
- 加缓存(revalidate/Cache-Control),避免每次爬虫请求都打爆 API/DB
- sitemap 分片的 page-size 需要与后端
GET /api/skills的 max limit 对齐(当前 <= 100),否则会触发 422 并导致 sitemap-skills 返回 502 - 注意:
/sitemap-index.xml必须是运行时动态(例如export const dynamic = "force-dynamic"),否则 Next 可能在 build 阶段预渲染该路由并触发对自家 API 的 fetch,导致 Docker build 时超时失败
- 验收标准:
https://agentskill.work/sitemap-index.xml存在且可被 robots 引用- index 中列出的
sitemap-skills-*.xml返回 200 且包含有效 URL 集
- 实现:
- 新增可索引聚合页(提高长尾覆盖 + 内链结构)
- 4.1 后端支持:
GET /api/skills支持按topic/language/owner过滤(只查 DB,不触发 GitHub API)topic:按 topics(逗号分隔)做整词匹配language:大小写不敏感匹配owner:匹配full_name的{owner}/...- 说明:后端 list API 仍限制
limit <= 100,聚合页与 sitemap 分片要按该上限分页
- 4.2 前端页面:
/{lang}/topics/{topic}/{lang}/languages/{language}/{lang}/owners/{owner}
- 4.3 SEO 收录:
- 新增
https://agentskill.work/sitemap-facets.xml(按热门 topic/language/owner 输出聚合页) sitemap-index.xml已包含sitemap-facets.xml- 首页/详情页增加可爬取内链(详情页已将 topics/owner/language 变为内链)
- 新增
- 页面:
/{lang}/topics/{topic}/{lang}/languages/{language}/{lang}/owners/{owner}
- 页面内容(必须“够厚”):
- 顶部 intro(解释该聚合页的含义,保持“Claude Skill”术语)
- 可分页列表(仅打自家 API)
- 结构化数据 ItemList + BreadcrumbList
- OG/Twitter + canonical/hreflang
- 后端支持(可能需要 DB/迁移):
- topics 如果现在是逗号字符串,建议迁移为 JSON 数组字段(查询更稳、更快)
- 新增筛选 API:
GET /skills?topic=...&language=...&owner=...
- 验收标准:
- 聚合页被 sitemap 收录(或从首页/详情页内链可达且可索引)
- 聚合页翻页只走 DB,不走 GitHub API
- 4.1 后端支持:
- 在“定时任务”里离线生成内容块,提升详情页信息密度,减少 thin-content
- 5.1 DB 字段 + 迁移
- 新增字段(中英文分别存,避免混用导致 SEO 语义不清):
summary_en/summary_zh(1-2 段,页面主摘要)key_features_en/key_features_zh(3-6 条 bullet)use_cases_en/use_cases_zh(3-6 条 bullet)seo_title_en/seo_title_zh(<= 60 字符左右,避免标题同质化)seo_description_en/seo_description_zh(<= 160 字符左右,避免描述同质化)content_updated_at(内容生成时间,用于判定是否需要重新生成)
- 新增字段(中英文分别存,避免混用导致 SEO 语义不清):
- 5.2 后端:离线生成任务(Celery)
- 仅在定时任务里调用 DeepSeek(严禁在用户请求链路调用 LLM)
- 选取策略:优先补齐
content_updated_at is null的技能,其次last_pushed_at > content_updated_at - 失败兜底:解析/校验失败或接口错误时只记录日志,不影响 GitHub 同步主任务
- 限速/并发控制:
- 单次任务最多处理
ENRICH_BATCH_SIZE条 - 任务互斥锁(Redis lock)避免 beat 重叠导致重复生成
- Celery retry/backoff(上游抖动时自动重试)
- 单次任务最多处理
- 5.3 前端:详情页内容增厚(HTML 可见,利于收录)
- 优先展示
summary_{lang},无则 fallback 到description_{lang} - 展示
key_features_{lang}、use_cases_{lang}(缺失则隐藏该区块)
- 优先展示
- 5.4 SEO:metadata 使用
seo_title_{lang}/seo_description_{lang}(存在时覆盖默认) - 5.5 GEO:同步更新
llms-full.txt(补充新字段语义与示例) - 5.6 运维:
.env.example+docs/operations.md补充开关与频率说明
- 5.1 DB 字段 + 迁移
- 在现有 JSON-LD 基础上补强
- 6.1 详情页(SoftwareSourceCode):增加
interactionStatistic(stars/forks)与mainEntityOfPage(canonical) - 6.2 聚合页(ItemList):补充
numberOfItems、startIndex、分页语义(如可用) - 验收标准:
- 页面 JSON-LD 可通过常见验证器解析(无明显 schema 错误)
- 6.1 详情页(SoftwareSourceCode):增加
- 增加可配置的站长验证(文件 or meta)并写入运维文档
- 支持:
- Google Search Console(
GOOGLE_SITE_VERIFICATION->google-site-verificationmeta) - Bing Webmaster(
BING_SITE_VERIFICATION->msvalidate.01meta)
- Google Search Console(
- 验收标准:
- 通过配置即可完成验证(无需改代码/重新构建;改
docker/.env后重启即可)
- 通过配置即可完成验证(无需改代码/重新构建;改
- 支持:
- 调整 Next fetch 缓存策略,降低
no-store覆盖面- 8.1 详情页/聚合页首屏数据:server fetch 使用
revalidate(搜索q时强制no-store,避免高基数缓存) - 8.2 首页首屏列表:改为服务端预取 +
revalidate(避免 SSR 为空列表) - 目标:
- 首页列表、详情页采用
revalidate(例如 5-10 分钟) - sitemap/robots 输出可缓存(例如 1 小时)
- 首页列表、详情页采用
- 注意:
- 仍需保证“更新及时”:数据同步后不要长时间缓存旧页
- 避免缓存导致 PV/UV 埋点失效(埋点是 POST,不受缓存影响)
- 验收标准:
- 线上可观察到 TTFB 下降(或至少不比现在差)
- 8.1 详情页/聚合页首屏数据:server fetch 使用
- 新增
/llms-full.txt- 建议包含:
- 数据结构完整 schema(字段解释、类型、取值范围)
- API 分页/排序语义(limit/offset、默认排序)
- 示例请求/响应 JSON(列表 + 详情)
- 术语与翻译约束(Claude Skill 不翻译)
- 许可/归因与抓取建议(延续 llms.txt)
- 验收标准:
- 文件可访问、内容稳定、对 LLM/agent 足够明确
- 建议包含:
- 在文档与 GEO 文件中明确 OpenAPI 入口与常用端点语义
- 现状:FastAPI OpenAPI 已可访问(
/api/openapi.json) - 目标:
- 在 README / docs/operations.md / llms-full.txt 明确写出 API base、鉴权策略(如有)、分页与限速建议
- 验收标准:
- 外部开发者/agent 只看文档即可正确调用(不猜测参数)
- 现状:FastAPI OpenAPI 已可访问(
- 在定时任务抓取时,把关键词扩展为包含
"agent skill"(提升召回,覆盖更多同义项目)- 目标:
- 在不改变“用户访问链路不直连 GitHub”的前提下,扩大入库候选集
- 仍然遵守 GitHub rate limit(已有
GITHUB_RATE_LIMIT_BUFFER保护)
- 实现建议:
- 调整
GITHUB_SEARCH_QUERY(默认值 + docker/.env.example):- 例如:
("claude skill" OR "agent skill") in:name,description,topics - 可选增强:加入复数(
"agent skills"/"claude skills"),避免因分词差异漏收
- 例如:
- 只改“定时任务”用的 query;前端/分页/搜索仍只打自家 API
- 调整
- 验收标准:
- Celery sync 任务成功完成(无异常、无额外 GitHub API 调用路径)
- 入库结果对比原 query 有新增 repo(抽样验证即可)
- 目标:
- 增加“最新开源的 Claude Skill 项目”能力(列表页 + 首页入口)
- 定义(先定口径,避免歧义):
- 优先按 GitHub 仓库创建时间(
repo_created_at)倒序 - fallback:按站内首次入库时间(
created_at)倒序(当 GitHub created_at 缺失时)
- 优先按 GitHub 仓库创建时间(
- 后端(数据与 API):
- DB:新增字段(migration)
repo_created_at(GitHub created_at)repo_updated_at(GitHub updated_at,可选,用于后续“最近更新”)
- GitHub 同步:在 upsert 时写入以上字段(仍在 Celery 任务里)
- 列表 API:支持按最新排序(DB 内排序,不触发 GitHub)
- 方案 A:
GET /api/skills?sort=stars|newest(默认stars) - 方案 B:新增独立端点
GET /api/skills/latest(当前不需要;如后续要更“语义化”再加)
- 方案 A:
- DB:新增字段(migration)
- 定时任务(确保“最新”真的会进库):
- 在现有“按 stars”抓取之外,增加一个“recent/newest”抓取策略(仍然只在定时任务)
- 参考:GitHub Search API
sort=updated+ query 加created:>=YYYY-MM-DD(窗口期可配) - 配置建议:
GITHUB_NEWEST_WINDOW_DAYS(例如 7)GITHUB_NEWEST_MAX_PAGES/GITHUB_NEWEST_MAX_RESULTS(小一点,避免拉爆)- 与现有 rate-limit guard 共用
- 参考:GitHub Search API
- 在现有“按 stars”抓取之外,增加一个“recent/newest”抓取策略(仍然只在定时任务)
- 前端(SEO 页):
- 新增页面:
/{lang}/latest- canonical + hreflang(/zh 与 /en 对应)
- JSON-LD:BreadcrumbList + ItemList
- 可分页(走 DB/API,不触发 GitHub)
- 首页增加入口(例如 “Latest” 模块 + 跳转按钮),帮助爬虫与用户发现
- sitemap-pages.xml 增加
/{lang}/latest(静态入口页必须可被 sitemap 发现)
- 新增页面:
- 验收标准:
/{lang}/latest可访问且可分页- 有稳定可解释的“最新”排序(且数据来自 DB,不触发 GitHub API)
- sitemap 覆盖:详情页仍全量覆盖,latest 页被 sitemap-pages.xml 收录
- 定义(先定口径,避免歧义):
- MIT license:
LICENSE - Bilingual README:
README.md,README.zh-CN.md - Contributing guide:
CONTRIBUTING.md - Code of Conduct:
CODE_OF_CONDUCT.md - Security policy:
SECURITY.md - Changelog:
CHANGELOG.md - Support policy:
SUPPORT.md