Agent skill

Linkyee Plugin Builder

by ZhgChgLi in ZhgChgLi/linkyee

A skill your agent uses when the user wants to add dynamic data (GitHub stars, latest blog posts, weather, follower counts, repo activity, anything fetched from a URL) to their linkyee site by…

MITAuto-check: notesWriting & Content

Install Linkyee Plugin Builder

skills CLI
$ npx skills add ZhgChgLi/linkyee --skill linkyee-plugin-builder -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ZhgChgLi/linkyee linkyee-plugin-builder --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ZhgChgLi/linkyee.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/linkyee-plugin-builder .claude/skills/linkyee-plugin-builder && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
linkyee-plugin-builder
GitHub stars
180
Token cost
~1.9k tokens
SKILL.md length
949 words
Files
1
Skills in repo
2
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when the user wants to add dynamic data (GitHub stars, latest blog posts, weather, follower counts, repo activity, anything fetched from a URL) to their linkyee site by…

  • Works in 8 steps: Understand the request → Check whether a built-in plugin already… → Read the existing config → …
  • The user wants to add dynamic data (GitHub stars
  • SKILL.md covers Mental model in one paragraph, Workflow, What NOT to do and Anti-patterns to refuse
  • Calls bundle; needs MEDIUM_TOKEN

What it does

Linkyee Plugin Builder is an agent skill from ZhgChgLi/linkyee. Use when the user wants to add dynamic data (GitHub stars, latest blog posts, weather, follower counts, repo activity, anything fetched from a URL) to their linkyee site by writing a build-time plugin. Triggers on phrases like "add a plugin", "show my latest Medium post on the page", "fetch X and display it", "make linkyee pull data from Y", "inject a value into the page". Generates plugins/<PluginName.rb, wires it up in config.yml, references it in the right Liquid spot, and runs the build to verify.

Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Writing & Content, covering Blog and article writing. It works with GitHub and Wix. The repository describes itself as: A fully customized, open-source LinkTree alternative deployed directly on GitHub Pages. The licence is MIT.

When your agent uses it

  • The user wants to add dynamic data (GitHub stars
  • Latest blog posts
  • Follower counts
  • Anything fetched from a URL) to their linkyee site by writing a build-time plugin

Example prompts

  • “add a plugin”
  • “show my latest Medium post on the page”
  • “fetch X and display it”
  • “/linkyee-plugin-builder”

Requirements

  • A credential in MEDIUM_TOKEN
  • Pre-approved tools (allowed-tools): Read, Write, Edit, Bash, Glob, Grep

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Understand the request
  2. Check whether a built-in plugin already covers it
  3. Read the existing config
  4. Write the plugin
  5. Wire it up in config.yml
  6. Verify the build
  7. Secrets — non-negotiable
  8. Report back

What it can do on your machine

Read from SKILL.md and the folder at commit 1b6f42e. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Write
    • Edit
    • Bash
    • Glob
    • Grep

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • bundle

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • MEDIUM_TOKEN

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Linkyee Plugin Builder loads about 1.9k tokens when it runs. Until then it costs about 134 tokens; SKILL.md has 949 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~134
When it runs · the whole SKILL.md, loaded when a task matches
~1.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Read, Write, Edit, Bash, Glob, Grep

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from ZhgChgLi/linkyee at commit 1b6f42e, republished under its MIT licence (© ZhgChgLi). 949 words, ~1,863 tokens.

Download SKILL.mdSave it as .claude/skills/linkyee-plugin-builder/SKILL.md (or your agent's skills folder).
name
linkyee-plugin-builder
description
Use when the user wants to add dynamic data (GitHub stars, latest blog posts, weather, follower counts, repo activity, anything fetched from a URL) to their linkyee site by writing a build-time plugin. Triggers on phrases like "add a plugin", "show my latest Medium post on the page", "fetch X and display it", "make linkyee pull data from Y", "inject a value into the page". Generates `plugins/<PluginName>.rb`, wires it up in `config.yml`, references it in the right Liquid spot, and runs the build to verify.
allowed-tools
Read, Write, Edit, Bash, Glob, Grep

linkyee Plugin Builder

You help users add build-time plugins to linkyee — a Ruby/Liquid static-site generator. A plugin is a small Ruby class that fetches some data at build time and exposes it to the templates as vars.<PluginName>.

The canonical reference for the plugin contract lives at plugins/README.md. Read it before you write code; it contains examples, helpers, and conventions that this skill expects you to follow. Do not duplicate that information here — this skill is the workflow, the wiki is the spec.

Mental model in one paragraph

config.yml lists enabled plugins. At build time scaffold.rb instantiates <PluginName>.new(yaml_values), calls execute(), and stores the return value at settings["vars"][<PluginName>]. Liquid then renders {{ vars.<PluginName> }} (and friends) inside config.yml strings and the theme's index.html. If a plugin raises, scaffold logs the error and sets the value to nil — the build still completes.

Workflow

Follow these steps in order. Don't skip steps; the verification step in particular catches most mistakes.

1. Understand the request

Before writing anything, confirm:

  • What data does the user want? (a star count, a list of posts, a weather temp, a follower count, the latest commit, …)
  • From where? (specific URL, RSS feed, JSON API, scraped HTML)
  • Where on the page should it appear? (footer, a link's text, a new link, a new section in index.html)

If anything is ambiguous, ask one focused question. Don't ask three clarifying questions at once.

2. Check whether a built-in plugin already covers it

Read plugins/README.md § "Built-in plugins". If GithubRepoStarsCountPlugin, GithubLastCommitPlugin, GithubProfilePlugin, or RSSFeedPlugin already does the job, don't write a new one — just enable and reference it. Tell the user.

3. Read the existing config

Run Read on config.yml to see how the user already structures their links and what's already in vars. This affects naming and where to inject the value.

4. Write the plugin

Create plugins/<PluginName>.rb:

  • Name the class to match the file. Use a descriptive *Plugin suffix (e.g. WeatherPlugin, MediumLatestPostsPlugin).
  • require_relative 'Plugin' at the top.
  • Inherit from Plugin.
  • Use the helpers (http_get, http_get_json, args, params, cache, log) — do not call Net::HTTP or URI directly. They're already wrapped with redirect following, timeouts, and error handling.
  • Be defensive. Return a sensible default (0, "", {}, []) on failure. Plugins must not raise.
  • Use String keys in returned hashes (Liquid can't look up symbol keys).
  • Match the data shape on success and failure (don't return a Hash on success and nil on failure — Liquid breaks).

Look at the existing built-in plugins as templates — they're short and demonstrate the patterns.

5. Wire it up in config.yml

Add to plugins: using the YAML style that matches the plugin's arguments (list-style for args, hash-style for params). Then reference {{ vars.<PluginName>… }} in the appropriate links/socials/title/tagline/footer field, or edit the theme's index.html if the user wants a loop / conditional.

6. Verify the build

Run:

bash
bundle exec ruby ./scaffold.rb

Then check:

  • Build exits 0
  • No [<PluginName>] or [scaffold] Plugin '<PluginName>' failed lines in stderr
  • The injected value appears in _output/index.html (grep for it)

If the value is missing, read the stderr output — the new scaffold.rb swallows plugin failures but logs them clearly. Do not guess; fix the underlying error.

Show full SKILL.md (452 more words)Show less
7. Secrets — non-negotiable

If the plugin needs an API key, personal access token, OAuth token, or any other credential:

  • Never put the secret value in config.yml. That file is committed to git and rendered into the public site at build time. Anything in it is public, forever, including in old commits.
  • Never hardcode the secret in the plugin's .rb file. Same problem.
  • Always read it from ENV:
    ruby
    token = ENV["MEDIUM_TOKEN"]
    return [] if token.nil? || token.empty?
    http_get_json(url, headers: { "Authorization" => "Bearer #{token}" })
  • Always document the secret name in the plugin's header comment so the user knows what to set.
  • Always tell the user how to wire it through, in three steps:
    1. Repo secret: GitHub → repo → Settings → Secrets and variables → Actions → New repository secret. Name it (e.g. MEDIUM_TOKEN), paste value.
    2. Workflow env: edit .github/workflows/build.yml, add an env: block to the Deploy step:
      yaml
      - name: Deploy
        env:
          MEDIUM_TOKEN: ${{ secrets.MEDIUM_TOKEN }}
        run: bash deploy.sh
    3. Local dev: same name, exported in shell: export MEDIUM_TOKEN=xxx && bundle exec ruby ./scaffold.rb

If the user asks you to "just paste the token in config.yml for now", refuse and explain why. The secret will end up in git history and on the deployed gh-pages branch — no easy way to revoke once leaked.

8. Report back

Tell the user:

  • What plugin was created
  • What got added to config.yml
  • Where in the rendered page the value now appears
  • How to extend it (e.g. "add more entries to the list under MyPlugin:")

What NOT to do

  • Don't add new gems to the Gemfile unless absolutely required. nokogiri (already in Gemfile) plus stdlib net/http and json cover the vast majority of cases.
  • Don't scrape sites that have an obvious public JSON/Atom endpoint. RSS / Atom (/feed, /commits.atom) and JSON APIs are far more stable than HTML scraping.
  • Don't hardcode credentials. If a token is required, read it from ENV and document the secret name in the plugin's header comment.
  • Don't add per-request side effects (writing files, sending notifications). execute should be a pure data fetch.
  • Don't invoke things at build time that can take more than ~30s in total — the GitHub Actions build is on a free runner and we run it daily. Cap the work.
  • Don't touch theme files unless the user asked for layout changes. Most plugin requests are satisfied by editing config.yml only.
  • Don't create a new plugin when an existing one (RSSFeedPlugin especially) already handles the case.

Anti-patterns to refuse

  • "Make it run in the visitor's browser instead." — linkyee is a static site; plugins are build-time only. If they want runtime data, they need separate JS in the theme — out of scope for this skill.
  • "Have the plugin email me when X." — no side effects in plugins. Suggest a separate GitHub Actions workflow.

© ZhgChgLi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/linkyee-plugin-builder of ZhgChgLi/linkyee.

Open the folder on GitHubat commit 1b6f42e

Compare with similar skills

Linkyee Plugin Builder next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Linkyee Plugin Builder compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Linkyee Plugin Builder this skillZhgChgLi/linkyee180—~1.9kAutomated safety check: NotesMIT
Figurevectorize-io/hindsight47k—~1.9kAutomated safety check: PassMIT
Content Writerdageno-agents/geo-content-writer214—~1.2kAutomated safety check: PassMIT
Release Blog Drafterobot-platform/obot1.1k—~4.6kAutomated safety check: PassMIT
Lwipponylang/ponylang-website160—~3.5kAutomated safety check: PassBSD-2-Clause
Readability Checkjdevalk/skills105—~3.3kAutomated safety check: PassMIT

Similar skills

  • Figure

    vectorize-io/hindsight

    Draw an animated figure (boxes, arrows, moving data) as one self-contained SVG for a GitHub README, PR, issue or blog post.

    47k GitHub stars~1.9k tokensUpdated yesterday
    Writing & ContentAuto-check passed
  • Content Writer

    dageno-agents/geo-content-writer

    A skill your agent uses when the user wants to turn [Dageno](https://dageno.ai/?utmsource=github&utmmedium=social&utmcampaign=official) GEO opportunities into a real-fanout backlog and then write…

    214 GitHub stars~1.2k tokensUpdated 3 mo ago
    Writing & ContentAuto-check passed
  • Release Blog Drafter

    obot-platform/obot

    Drafts a release announcement blog post for an obot release as a Markdown file, with an optional WordPress draft through MCP and no live publishing without confirmation.

    1.1k GitHub stars~4.6k tokensUpdated today
    Writing & ContentAuto-check passed
  • Lwip

    ponylang/ponylang-website

    Create a new "Last Week in Pony" blog post from the open GitHub issue

    160 GitHub stars~3.5k tokensUpdated 5 days ago
    Writing & ContentAuto-check passed
  • Readability Check

    jdevalk/skills

    Runs a readability audit on a blog post draft or other multi-paragraph prose, calibrated for readers who read English as a second language.

    105 GitHub stars~3.3k tokensUpdated 3 mo ago
    Writing & ContentAuto-check passed
  • Write Chinese "数据库筑基课" Markdown articles for database architects, DBAs, and application developers.

    8.6k GitHub stars~2.4k tokensUpdated today
    Writing & ContentAuto-check passed

More from ZhgChgLi/linkyee

  • Linkyee Style Designer

    ZhgChgLi/linkyee

    A skill your agent uses when the user wants to design, customize, or generate a custom visual theme for their linkyee site (a Hexo-like LinkTree-style static site).

    180 GitHub stars~4.4k tokensUpdated today
    Auto-check: notes

Works with

Questions about Linkyee Plugin Builder

What does Linkyee Plugin Builder do?

A skill your agent uses when the user wants to add dynamic data (GitHub stars, latest blog posts, weather, follower counts, repo activity, anything fetched from a URL) to their linkyee site by…. Linkyee Plugin Builder is an agent skill from ZhgChgLi/linkyee. Use when the user wants to add dynamic data (GitHub stars, latest blog posts, weather, follower counts, repo activity, anything fetched from a URL) to their linkyee site by writing a build-time plugin.

When should I use Linkyee Plugin Builder?

Linkyee Plugin Builder fits situations like: the user wants to add dynamic data (GitHub stars; latest blog posts; follower counts; anything fetched from a URL) to their linkyee site by writing a build-time plugin.

How do I install Linkyee Plugin Builder in Claude Code?

Run `npx skills add ZhgChgLi/linkyee --skill linkyee-plugin-builder -a claude-code`. Or copy the skill folder (.claude/skills/linkyee-plugin-builder in ZhgChgLi/linkyee) into .claude/skills/linkyee-plugin-builder in your project. Claude Code loads it when a task matches its description.

How do I install Linkyee Plugin Builder in Codex?

Run `npx skills add ZhgChgLi/linkyee --skill linkyee-plugin-builder -a codex`. Or copy the skill folder (.claude/skills/linkyee-plugin-builder in ZhgChgLi/linkyee) into .agents/skills/linkyee-plugin-builder in your project. Codex loads it when a task matches its description.

Can I use Linkyee Plugin Builder in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ZhgChgLi/linkyee --skill linkyee-plugin-builder -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/linkyee-plugin-builder, .gemini/skills/linkyee-plugin-builder, .github/skills/linkyee-plugin-builder and .opencode/skills/linkyee-plugin-builder in your project.

What does Linkyee Plugin Builder need to run?

Going by SKILL.md and its folder, Linkyee Plugin Builder needs the command-line tools its instructions call (bundle) and credentials named MEDIUM_TOKEN. Our summary lists: A credential in MEDIUM_TOKEN. Its frontmatter pre-approves these tools: Read, Write, Edit, Bash, Glob, Grep.

Does Linkyee Plugin Builder access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Linkyee Plugin Builder safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Linkyee Plugin Builder use?

Linkyee Plugin Builder is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Linkyee Plugin Builder use?

About 1.9k tokens (SKILL.md is roughly 7.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Linkyee Plugin Builder?

Skills that share tags, products or a category with Linkyee Plugin Builder: Figure (vectorize-io/hindsight, 47k stars), Content Writer (dageno-agents/geo-content-writer, 214 stars), Release Blog Drafter (obot-platform/obot, 1.1k stars) and Lwip (ponylang/ponylang-website, 160 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Linkyee Plugin Builder?

ZhgChgLi (a GitHub organization) maintains it in ZhgChgLi/linkyee, which has 180 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 9, 2026.

Source: ZhgChgLi/linkyee on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.