Skip to Content

Install a Skill somebody else wrote, then write your own

Part 9 explained what a Skill is. This one is the doing half: install a published Skill without writing code, learn the naming rule that trips up almost everybody, then write your own — a refrigerator-inventory Skill in
September 12, 2026 by
Install a Skill somebody else wrote, then write your own
OdooBot
borrow one, then build one
Pi Agent Guide · Part 10

Install a Skill somebody else wrote, then write your own

Part 9 explained what a Skill is. This one is the doing half: install a published Skill without writing code, learn the naming rule that trips up almost everybody, then write your own — a refrigerator-inventory Skill in a single file. It ends with the failures you are most likely to hit.

1 file
A Skill is a folder with SKILL.md in it. Nothing else is required
4 formats
Ways to name a package. A bare owner/repo is not one of them
3-7 Skills
What experienced users suggest keeping installed
Borrow before you build

Start with somebody else's, even if you plan to write your own

Three reasons to install one first. No programming is required — a Skill is a folder containing a SKILL.md instruction file; the author packaged it, you supply the source and select Install. You can try one before committing time — about three minutes, against an hour of studying examples. And you get a working example: open the installed SKILL.md and read how somebody else writes one.

In plain terms

A Skill does not make the model smarter. It gives the model the rules for your house. A competent cleaner already knows how to clean — what they do not know is that your wooden floor must not get wet. A Skill is that note on the counter.

Skills are central to how Pi Agent is meant to be used. With the same model — GLM-4.6, say — a Skill can change the result substantially. With home-assistant-best-practices installed, the model may tell you a helper beats a template sensor for a particular automation. Without it, it falls back on its own, possibly outdated, habits. The familiar comparison is HACS: the built-ins work, and the community sometimes offers something better suited to what you do.

Open Settings and select the Skills tab — third of the five along the top, between Models and Sub-agents.

The Pi Web Settings dialog with the Skills tab selected among the tabs General, Models, Skills, Sub-agents and Plugins. The left column reads No skills found and carries a plus Add skill control at its foot; the wide right-hand pane reads Select a skill.
Where Skills liveSettings, Skills tab, before anything is installed.
  • No skills found fills the left column. That column is the installed list, so an empty one is the correct first state.
  • + Add skill sits at the foot of that column — the only control on this screen, and where every install starts.
  • Select a skill is the placeholder in the right-hand pane, which fills with a Skill's detail or with the Add skill form.
Naming the thing

Four ways to name a package, and one that gets rejected

Search finds what somebody listed in the catalog. Everything else — an unlisted repository, an npm package, a folder already on your host — installs by package specification, the argument of the command the panel fronts: pi install <package-spec>. Pi Agent is built on @earendil-works/pi-coding-agent, whose command-line interface is pi. A specification has a defined syntax; a repository name you recognize is not one. Four source types are valid.

Source typeExampleWhat it runsWhere the files land
npm packagenpm:@scope/[email protected]
npm:my-pi-skill
npm install~/.pi/agent/npm/
Git, with the git: prefixgit:github.com/user/repo@v1
git:[email protected]:user/repo
git clone, shorthand allowed~/.pi/agent/git/<host>/<path>
Git, full protocol URLhttps://github.com/user/repo
ssh://[email protected]/user/repo
git cloneSame as above
Local path/absolute/path
./relative/path
Records the path in settingsNowhere — the source stays where it is and is read in place
The one that gets rejected: a bare owner/repo. It looks right, because gh repo clone accepts it. Pi Agent does not. GitHub shorthand must carry the prefix — git:github.com/owner/repo. Without a prefix, only URLs beginning with https://, http://, ssh:// or git:// are accepted.
In plain terms

Writing mattpocock/skills is like handing a courier a note that says “the Chen family.” Perfectly clear to you. The courier does not know which town. Pi refuses to guess whether foo/bar means npm or GitHub, so it asks you to put the town on the envelope.

One more rule, easy to miss: references stay pinned. @v1 keeps meaning v1; an update refreshes that checkout rather than moving you to v2. Changing refs is a fresh install, covered below.

