Creating Skills
This tutorial walks through building a skill from scratch, validating it, and publishing to the marketplace.
Prerequisites
- SiteSkills CLI installed and authenticated
- Familiarity with the target website you are building a skill for
- Understanding of CSS selectors
Step 1: Scaffold
Run the interactive scaffolding command:
siteskills initCreate a new SiteSkills skill
─────────────────────────────
Skill name (slug): my-awesome-skill
Display name: My Awesome Skill
Target domain(s): example.com
Category: productivity
Difficulty: easy
Requires auth? (y/N): n
Created my-awesome-skill/
├── SKILL.md
├── siteskills.json
├── README.md
└── tests/
└── test-basic.jsonStep 2: Write SKILL.md
Open SKILL.md and define the navigation flow. This is what the agent reads at runtime.
Frontmatter
---
name: my-awesome-skill
description: "One-line description of what this skill does"
triggers:
- "do something on example.com"
- "automate example.com task"
---Triggers are natural language phrases that tell agents when to activate this skill.
Prerequisites and Input Parameters
## Prerequisites
- Browser viewport at least 1024x768
- User must be on example.com
## Input Parameters
- `url` (required): The page URL to navigate to
- `option` (optional, default: "A"): Which option to selectNavigation Steps
Each step follows this pattern:
### Step 1: Navigate to Page
- **Goal:** Load the target page
- **Action:** Navigate to the provided URL
- **Expected state:** Page loads with main content visible
- **DOM hints:**
- Primary: `#main-content`
- Secondary: `.content-wrapper`
- Text fallback: heading containing "Welcome"
- **Wait condition:** Element `#main-content` visible within 10 seconds
- **Fallback:**
- If 404 -> report "Page not found"
- If login redirect -> stop, report "Authentication required"Key rules:
- Provide multiple DOM selectors in priority order (IDs, classes, text, ARIA)
- Always include a wait condition with a timeout
- Always include fallbacks with detection + recovery
- Be specific about what "success" looks like at each step
Verification
## Verification
The skill is successful when ALL of the following are true:
1. Confirmation message is visible
2. Page URL contains "/success"
3. Expected element is present in the DOMAnti-Detection Notes
## Anti-Detection Notes
- Insert 0.5-2 second random delays between actions
- Scroll to elements naturally before clicking
- Do not reload the page unless necessaryStep 3: Fill siteskills.json
The scaffolded file has most fields pre-filled. Update these key sections:
Target
{
"target": {
"domains": ["example.com"],
"url_patterns": ["https://example.com/page/*"],
"requires_https": true,
"last_verified": "2026-02-15T00:00:00Z",
"verified_by": "manual"
}
}Compatibility
Declare which agents you have tested with:
{
"compatibility": {
"agents": [
{ "name": "claude-cowork", "min_version": null, "notes": "Tested" },
{ "name": "browser-use", "min_version": "0.3.0", "notes": "Needs Playwright" }
],
"requires_auth": false,
"requires_captcha_solver": false,
"requires_proxy": false
}
}Failure Modes
Document every known failure with detection and recovery:
{
"navigation": {
"failure_modes": [
{
"id": "element-not-found",
"description": "Target button not found on page",
"detection": "element:#submit-btn not found within 5s",
"recovery": "Fall back to text search for 'Submit' button",
"probability": "low"
}
]
}
}See the Template Standard for the complete field reference.
Step 4: Write README.md
The README is for human developers browsing the marketplace. Include:
# My Awesome Skill
A SiteSkills navigation skill for AI browser agents.
## What it does
Brief description of the automation.
## Supported Sites
- example.com
## Compatible Agents
| Agent | Min Version | Status |
|-------|------------|--------|
| Claude Cowork | Any | Tested |
| Browser Use | 0.3.0+ | Tested |
## Prerequisites
- List any requirements
## Installation
\```bash
siteskills install my-awesome-skill
\```
## Usage Examples
> "Do the thing on example.com"Step 5: Validate
Run the local validator:
siteskills validate ./my-awesome-skill/Validating my-awesome-skill...
Structure:
SKILL.md found
siteskills.json found (valid JSON, schema OK)
README.md found
No prohibited files
Total size: 8.2 KB
Content:
All target domains resolve
3 navigation steps with fallbacks
2 failure modes defined
No suspicious patterns detected
Warnings:
No test files in tests/ directory
No screenshots provided
Result: PASS (ready to publish)Fix any errors before publishing. Warnings are non-blocking but improve quality.
Step 6: Test Manually
Before publishing, test your skill with a real agent:
- Install the skill locally in your agent's skills directory
- Run the agent and trigger the skill with one of your trigger phrases
- Verify each step executes correctly
- Test the failure modes -- intentionally trigger edge cases
- Update DOM selectors and fallbacks based on what you find
Step 7: Publish
siteskills publish ./my-awesome-skill/Publishing my-awesome-skill v1.0.0...
Validated locally (all checks pass)
Packaged as zip (8.2 KB)
Uploaded to SiteSkills
Scan queued (estimated: 1-2 minutes)
Track status: https://siteskills.ai/dashboard/skills/abc123The skill enters the automated scanning pipeline:
- Structural validation -- file format, schema compliance
- Static analysis -- pattern matching for suspicious content
- LLM analysis -- AI review of navigation quality
Skills scoring 80+ are auto-approved. Lower scores go to manual review.
Updating a Published Skill
To push a new version:
- Bump the
versionfield insiteskills.json(follow semver) - Update
target.last_verifiedto today's date - Add a
CHANGELOG.mdentry (optional but recommended) - Run
siteskills publishagain
siteskills publish ./my-awesome-skill/The new version goes through the same scan pipeline. Previous versions remain available.
Tips
- Start simple. A 3-step skill that works reliably is better than a 15-step skill that breaks.
- Test on multiple screen sizes. Some sites serve different DOM for different viewports.
- Watch for A/B tests. Major sites change layouts frequently. Use text fallbacks, not just selectors.
- Document aggressively. Future you (and other developers) will thank you.
- Set
last_verifiedhonestly. It drives the auto-deprecation system.