Create and share Claude skills with your team. Even non-tech folks become power users.
The extension popup shows all your team skills with toggles to enable/disable them. A checkmark indicates the skill is managed and in sync with your team's configuration.
Claude.ai skills are powerful but managing them across a team is challenging:
- No native team sharing - Skills are personal, requiring manual copy-paste
- Version drift - Team members end up with different versions of the same skill
- Onboarding friction - New hires need to manually set up all team skills
- No audit trail - Hard to track what skills exist and who has what
SkillForge solves this by:
- Centralizing skills in a Git repository with version control
- Hosting them on Cloudflare R2 (or any S3-compatible storage)
- Syncing automatically via a Chrome extension to team members' Claude.ai accounts
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ skills/ │ │ Cloudflare │ │ Chrome │
│ ├── config │────▶│ R2 Bucket │────▶│ Extension │
│ └── *.md │ │ │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
pnpm upload-skills Syncs to Claude.ai
- Define skills as Markdown files with YAML frontmatter
- Upload to R2 with
pnpm upload-skills - Team installs the Chrome extension
- Extension syncs skills to their Claude.ai accounts
| Level | What | Description |
|---|---|---|
| Team (R2 Bucket) | config.json |
The list of skills and their metadata |
| Team (R2 Bucket) | SKILL.md files |
The actual skill instructions |
| Personal (Extension) | Toggle states | Which skills you've enabled/disabled |
| Personal (Claude.ai) | Skill instances | Copies of skills in your account |
Key insight: Skills in your Claude.ai account are copies, not live links. That's why "Sync" exists — to update your local copies when the team updates the source.
Each team maintains their own R2 bucket and builds their own extension. Users install the extension for their team, which connects them to their team's skill library.
TEAM A TEAM B
┌─────────────────┐ ┌─────────────────┐
│ R2 Bucket A │ │ R2 Bucket B │
│ (team-a.r2.dev)│ │ (team-b.r2.dev)│
│ │ │ │
│ config.json │ │ config.json │
│ skill-1/ │ │ skill-x/ │
│ skill-2/ │ │ skill-y/ │
└────────┬────────┘ └────────┬────────┘
│ │
┌──────────────┼──────────────┐ ┌──────────────┼──────────────┐
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Alice │ │ Bob │ │ Carol │ │ David │ │ Eve │ │ Frank │
│Extension │ │Extension │ │Extension │ │Extension │ │Extension │ │Extension │
│(Team A) │ │(Team A) │ │(Team A) │ │(Team B) │ │(Team B) │ │(Team B) │
└────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Claude │ │ Claude │ │ Claude │ │ Claude │ │ Claude │ │ Claude │
│ Account │ │ Account │ │ Account │ │ Account │ │ Account │ │ Account │
│ (Alice) │ │ (Bob) │ │ (Carol) │ │ (David) │ │ (Eve) │ │ (Frank) │
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘
- One R2 bucket per team — contains the shared skill library
- One extension build per team — hardcoded with that team's
VITE_CONFIG_URL - One Claude.ai account per user — where skills get installed as personal copies
git clone https://github.com/bguivarch/skillforge.git
cd skillforge
pnpm installSee Setting Up Cloudflare R2 for how to get these credentials.
Create a .env file in the root:
# Cloudflare R2 Configuration
R2_ACCOUNT_ID=your_account_id
R2_ACCESS_KEY_ID=your_access_key_id
R2_SECRET_ACCESS_KEY=your_secret_access_key
R2_BUCKET_NAME=skillforge-skills
R2_PUBLIC_URL=https://pub-xxxx.r2.devCreate apps/skillforge/.env:
VITE_CONFIG_URL=https://pub-xxxx.r2.dev/skills/config.jsonBrowse available skills at skills.sh and install one:
# See available skills from a repository
pnpm install-skill vercel-labs/agent-skills
# Or install a specific skill directly
pnpm install-skill vercel-labs/agent-skills --skill react-best-practicesThis automatically:
- Downloads the skill to
skills/<skill-name>/ - Updates
skills/config.jsonwith the new entry
pnpm upload-skillspnpm buildThen load the extension in Chrome:
- Go to
chrome://extensions - Enable "Developer mode"
- Click "Load unpacked"
- Select
dist/chrome-mv3
Once you've built and configured your extension, you can share it with colleagues so they get the same skills automatically.
pnpm zipThis creates a distributable ZIP file at dist/skillforge-<version>-chrome.zip.
Send the ZIP file to your colleagues via Slack, email, Google Drive, or any file sharing service.
Recipients install the extension in Chrome:
- Unzip the file
- Go to
chrome://extensions - Enable "Developer mode"
- Click "Load unpacked"
- Select the unzipped folder
The extension will automatically sync skills from your configured R2 bucket - no additional setup needed for colleagues.
The extension is pre-configured with your VITE_CONFIG_URL at build time. When colleagues install it, they automatically connect to your shared skill repository and receive all team skills.
| Command | Description |
|---|---|
pnpm dev |
Start extension in development mode with hot reload |
pnpm build |
Build extension for production |
pnpm zip |
Create ZIP file for Chrome Web Store submission |
pnpm upload-skills |
Upload skills folder to R2 |
pnpm install-skill <repo> |
Install skills from GitHub |
pnpm typecheck |
Type-check TypeScript |
Import skills from the skills.sh directory or any GitHub repository:
# Interactive selection
pnpm install-skill vercel-labs/agent-skills
# Install specific skill
pnpm install-skill vercel-labs/agent-skills --skill react-best-practices
# Non-interactive (for CI)
pnpm install-skill vercel-labs/agent-skills -s web-design-guidelines --force --yesOptions:
-s, --skill <name>- Install specific skill by name-f, --force- Overwrite existing skill without prompting-y, --yes- Skip all prompts
{
"name": "Team Name Skills Pack",
"version": "1.0.0",
"skills": [
{
"name": "skill-name",
"version": "1.0.0",
"description": "What this skill does",
"source": "${R2_PUBLIC_URL}/skills/skill-name/SKILL.md",
"enabledByDefault": true,
"allowUserToggle": true
}
]
}| Field | Required | Description |
|---|---|---|
name |
Yes | Unique identifier (lowercase, hyphenated) |
version |
Yes | Semantic version for change tracking |
description |
Yes | Brief description shown in UI |
source |
Yes | URL to SKILL.md file |
enabledByDefault |
No | Auto-enable on first sync (default: true) |
allowUserToggle |
No | Let users enable/disable (default: true) |
---
name: skill-name
description: Brief description
---
# Skill Title
Main instructions go here. This is what Claude receives.
## Section 1
Content...
## Section 2
Content...The YAML frontmatter contains metadata, and everything after becomes the skill instructions.
Use the skill-creator to scaffold a new skill with the proper structure:
python3 .claude/skills/skill-creator/scripts/init_skill.py my-custom-skillThis automatically:
- Creates
skills/my-custom-skill/with a SKILL.md template - Adds example
scripts/,references/, andassets/directories - Updates
skills/config.jsonwith the new skill entry
Then edit skills/my-custom-skill/SKILL.md to add your instructions and update the description in skills/config.json.
If you prefer to create skills manually:
- Create a folder in
skills/with your skill name:
mkdir skills/my-custom-skill- Create
skills/my-custom-skill/SKILL.md:
---
name: my-custom-skill
description: What this skill does
---
# My Custom Skill
Instructions for Claude go here...- Add the entry to
skills/config.json:
{
"name": "my-custom-skill",
"version": "1.0.0",
"description": "What this skill does",
"source": "${R2_PUBLIC_URL}/skills/my-custom-skill/SKILL.md",
"enabledByDefault": true,
"allowUserToggle": true
}- Upload and sync:
pnpm upload-skills| Variable | Required | Description |
|---|---|---|
R2_ACCOUNT_ID |
Yes | Cloudflare account ID |
R2_ACCESS_KEY_ID |
Yes | R2 API access key ID |
R2_SECRET_ACCESS_KEY |
Yes | R2 API secret access key |
R2_BUCKET_NAME |
Yes | R2 bucket name |
R2_PUBLIC_URL |
Yes | Public URL for the R2 bucket |
| Variable | Required | Description |
|---|---|---|
VITE_CONFIG_URL |
Yes | URL to your hosted config.json |
skillforge/
├── apps/
│ └── skillforge/ # Chrome extension (WXT + Svelte)
│ ├── entrypoints/
│ │ ├── background/ # Service worker
│ │ └── popup/ # Extension popup UI
│ ├── components/ # Svelte components
│ ├── lib/ # Shared utilities
│ └── public/ # Extension icons
├── scripts/
│ ├── upload-skills.ts # Upload to R2
│ └── install-skill.ts # Install from GitHub
├── skills/
│ ├── config.json # Skill definitions
│ └── */SKILL.md # Individual skills
└── package.json
| State | Badge | Description |
|---|---|---|
| Managed | [checkmark] |
In config, installed, version matches |
| Outdated | [arrow up] Update |
In config, version changed |
| Orphaned | [warning] Removed |
Was managed, removed from config |
| Other | - | User's personal skill (not managed) |
- Sync All - Install/update all skills from config
- Update Individual - Update a single outdated skill
- Toggle - Enable/disable skills (if allowed)
- View Status - See skill states and last sync time
Shows count of pending actions (new skills + available updates).
- Go to the Cloudflare Dashboard (create an account if needed)
- Navigate to R2 Object Storage
- Create a new bucket
- Enable public access - This is required for the Chrome extension to fetch skills. Go to your bucket settings and enable "R2.dev subdomain" or configure a custom domain. The bucket must be publicly accessible since the extension fetches skills directly from the URL.
- Create an API token with R2 read/write permissions
- Copy credentials to your
.envfile
# Start extension dev server
pnpm dev
# This opens Chrome with the extension loaded
# Changes hot-reload automatically- Extension Framework: WXT (Web Extension Toolkit)
- UI: Svelte 5
- Language: TypeScript
- Storage: WXT Storage API
- Build: Vite
Popup UI (Svelte)
│
▼
lib/messaging.ts ──────▶ background/index.ts
│
▼
sync-engine.ts
│
┌─────────┴─────────┐
▼ ▼
config-loader.ts api-client.ts
│ │
▼ ▼
R2 Bucket Claude.ai API
If a colleague shared a SkillForge extension ZIP with you, follow these steps to install it:
-
Unzip the file - Extract the ZIP to a folder (e.g.,
skillforge-extension/) -
Open Chrome Extensions - Navigate to
chrome://extensionsin your browser -
Enable Developer Mode - Toggle the switch in the top-right corner
-
Load the extension - Click "Load unpacked" and select the unzipped folder
-
Pin the extension - Click the puzzle icon in Chrome's toolbar and pin SkillForge for easy access
- Click the SkillForge icon in your toolbar
- Click "Sync All" to install all team skills
- Go to claude.ai - your skills are ready to use
When your team updates the skills, you'll see a badge on the extension icon. Click it and hit "Sync All" to get the latest versions.
Note: You don't need to set up R2 or clone any repository. The extension is pre-configured to connect to your team's skill server.
Skills are stored locally in the skills/ folder of this repository. For most users (colleagues receiving skills via the extension), no Git knowledge or repository access is needed — they just install the extension and sync.
However, if multiple people need to manage skills (add, edit, or remove skills from the shared config), they'll need to:
- Fork this repository (one fork per team)
- Clone the fork
- Make changes to the
skills/folder - Commit and push to keep everyone in sync
- Run
pnpm upload-skillsto publish changes to R2
This ensures all skill administrators stay synchronized and changes are tracked with version control.
Note: We're aware this workflow adds friction for teams with multiple skill administrators. If SkillForge gets traction and people find it useful, we plan to add a proper backend with a web UI for collaborative skill management — no Git required.
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
SkillForge collects anonymous usage data to help improve the product:
- Install count
- Feature usage (skills imported)
- Extension version
We don't collect:
- Personal information
- Browsing history
- Skill content
- IP addresses
All data is aggregated and anonymous.
View our analytics code — it's open source like everything else.
Apache 2.0 - See LICENSE for details.
- skills.sh - The Agent Skills Directory
- vercel-labs/agent-skills - Community skills
- vercel-labs/add-skill - Official CLI