Nothing here assumes GitHub. Replace the host — git:gitlab.com/user/repo, git:codeberg.org/user/repo, or your own server at git:git.your-domain.tw/user/repo.

If you ever script this: in a non-interactive environment set GIT_TERMINAL_PROMPT=0 and GIT_SSH_COMMAND="ssh -o BatchMode=yes" so a missing credential fails immediately instead of hanging on a prompt nobody will answer.

All four forms end at the same discovery step. Pi scans three directories for folders containing a SKILL.md: ~/.pi/agent/npm/, ~/.pi/agent/git/, and ~/.pi/agent/skills/. That last is a symlink to /data/pi-agent/skills/, where hand-written Skills go — do not look for an installed Git package there. Because $HOME is pinned into the add-on's data volume, panel and command line see the same Skills, and a Home Assistant snapshot brings the collection back with it: skills/, npm/, git/, and the enabled state in ~/.pi/agent/settings.json.

Whether a source works then depends mostly on authentication.

SourceWorks?WhyWhat to do
Public GitHub over HTTPSYes, immediatelyA public repository needs no authentication for git clone https://…Use it directly. This covers about 90% of cases
Public npm packageYes, through npm installThe author packaged and published it to the npm registryPin with @version. The npm route is young; most Skills travel by Git
Private GitHub over HTTPSNo, not through the panel aloneThe panel has no field for a personal access token, and a non-interactive clone cannot prompt for a passwordA public fork; SSH as below; or attach a terminal and set git config --global credential.helper store to cache credentials
Private GitHub over SSHYes, officially supportedopenssh-client ships in the add-on image and reads ~/.ssh/config; SSH URLs use your configured keys automaticallyGenerate a key on the host, add the public half under GitHub Settings → SSH Keys, store it in /data/pi-agent/home/.ssh/, and run ssh -T [email protected] once to record the host key
Another Git hostYesPi's Git shorthand does not assume a hostEnter git:host/user/repo or the full https://… URL, exactly as for GitHub
Local pathYesPi records the absolute path in settings.json and scans it at startup instead of copying filesPut the folder under /data/pi-agent/ with scp or Samba first, then enter the path
SSH is supported, but it is not one-click. Beyond the key steps in the table, you must trust the host in known_hosts and store the key under /data/pi-agent/home/.ssh/not under /root/.ssh/, because HOME is pinned to the data volume. Budget around 30 minutes the first time; it is reusable after that. If you do not already manage Git over SSH, a public fork is usually simpler at home: about five minutes, license and permissions permitting.
Installing one

Install a real Skill, then prove the agent can see it

Press + Add skill and the right-hand pane fills in.

The same Settings dialog with the right-hand pane now headed Add skill. It holds a search field whose placeholder reads e.g. react, testing, deploy, with a blue Search button beside it. Below sit two small buttons, global and project, with global selected, and an arrow pointing to the path tilde slash dot pi slash agent slash skills. A line under that reads Search skills.sh to discover and install skills for your agent, with skills.sh as a link. The left column still reads No skills found.
Add skillOne search field, one scope switch, one link to the catalog.
  • The field wants a keyword, not an address. Its placeholder reads e.g. react, testing, deploy, and the blue Search button queries the skills.sh catalog.
  • global / project decides which settings file records the install. Global writes to ~/.pi/agent/settings.json, project to .pi/settings.json beside your working directory. The arrow names the selected scope's path, ~/.pi/agent/skills/. Leave it on global unless you need a per-project Skill.
  • skills.sh is the link on the last line — the community-curated directory, and the closest thing to an official Skill store.
One place the documentation and the build disagree. The upstream documentation describes an Add Skill dialog that also accepts a typed package specification, placeholder npm:@scope/package. The build above gives a search field only. If your panel has no specification field, use the command line for anything the catalog does not list — both share the same state, so the result appears in the panel either way.
  1. Step 1

    Search for it, or install it by specification

    Select + Add skill, type mattpocock and select Search. This walkthrough uses mattpocock/skills: not useful at home, but it installs reliably. The panel calls /api/skills/search; matching cards come back with their own Install button. If the catalog does not list what you want, open a terminal attached to the add-on and run one of these:

    pi install git:github.com/mattpocock/skills
    pi install https://github.com/mattpocock/skills
    pi install git:github.com/mattpocock/skills@main

    The third form pins a tag or commit. Do not enter bare mattpocock/skills.

  2. Step 2

    Select Install and leave it alone

    The button reads Installing… while it works. Behind it the panel posts to /api/skills/install with {cwd, package, scope} and the backend runs pi install. Usually 5-30 seconds, depending on repository size and your connection. Do not cancel or refresh the page. It ends with a Package installed. toast.

  3. Step 3

    Check the entry that appears

    The new Skill appears in the left column. Select it: the pane carries an enable/disable switch, Check Updates, Remove, and Installed Path — under ~/.pi/agent/npm/ for an npm package, ~/.pi/agent/git/<host>/<path>/ for a Git one.

  4. Step 4

    Reload the session, not the page

    Reload Session usually sits at the upper right; select it and you should see Session reloaded. A new session works too. F5 does not — the system prompt is assembled when a session starts and is not reread part-way through, the most common reason a new Skill seems to have vanished.

  5. Step 5

    Find it in the system prompt, then use it once

    Open the read-only System Prompt panel and scroll to the <available_skills> block; your Skill's name should be inside it. That proves Pi found it — not that the agent will use it well. So name it in a test request too: “Please use Skill name to help me do XX.” If the reply engages and the right tools appear, it works.

  6. Step 6

    Read its SKILL.md before you rely on it

    SKILL.md is the file Pi reads, not README.md: it holds the name, description and allowed-tools frontmatter fields, and should say what triggers it, which tools it needs and which environment variables it expects. Follow Installed Path to it — /data/pi-agent/home/.pi/agent/git/<host>/<user>/<repo>/SKILL.md for a Git package, the matching …/npm/… path for an npm one. Five minutes of reading beats half an hour of guessing.

A shortcut you may not know about: when enableSkillCommands is on, each Skill is also registered as a slash command, /skill:name. Type /skill: in the conversation field to list what is available.

Every installed Skill is stapled to the front of every conversation, relevant or not, so remove the ones you do not use. Two ways, for two situations.

From the panel, right in about 99% of cases: select the Skill, select Remove, confirm. The backend runs pi remove <spec>, drops the registration from settings.json, deletes the folder under ~/.pi/agent/git/… or ~/.pi/agent/npm/…, and shows a Package removed. toast. It cannot leave stale settings or delete the wrong path.

From a terminal attached to the add-on, when the panel is unavailable, the package is too damaged to list, or you are clearing several at once. Confirm the deployment-specific container name before using any host-level exec command, then:

pi list
pi remove npm:@foo/bar
pi remove git:github.com/user/repo
Do not delete the folder yourself. rm -rf removes the files but leaves the registration in ~/.pi/agent/settings.json. At its next start Pi may try to reinstall the missing package, or simply report an error. Always prefer pi remove; if manual cleanup is unavoidable, edit settings.json to match. Either way, reload the session afterwards. Existing sessions are unaffected — their Skill text was fixed into the system prompt when they began.
On updates: nothing updates by itself. Installation clones a snapshot at one reference, deliberately — an author's breaking change should not quietly break your automation overnight. Select Check Updates on the Skill's row and Pi calls /api/skills/check to compare the local and upstream versionHash; if there is a newer one, an Update button appears and calls /api/skills/update. From the command line, pi update --extensions checks everything, pi update npm:@foo/bar checks one. A pinned reference stays pinned — to move, run pi install git:host/user/repo@new-ref.
Writing your own

One folder, one file, no programming

Published Skills address general needs — managing files, building websites. They know nothing about your household. Your own Skill is how you hand off the repetitive, specific work: photograph the refrigerator and get an inventory back, or answer a dishwasher error code from a manual you dropped in the folder.

The whole structure is one folder, one file:

fridge-check/
└── SKILL.md

Three elements go into it, and only two are required.

ElementWhat it isWhat it doesRequired?
YAML frontmatterKey-value pairs between two --- lines at the very top, including name and descriptionTells Pi what the Skill is called and when it appliesYes
Main instructionsThe Markdown below the frontmatter, usually a few ## sectionsTells the agent what to do, what to ask, and what the output should look likeYes
Supporting filesAnything else in the folder — sample images, templates, PDF manualsMaterial the agent can consult, such as a format to followNo, but useful

The filename is exact: SKILL uppercase, .md lowercase. Get the capitalization wrong and Pi will not find it. Markdown is the plain-text format you have seen on GitHub and in Obsidian — # makes a heading, - a list item — and if it is new to you, the agent still understands ordinary paragraphs.

Two notes on the frontmatter. name is the identifier: lowercase letters and hyphens, such as fridge-check, preferably matching the folder name. A non-ASCII name may work, but ASCII avoids path-encoding problems across operating systems. description matters most — the agent reads it to decide whether the Skill applies at all.

Here is the complete file. Copy it into SKILL.md:

---
name: fridge-check
description: Use when the user shares a refrigerator photo or asks what to cook. Inventory visible food, identify items that may expire soon, and suggest dinner ideas.
---
# Fridge Check Skill
Help the user inventory a refrigerator, assess visible freshness cues, and plan meals without inventing details.
## When to use this
Use this Skill when the user:
- Shares a refrigerator or freezer photo
- Asks what is in the refrigerator or what to cook
- Mentions ingredients, pantry items, leftovers, or food nearing expiration
## Steps
1. **Describe visible items first** — Use location, item, and approximate quantity. Say when a label or package is unclear; do not guess.
2. **Identify items to check soon** — Note visible signs such as yellowing leaves, damaged packaging, leaks, or discoloration. Explain that a photo cannot establish food safety.
3. **Suggest one or two dinner ideas** — Prefer ingredients that appear usable and should be consumed soon. Avoid requiring many extra purchases.
4. **Create a short use-next list** — Summarize which items the user should inspect or use first.
## Safety
- **Do not invent items that are not visible.**
- **Do not diagnose poisoning risk or provide medical advice.** If an item appears spoiled, advise the user to inspect it and discard it when in doubt.
- **Ask about available appliances and dietary requirements** before assuming a cooking method.
- **Use approximate quantities** when objects are partly obscured.
- **Reply in English** unless the user explicitly requests another language.
## Example output
[Refrigerator inventory]
- Upper shelf: one carton of milk, about four eggs, one bowl of leftovers
- Middle shelf: half a cabbage, two carrots, one package of tofu
- Produce drawer: one bunch of spinach; some leaves appear yellow
[Dinner ideas]
1. Spinach and egg stir-fry — uses the spinach and two eggs
2. Tofu with cabbage — uses the tofu and part of the cabbage
[Check or use next]
- Check the date and storage instructions on the milk
- Inspect and use the leftovers promptly if they have been stored safely

Treat the Example output block as a template you refill for the next one: name, description, when to use, steps, safety, output shape.

The frontmatter is the fragile part. Both --- lines must be exactly three hyphens on a line of their own, and the first must be the very first thing in the file — no blank line above it, no byte order mark. name: and description: must be spelled correctly with a space after each colon. Save as UTF-8 without a BOM; malformed frontmatter can stop the whole Skill loading.

Now get the folder onto the host. The fast route — about two minutes — is scp, or an SFTP client such as FileZilla or Cyberduck, into /data/pi-agent/skills/. Replace the host address with yours:

scp -r ~/Desktop/fridge-check [email protected]:/data/pi-agent/skills/

The slower route is GitHub, which buys version history and the ability to share it:

cd ~/Desktop/fridge-check
git init
git add SKILL.md
git commit -m "Initial fridge check skill"
# Create a public repo called fridge-check on GitHub
git remote add origin https://github.com/your-account/fridge-check.git
git branch -M main
git push -u origin main

Then bring it back in: in the panel select Add from URL, paste the repository URL, select Install — or by specification, pi install https://github.com/your-account/fridge-check. Both routes end with the folder under /data/pi-agent/skills/. Iterate locally with scp while the Skill is rough, then push to GitHub once it has settled.

Finish by opening a new session, checking <available_skills> for fridge-check, then attaching a photo of your refrigerator — look it over for anything private first. The reply should describe what is visible, flag what to inspect, suggest dinner and list what to check next, in that order and without unsupported safety claims.

Edited the file and nothing changed? Skills load when a session begins, so an open session keeps the version it started with. Always test a change in a new session.
What makes it fire

Three things that decide whether the agent uses it at all

Once a few are installed, writing quality decides almost everything. Three principles do most of that work.

PrincipleWeak versionBetter version
Make the description specific, with real triggers description: Help the user with household tasks description: Trigger when the user shares a refrigerator photo or mentions ingredients, pantry items, leftovers, or asks "What should I cook today?"
Number the steps so the order is not a guess “Look at what is in the refrigerator and offer some advice.” “1. Describe what is visible. 2. Flag items to inspect. 3. Suggest dinner. 4. List what to check next.”
State prohibitions outright (No prohibitions are stated.) “Do not invent ingredients, diagnose food poisoning, claim that food is safe from a photo, or recommend an unfamiliar dish that takes more than 30 minutes.”

Prohibitions are the part people leave out, and they matter because these systems are eager to help. Leave the boundary unstated and an inventory drifts into an invented nutrition report, or into claims about bacteria and illness. Blunt instructions — “do not diagnose,” “do not infer safety from an image” — keep the output useful and appropriately limited. Do not overcorrect either: a wall of “must” and “absolutely never” makes replies sound scripted, so use “prefer,” “usually” or “avoid” where judgment is genuinely appropriate, and keep the real prohibitions firm.

Run a failure-mode review once you have a draft. Picture the most misleading or harmful reply this Skill could produce — inventing an ingredient hidden behind the milk, or diagnosing food poisoning — and add one short prohibition that prevents it, without weakening the safety guidance you actually need.
flowchart TD
  A["The agent ignored my Skill"] --> B{"Is it listed in the
available_skills block?"} B -->|"no"| C["Pi never loaded it.
Check the folder location
and the frontmatter"] B -->|"yes"| D{"Does the description name
the words you actually used?"} D -->|"no"| E["Rewrite the description
with concrete triggers"] D -->|"yes"| F["Try a model with stronger
instruction-following, and read
its tool calls, not just the reply"]
Three checks, in this orderWork down, not across. Most cases stop at the first branch, and swapping models first wastes an afternoon.

One more habit: keep each Skill to one job. A single-purpose description is easier to match, conflicts are easier to diagnose, and a change has a smaller blast radius — refrigerator inventory, dinner suggestions and grocery planning work better as three Skills than one, even when they refer to each other.

Seven more, and publishing

The same template, seven times over

Every entry below fills in the same blanks: repetitive work to delegate, rules the agent must follow, and approved reference material beside SKILL.md. Seven ideas, including the one you have built.

SkillWhen it appliesWhat it should doSupporting files
fridge-checkA refrigerator photo, or “what should I cook today?”Inventory what is visible, flag what to inspect, suggest dishes(None)
chore-rotation“Who takes the rubbish out this week?”Work out whose turn it is from the household list and the rotation periodfamily.md
dinner-suggest“What shall we eat tonight?” or “I have no idea what to cook”Offer three options weighed against preferences, time, budget and leftoverspreferences.md
grocery-listAny mention of the weekly shop or a menuDerive the ingredients needed from the menu dinner-suggest producedstaples.md
appliance-manualAn error code or an operating question about an applianceAnswer from the PDF manuals in the folder, preserving the documented warningswasher.pdf, ac.pdf, dryer.pdf
ha-automation“Write me a Home Assistant automation and explain it”Produce YAML in Home Assistant's trigger / condition / action structureentity_map.md
video-scriptA request for a video script or a YouTube ShortProduce a 30- or 60-second script, a storyboard and captionsvoice.md
The appliance one needs a tighter leash than the rest. Its answers must stay grounded in the manual you supplied. For fault codes and safety warnings, quote the documented guidance accurately, and keep any instruction to contact qualified service personnel exactly as the manual states it. Do not let it summarize a safety warning into something friendlier.

If one of yours is safe and useful outside your own house, publish it to a public GitHub repository so other people can read it before they install it. Four things to do first.

  1. Step 1

    Confirm the repository really is public

    Open the repository on GitHub, go to Settings and scroll to the Danger Zone to check its visibility. A private repository cannot be fetched without authentication, so nobody else's install will work.

  2. Step 2

    Strip anything private before the first push

    Credentials, personal information, internal hostnames, entity names, paths, household details. Once pushed to a public repository it is in the history, so do this before the push, not after.

  3. Step 3

    Share a specification people can actually paste

    Do not tell anybody to enter your-account/fridge-check — Pi rejects bare shorthand. Give them the git: form or the complete https://github.com/… URL.

  4. Step 4

    Add a README.md for the humans

    Explain what the Skill does, how to use it and what a sample conversation looks like, so somebody can decide whether it fits before installing. SKILL.md is written for the agent; README.md for people.

There is no official index to submit to. The Pi Agent ecosystem has no central Skill registry; what exists are scattered awesome-list style collections maintained by individual communities. For visibility, try the Home Assistant community, Reddit's r/homeassistant, or the #pi-agent and #homeassistant tags on social platforms. In particular, do not treat “submit it to skills.sh” as official Pi Agent guidance — it is not.
Write it for your own household first. Run it long enough to learn its triggers, its failure modes and its safety limits — a month or two is a reasonable bar — and publish only after that.
When it does not work

The failures you are most likely to hit

Start with the mechanical ones.

SymptomWhat to do
The clone appears stuck around halfway Usually the network, or a large repository — a few carry tens of megabytes of assets. Wait 3-5 minutes. If it still has not finished, cancel and run pi install git:github.com/xxx/yyy in a terminal on the add-on: it shows each step far more clearly than the progress bar, and the panel recognizes the result, since both share the same Skills path.
A failed install left a broken directory that blocks retries Fixed in version 0.83.0, which stopped failed Git installs leaving partial directories behind. On anything older, remove that directory with rm -rf before retrying.
The Skill directory is enormous A typical Skill is a few hundred kilobytes to a few megabytes. If du -sh /data/pi-agent/git/github.com/<user>/<repo> reports hundreds of megabytes, the repository probably ships sample videos or pretrained models; check its README. To keep the Skill without the bulk, copy SKILL.md and the minimum files it needs into /data/pi-agent/skills/<name>/, remove the Git package, then reinstall from that local path.
The new Skill has the same name as an existing one Pi keys Skills on the name frontmatter field, not the folder name, and does not require the two to match. Duplicates are deduplicated — one survives per scope, and project scope wins over global. Renaming the folder does not help. Remove one package from the packages array in ~/.pi/agent/settings.json, or disable the conflicting Skill in the panel.
It fires sometimes and not others The description does not cover enough triggers. “Use when the user uploads a refrigerator photo” will not match a text-only question about dinner. Write in the requests people actually make, with the surrounding words — fridge, pantry, leftovers, ingredients.
Replies have turned stiff and scripted Too many hard commands. Soften the ones that are really judgment calls to “prefer,” “usually” or “avoid,” and keep firm only what must stay firm: do not invent facts, do not expose private data, do not take destructive action without approval, do not give unsupported medical advice.
You cannot use git push at all Two ways round it. Drag the folder into /data/pi-agent/skills/ with an SFTP client such as FileZilla. Or attach your SKILL.md and ask the agent to prepare the commands — “explain and prepare the commands to push this Skill to my GitHub fridge-check repository. Do not run them without my approval.” If it reaches for the bash tool, read every command and destination on the tool card before you approve it.
Never git clone straight into ~/.pi/agent/git/. The files arrive, but nothing registers them in settings.json, so the panel will not see the package and neither will the next session. Install through the panel or through pi install, always.
I gave it a source and nothing happened
Four usual causes. A bare owner/repo, which Pi rejects — use git:github.com/owner/repo. A typo in the address, often a missing https:// or a misspelled owner; open it in a new tab to check. The repository is private or deleted — open it in a private browsing window to confirm it is genuinely public. Or you did not wait: look for the Installing… state and let it finish.
It fails with "fatal: 401" or "Authentication failed"
The signature of a private repository over HTTPS: no token field in the panel, and a non-interactive clone cannot prompt for a password. The simplest fix at home is a public fork — select Fork on GitHub, set the fork's visibility to Public, and install the fork instead, if the license and your permissions allow it. About five minutes. The SSH route works too, with the setup in the source table above.
The clone finished but the Skill is not in the panel
Select Reload Session first — discovery runs when a session opens, so F5 triggers no rescan. If it still does not appear, press F12, read the Console for errors, then check the /api/skills?cwd=… request in the Network tab. It should return 200; a 4xx or 5xx points at the backend. Pay particular attention to 403: the current working directory is neither a trusted project nor a default pi-cwd-YYYYMMDD/ directory.
It is installed, but the agent seems to ignore it
Confirm first that it appears in the System Prompt panel under <available_skills>. If it does, the problem is usually trigger specificity — the description is too vague for the agent to recognize when it applies. As a stopgap, ask outright: “Please use Skill name to help me.” As a fix, read the Skill's README for the trigger phrases its author intended, or rewrite the description with concrete ones. If the description is already specific, the model may be the limit: a lighter model such as GLM-4-Flash may handle complex instructions differently, so compare a current reasoning-capable model such as GLM-4.6, Claude Sonnet 4, or DeepSeek-R1 when available. Do not infer instruction-following quality from a model-family label alone — test the exact model with the same prompt, and read its tool calls, not just its reply.
Nothing shows in the System prompt panel at all
Pi did not load the file, and frontmatter is the usual reason. Check three things: both --- delimiters are exactly three hyphens on lines of their own, with no blank line before the first; name: and description: are spelled correctly with a space after each colon; the filename is exactly SKILL.md, uppercase SKILL, lowercase .md. Open it in a text editor such as VS Code or Notepad++ and confirm the encoding is UTF-8 without a BOM.
Two Skills seem to fight each other
If Skill A says to use a helper for automations and Skill B a template sensor, the agent may split the difference or pick one and ignore the other. Read each installed description and check whether two cover the same triggers; if so, keep one. This is the usual argument for starting with one or two Skills and adding slowly.
Something else entirely went wrong
Start with the troubleshooting guide in Part 16 of this series, which indexes symptoms and remedies including a section for Skill installation failures. If that does not resolve it, post the specification you entered, a screenshot of the error, and your Pi Web version to a GitHub issue or the Discord community. Do not report only that “installation failed” — say what you selected, what appeared, and whether the Skill shows in the system prompt.
Questions people ask

The rest of it

How do I find Skills worth installing? Is there a catalog?
There is no official Pi Agent Skill store; Skills live in individual GitHub repositories. Three places to look: skills.sh, the community-curated directory the panel links to, organized by topic; GitHub searches for topic:claude-skill or topic:pi-agent-skill; and the r/ClaudeAI and r/homeassistant communities, or the #skills topic on X. Favor Home Assistant, smart home and household Skills — a general coding or Markdown-formatting Skill is worth much less in a house than in an office.
Will installing Skills make conversations better in general?
Only in the situations they cover. A Skill supplies relevant rules at the right moment; it is not a switch that raises quality everywhere. home-assistant-best-practices may help a great deal while you write an automation and nothing at all when you ask whether it will rain, where a large collection only makes the choice harder. A good kitchen knife does not make you a better cook.
How many can I install? Is there a limit?
No hard technical limit — as many directories as your storage allows. In practice problems start past 5-10: the system prompt grows and costs more tokens, the agent has more trouble choosing, and rules begin to conflict. Experienced users recommend 3-7 Skills with clearly separate jobs. Three you use nearly every day beat ten you might need one day.
Is the extra API cost worth it?
No separate charge — a Skill is Markdown included in the system prompt. The cost is the longer prompt: hundreds to thousands of extra input tokens per conversation, depending on the Skill. With an inexpensive model such as GLM-4.6 that is under US$0.001 per conversation; at a hundred turns a day, at most around US$3 a month. To keep it down: keep only Skills you use, avoid unusually long ones — past roughly 5,000 words they are often over-detailed — and use a non-reasoning model for simple everyday questions.
Where do the files live, and can I edit them?
npm packages sit under /data/pi-agent/home/.pi/agent/npm/<pkg>/, Git packages under /data/pi-agent/home/.pi/agent/git/<host>/<user>/<repo>/, hand-written Skills under /data/pi-agent/skills/<name>/. That last path is symlinked to $HOME/.pi/agent/skills/, so both names mean the same files, and the panel's Installed Path shows the exact one. You may edit them — but pi update resets local changes to a Git package, so to make a change last, fork the repository and install your fork.
Can I copy my Skills to another Pi Agent?
Yes, and this is the supported way to migrate offline — but do not copy only skills/. Archive the whole /data/pi-agent/ directory from host A, including skills/, home/.pi/agent/npm/, home/.pi/agent/git/ and home/.pi/agent/settings.json, extract it to the same path on host B, and reload the session. settings.json is the essential piece: it records which npm and Git packages are installed, their pinned refs and their scopes. Without it, none of them are registered. For ordinary backups a Home Assistant snapshot is simpler, since it takes /data/pi-agent/ in full.
Does a Skill have to be written in English?
No — write the instructions in any language the model you use supports. For an English Skill, write every instruction, trigger example and embedded prompt in English, and ask for an English reply explicitly where it matters. Keep the name field and the folder name in lowercase ASCII regardless, so the paths stay portable. If the people using it may write in more than one language, put triggers for each of those languages in the description.
What is YAML, exactly?
A human-readable key-value format that uses indentation for structure — the same format as Home Assistant lines like alias: Sunset lights on. The frontmatter here needs only name: and description:, each with a space after the colon. Nothing more advanced is required for this example.
Can a Skill tell the agent to use tools?
Yes, if your deployment exposes those tools and your approval policy allows them. A SKILL.md can tell the agent to read /config/automations.yaml or to reach for bash, but whether bash, read_file and write_file are available varies by deployment — and a Skill grants no permissions by itself. Controlling Home Assistant needs a separately configured MCP server such as ha-mcp, exposing tools like ha_get_state and ha_call_service. Review every tool card before approving it.
Can a badly written Skill damage Pi Agent?
Malformed frontmatter normally stops only that Skill loading; the others still load. But do not read that as “a well-formed Skill is safe.” A perfectly valid SKILL.md can still ask for destructive actions, ask for data to be disclosed, or ask you to weaken your approval controls. Test third-party Skills locally with approvals enabled, watch the logs and the tool requests, and publish or recommend nothing you have not reviewed.
Can a Skill read my files without my approval?
A Skill is only text — but the agent may act on that text through whatever tools are exposed, so real access depends on your tool configuration, path permissions and approval policy. Read the tool cards and reject access you did not expect. Before installing anybody else's SKILL.md, read it for the five things worth stopping over: broad file reads, network transfers, deletion requests, credential access, and any attempt to weaken approvals.
Does a Skill stay available in a new session?
Yes. A Skill is installed in Pi Agent, not stored in the model's memory, so every new session can load it as long as it remains installed. What does not carry over is anything you said inside one session — “use the vegetarian version this time” applies to that conversation only. Durable, non-secret rules belong in SKILL.md; one-off exceptions belong in the conversation.
Can I version a Skill and roll a change back?
Yes. If it lives on GitHub, commit each change to SKILL.md, then use git log to find the revision you want and git checkout — or whichever restore command your Git workflow uses — to return to it. Keep anything you rely on under version control. A verified Home Assistant backup is the second layer, since it covers /data/pi-agent/skills/ as well.
Next

Where to go from here

keep going

You can teach it a craft. Part 11 gives it a production line.

The next article builds a video workflow — the first job in this guide where the agent runs a sequence of real tools on your host rather than answering a question.

Open the full guide

Part 10 of the Pi Agent Onboarding Guide series, published by WoowTech.

Based on the Woow HA Pi Agent Onboarding Guide, produced by WoowTech and released under CC BY 4.0.

The Smart Space Solution · 智慧空間解決方案 · © 2026 WOOW Technology Co., Ltd.

Share this post